Linux学习之旅之Nginx认知和部署
一、Nginx认知
1、什么是Nginx
Nginx 是一款轻量高性能的开源服务软件,主要用作网页服务器、反向代理与负载均衡器,既能快速处理图片、页面等静态资源,也能转发用户请求至后端业务服务,实现流量分发、动静分离、HTTPS 加密、访问限流与缓存加速,隐藏后端服务器地址提升安全性,分担后端压力,支撑网站、微服务集群高并发稳定运行。
2、进程模型
| 进程身份 | 父进程,启动 Nginx 时唯一主进程 | Master 生成的多个子进程,数量可配置 |
| 核心作用 | 管理控制,不处理用户业务请求 | 实际处理客户端所有网络请求 |
| 主要功能 | 1. 读取、解析 nginx 配置文件2. 创建、管理 Worker 子进程3. 接收运维信号(重启 / 停止 / 重载配置)4. 监控 Worker 运行状态,异常时自动拉起新 Worker5. 管理日志文件、缓存文件 | 1. 监听端口,接收浏览器客户端连接2. 处理静态资源、反向代理、负载均衡、SSL、限流等业务逻辑3. 异步事件驱动,高效处理大量并发连接4. 独立执行业务,进程间互不干扰 |
| 资源占用 | 占用极少 CPU、内存 | 绝大部分 CPU、内存消耗在此进程 |
| 数量规则 | 全局仅 1 个 | 默认等于 CPU 核心数,可手动修改 worker_processes 参数 |
| 操作权限 | 拥有 root 启动权限,负责端口绑定 | 降低权限运行,保障服务安全 |
| 运维信号响应 | 接收 kill/HUP/QUIT 等信号执行重载、优雅停止 | 不直接接收运维信号,由 Master 下发指令 |
| 故障影响 | Master 崩溃则整个 Nginx 服务失效 | 单个 Worker 崩溃,Master 会重启该 Worker,不影响整体服务 |
3、epoll事件驱动模型
| 处理逻辑 | 一个线程只能监听一个连接,无数据时线程阻塞等待数据 | 单线程监听多个 fd,内核轮询所有 fd,有数据才返回就绪列表 | 内核维护就绪链表,只返回有事件的 fd,无轮询扫描 |
| 文件描述符上限 | 无上限,靠多线程支撑,并发高就创建大量线程 | select 上限 1024;poll 无硬性上限,但性能随 fd 增多急剧下降 | 无固定上限,受系统内存限制,支持十万级并发 |
| 内核检测方式 | 一对一阻塞等待 | 内核每次遍历全部监听 fd,O (n) 时间复杂度 | 内核回调机制,仅返回就绪 fd,O (1) 就绪查找 |
| 数据拷贝 | 用户进程等待内核数据拷贝完成才返回 | 每次调用都需要在内核、用户空间拷贝 fd 数组 | 采用红黑树存储监听 fd,就绪链表直接返回,拷贝开销小 |
| 并发性能 | 极低,上万并发需上万线程,CPU 切换开销巨大 | 中低,连接越多越卡,适合几百以内连接 | 极高,上万、十万并发无明显性能衰减 |
| CPU 消耗 | 大量空闲等待,但多线程切换耗 CPU | 连接多时频繁遍历 fd,CPU 占用飙升 | 空闲时休眠,只有事件触发才工作,CPU 占用低 |
| Nginx 使用情况 | 完全不采用 | 老旧系统兼容方案,不推荐 | Linux 下默认、主力 IO 模型 |
| 典型场景 | 简单单机小程序、少量连接 | 兼容老旧 Linux 内核、低并发场景 | Web 服务器、网关、Redis 等高并发服务 |
Nginx中如何配置epoll
events {
use epoll; # 指定使用epoll事件模型
worker_connections 10240; # 单Worker最大连接数
multi_accept on; # 一次接受所有新连接
}
二、部署Nginx
1、环境准备
主环境:Rocky Linux 10
测试环境:Ubuntu 26.04
[root@rocky01 ~]# dnf install -y curl wget vim net-tools git
[root@rocky01 ~]# systemctl disable –now firewalld
2、安装依赖
[root@rocky01 ~]# dnf install -y gcc make pcre2-devel zlib-devel openssl-devel git
3、下载Nginx源码和第三方模块
[root@rocky01 ~]# cd /usr/local/src
[root@rocky01 src]# git clone https://github.com/openresty/echo-nginx-module.git
正克隆到 'echo-nginx-module'...
remote: Enumerating objects: 3117, done.
remote: Counting objects: 100% (49/49), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 3117 (delta 32), reused 22 (delta 20), pack-reused 3068 (from 3)
接收对象中: 100% (3117/3117), 1.19 MiB | 876.00 KiB/s, 完成.
处理 delta 中: 100% (1673/1673), 完成.
[root@rocky01 src]# ls
echo-nginx-module nginx-1.30.4.tar.gz
4、编译配置
[root@rocky01 src]# useradd nginx
[root@rocky01 src]# tar xf nginx-1.30.4.tar.gz
[root@rocky01 src]# ls
echo-nginx-module nginx-1.30.4 nginx-1.30.4.tar.gz
[root@rocky01 src]# cd nginx-1.30.4/
[root@rocky01 nginx-1.30.4]# ./configure \\
–prefix=/usr/local/nginx \\
–sbin-path=/usr/sbin/nginx \\
–conf-path=/etc/nginx/nginx.conf \\
–error-log-path=/var/log/nginx/error.log \\
–http-log-path=/var/log/nginx/access.log \\
–pid-path=/var/run/nginx.pid \\
–lock-path=/var/run/nginx.lock \\
–user=nginx \\
–group=nginx \\
–with-http_ssl_module \\
–with-http_v2_module \\
–with-http_realip_module \\
–with-http_stub_status_module \\
–with-http_gzip_static_module \\
–add-module=/usr/local/src/echo-nginx-module
5、开始编译
[root@rocky01 nginx-1.30.4]# make
make -f objs/Makefile
make[1]: 进入目录“/usr/local/src/nginx-1.30.4”
...........
sed -e "s|%%PREFIX%%|/usr/local/nginx|" \\
-e "s|%%PID_PATH%%|/var/run/nginx.pid|" \\
-e "s|%%CONF_PATH%%|/etc/nginx/nginx.conf|" \\
-e "s|%%ERROR_LOG_PATH%%|/var/log/nginx/error.log|" \\
< man/nginx.8 > objs/nginx.8
make[1]: 离开目录“/usr/local/src/nginx-1.30.4”
[root@rocky01 nginx-1.30.4]# make install
make -f objs/Makefile install
make[1]: 进入目录“/usr/local/src/nginx-1.30.4”
......................
test -d '/var/log/nginx' \\
|| mkdir -p '/var/log/nginx'
make[1]: 离开目录“/usr/local/src/nginx-1.30.4”
6、验证模块是否编译成功
[root@rocky01 nginx-1.30.4]# /usr/sbin/nginx -V
nginx version: nginx/1.30.4
built by gcc 14.3.1 20251022 (Red Hat 14.3.1-4) (GCC)
built with OpenSSL 3.5.5 27 Jan 2026
TLS SNI support enabled
configure arguments: –prefix=/usr/local/nginx –sbin-path=/usr/sbin/nginx –con f-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-lo g-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/ run/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_v2_ module –with-http_realip_module –with-http_stub_status_module –with-http_gzip _static_module –add-module=/usr/local/src/echo-nginx-module
7、创建systemd服务文件
[root@rocky01 nginx-1.30.4]# cd
[root@rocky01 ~]# tee /etc/systemd/system/nginx.service <<'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
8、启动并访问测试
[root@rocky01 ~]# systemctl daemon-reload
[root@rocky01 ~]# systemctl enable –now nginx.service
Created symlink '/etc/systemd/system/multi-user.target.wants/nginx.service' → '/ etc/systemd/system/nginx.service'.
[root@rocky01 ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5742,fd=6),("nginx",pid=5741,fd=6))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1068,fd=7))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1068,fd=8))
LISTEN 0 4096 *:9090 *:* users:(("systemd",pid=1,fd=90))
#Ubuntu测试
root@ubt2604ser:~# curl 10.0.0.6
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
三、在线平滑升级
1、拷贝原有编译参数
root@rocky01:~# nginx -v
nginx version: nginx/1.30.4
root@rocky01:~# nginx -V
nginx version: nginx/1.30.4
built by gcc 14.3.1 20251022 (Red Hat 14.3.1-4) (GCC)
built with OpenSSL 3.5.5 27 Jan 2026
TLS SNI support enabled
configure arguments: –prefix=/usr/local/nginx –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_v2_module –with-http_realip_module –with-http_stub_status_module –with-http_gzip_static_module –add-module=/usr/local/src/echo-nginx-module
2、备份当前二进制
root@rocky01:~# mv /usr/sbin/nginx /usr/sbin/nginx.old
3、编译新版本
root@rocky01:~# cd /usr/local/src/
root@rocky01:~# wget https://nginx.org/download/nginx-1.31.3.tar.gz
root@rocky01:/usr/local/src# ls
echo-nginx-module nginx-1.30.4 nginx-1.30.4.tar.gz
root@rocky01:/usr/local/src# tar xf nginx-1.31.3.tar.gz
root@rocky01:/usr/local/src# cd nginx-1.31.3/
root@rocky01:/usr/local/src/nginx-1.31.3# ./configure \\
–prefix=/usr/local/nginx \\
–sbin-path=/usr/sbin/nginx \\
–conf-path=/etc/nginx/nginx.conf \\
–error-log-path=/var/log/nginx/error.log \\
–http-log-path=/var/log/nginx/access.log \\
–pid-path=/var/run/nginx.pid \\
–lock-path=/var/run/nginx.lock \\
–user=nginx \\
–group=nginx \\
–with-http_ssl_module \\
–with-http_v2_module \\
–with-http_realip_module \\
–with-http_stub_status_module \\
–with-http_gzip_static_module \\
–add-module=/usr/local/src/echo-nginx-module
root@rocky01:/usr/local/src/nginx-1.31.3# make
4、备份就版本
root@rocky01:/usr/local/src/nginx-1.31.3# cp objs/nginx /usr/sbin/nginx
root@rocky01:/usr/local/src/nginx-1.31.3# ls /usr/sbin/nginx*
/usr/sbin/nginx /usr/sbin/nginx.old
5、对旧版本Master发送USR2信号
root@rocky01:/usr/local/src/nginx-1.31.3# kill -USR2 $(cat /var/run/nginx.pid)
#新版本Master启动
root@rocky01:/usr/local/src/nginx-1.31.3# ps aux | grep nginx
root 1156 0.0 0.1 12840 3068 ? Ss 11:24 0:00 nginx: master process /usr/sbin/nginx
nginx 1157 0.0 0.2 13040 4244 ? S 11:24 0:00 nginx: worker process
root 6047 0.1 0.4 12860 7240 ? S 11:45 0:00 nginx: master process /usr/sbin/nginx
nginx 6048 0.0 0.2 13060 4256 ? S 11:45 0:00 nginx: worker process
root 6050 0.0 0.1 6624 2200 pts/0 S+ 11:46 0:00 grep –color=auto nginx
6、向旧Master进程发送WINCH信号
root@rocky01:/usr/local/src/nginx-1.31.3# kill -WINCH $(cat /var/run/nginx.pid.oldbin)
#等待所有旧版本连接关闭后只留有Master进程
root@rocky01:/usr/local/src/nginx-1.31.3# ps aux | grep nginx
root 1156 0.0 0.1 12840 3072 ? Ss 11:24 0:00 nginx: master process /usr/sbin/nginx
root 6047 0.0 0.4 12860 7240 ? S 11:45 0:00 nginx: master process /usr/sbin/nginx
nginx 6048 0.0 0.2 13060 4256 ? S 11:45 0:00 nginx: worker process
root 6069 0.0 0.1 6624 2236 pts/0 S+ 11:48 0:00 grep –color=auto nginx
7、向旧Master进程发送QUIT信号
root@rocky01:/usr/local/src/nginx-1.31.3# kill -QUIT $(cat /var/run/nginx.pid.oldbin)
(failed reverse-i-search)`': git clone
htt^C://github.com/openresty/echo-nginx-module.git
#就版本Master退出,新版本彻底接收连接
root@rocky01:/usr/local/src/nginx-1.31.3# ps aux | grep nginx
root 6047 0.0 0.4 12860 7240 ? S 11:45 0:00 nginx: master process /usr/sbin/nginx
nginx 6048 0.0 0.2 13060 4256 ? S 11:45 0:00 nginx: worker process
root 6074 0.0 0.1 6624 2236 pts/0 S+ 11:50 0:00 grep –color=auto nginx
8、验证新版本
root@rocky01:/usr/local/src/nginx-1.31.3# nginx -v
nginx version: nginx/1.31.3
root@ubt2604ser:~# curl -I 10.0.0.20
HTTP/1.1 200 OK
Server: nginx/1.31.3
Date: Tue, 11 Aug 2026 05:10:26 GMT
Content-Type: text/html
Content-Length: 896
Last-Modified: Thu, 06 Aug 2026 08:47:02 GMT
Connection: keep-alive
ETag: "6a744a06-380"
Accept-Ranges: bytes
四、配置虚拟主机
1、修改主配置文件
root@rocky01:~# vim /etc/nginx/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
###将日志前面的#去掉
log_format main '$remote_addr – $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
###将日志前面的#去掉
#gzip on;
#再http中添加一条包含语句include
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost;
2、创建子配置文件目录并测试加载配置
root@rocky01:~# mkdir /etc/nginx/conf.d
root@rocky01:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@rocky01:~# systemctl reload nginx.service
3、创建虚拟主机站子目录及测试页面
#创建目录并经html文件长传到目录下
root@rocky01:~# mkdir -p /var/www/xyx
root@rocky01:~# ls /var/www/xyx/
index.html xyx.html
root@rocky01:~#
#本次豆包生成一条html文件为xyx.html
#也可自行创建一个测试的文件
echo "www.a.com…." > /var/www/xyx/index.html
4、创建虚拟主机
root@rocky01:~# vim /etc/nginx/conf.d/www.conf
root@rocky01:~# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.xyx.com;
location / {
root /var/www/xyx;
index xyx.html index.html;
}
}
root@rocky01:~#
5、测试语句是否正确并重新加载
root@rocky01:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@rocky01:~# systemctl reload nginx.service
root@rocky01:~#
6、测试网页
Windows测试
#修改hosts文件
C:\\Windows\\System32\\drivers\\etc\\hosts
10.0.0.2 www.xyx.com

linux测试
#修改/etc/hosts
root@ubt2604ser:~# vim /etc/hosts
root@ubt2604ser:~# cat /etc/hosts
10.0.0.20 www.xyx.com
</html>root@ubt2604ser:~# curl -I www.xyx.com
HTTP/1.1 200 OK
Server: nginx/1.31.3
Date: Tue, 11 Aug 2026 06:05:28 GMT
Content-Type: text/html
Content-Length: 4004
Last-Modified: Tue, 11 Aug 2026 05:18:59 GMT
Connection: keep-alive
ETag: "6a7ab0c3-fa4"
Accept-Ranges: bytes
五、部署WordPress站点(PHP + MySQL)
1、安装Mysql
Rocky Linux 10 的MySQL软件包名是 mysql8.4-server
[root@rocky01 ~]# dnf -y install mysql8.4-server
上次元数据过期检查:1:45:40 前,执行于 2026年08月11日 星期二 12时28分49秒。
依赖关系解决。
====================================================================================================================
软件包 架构 版本 仓库 大小
====================================================================================================================
安装:
mysql8.4-server x86_64 8.4.9-1.el10_2.rocky.0.1 appstream 18 M
安装依赖关系:
mariadb-connector-c-config noarch 3.4.4-2.el10_2 baseos 8.4 k
mecab x86_64 0.996-9.el10 appstream 361 k
...............
完毕!
#启动
[root@rocky01 ~]# systemctl enable –now mysqld
Created symlink '/etc/systemd/system/multi-user.target.wants/mysqld.service' → '/usr/lib/systemd/system/mysqld.service'.
[root@rocky01 ~]# systemctl status mysqld.service
Active: active (running) since Tue 2026-08-11 14:15:47 CST; 11s ago
#登录MySQL
[root@rocky01 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 8
Server version: 8.4.9 Source distribution
#创建数据库
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.01 sec)
#创建用户
mysql> CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'Xyx123@';
Query OK, 0 rows affected (0.01 sec)
#修改连接策略
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
Query OK, 0 rows affected (0.00 sec)
#修改权限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
#退出
mysql> \\q
Bye
2、部署PHP-FPM
[root@rocky01 ~]# dnf install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring
上次元数据过期检查:1:48:35 前,执行于 2026年08月11日 星期二 12时28分49秒。
依赖关系解决。
====================================================================================================================
软件包 架构 版本 仓库 大小
====================================================================================================================
安装:
php x86_64 8.3.32-1.el10_2
...........
完毕!
#启动
[root@rocky01 ~]# systemctl enable –now php-fpm.service
Created symlink '/etc/systemd/system/multi-user.target.wants/php-fpm.service' → '/usr/lib/systemd/system/php-fpm.service'.
#查看进程
[root@rocky01 ~]# ls /run/php-fpm/www.sock
/run/php-fpm/www.sock
[root@rocky01 ~]# pa aux | grep php-fpm
-bash: pa: 未找到命令
[root@rocky01 ~]# ps aux | grep php-fpm
root 7874 0.3 1.7 196200 29368 ? Ss 14:17 0:00 php-fpm: master process (/etc/php-fpm.conf)
apache 7877 0.0 0.6 196200 11736 ? S 14:17 0:00 php-fpm: pool www
apache 7878 0.0 0.6 196200 11736 ? S 14:17 0:00 php-fpm: pool www
apache 7879 0.0 0.6 196200 11740 ? S 14:17 0:00 php-fpm: pool www
apache 7880 0.0 0.6 196200 11744 ? S 14:17 0:00 php-fpm: pool www
apache 7881 0.0 0.6 196200 11748 ? S 14:17 0:00 php-fpm: pool www
root 7895 0.0 0.1 6624 2264 pts/0 S+ 14:18 0:00 grep –color=auto php-fpm
3、下载WordPress
#下载
[root@rocky01 ~]# wget https://wordpress.org/latest.tar.gz
–2026-08-11 14:19:21– https://wordpress.org/latest.tar.gz
正在解析主机 wordpress.org (wordpress.org)... 66.6.42.252, 2620:109:b00a::4206:2afc
正在连接 wordpress.org (wordpress.org)|66.6.42.252|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:29550735 (28M) [application/octet-stream]
正在保存至: “latest.tar.gz”
latest.tar.gz 100%[==============================================>] 28.18M 2.69MB/s 用时 14s
2026-08-11 14:19:37 (1.96 MB/s) – 已保存 “latest.tar.gz” [29550735/29550735])
#查看下载包
[root@rocky01 ~]# ls
anaconda-ks.cfg latest.tar.gz
#解压
[root@rocky01 ~]# tar xf latest.tar.gz
[root@rocky01 ~]# ls
anaconda-ks.cfg latest.tar.gz wordpress
#设置权限(Nginx用户需读写权限)
[root@rocky01 ~]# mkdir -p /var/www/wordpress
[root@rocky01 ~]# cp -r wordpress/* /var/www/wordpress/
[root@rocky01 ~]# chown -R nginx:nginx /var/www/wordpress/
[root@rocky01 ~]# chmod -R 755 /var/www/wordpress/
4、配置woedpress连接数据库
[root@rocky01 wordpress]# cp wp-config-sample.php wp-config.php
[root@rocky01 wordpress]# vim wp-config.php
# 修改以下内容:
# DB_NAME = 'wordpress'
# DB_USER = 'wpuser'
# DB_PASSWORD = 'Xyx123@'
# DB_HOST = 'localhost'
5、创建wordpress虚拟主机
[root@rocky01 ~]# cat > /etc/nginx/conf.d/wordpress.conf << 'EOF'
server {
listen 80;
server_name wordpress.xyx.com;
root /var/www/wordpress;
index index.php index.html;
access_log /var/log/nginx/wordpress_access.log main;
error_log /var/log/nginx/wordpress_error.log warn;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \\.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \\.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
}
EOF
6、测试配置并重新加载
[root@rocky01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@rocky01 ~]# systemctl reload nginx.service
7、Windows测试
# 1. 修改 hosts 文件
C:\\Windows\\System32\\drivers\\etc\\hosts
10.0.0.20 wordpress.xyx.com
@ 2. 浏览器访问 http://wordpress.xyx.com/







