欢迎光临
我们一直在努力

19-Linux学习之旅之Nginx认知和部署

Linux学习之旅之Nginx认知和部署

一、Nginx认知

1、什么是Nginx

Nginx 是一款轻量高性能的开源服务软件,主要用作网页服务器、反向代理与负载均衡器,既能快速处理图片、页面等静态资源,也能转发用户请求至后端业务服务,实现流量分发、动静分离、HTTPS 加密、访问限流与缓存加速,隐藏后端服务器地址提升安全性,分担后端压力,支撑网站、微服务集群高并发稳定运行。

2、进程模型

对比项Master 主进程Worker 工作进程
进程身份 父进程,启动 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事件驱动模型

对比维度阻塞 IO(Blocking IO)select /poll(IO 多路复用)epoll(高性能 IO 多路复用)
处理逻辑 一个线程只能监听一个连接,无数据时线程阻塞等待数据 单线程监听多个 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/

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 19-Linux学习之旅之Nginx认知和部署
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址