企业高性能 Web 服务部署实践(基于 RHEL 9)
一、实验环境准备
1.1 系统要求
操作系统:Red Hat Enterprise Linux 9(RHEL 9)
内核版本:4.18+(可通过
uname -r
验证)网络:确保服务器可连接互联网(用于安装依赖和下载源码)。
1.2 安装基础依赖
# 安装编译工具和依赖库
sudo dnf install -y gcc pcre-devel zlib-devel openssl-devel make wget
说明:
gcc
:C 语言编译器,用于编译 Nginx 源码。pcre-devel
:支持正则表达式功能(如 URL 重写)。zlib-devel
:支持 Gzip 压缩,减少传输数据量。openssl-devel
:支持 SSL/TLS 加密,实现 HTTPS 服务。make
:自动化构建工具,用于编译源码。
二、Nginx 源码编译安装
2.1 创建 Nginx 用户
# 创建nginx用户(禁止登录,仅用于运行服务)
sudo useradd -r -s /sbin/nologin nginx
2.2 下载并解压源码
# 进入源码目录(统一存放源码的规范路径)
cd /usr/local/src # 下载Nginx源码(以1.24.0版本为例,可替换为最新稳定版)
wget https://nginx.org/download/nginx-1.24.0.tar.gz # 解压源码包
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0
2.3 配置编译参数
./configure \
--prefix=/usr/local/nginx \ # 安装路径
--user=nginx \ # 运行Nginx的用户(需提前创建)
--group=nginx \ # 运行Nginx的用户组
--with-http_ssl_module \ # 支持HTTPS
--with-http_v2_module \ # 支持HTTP/2(多路复用提升性能)
--with-http_realip_module \ # 支持获取客户端真实IP(反向代理场景)
--with-http_stub_status_module \ # 启用状态页(监控Nginx运行状态)
--with-http_gzip_static_module \ # 支持静态Gzip压缩(预压缩文件直接传输)
--with-pcre \ # 支持正则表达式(URL匹配、重写)
--with-stream \ # 支持TCP/UDP反向代理(如数据库代理)
--with-stream_ssl_module \ # 支持TCP/UDP SSL加密
--with-stream_realip_module # 支持TCP/UDP场景获取真实IP
2.4 编译和安装
# 编译(可加-j参数启用多核心加速,如make -j 4)
make && make install
2.5 创建 Systemd 服务文件
# 创建服务文件(便于系统管理Nginx生命周期)
sudo vim /etc/systemd/system/nginx.service
服务文件内容:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target [Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t # 启动前检查配置文件语法
ExecStart=/usr/local/nginx/sbin/nginx # 启动命令
ExecReload=/bin/kill -s HUP $MAINPID # 平滑重载配置(不中断服务)
ExecStop=/bin/kill -s QUIT $MAINPID # 优雅关闭(处理完现有连接)
PrivateTmp=true [Install]
WantedBy=multi-user.target
2.6 添加 Nginx 环境变量(系统级配置)
为避免仅当前用户生效,建议配置系统级环境变量:
将 nginx 可执行文件的路径添加到系统环境变量 PATH 中,就能直接使用nginx
命令。
# 创建环境变量配置文件
sudo vim /etc/profile.d/nginx.sh # 写入内容:
export PATH=$PATH:/usr/local/nginx/sbin # 生效配置
source /etc/profile.d/nginx.sh
2.7 启动 Nginx 并设置开机自启
# 重新加载Systemd配置(识别新服务)
sudo systemctl daemon-reload # 启动Nginx服务
sudo systemctl start nginx # 验证服务状态
sudo systemctl status nginx # 设置开机自启
sudo systemctl enable nginx
三、Nginx 性能调优配置
3.1 高并发核心配置
# 编辑Nginx主配置文件
sudo vim /usr/local/nginx/conf/nginx.conf
关键配置内容:
worker_processes auto; # 自动匹配CPU核心数(1核心1进程,避免切换开销)
worker_rlimit_nofile 100000; # 每个工作进程最大文件句柄数(需系统支持) events {worker_connections 65535; # 每个进程支持的最大连接数 use epoll; # 启用epoll事件驱动(Linux高性能IO模型) multi_accept on; # 一次接受多个新连接,减少系统调用
}http {include mime.types; default_type application/octet-stream; sendfile on; # 启用sendfile(零拷贝,减少用户态/内核态切换) tcp_nopush on; # 配合sendfile使用,批量发送数据 tcp_nodelay on; # 小数据不延迟发送(提升交互性) keepalive_timeout 65; # 长连接超时时间(减少握手开销)
}
3.2 系统级限制调整(避免高并发瓶颈)
# 临时调整进程最大文件句柄数(当前会话生效)
ulimit -n 100000 # 永久调整(重启生效)
sudo vim /etc/security/limits.conf
# 加入以下内容:
* soft nofile 100000
* hard nofile 100000
3.3 性能测试方法
# 安装压测工具
sudo dnf install -y httpd-tools # 测试(10000总请求,1000并发,注意提前调整ulimit)
ab -n 10000 -c 1000 http://172.25.254.60/
四、反向代理与负载均衡配置
4.1 负载均衡核心配置
sudo vim /usr/local/nginx/conf/nginx.conf
配置内容:
upstream backend { server 172.25.254.61:8080 weight=3; # 后端服务器A(权重3,接收75%流量) server 172.25.254.62:8080; # 后端服务器B(权重1,接收25%流量) # 可选:添加健康检查 # server 172.25.254.63:8080 backup; # 备用服务器(主服务故障时启用)
} server { listen 80; server_name 172.25.254.60; location / { proxy_pass http://backend; proxy_set_header Host $host; # 传递原始主机名 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录代理链 }
}
4.2 后端服务准备(测试用)
服务器 61:
echo "Backend A (172.25.254.61)" > /root/index.html
python3 -m http.server 8080 --bind 0.0.0.0 # 仅用于测试,生产环境需替换为正式服务
服务器 62:
echo "Backend B (172.25.254.62)" > /root/index.html
python3 -m http.server 8080 --bind 0.0.0.0
4.3 验证配置
# 检查配置语法
nginx -t # 平滑重载配置
sudo systemctl reload nginx # 测试负载均衡效果(多次访问观察返回内容)
curl http://172.25.254.60
五、动态内容处理(PHP-FPM 集成)
5.1 安装 PHP-FPM(需启用 EPEL 源)
# 启用EPEL源(RHEL默认源无php-fpm)
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm # 安装PHP及FPM
sudo dnf install -y php php-fpm
5.2 创建测试页面
echo "<?php phpinfo(); ?>" > /usr/local/nginx/html/index.php
5.3 配置 Nginx 支持 PHP
sudo vim /usr/local/nginx/conf/nginx.conf
配置内容:
server {listen 80;server_name 172.25.254.60;# 静态文件处理location / {root /usr/local/nginx/html;index index.html index.php;}# PHP动态请求处理location ~ \.php$ {root /usr/local/nginx/html;fastcgi_pass 127.0.0.1:9000; # 转发至PHP-FPMfastcgi_index index.php;include fastcgi_params;# 定义PHP文件路径(必须正确,否则报404)fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
5.4 配置 PHP-FPM
# 编辑PHP-FPM配置(调整运行用户和监听地址)
sudo vim /etc/php-fpm.d/www.conf # 修改以下参数:
listen = 127.0.0.1:9000
user = nginx
group = nginx
确保
listen
地址和端口与 Nginx 配置中的fastcgi_pass
一致。如果用户不是
nginx
,需修改为当前 Nginx 进程运行的用户(通常为nginx
或www-data
)。
5.5 启动 PHP-FPM 并验证
sudo systemctl start php-fpm
sudo systemctl enable php-fpm # 测试PHP页面
curl http://172.25.254.60/index.php # 应返回PHP信息页
预期结果:
返回PHP信息页面(
phpinfo()
输出),表示PHP-FPM和Nginx集成成功。
六、缓存与加速配置
6.1 启用代理缓存
sudo vim /usr/local/nginx/conf/nginx.conf
配置内容:
# 定义缓存目录(levels:目录层级;keys_zone:内存区;max_size:最大磁盘空间)
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;upstream backend_servers {server 172.25.254.61:80; server 172.25.254.62:80;
}server {listen 80;server_name 172.25.254.60;location / {proxy_pass http://backend_servers;proxy_cache my_cache; # 启用缓存proxy_cache_valid 200 302 10m; # 成功响应缓存10分钟proxy_cache_valid 404 1m; # 404响应缓存1分钟add_header X-Cache-Status $upstream_cache_status; # 显示缓存状态(HIT/MISS)}
}
6.2 配置缓存目录权限
# 创建缓存目录并授权(确保Nginx可读写)
sudo mkdir -p /var/cache/nginx
sudo chown -R nginx:nginx /var/cache/nginx
6.3 验证缓存效果
# 重载配置
sudo systemctl reload nginx # 测试缓存(首次MISS,后续HIT)
curl -I http://172.25.254.60/
验证结果:
缓存:响应头中出现X-Cache-Lookup
表示缓存命中。
总结
本文基于 RHEL 9 环境,从源码编译安装 Nginx 开始,逐步实现了高性能 Web 服务的核心能力:
基础部署:通过源码编译定制 Nginx 功能,结合 Systemd 实现服务化管理;
性能调优:通过调整进程数、连接数、系统限制及 IO 模型,提升并发处理能力;
负载均衡:基于权重的流量分配,实现后端服务的负载分担与高可用;
动态处理:集成 PHP-FPM,支持动态内容生成;
缓存加速:启用代理缓存减少后端压力,提升响应速度。
实际生产环境中,还需结合 SSL 证书配置(HTTPS)、日志分析、监控告警等功能,进一步增强服务的安全性和可维护性。