15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
21.10.2024

如何在 Linux 上管理 Nginx:启动、停止、重启和重新加载

Nginx 是一款高性能、事件驱动的 Web 服务器和反向代理,服务于全球数百万个生产环境。其生命周期管理——启动、停止、重启和重载——通过 Linux 初始化系统控制,可以是 systemd(Ubuntu 16.04+、CentOS 7+、Debian 8+)或传统的 SysVinit 框架。restartreload 之间的关键区别并非表面上的:重启会终止所有活动连接,而重载则通过在优雅地排空旧工作进程之前派生新工作进程来执行零停机配置切换。

本指南涵盖您所需的每个操作命令、每个命令的底层机制、预检配置验证、基于日志的诊断,以及在生产环境中导致静默故障的边缘情况。

前提条件

在发出任何 Nginx 管理命令之前,请确认以下内容:

  • 您拥有 root 访问权限或具有 sudo 权限的用户账户。
  • Nginx 已安装(nginx -v 应返回版本字符串)。
  • 您了解您的发行版使用哪个初始化系统(systemctl --version 确认为 systemd;其缺失表示使用 SysVinit 或其他管理器)。

如果您正在配置全新服务器,运行 Ubuntu 22.04 LTS 或 Debian 12 的 VPS 托管环境将默认使用 systemd,这是所有新部署的推荐路径。

了解 Nginx 进程模型

Nginx 以一个主进程和一个或多个工作进程运行。主进程读取配置、绑定到特权端口(80、443)并管理工作进程的生命周期。工作进程处理实际的客户端连接。这种架构正是 reload 在生产环境中安全的原因:主进程使用更新后的配置派生新工作进程,同时现有工作进程继续处理正在进行的请求,然后干净地退出。

当您发出硬 restart 时,主进程本身会终止并重启,丢弃所有打开的连接。请将此操作保留用于主进程本身处于异常状态或二进制升级后的情况。

使用 systemd 管理 Nginx(现代 Linux 发行版)

systemd 是所有现代 Linux 发行版上的标准服务管理器。Nginx 通过单元文件与其集成,通常位于 /lib/systemd/system/nginx.service

启动 Nginx

sudo systemctl start nginx

这将激活 Nginx 服务单元。如果主进程无法绑定到端口或遇到配置错误,systemd 将立即报告失败。使用 echo $? 检查退出代码——非零值表示启动失败。

停止 Nginx

sudo systemctl stop nginx

这会向 Nginx 主进程发送 SIGTERM,然后主进程通知工作进程在关闭前完成活动请求。如果工作进程在配置的超时时间内未退出,systemd 将发送 SIGKILL。在繁忙的服务器上,这可能导致连接断开——请尽可能使用 reload 代替。

重启 Nginx

sudo systemctl restart nginx

重启是依次执行停止后再启动的操作。所有活动连接都将被终止。仅在以下情况下使用:

  • Nginx 二进制文件本身已更新。
  • 主进程无响应。
  • 您需要释放并重新绑定监听套接字(例如,端口更改后)。

重启前务必运行配置测试(详见下方验证部分)。

重载 Nginx(零停机配置应用)

sudo systemctl reload nginx

这是在生产环境中应用配置更改的正确命令。在内部,systemd 向 Nginx 主进程发送 SIGHUP。主进程重新读取 nginx.conf,对其进行验证,并派生新的工作进程。旧工作进程继续处理现有连接直到空闲,然后退出。整个过渡对最终用户是无感知的。

关键边缘情况:如果新配置包含错误,reload 在某些发行版上会静默失败——旧配置保持活动状态,但终端不会显示任何错误。这就是为什么在每次重载前使用 nginx -t 进行预验证是不可或缺的。

检查 Nginx 状态

sudo systemctl status nginx

此命令显示服务状态(active (running)inactive (dead)failed)、主进程的 PID、内存和 CPU 使用情况,以及日志的最后几行。这是诊断任何 Nginx 问题的最快第一步。

健康实例的示例输出:

● nginx.service - A high performance web server and a reverse/proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-01-13 10:22:04 UTC; 2h 15min ago
       Docs: man:nginx(8)
    Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on;
   Main PID: 1235 (nginx)
      Tasks: 3 (limit: 4915)
     Memory: 6.4M
        CPU: 312ms
     CGroup: /system.slice/nginx.service
             ├─1235 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─1236 "nginx: worker process"
             └─1237 "nginx: worker process"

启用 Nginx 开机自启

sudo systemctl enable nginx

