新闻详情

新闻详情

首页 / 资讯中心 / 详情

CentOS 7.9源码编译安装Nginx全程实录:从编译参数到反向代理排障

发布时间:2026/9/29 17:39:06来源:尧图网络
CentOS 7.9源码编译安装Nginx全程实录:从编译参数到反向代理排障
做Linux运维和Web服务这块的人几乎都绕不过“在CentOS 7.9上搭nginx”这个活儿。CentOS 7.9虽然生命周期已经进入维护末期但生产环境里存量机器仍然非常多特别是银行、政企、传统IDC机房一堆老业务还跑在上面。nginx作为高性能的Web服务器和反向代理入口在这类环境里几乎是标配。这篇文章不是抄官网文档而是把我实际动手安装、配置、排障的过程完整写出来包括源码编译参数怎么选、systemd托管怎么写、反向代理和静态资源怎么配、遇到坑怎么查适合刚接触Linux的运维新手也适合需要在内网离线环境部署nginx的开发同学参考。1. 环境选型为什么我推荐源码编译而不是yum一把梭很多新手上来就问CentOS 7.9装nginx不是一条yum命令的事吗是也不完全是。yum装起来确实快但实际到了生产环境源码编译才是更稳妥的选择这里面的门道我展开讲讲。1.1 CentOS 7.9的nginx来源差异CentOS 7.9自带的默认yum源里其实没有nginx常见的来源有三个EPEL源装好后默认给的是nginx 1.20.x比较老但胜在稳定。nginx官方yum源能拿到最新的稳定版不过官方源和国内网络之间的下载速度经常让人抓狂很多公司内网根本访问不到。源码编译版本完全自己控制模块随便加编译参数按需定制这是生产环境最可控的方案。我接触的项目里十有八九最后都选了源码编译。原因很现实yum装的nginx默认不带--with-http_ssl_module这种模块倒还好但如果之后想加stub_status监控、加realip拿真实客户端IP就得折腾重新编译或者装额外包非常麻烦。1.2 三种安装方式的适用场景对比我根据自己的经验整理了一张对照表方便你按照实际场景去选安装方式优点缺点适用场景EPEL源 yum安装命令简单依赖自动处理升级走yum版本偏旧无法定制模块临时测试、非关键环境nginx官方yum源版本比较新安装同样方便国内下载速度不稳定企业内网经常不通外网机器、对版本有基本要求源码编译版本、模块、安装路径全部可控编译耗时需要安装开发工具链生产环境、内网环境、需要特殊模块如果你确定要用yum方式我建议优先配nginx官方源配置文件放/etc/yum.repos.d/nginx.repo内容大概是[nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.key配好之后yum install nginx就行版本是当前官方稳定版。但注意公网下载慢的问题依旧存在内网机器基本不用考虑这条路。2. 开工前的准备依赖、目录和磁盘一个都不能省源码编译最怕什么怕编译到一半报错。报错里十有八九是缺开发库所以准备工作宁可多做一步也不要等报错再回头补。2.1 确认系统版本和CPU架构这一步常被忽略但特别关键。先看系统版本和架构cat /etc/redhat-release # 输出示例CentOS Linux release 7.9.2009 (Core) uname -m # x86_64 或者 aarch64架构决定了你下载的源码包本身没什么区别nginx源码是跨平台的但如果你后续想直接复用别人编译好的二进制包就必须严格区分x86_64和aarch64。我在内网见过有人把x86的rpm包往ARM机器上装结果安装失败还得重新找包纯属浪费时间。另外还要确认磁盘空间源码编译完大概占用300MB左右/usr/local分区至少留出2GB才安心。2.2 安装编译依赖库用源码编译nginx必须先把这些包装上yum install -y gcc gcc-c make pcre-devel zlib-devel openssl-devel逐个说下它们是干嘛的gcc和gcc-cC/C编译器不装这个连configure都过不去。make构建工具负责执行编译任务。pcre-develnginx的正则表达式支持location匹配规则靠它实现也很重要。zlib-develgzip压缩模块依赖它你不开gzip可以不要但生产上一般都会用。openssl-develHTTPS支持、HTTP/2支持都离不开它带ssl模块时必须安装。如果是在完全离线的内网环境这些依赖包需要提前下载好rpm包可以用yumdownloader工具配合--resolve参数把依赖一起拉下来再带到内网机器上rpm -ivh批量安装。这是离线部署绕不开的一步别嫌麻烦。2.3 下载并校验nginx源码包nginx版本我推荐选当前的最新稳定版在nginx官网下载页面能找到。写这篇的时候我用的版本是nginx-1.26.2你可以根据实际下载当时的最新稳定版调整。cd /usr/local/src wget http://nginx.org/download/nginx-1.26.2.tar.gz tar -zxvf nginx-1.26.2.tar.gz cd nginx-1.26.2顺手提一句有安全洁癖的可以下载对应的.asc签名文件做PGP校验。nginx官网提供签名公钥导入后校验命令类似于gpg --verify nginx-1.26.2.tar.gz.asc nginx-1.26.2.tar.gz这一步能防止网上被篡改的包。内网环境里这一步可以跳过但公网下载还是建议做一下。3. 源码编译安装完整操作实录这章是全文的重头戏我把从编译参数到systemd托管服务的过程一步一步写清楚。3.1 创建nginx运行用户nginx的master进程以root启动但worker进程不应该以root身份跑这是基本的安全底线。所以要先建一个专门的系统用户useradd -r -s /sbin/nologin nginx-r表示创建系统用户-s /sbin/nologin让这个用户不能登录shell。这样即使nginx被攻击导致worker进程沦陷攻击者也无法通过这个账户直接登录系统能多一层防护。3.2 configure编译参数详解nginx的configure参数决定了最后装出来的形态这一步也是源码编译最大的价值所在。我比较常用的参数组合是./configure \ --prefix/usr/local/nginx \ --usernginx \ --groupnginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_sub_module \ --with-stream \ --with-stream_ssl_module逐个解释--prefix/usr/local/nginx安装目录后续所有文件都在这个目录下面。--usernginx --groupnginx指定worker进程运行的用户和组。--with-http_ssl_module支持HTTPS不配这个没法上证书。--with-http_v2_moduleHTTP/2协议支持现在部署HTTPS基本都会开。--with-http_realip_module获取真实客户端IP必须在反向代理前面有NAT或CDN时使用。--with-http_stub_status_status_module提供简单的连接状态监控页面。--with-stream四层TCP/UDP负载均衡nginx 1.9.0之后才支持很多老教程不会提。--with-http_sub_module内容替换模块偶尔调试用。如果以后想加额外模块比如--with-http_image_filter_module做图片缩放就需要重新编译。所以第一步就把参数定全能省不少事。3.3 make编译与安装目录里直接执行make -j2 make install-j2表示并行编译能用上两个CPU核心如果机器核数多可以写-j4或更大。编译过程一般一两分钟取决于机器性能。如果报错十有八九是依赖库没有装全比如这种checking for PCRE library ... not found ./configure: error: the HTTP rewrite module requires the PCRE library.看到not found就回头看第二步yum install pcre-devel补齐然后重新./configure。安装完成后nginx已经被放到/usr/local/nginx目录下看下版本和编译参数确认是否如预期/usr/local/nginx/sbin/nginx -V-V大写会输出详细编译参数这个命令后面排查问题也经常用。3.4 用systemd管理nginx服务源码编译装的nginx没有systemd服务脚本每次开机手动启动不现实。所以我在/usr/lib/systemd/system/nginx.service里建一个服务文件[Unit] Descriptionnginx - high performance web 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 -c /usr/local/nginx/conf/nginx.conf ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/bin/kill -s HUP $(cat /usr/local/nginx/logs/nginx.pid) ExecStop/bin/kill -s QUIT $(cat /usr/local/nginx/logs/nginx.pid) PrivateTmptrue [Install] WantedBymulti-user.target这里有个细节要注意Typeforking表示nginx主进程会后台化systemd会通过PIDFile追踪进程所以nginx.conf里必须开启pid指令并且路径要和PIDFile保持一致。之后就是标准的启动和设置开机自启systemctl daemon-reload systemctl start nginx systemctl enable nginx systemctl status nginx启动出现active (running)状态就说明服务起来了。如果报错用systemctl status nginx -l看日志或者手动跑/usr/local/nginx/sbin/nginx -t检查配置文件。4. 配置实战虚拟主机、反向代理、静态资源与HTTPS装好只是第一步真正干活全靠配置。这一章我按照最常见的几个场景来拆解每个都是可以直接抄作业的。4.1 主配置结构与虚拟主机nginx.conf的核心结构是四个层main全局配置、events事件模型、httpHTTP服务、server虚拟主机。一个物理机上跑多个网站靠的就是多个server块。先建立项目目录mkdir -p /data/www/example.com echo h1Hello Nginx/h1 /data/www/example.com/index.html然后在/usr/local/nginx/conf/nginx.conf的http块内加一个serverserver { listen 80; server_name example.com www.example.com; root /data/www/example.com; index index.html index.htm; access_log /usr/local/nginx/logs/example.com.log; }server_name支持域名也支持IP。如果请求的Host头匹配哪个server_namenginx就进哪个server块。没人匹配时走默认的server所以建议把默认server设置为一个简洁的错误页防止IP直接访问暴露后端服务。这里提示一句每次改完配置先执行/usr/local/nginx/sbin/nginx -t显示ok和successful之后再systemctl reload nginx。这个习惯能避免很多线上事故。4.2 反向代理与负载均衡反向代理是nginx最常用的场景。通俗点说用户访问80端口nginx在中间把请求转给后端某个服务比如端口8080的Tomcat或Spring Boot应用。最简单的单机反向代理配置server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }proxy_pass后面写http://127.0.0.1:8080不带URI路径表示原样转发请求URI。如果带路径比如proxy_pass http://127.0.0.1:8080/nginx会把location匹配部分替换掉这个细节很容易让人困惑我踩过不止一次坑。机器有多台时用upstream做负载均衡upstream backend_servers { server 192.168.1.10:8080 weight3 max_fails2 fail_timeout30s; server 192.168.1.11:8080 weight1 max_fails2 fail_timeout30s; keepalive 32; } server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_servers; proxy_set_header Host $host; } }weight控制权重max_fails和fail_timeout表示30秒内失败2次就摘掉该节点。这里注意配置了keepalive之后proxy_http_version要设置成1.1否则长连接不生效网上很多教程都漏了这点。4.3 静态资源与root/alias的区别nginx处理静态文件效率极高很多项目把图片、JS、CSS直接交给nginx。核心区别是root和alias这两个指令的路径计算方式不同rootlocation /images/ { root /data/www; }请求/images/logo.png时实际访问的是/data/www/images/logo.png。aliaslocation /images/ { alias /data/web/; }请求/images/logo.png时实际访问的是/data/web/logo.png。一句话总结root会把location中的路径也拼进目录alias不会。很多人配静态资源时出现404大部分就是root和alias搞混了。再加一组常规优化配置location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; access_log off; add_header Cache-Control public; }expires 30d给浏览器一个30天的强缓存静态文件重新发版时记得改文件名否则浏览器会缓存住旧资源。另外location匹配规则有优先级实际配置时记住这个顺序精确匹配最好使^~前缀匹配其次然后是正则~最后才是普通前缀匹配。从高到低排好别让正则把精确路径吃掉。4.4 HTTPS证书配置证书文件准备好之后放到/usr/local/nginx/conf/ssl/目录下比如证书链和私钥文件。配置HTTPS的server块大致长这样server { listen 443 ssl; server_name secure.example.com; ssl_certificate /usr/local/nginx/conf/ssl/example.com.pem; ssl_certificate_key /usr/local/nginx/conf/ssl/example.com.key; ssl_session_cache shared:SSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /data/www/secure; index index.html; } } server { listen 80; server_name secure.example.com; return 301 https://$server_name$request_uri; }第二个server块做HTTP到HTTPS的跳转一条return 301就够了不需要写rewrite那套复杂的规则。关于证书本身生产环境不建议自签名可以申请免费证书或者商业证书。证书过期是生产事故的高发原因我习惯在日历上设置提前一个月的提醒顺便写个定时任务检查证书有效期这个习惯帮我避免了至少两次线上事故。5. 常见问题与排查技巧实录nginx排障只要掌握正确思路其实一点都不难。最核心的两条线索是看错误日志和看nginx -t输出。错误日志默认在/usr/local/nginx/logs/error.log大部分问题的原因都能在这里找到。5.1 启动失败类问题最常见的启动失败信息是nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)这说明80端口被别的进程占了。排查方式ss -lntp | grep :80如果发现是httpd或者其他服务占用了端口把它停掉再启动nginx。如果是nginx自己重复启动就检查是不是systemd里重复执行了start。另一类常见的是配置文件语法错误nginx: [emerg] unknown directive gzipon in /usr/local/nginx/conf/nginx.conf:12gzipon明显是少了空格应该是gzip on;。这种情况下nginx -t会把行号报得明明白白按图索骥去改就行。5.2 运行期故障运行时问题最典型的是502和403。502 Bad Gateway表示nginx连不上后端节点。先检查后端进程是否存活再测试用curl http://127.0.0.1:8080能否直接访问排除后端自身问题然后看proxy_pass是否写对upstream里的IP和端口是否正确最后看一眼SELinux这个坑见5.3节。403 Forbidden通常是缺少index指令指定的文件或者目录没有执行权限。先用ls -ld查看目录权限确认nginx用户对目录有读和执行权限然后查错误日志如果出现Permission denied又是SELinux的范畴了。404则重点检查root和alias的路径拼接是否如预期。我在排障时经常临时加一条location /test { return 200 test; }来验证配置是否生效确认链路通不通。5.3 防火墙与SELinux坑中最坑CentOS 7默认开着firewalld如果外部访问不了80和443端口先看防火墙firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --reload然后是SELinux。很多人装完nginx后一切正常但配置了反向代理之后nginx访问后端端口时报connect() failed (13: Permission denied)日志里看就是权限问题最后罪魁祸首是SELinux。临时可以setenforce 0但生产环境不建议关掉SELinux正确做法是放行对应布尔值setsebool -P httpd_can_network_connect 1如果静态网站目录也出现权限问题可以用chcon -R -t httpd_sys_content_t /data/www给目录打上正确的SELinux标签。我见过太多人一上来就setenforce 0结果下次重启又恢复业务还是不通然后陷入死循环。这里按经验做个速查表现象排查方向常用命令外部访问不通防火墙是否放行firewall-cmd --list-all80端口被占看监听进程ss -lntp | grep :80配置报错语法检查nginx -t502后端进程与proxy_passcurl 127.0.0.1:8080403目录权限/index配置ls -ld /data/www13 Permission deniedSELinuxgetenforce502且日志无特别信息SELinux拦截setsebool -P httpd_can_network_connect 16. 进阶平滑升级与性能调优nginx装好能跑只是及格会平滑升级、会调性能参数才是进阶运维该干的事。6.1 平滑升级不中断服务nginx版本有安全漏洞时最怕升级中断业务。实际上nginx设计得非常优雅支持平滑升级原理是让新旧版本同时运行然后逐步退出旧进程。先说步骤。假设你下载了新版本源码包按原来的configure参数重新编译之后不要直接make install覆盖而是# 1. 备份旧版nginx二进制 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old # 2. 将新版二进制覆盖到安装目录 cp /usr/local/src/nginx-1.27.0/objs/nginx /usr/local/nginx/sbin/nginx # 3. 语法检查 /usr/local/nginx/sbin/nginx -t # 4. 向旧master进程发送USR2信号启动新master kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) # 5. 向旧master发送WINCH信号优雅关闭旧worker kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) # 6. 确认新版本正常后退出旧master kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)如果新版本有问题在步骤6之前还可以通过kill -HUP $(cat /usr/local/nginx/logs/nginx.pid.oldbin)回滚到旧版本。这套流程我实操过很多遍只要按顺序执行业务几乎无感。6.2 核心性能参数调整生产环境我一般会在nginx.conf里做这些调整worker_processes auto; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; multi_accept on; } http { sendfile on; tcp_nopush on; keepalive_timeout 65; keepalive_requests 10000; server_tokens off; gzip on; gzip_types text/plain text/css application/json application/javascript application/xml image/svgxml; }worker_processes auto表示按CPU核心数自动启动worker进程一般一个核一个worker就够了不必贪多。worker_connections每个worker能同时处理的连接数配合worker_rlimit_nofile调大文件描述符上限。multi_accept on让worker一次接受所有新连接能降低连接建立延迟。keepalive_requests调大是为了让单条长连接多干几次活避免频繁握手。系统层面还有两个内核参数值得调。在/etc/sysctl.conf里加net.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535如果并发的短连接特别多net.ipv4.tcp_tw_reuse 1可以复用TIME_WAIT状态的连接但注意这是把双刃剑改完要观察线上表现。6.3 日常维护两个小技巧监控连接状态是检查nginx健康度的第一步。编译时加了--with-http_stub_status_module配置里放一个location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }访问http://127.0.0.1/nginx_status能看到Active connections等指标配合Zabbix或Prometheus就能做基础监控。日志切割也是刚需。不处理的话access.log能撑满磁盘。我给/etc/logrotate.d/nginx写过一个配置/usr/local/nginx/logs/*.log { daily missingok rotate 30 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate [ -f /usr/local/nginx/logs/nginx.pid ] kill -USR1 cat /usr/local/nginx/logs/nginx.pid endscript }kill -USR1是让nginx重新打开日志文件切割过程不需要重启服务。做运维这几年nginx是我接触最多、也最顺手的一个组件。生产环境里我用得最多的其实还是源码编译加systemd这套组合原因无非是可控、可预期。每次改配置之前我都先备份一份然后nginx -t验证再reload顺序从来没变过。最后再分享一个小技巧排查问题时可以用/usr/local/nginx/sbin/nginx -T一次性打印出所有生效配置比在多个conf文件里翻来翻去高效得多。这套流程下来CentOS 7.9上从零搭起一个能扛生产压力的nginx环境基本就是半天之内的事了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

NTP授时服务器搭建与运维实践:chrony、W32Time及防火墙全解析 2026/9/29 22:07:14

NTP授时服务器搭建与运维实践:chrony、W32Time及防火墙全解析

干运维这些年,我越来越觉得授时服务器(NTP)才是系统架构里真正的“压舱石”。它不像数据库、消息队列那样光鲜,平日里没有任何存在感,但只要它一抖,日志对不上、证书验证失败、分布式锁超时、定时任务乱跳&…

阅读更多 →
快手AI Agent万擎团队实习总结:从0到1搭建智能体工作流 2026/9/29 22:07:14

快手AI Agent万擎团队实习总结:从0到1搭建智能体工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
iOS选座页开发:座位状态机、网格渲染与高并发锁座全解析 2026/9/29 22:07:14

iOS选座页开发:座位状态机、网格渲染与高并发锁座全解析

简介:针对iOS开发中电影选座功能的完整实现代码包,适合有一定iOS基础、希望快速上手座位选择交互的开发者。资源围绕类似猫眼的选座流程,详细展示了如何搭建界面布局,以Seat模型管理空闲、已选、禁选等状态,并基于自定…

阅读更多 →
反射是 AOT 的敌人:飞书 .NET SDK 的源生成改造记 2026/9/29 22:07:08

反射是 AOT 的敌人:飞书 .NET SDK 的源生成改造记

先讲一个真实场景 一个跑在 K8s 里的飞书回调服务,过去长这样:容器冷启动 800ms 上下,常驻内存 80MB,夜里没人访问缩容到零,第二天第一个用户把它唤醒,先等一秒的「正在加载」。 这在普通 Web 服务里还能忍…

阅读更多 →
Enfocus Phoenix :印刷拼版解决方案 2026/9/29 22:07:07

Enfocus Phoenix :印刷拼版解决方案

明智的规划,带来卓越的成果 这款人工智能驱动的印刷拼版解决方案,能够改变任何印刷企业的规划和拼版方式。如果您希望通过突破性的作业规划和拼贴功能来大幅缩短时间和降低成本,那么 Phoenix 就是为您量身打造的。Phoenix 会克隆您的生产环境…

阅读更多 →
GBase 8a之SQL运行机制与原理及其常见优化方法 2026/9/29 22:07:00

GBase 8a之SQL运行机制与原理及其常见优化方法

1. SQL产生性能问题的原因及优化方法在GBASE8a运维过程中,经常会遇到以下问题。其原因 一般有以下几种首先,应排除受操作系统资源影响问题,可通过以下命令进行逐项排查。也可通过nmon工具进行直观排查cpu出现瓶颈可参考如下现象内存 磁盘 出现…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