源码编译安装nginx需先装全依赖(gcc、pcre-devel、zlib-devel、openssl-devel),再执行./configure指定路径与模块,make && make install后配置systemd服务文件并设type=forking,最后开放防火墙端口并处理selinux权限。

直接用包管理器装最省事,但想自定义模块或用新版就得编译安装;开机自启必须靠 systemd 服务文件,/etc/init.d/nginx 脚本在现代发行版里基本失效了。
源码编译安装(推荐生产环境)
编译安装能控制模块、路径和版本,避免包管理器的老旧版本限制。关键点不是“能不能装”,而是“少装哪个依赖就卡在哪”:
-
yum install -y gcc pcre-devel zlib-devel openssl-devel必须一次性装全——缺pcre-devel会报the HTTP rewrite module requires the PCRE library;缺openssl-devel则--with-http_ssl_module直接失败 - 解压后进目录执行:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module,--prefix建议固定路径,别用默认,否则后续服务文件路径容易写错 -
make && make install后检查:/usr/local/nginx/sbin/nginx -t必须返回success才算配置层可用
手动配置 systemd 服务(CentOS 7+/Ubuntu 16.04+ 通用)
旧教程里扔 /etc/init.d/nginx 然后 chkconfig 的方式,在 systemd 系统上根本不会开机启动。正确做法是写标准 service 文件:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 新建
/lib/systemd/system/nginx.service(或/etc/systemd/system/nginx.service),内容里ExecStart和ExecReload的路径必须跟你--prefix指定的一致,比如装在/usr/local/nginx,就不能写成/usr/sbin/nginx -
Type=forking是必须的——Nginx 主进程会 fork 出 worker 进程,simple类型会导致systemctl start认为启动失败 - 写完执行:
systemctl daemon-reload && systemctl enable nginx && systemctl start nginx,然后systemctl is-enabled nginx应返回enabled
防火墙与端口权限(常被忽略的连通性问题)
装完启动成功,ps -ef | grep nginx 也能看到进程,但浏览器打不开——八成是这两个地方卡住:
- 非 root 用户无法绑定 80/443 端口:
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)。要么用sudo启动,要么改配置里listen 8080,别硬扛 - firewalld 默认拦 80 端口:
firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload,只加--permanent不 reload 是无效的 - SELinux 启用时(如 CentOS 默认),即使端口放行,也会拦截连接,临时验证可
setenforce 0,长期方案是semanage port -a -t http_port_t -p tcp 80
真正麻烦的从来不是“怎么装”,而是路径写错一个字符、Type 选错类型、或者忘了 reload systemd 配置——这些错误不报明显异常,只让服务静默失效。










