在 Ubuntu 24.04 中,自己编译的 Nginx 安装在 /usr/local/nginx/,默认不会随系统启动。以下是目前最规范、最稳定、也是大厂通用的做法——使用 systemd 完全接管 Nginx。
一、创建 systemd 服务文件
sudo vim /etc/systemd/system/nginx.service
将以下内容完整复制进去:
[Unit]
Description=The NGINX HTTP and reverse proxy server
Documentation=https://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
LimitNOFILE=65535
Restart=on-failure
RestartSec=1s
[Install]
WantedBy=multi-user.target
二、四条核心命令详细解释(重点)
| 配置项 | 命令 | 详细作用解释 |
|---|---|---|
| ExecStartPre | /usr/local/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;' |
启动前先测试配置文件语法 • -t 测试配置• -q 只输出错误不输出成功信息• -g 强制全局指令,防止配置文件里写了 daemon off;配置错误直接启动失败,避免坏服务上线 |
| ExecStart | /usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;' |
真正启动 Nginx 不带参数即启动 master 进程 强制后台运行,配合 Type=forking 和 PIDFile 让 systemd 正确识别服务状态 |
| ExecReload | /usr/local/nginx/sbin/nginx -s reload |
平滑重载配置(零宕机) 检查新配置 → 启动新 worker → 旧 worker 处理完请求后自动退出 日常改配置后必用命令 |
| ExecStop | /usr/local/nginx/sbin/nginx -s quit |
优雅停止服务 等待所有 worker 处理完当前请求后再退出 比强制 kill 友好得多,避免用户请求被强行中断 |
为什么都要加
-g 'daemon on; master_process on;'?
因为很多人在测试或 Docker 里会把配置改成daemon off;(前台运行),但 systemd 要求服务必须后台运行并 fork 子进程。强制加-g可以彻底杜绝因配置导致的服务启动失败。
三、启用服务
sudo systemctl daemon-reload # 重新加载单元文件
sudo systemctl enable nginx.service # 设置开机自启
sudo systemctl start nginx.service # 立即启动
四、验证是否成功
sudo systemctl status nginx.service
看到类似以下输出即为完美成功:
● nginx.service - The NGINX HTTP and reverse proxy server
Loaded: loaded (/etc/systemd/system/nginx.service; enabled)
Active: active (running) since ...
五、以后只需要记住这几条命令
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启(会短暂断连接)
sudo systemctl reload nginx # 平滑重载(推荐!零宕机)
sudo systemctl status nginx # 查看状态
六、常见坑提前规避
# 确保日志目录和 pid 文件存在
sudo mkdir -p /usr/local/nginx/logs
sudo touch /usr/local/nginx/logs/nginx.pid
sudo chown -R www-data:www-data /usr/local/nginx/logs # 或你的运行用户
# 手动先测一次
sudo /usr/local/nginx/sbin/nginx -t # 配置测试
sudo /usr/local/nginx/sbin/nginx # 手动启动看有没有报错
全部操作完成后,你的自定义编译 Nginx 就和 apt install nginx 安装的效果完全一样:开机自动启动、可以用 systemctl 统一管理、配置重载零宕机、日志清晰、状态一目了然。
以后再也不用每次重启服务器后手动敲 ./nginx 了!