源码安装的 nginx 需手动创建 systemd 服务文件才能用 systemctl 管理;需确认主程序、配置文件、pid 文件路径及运行用户,编写 /etc/systemd/system/nginx.service 并设置 type=forking、正确 execstartpre/execstart、pidfile 和权限,最后 daemon-reload、start、enable 并 status 验证。

源码安装的 Nginx 默认不带 systemd 服务文件,必须手动创建并启用,才能用 systemctl 正常启停、查看状态和设置开机自启。
确认实际安装路径与关键配置
先查清你的 Nginx 实际部署位置,避免服务文件中路径写错导致启动失败:
- 主程序路径:通常为
/usr/local/nginx/sbin/nginx,可用/usr/local/nginx/sbin/nginx -V验证,或运行find /usr -name nginx 2>/dev/null - 配置文件路径:默认是
/usr/local/nginx/conf/nginx.conf,ExecStartPre和ExecStart中需显式指定(尤其当你用了-c参数时) - PID 文件路径:Nginx 启动后生成
/usr/local/nginx/logs/nginx.pid,PIDFile=必须与此严格一致;该路径需与nginx.conf中pid指令值相同(如未修改,默认即此路径) - 运行用户:若编译时指定了
--user=www --group=www,且nginx.conf中有user www;,则服务文件中User=和Group=应设为www,并确保该用户对conf/、logs/、html/有读写权限
编写标准的 nginx.service 文件
在 /etc/systemd/system/nginx.service 创建服务单元文件(优先级高于 /usr/lib/systemd/system/),内容如下(请按你的真实路径和用户调整):
[Unit] Description=The NGINX HTTP and reverse proxy server After=network.target [Service] Type=forking 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 $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID Restart=on-failure RestartSec=3 User=root Group=root LimitNOFILE=65535 [Install] WantedBy=multi-user.target
说明要点:
-
Type=forking:适配 Nginx 主进程 fork 子进程的模式;不要改成simple,除非你强制daemon off;(不推荐生产环境) -
ExecStartPre带-c显式指定配置文件,确保语法检查准确;若省略,Nginx 会按默认路径找,可能误判 -
ExecStop推荐用QUIT信号,比TERM更温和,能等待 worker 处理完请求再退出 - 若以非 root 用户运行 worker(如
www),User/Group可设为该用户,但ExecStart仍需 root 权限来绑定 80/443 端口
启用并验证 systemd 管理
保存文件后,执行以下命令完成启用:
- 重载配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start nginx - 设为开机自启:
sudo systemctl enable nginx - 检查状态:
sudo systemctl status nginx(应显示active (running)) - 查错误日志:
sudo journalctl -u nginx -n 20 --no-pager,重点关注启动失败时的报错行
注意:启动前建议先手动执行 /usr/local/nginx/sbin/nginx -s stop 停掉已有进程,避免端口冲突或 PID 文件残留干扰。











