Ubuntu下自编译 Nginx 实现开机自启动完整指南

By | 2025-12-05

在 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 了!

发表评论

邮箱地址不会被公开。 必填项已用*标注