如果没有此设置,Nginx 在服务器重启后不会自动启动。将其与 start 命令配合使用,通过单个调用完成:

sudo systemctl enable --now nginx

禁用 Nginx 自动启动

sudo systemctl disable nginx

使用 SysVinit 管理 Nginx(旧版系统)

SysVinit 存在于已停止维护的发行版中,如 CentOS 6 和 Ubuntu 14.04。service 包装器为位于 /etc/init.d/ 的初始化脚本提供了一致的接口。

操作SysVinit 命令
启动`sudo service nginx start`
停止`sudo service nginx stop`
重启`sudo service nginx restart`
重载`sudo service nginx reload`
状态`sudo service nginx status`

如果您仍在生产环境中运行基于 SysVinit 的系统,强烈建议迁移到受支持的发行版。这些系统不再接收安全补丁,这对任何面向互联网的服务器都会造成重大风险。

systemd 与 SysVinit:命令对比

操作systemdSysVinit
启动服务`systemctl start nginx``service nginx start`
停止服务`systemctl stop nginx``service nginx stop`
重启服务`systemctl restart nginx``service nginx restart`
重载配置`systemctl reload nginx``service nginx reload`
检查状态`systemctl status nginx``service nginx status`
开机自启`systemctl enable nginx``chkconfig nginx on`
禁用开机自启`systemctl disable nginx``chkconfig nginx off`
查看日志`journalctl -u nginx``/var/log/nginx/error.log`

任何服务变更前的配置验证

这是管理 Nginx 时最重要的操作习惯。损坏的配置文件将导致 restart 失败,并使您的服务器离线。

sudo nginx -t

通过测试后返回:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如需同时打印已解析配置的详细输出(在调试 include 指令时很有用):

sudo nginx -T

nginx -T 将整个合并后的配置转储到标准输出,对于审计跨 /etc/nginx/conf.d//etc/nginx/sites-enabled/ 分布的多个服务器块的复杂设置非常有价值。

安全配置更改的工作流程:

# 1. Edit your configuration
sudo nano /etc/nginx/nginx.conf

# 2. Validate — stop here if errors are reported
sudo nginx -t

# 3. Apply with zero downtime
sudo systemctl reload nginx

# 4. Confirm the service is still healthy
sudo systemctl status nginx

直接向 Nginx 主进程发送信号

对于 systemd 不可用或需要精细控制的场景,Nginx 通过 nginx -s 直接接受 POSIX 信号:

sudo nginx -s reload    # Equivalent to SIGHUP — graceful config reload
sudo nginx -s reopen    # Reopen log files (used after log rotation)
sudo nginx -s stop      # Fast shutdown (SIGTERM)
sudo nginx -s quit      # Graceful shutdown — waits for workers to finish

主进程 PID 默认存储在 /var/run/nginx.pid 中。您也可以手动发送信号:

sudo kill -HUP $(cat /var/run/nginx.pid)

reopen 信号在日志轮转管道中尤为重要。当 logrotate 移动 /var/log/nginx/access.log 时,Nginx 会继续写入旧的文件描述符,直到您发送 reopen,此时它才会创建并写入新的文件路径。

诊断故障:日志与日志记录

当 Nginx 无法启动或重载时,有两个来源提供诊断数据。

systemd 日志

sudo journalctl -u nginx --since "10 minutes ago"

在重启尝试期间跟踪实时输出:

sudo journalctl -u nginx -f

Nginx 错误日志

sudo tail -n 50 /var/log/nginx/error.log

实时监控:

sudo tail -f /var/log/nginx/error.log

常见故障模式及其原因:

  • bind() to 0.0.0.0:80 failed (98: Address already in use) — 另一个进程(Apache、之前的 Nginx 实例)占用了端口 80。使用 sudo ss -tlnp | grep :80 识别它。
  • open() "/var/log/nginx/error.log" failed (13: Permission denied) — Nginx 工作进程用户缺少对日志目录的写入权限。
  • nginx: [emerg] unknown directivenginx.conf 中存在拼写错误或不支持的模块指令。nginx -t 输出将包含确切的文件和行号。
  • connect() failed (111: Connection refused) while connecting to upstream — Nginx 正在运行,但上游应用程序(PHP-FPM、Node.js)未运行。这出现在错误日志中,而非启动期间。

在带有控制面板的服务器上管理 Nginx

如果您的服务器运行 cPanel 或 Plesk 等控制面板,Nginx 可能作为 Apache 前端的反向代理层或主要 Web 服务器进行管理。在这些环境中,不要在不了解面板服务编排的情况下使用原始 systemctl 命令重启 Nginx——某些面板会覆盖 systemd 单元文件,并通过其自己的守护进程监控器管理 Nginx。

