CentOS 8 生产环境编译安装 Nginx 1.18.0 全流程与优化指南

发布时间:2026/8/4 12:22:13
CentOS 8 生产环境编译安装 Nginx 1.18.0 全流程与优化指南 1. 项目概述与核心价值最近在帮一个朋友的公司做服务器环境迁移他们有几台老旧的CentOS 7服务器上面跑着一些核心的业务应用其中Nginx作为前端代理和静态资源服务器版本还停留在1.16。考虑到CentOS 7即将停止维护以及新版本Nginx在性能和安全性上的提升我们决定将系统升级到CentOS 8并同步将Nginx升级到1.18.0版本。这个版本虽然不是最新的但它是1.18.x稳定分支的初始版本在功能、稳定性和社区支持上达到了一个很好的平衡点非常适合生产环境。整个迁移过程从系统安装、环境配置到Nginx的编译安装和优化我重新梳理了一遍踩了几个不大不小的坑也总结出一些能显著提升效率和稳定性的技巧。今天就把在CentOS 8上从零开始安装Nginx 1.18.0的完整过程以及背后的原理和避坑指南毫无保留地分享出来。无论你是刚接触Linux运维的新手还是想了解如何更“地道”地在生产环境部署Nginx的老手这篇文章都能给你提供一份可以直接“抄作业”的详细方案。2. 环境准备与系统调优在开始安装Nginx之前一个干净、稳定且经过初步优化的操作系统环境是基石。CentOS 8虽然已经停止官方维护但其稳定性和生态依然使其成为许多企业环境的选择。我们的目标不仅仅是“装上”而是“装好、装稳”。2.1 系统初始化与基础配置拿到一台新安装的CentOS 8服务器第一件事不是急着装软件而是进行系统级的检查和优化。这就像盖房子前要打好地基一样。首先更新系统到最新的稳定状态。虽然CentOS 8的官方源已归档但我们可以使用centos-vault或almalinux等替代源。这里我推荐使用Vault源因为它保持了CentOS 8原始仓库的纯净性。# 备份原有的repo文件 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup # 下载并替换为Vault源以CentOS 8.5为例请根据你的小版本号调整 sudo sed -i s/mirror.centos.org/$basearch/vault.centos.org/g /etc/yum.repos.d/CentOS-*.repo sudo sed -i s/#baseurl/baseurl/g /etc/yum.repos.d/CentOS-*.repo sudo sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*.repo # 清理缓存并更新系统 sudo yum clean all sudo yum makecache sudo yum update -y注意执行yum update会升级所有包包括内核。对于生产服务器建议在维护窗口进行并做好回滚预案。如果只是测试环境可以放心更新。接下来安装一些基础但至关重要的工具包这些工具在后续的编译、排错和系统管理中会频繁用到。sudo yum groupinstall “Development Tools” -y sudo yum install -y vim wget curl net-tools lsof telnet tree htop nc psmisc其中“Development Tools”组包含了gcc,make,automake等编译工具链这是后续从源码编译Nginx的必备条件。其他工具如net-tools包含ifconfig,netstat、lsof查看进程打开的文件、htop增强版任务管理器都是运维排障的利器。2.2 防火墙与SELinux策略规划CentOS 8默认使用firewalld作为防火墙SELinux也处于强制模式。对于Nginx这样的Web服务我们需要正确配置它们而不是简单地关闭。一关了之会带来安全风险。配置Firewalld开放端口Nginx默认监听80HTTP和443HTTPS端口。我们需要永久开放这两个端口。# 查看当前防火墙区域和规则 sudo firewall-cmd --list-all # 永久开放80和443端口 sudo firewall-cmd --permanent --add-port80/tcp sudo firewall-cmd --permanent --add-port443/tcp # 重载防火墙配置使其生效 sudo firewall-cmd --reload # 再次确认规则 sudo firewall-cmd --list-ports规划SELinux策略SELinux可能会阻止Nginx访问非标准目录下的网页文件或日志。我们有三种策略临时关闭不推荐用于生产setenforce 0。重启失效。永久禁用不推荐修改/etc/selinux/config设置SELINUXdisabled需重启。正确配置上下文推荐这是最安全的方式。例如如果你的网站根目录不是/usr/share/nginx/html就需要用semanage和chcon命令修改该目录的安全上下文。# 安装SELinux策略管理工具 sudo yum install -y policycoreutils-python-utils # 假设你的网站目录是 /data/www sudo semanage fcontext -a -t httpd_sys_content_t “/data/www(/.*)?” sudo restorecon -Rv /data/www这样SELinux就允许Nginx进程访问/data/www目录下的内容了。在安装完Nginx后如果遇到403权限错误但文件和目录权限都正确首先要排查的就是SELinux。3. Nginx 1.18.0 编译安装详解为什么选择编译安装而不是直接用yum安装yum安装的Nginx版本往往不是最新的且模块是预编译好的无法灵活裁剪或添加第三方模块。编译安装虽然步骤稍多但能让我们获得指定版本如1.18.0。自定义安装路径便于管理。选择需要的模块减少软件体积和潜在安全风险。方便集成如ngx_cache_purge、headers-more等第三方模块。3.1 依赖库的安装与验证Nginx的编译依赖于几个核心库缺少它们会导致配置或编译失败。# 安装PCRE库用于Rewrite模块的正则表达式支持 sudo yum install -y pcre pcre-devel # 安装OpenSSL库用于HTTPS支持 sudo yum install -y openssl openssl-devel # 安装zlib库用于Gzip压缩 sudo yum install -y zlib zlib-devel安装完成后最好验证一下这些开发包是否安装成功可以查看对应的devel包是否已安装。rpm -qa | grep -E “pcre-devel|openssl-devel|zlib-devel”3.2 源码下载、编译与安装现在进入核心步骤。我们将从Nginx官网下载源码进行编译和安装。第一步创建专用系统用户为了安全我们不建议Nginx以root用户运行。创建一个没有登录权限的nginx用户和组。sudo groupadd -r nginx sudo useradd -r -g nginx -s /sbin/nologin -M nginx # -r 创建系统用户-g 指定主组-s 指定无法登录的shell-M 不创建家目录第二步下载并解压源码访问Nginx官网nginx.org找到1.18.0的稳定版下载链接。使用wget下载到服务器。# 进入一个临时工作目录比如 /usr/local/src cd /usr/local/src # 下载Nginx 1.18.0源码包 sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz # 验证文件完整性可选但推荐 sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz.asc # 需要导入Nginx的签名公钥来验证这里先跳过生产环境建议做 # 解压源码包 sudo tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0第三步配置编译选项这是最关键的一步./configure脚本决定了Nginx将包含哪些功能、安装到哪里。下面是一个兼顾通用性和生产需求的配置示例./configure \ --prefix/usr/local/nginx \ --usernginx \ --groupnginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module \ --with-threads配置参数解读--prefix/usr/local/nginx指定安装根目录。所有Nginx文件都将安装在此目录下结构清晰。--user/--groupnginx指定运行工作进程的用户和组。--with-http_ssl_module启用HTTPS支持必须。--with-http_v2_module启用HTTP/2协议支持提升性能。--with-http_realip_module当Nginx前面有代理如CDN、负载均衡器时此模块能获取到客户端的真实IP。--with-http_stub_status_module启用状态页用于监控Nginx的运行状态通过访问/nginx_status。--with-stream启用TCP/UDP代理模块可用于做数据库负载均衡等四层代理。--with-threads启用线程池用于处理异步IO在高负载下能改善性能。执行./configure后仔细查看输出。如果最后显示“configuration is successful”说明所有依赖检查通过。如果失败通常会明确告诉你缺少哪个库根据提示安装对应的devel包即可。第四步编译与安装配置成功后使用make进行编译make install进行安装。# 编译-j参数指定并行编译的作业数通常设为CPU核心数可以加快速度 sudo make -j$(nproc) # 安装 sudo make install安装完成后Nginx的可执行文件、配置文件、日志目录等都会出现在/usr/local/nginx下。3.3 目录结构与权限检查安装完成后让我们查看一下生成的关键目录并确保权限正确。ls -lh /usr/local/nginx/典型的目录结构如下sbin/nginx主程序文件。conf/nginx.conf主配置文件。html/默认的网站根目录。logs/存放访问日志和错误日志。我们需要确保logs目录对nginx用户可写否则Nginx将无法启动。sudo chown -R nginx:nginx /usr/local/nginx/logs4. 服务配置、启动与基础优化软件安装只是第一步将其配置成系统服务并优化才能投入生产使用。4.1 创建Systemd服务单元文件CentOS 8使用Systemd管理服务。我们需要创建一个服务文件让Nginx可以像systemctl start nginx这样方便地管理。创建文件/usr/lib/systemd/system/nginx.servicesudo vim /usr/lib/systemd/system/nginx.service写入以下内容[Unit] DescriptionThe nginx HTTP and reverse proxy server Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking 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 PrivateTmptrue Usernginx Groupnginx [Install] WantedBymulti-user.target关键点解析TypeforkingNginx以守护进程模式运行。PIDFile指定Nginx主进程PID文件的位置ExecReload和ExecStop命令依赖于此。ExecStartPre在启动前执行nginx -t测试配置文件语法这是一个非常好的安全实践防止配置错误导致服务无法启动。User/Group指定服务运行的身份。保存后重新加载Systemd配置并启用开机自启sudo systemctl daemon-reload sudo systemctl enable nginx4.2 启动、停止与状态检查现在可以使用Systemd命令来管理Nginx了# 启动Nginx sudo systemctl start nginx # 查看运行状态 sudo systemctl status nginx # 停止Nginx sudo systemctl stop nginx # 重启Nginx先停止再启动 sudo systemctl restart nginx # 重新加载配置文件不中断服务 sudo systemctl reload nginx如果status显示active (running)并且用curl http://localhost能返回Nginx的欢迎页面说明安装成功。4.3 基础配置文件优化默认的nginx.conf配置文件是功能性的但针对生产环境我们可以做一些基础优化。主要修改/usr/local/nginx/conf/nginx.conf中的http块。1. 调整工作进程数worker_processes参数通常设置为与CPU逻辑核心数相等或设置为auto让Nginx自动检测。worker_processes auto;2. 调整每个工作进程的连接数events块下的worker_connections定义了每个工作进程同时处理的最大连接数。这个值受系统“最大打开文件数”限制。events { worker_connections 1024; # 使用epoll高效I/O模型Linux特有 use epoll; # 尽可能接受更多连接 multi_accept on; }3. 优化HTTP基础配置在http块内可以设置一些提升性能和安全性的全局参数。http { # 关闭在错误页面和Server响应头中显示Nginx版本号增强安全性 server_tokens off; # 设置文件传输使用的sendfile机制高效 sendfile on; # 与sendfile配合当数据包大于特定大小时才立即发送减少小包网络开销 tcp_nopush on; # 禁用Nagle算法提高实时性 tcp_nodelay on; # 保持连接超时时间降低连接建立开销 keepalive_timeout 65; # 启用Gzip压缩减少传输体积 gzip on; gzip_min_length 1k; gzip_comp_level 2; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript; }修改完配置后务必使用sudo systemctl reload nginx平滑重载配置或者先使用/usr/local/nginx/sbin/nginx -t测试配置语法是否正确。5. 常见问题排查与实战技巧即使按照步骤操作在实际部署中也可能遇到各种问题。下面是我总结的几个典型问题及其解决方案。5.1 启动失败与日志分析问题现象执行systemctl start nginx后状态显示failed。排查思路查看具体错误信息sudo systemctl status nginx -l会显示更详细的错误日志。检查配置文件语法手动执行sudo /usr/local/nginx/sbin/nginx -t。最常见的错误是nginx.conf里多了或少了一个分号、括号。检查端口占用Nginx默认监听80端口如果该端口已被Apache、其他Nginx实例或某个应用占用则会启动失败。使用sudo netstat -tlnp | grep :80或sudo ss -tlnp | grep :80查看。检查权限问题nginx用户是否有权读取配置文件(nginx.conf)logs目录是否有写入权限我们之前已经设置过如果使用了自定义的access_log或error_log路径该路径是否存在且nginx用户有权写入检查SELinux如果以上都正确查看/var/log/audit/audit.log或使用sudo ausearch -m avc -ts recent命令看是否有SELinux拒绝访问的日志。临时可以setenforce 0测试长期需按前文配置安全上下文。5.2 访问403 Forbidden错误问题现象Nginx服务运行正常但访问网站返回403。排查思路检查网站根目录权限确保Nginx进程用户nginx对网站根目录如/usr/local/nginx/html或自定义目录至少有r读和x执行权限。执行权限对于进入目录是必须的。sudo chmod -R 755 /your/webroot sudo chown -R nginx:nginx /your/webroot检查索引文件确认index指令指定的文件如index index.html index.htm;存在于根目录中。再次确认SELinux这是403错误的常见“元凶”。确保网站目录的安全上下文是httpd_sys_content_t。5.3 性能相关配置调优安装完成后可以通过一些调整来进一步提升Nginx的性能表现。调整进程打开文件数限制Nginx的worker_connections值受限于Linux系统对单个进程打开文件数的限制ulimit -n。我们需要提高这个限制。 编辑/etc/security/limits.conf在文件末尾添加nginx soft nofile 65535 nginx hard nofile 65535 * soft nofile 65535 * hard nofile 65535第一、二行专门为nginx用户设置第三、四行为所有用户设置需要重启后生效。修改后需要重启Nginx服务。启用状态页进行监控在nginx.conf的server块中添加一个location来启用stub_status模块。location /nginx_status { stub_status on; access_log off; # 建议限制访问IP例如 allow 192.168.1.0/24; deny all; allow 127.0.0.1; deny all; }重启Nginx后访问http://your-server-ip/nginx_status你会看到一个包含活动连接数、请求统计等信息的简单页面这对于监控非常有用。连接超时与缓冲优化根据业务类型调整以下参数可以更好地处理慢客户端或预防某些攻击。http { # ... client_body_timeout 10; client_header_timeout 10; send_timeout 10; client_body_buffer_size 128k; client_header_buffer_size 1k; large_client_header_buffers 4 4k; client_max_body_size 10m; # 根据业务调整允许上传文件的大小 }5.4 升级与模块管理心得后续如何平滑升级假设未来需要从1.18.0升级到1.20.x。下载新版本源码在另一目录如/usr/local/src/nginx-1.20.1中配置、编译。./configure的参数尽量与旧版本保持一致你可以从旧版本的/usr/local/nginx/sbin/nginx -V输出中获取。编译完成后不要执行make install这会覆盖旧版本。备份旧的可执行文件cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old将新编译好的objs/nginx文件复制覆盖旧的可执行文件cp /usr/local/src/nginx-1.20.1/objs/nginx /usr/local/nginx/sbin/nginx测试新版本sudo /usr/local/nginx/sbin/nginx -t平滑升级sudo kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)。此时新旧主进程会并存旧进程处理完已有连接后退出。如果新版本运行稳定可以删除备份文件。如果出现问题可以立即用备份的旧文件替换回来重启。如何添加第三方模块比如要添加headers-more-nginx-module。下载第三方模块源码。在./configure时通过--add-module/path/to/module参数添加。重新make不要make install。替换可执行文件方法同上述升级步骤。最后一个小技巧养成修改配置文件前先备份的习惯。cp nginx.conf nginx.conf.bak.$(date %Y%m%d)。在测试任何重大配置变更前先在另一台测试机或容器里验证。Nginx的配置语法虽然严谨但一个不起眼的错误就可能导致服务中断。用好nginx -t这个语法检查工具它能帮你避免90%的配置错误。