1. 环境准备与基础配置
在CentOS系统上部署Nginx前,需要确保基础环境符合要求。我通常使用CentOS 7.9或8.x版本进行生产环境部署,这两个版本对Nginx的支持最为稳定。首先通过cat /etc/redhat-release命令确认系统版本,这是很多新手容易忽略的第一步。
重要提示:CentOS 8已于2021年底停止维护,建议使用CentOS 7或迁移到Rocky Linux等替代发行版
对于网络配置,执行以下检查步骤:
bash复制# 检查网络连通性
ping -c 4 baidu.com
# 查看防火墙状态
systemctl status firewalld
# 临时关闭SELinux(生产环境需另行配置)
setenforce 0
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. YUM安装方式详解
2.1 配置EPEL仓库
标准CentOS仓库中的Nginx版本较旧,添加EPEL仓库是必须步骤:
bash复制yum install epel-release
yum makecache
2.2 执行安装命令
基础安装只需一行命令:
bash复制yum install nginx
但我会推荐使用以下增强命令:
bash复制yum --enablerepo=epel install nginx-mod-*
这组命令会同时安装HTTP/2、GeoIP等常用模块。安装完成后,通过nginx -V可以查看编译参数和模块列表。
2.3 版本管理技巧
EPEL仓库的版本更新策略:
- 主版本号不变(如保持1.20.x)
- 安全更新会及时推送
- 每季度同步一次上游稳定版
如果需要最新版本,建议采用源码编译方式。我曾遇到过一个案例:某客户需要HTTP/3支持,就必须使用1.25+版本,这时yum安装就无法满足需求。
3. 源码编译安装指南
3.1 依赖项处理
编译安装需要更多开发工具:
bash复制yum groupinstall "Development Tools"
yum install pcre-devel zlib-devel openssl-devel
特别要注意的是,OpenSSL版本会影响TLS 1.3的支持。我有次在CentOS 7上就因为默认的OpenSSL 1.0.2导致TLS 1.3无法启用,后来不得不手动升级OpenSSL。
3.2 编译参数优化
我的常用编译参数配置:
bash复制./configure \
--prefix=/usr/local/nginx \
--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 \
--with-pcre \
--with-stream \
--with-threads
对于高并发场景,建议增加:
bash复制--with-file-aio \
--with-http_slice_module
3.3 性能调优参数
在make阶段可以使用:
bash复制make -j $(nproc)
这能充分利用多核CPU加速编译。安装完成后,别忘了创建nginx用户:
bash复制useradd -r -s /sbin/nologin nginx
4. 系统服务配置
4.1 Systemd单元文件
对于源码安装,需要手动创建服务文件/usr/lib/systemd/system/nginx.service:
ini复制[Unit]
Description=nginx - high performance web server
After=network.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
4.2 环境变量配置
建议在/etc/sysconfig/nginx中添加:
bash复制NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
ULIMIT="-n 65536"
5. 安全加固实践
5.1 目录权限设置
正确的权限配置方案:
bash复制chown -R root:root /usr/local/nginx
chown -R nginx:nginx /usr/local/nginx/logs
chown -R nginx:nginx /usr/local/nginx/client_body_temp
find /usr/local/nginx -type d -exec chmod 750 {} \;
find /usr/local/nginx -type f -exec chmod 640 {} \;
5.2 防火墙规则
推荐配置:
bash复制firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
6. 性能调优参数
在nginx.conf的http块中添加:
nginx复制keepalive_timeout 65;
keepalive_requests 1000;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 15s;
# 开启零拷贝
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 工作进程配置
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
7. 常见问题排查
7.1 端口冲突处理
检查端口占用情况的完整流程:
bash复制ss -tulnp | grep ':80\b'
ps -ef | grep nginx
lsof -i :80
7.2 日志分析技巧
错误日志快速定位方法:
bash复制tail -f /var/log/nginx/error.log | grep -E 'emerg|alert|crit|error'
访问日志统计分析:
bash复制# 统计HTTP状态码
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 统计访问量前10的IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
8. 模块扩展方案
8.1 动态模块加载
以安装headers-more模块为例:
bash复制# 下载模块源码
git clone https://github.com/openresty/headers-more-nginx-module.git
# 重新编译
./configure --add-dynamic-module=../headers-more-nginx-module
make modules
cp objs/ngx_http_headers_more_filter_module.so /usr/local/nginx/modules/
在nginx.conf中添加:
nginx复制load_module modules/ngx_http_headers_more_filter_module.so;
8.2 第三方模块推荐
我常用的生产级模块:
- nginx-module-vts - 可视化监控
- lua-nginx-module - 嵌入式Lua支持
- nginx-rtmp-module - 流媒体支持
- ngx_brotli - Brotli压缩算法
9. 版本升级策略
9.1 平滑升级步骤
- 备份现有配置和二进制文件
- 编译新版本时使用相同的configure参数
- 替换二进制文件:
bash复制cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
- 发送USR2信号:
bash复制kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
- 逐步关闭旧进程:
bash复制kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
10. 容器化部署方案
10.1 Docker最佳实践
推荐的基础镜像:
dockerfile复制FROM nginx:1.25-alpine
# 复制配置
COPY nginx.conf /etc/nginx/nginx.conf
COPY conf.d/ /etc/nginx/conf.d/
COPY ssl/ /etc/nginx/ssl/
# 设置健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
# 非root用户运行
RUN chown -R nginx:nginx /var/cache/nginx && \
chmod -R 755 /var/log/nginx
USER nginx
10.2 Kubernetes配置要点
Ingress控制器的关键参数:
yaml复制args:
- --controller-class=k8s.io/nginx-ingress
- --election-id=ingress-controller-leader
- --http-port=80
- --https-port=443
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --annotations-prefix=nginx.ingress.kubernetes.io
- --enable-ssl-passthrough
- --publish-service=$(POD_NAMESPACE)/nginx-ingress-controller