对于 cPanel 管理的环境,正确的重启命令通常是:

/scripts/restartsrv_nginx

带 cPanel 的 VPS 部署通过 WHM 的服务管理器处理服务管理,该管理器提供 GUI 界面以及上述 CLI 脚本。

对于希望在没有面板的情况下完全手动控制的环境,请探索可用的 VPS 控制面板,找到适合您操作模式的管理层。

专用硬件上的 Nginx

将 Nginx 作为负载均衡器或 TLS 终止点运行的高流量部署可从专用资源中显著受益。在独立服务器上,您可以精确调整工作进程数量以匹配物理 CPU 核心数,配置较大的 worker_connections 值而无需与其他租户竞争,并充分发挥内核级优化(SO_REUSEPORTsendfiletcp_nopush)的潜力。服务管理命令与 VPS 环境相同——区别在于您可以配置什么,而不是如何控制服务。

如果您的 Nginx 实例终止 HTTPS 流量,请确保您的 TLS 证书是最新的。过期证书会导致即时连接失败,而 systemctl status nginx 不会显示这些失败——服务看起来健康,而客户端收到 SSL 握手错误。主动管理您的 SSL 证书可防止此类静默故障。

操作决策矩阵

使用此矩阵为给定情况选择正确的管理操作:

情况正确操作原因
编辑了 `nginx.conf` 或服务器块`nginx -t` 然后 `reload`零停机配置应用
Nginx 二进制文件已升级`restart`新二进制文件必须加载到内存中
端口绑定已更改`restart`主进程必须重新绑定套接字
日志轮转已完成`nginx -s reopen`重新打开文件描述符到新日志路径
主进程无响应`stop` 然后 `start`强制终止并重新初始化
需要验证服务健康状态`systemctl status nginx`显示 PID、运行时间、最近日志行
诊断启动失败`journalctl -u nginx` + `nginx -t`来自两个来源的完整错误上下文
检查哪个进程占用端口 80`ss -tlnpgrep :80`在启动前识别端口冲突

关键技术要点

  • restartreload 之前务必运行 sudo nginx -t失败的测试可防止您使用损坏的配置使正在运行的服务器离线。
  • 在生产环境中优先使用 reload 而非 restart它不会造成中断,并处理 99% 的配置更改场景。
  • 需要手动关闭时,nginx -s quitnginx -s stop 更安全——它会等待工作进程排空活动连接。
  • systemctl enable nginxsystemctl start nginx 是分开的。忘记 enable 意味着 Nginx 在重启后将无法存活。
  • nginx -T(大写)转储完整的已解析配置,包括所有包含的文件——在重大更改前使用它来验证有效配置。
  • 控制面板环境有其自己的重启脚本。在 cPanel 或 Plesk 中使用原始 systemd 命令可能导致状态不一致。
  • 在任何配置部署期间持续监控 /var/log/nginx/error.log上游错误和权限问题出现在这里,而不是在 systemctl status 中。

常见问题解答

nginx restartnginx reload 有什么区别?

restart 终止主进程和所有工作进程,丢弃活动连接,然后重新启动。reload 向主进程发送 SIGHUP,主进程使用更新后的配置派生新工作进程,同时旧工作进程继续处理现有请求——实现零停机。

为什么 sudo systemctl restart nginx 失败,即使 nginx -t 通过了?

通过配置测试并不保证启动成功。常见原因包括端口冲突(另一个进程已绑定到端口 80 或 443)、配置中引用的 SSL 证书文件缺失,或文件描述符限制不足。失败后立即检查 journalctl -u nginx 以获取具体错误。

如何在不停机的情况下应用配置更改?

运行 sudo nginx -t 进行验证,然后运行 sudo systemctl reload nginx。这将执行优雅的就地工作进程替换。现有连接不会中断。

如何使 Nginx 在服务器重启后自动启动?

运行 sudo systemctl enable nginx。这会在适当的 systemd 目标目录中创建符号链接。将其与 sudo systemctl start nginx 结合使用,或使用 sudo systemctl enable --now nginx 通过单个命令启用并启动。

Nginx 日志位于何处,如何实时读取?

默认情况下,错误日志位于 /var/log/nginx/error.log,访问日志位于 /var/log/nginx/access.log。使用 sudo tail -f /var/log/nginx/error.log 实时跟踪任一日志。如需带时间戳和严重性过滤的结构化日志查看,请使用 sudo journalctl -u nginx -f

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用