root@hk-it:/etc/nginx# nginx -s reload nginx: [error] invalid PID number ““ in “/var/run/nginx.pid“

起因

今天在重启nginx时nginx -s reload,遇到一个报错

root@hk-it:/etc/nginx# nginx -s reload
nginx: [error] invalid PID number "" in "/var/run/nginx.pid"

image.png

解决步骤

这个错误信息表示 Nginx 在尝试重新加载配置时遇到了问题。具体来说,Nginx 试图读取它的 PID 文件(通常是为了找到正在运行的 Nginx 主进程的进程 ID),但发现该文件中没有有效的 PID(进程 ID)数字。

PID 文件通常位于 /var/run/nginx.pid,并且包含了运行中的 Nginx 主进程的进程 ID。Nginx 重载时需要这个 ID 来向主进程发送信号,告诉它重新加载配置文件。

出现这个错误可能有几个原因:

  1. Nginx 没有在运行。如果 Nginx 主进程没有启动,那么 PID 文件将不存在或者为空。
  2. PID 文件的路径不正确。可能是配置文件中指定的 PID 文件路径不对,或者在启动 Nginx 时指定了错误的 PID 文件路径。
  3. 权限问题。如果运行 Nginx 的用户没有权限读取 PID 文件,也可能导致这个错误。

解决这个问题的步骤可能包括:

  • 确保 Nginx 正在运行。可以使用命令 ps aux | grep nginx 来检查 Nginx 进程是否存在。
  • 检查 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf)中的 pid 指令,确保它指向正确的 PID 文件路径。
  • 检查 /var/run/nginx.pid 文件的权限,确保运行 Nginx 的用户有权读取该文件。
  • 如果 PID 文件丢失或损坏,尝试重新启动 Nginx 以生成新的 PID 文件。可以使用命令 service nginx restartsystemctl restart nginx 来重启 Nginx 服务。

如果以上步骤不能解决问题,可能需要检查 Nginx 的日志文件以获取更多的信息,日志文件通常位于 /var/log/nginx/ 目录下。

紧接着我执行了systemctl status nginx.service

image.png

 status nginx.service
× nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2024-03-25 14:39:44 CST; 55s ago
       Docs: man:nginx(8)
    Process: 2967784 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 2967785 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
        CPU: 14ms

Mar 25 14:39:41 hk-it systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 25 14:39:41 hk-it nginx[2967785]: nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Unknown error)
Mar 25 14:39:42 hk-it nginx[2967785]: nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Unknown error)
Mar 25 14:39:42 hk-it nginx[2967785]: nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Unknown error)
Mar 25 14:39:43 hk-it nginx[2967785]: nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Unknown error)
Mar 25 14:39:43 hk-it nginx[2967785]: nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Unknown error)
Mar 25 14:39:44 hk-it nginx[2967785]: nginx: [emerg] still could not bind()
Mar 25 14:39:44 hk-it systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Mar 25 14:39:44 hk-it systemd[1]: nginx.service: Failed with result 'exit-code'.
Mar 25 14:39:44 hk-it systemd[1]: Failed to start A high performance web server and a reverse proxy server.

Nginx 服务启动失败的原因是因为它试图绑定到 0.0.0.0:3000,但是这个端口已经被其他进程占用了。这在日志中的 “nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Unknown error)” 一行中可以看出。

在 Unix 和 Linux 系统中,一个端口在同一时间只能被一个进程绑定。如果一个进程试图绑定到一个已经被其他进程使用的端口,系统就会返回一个错误。

可以使用 netstat -tuln | grep :3000 命令来查看哪个进程正在使用 3000 端口。

如果确定 3000 端口是需要给 Nginx 使用的,可能需要停止那个占用 3000 端口的进程,或者更改那个进程的配置,让它使用其他的端口。

另外一个可能的解决方案是更改 Nginx 的配置,让它使用其他的端口。可以在 Nginx 的配置文件中找到类似 listen 3000; 的行,然后将 3000 改为其他的未被使用的端口号。然后再次尝试启动 Nginx 服务。

然后我执行了netstat -tuln | grep :3000

image.png

这个命令的输出显示,确实有一个进程正在监听 0.0.0.0:3000 端口,并且处于 LISTEN 状态。这意味着某个进程已经占用了 3000 端口,导致 Nginx 无法绑定到这个端口上。

要解决这个问题,可以采取以下步骤:

  1. 确定占用端口的进程。可以使用 sudo lsof -i :3000 或者 sudo fuser -n tcp 3000 命令来查找出哪个进程正在使用 3000 端口。

  2. 一旦找到占用端口的进程,可以决定是否要停止该进程。如果该进程是不必要的,或者可以更改其端口,可以安全地停止它。可以使用 kill 命令或者更优雅的方式来停止进程,比如 systemctl stop <服务名>(如果它是一个服务的话)。

  3. 如果不想或不能停止占用端口的进程,需要更改 Nginx 的配置,使其监听不同的端口。编辑 Nginx 的配置文件(通常位于 /etc/nginx/nginx.conf 或者 /etc/nginx/sites-available/ 目录下的某个文件),将 listen 3000; 更改为其他未被使用的端口,例如 listen 3001;。更改后,保存文件并尝试重新启动 Nginx。

  4. 重新启动 Nginx 服务。在更改了配置或解决了端口冲突之后,可以尝试再次启动 Nginx 服务,使用 sudo systemctl restart nginx 命令。

然后我执行了lsof -i :3000

image.png

根据 lsof -i :3000 命令的输出结果,我们可以看到 Nginx 本身就是占用了 3000 端口的进程。这表明 Nginx 已经在某个配置中设置了监听 3000 端口,并且已经启动了相关的工作进程。

这种情况下,如果尝试重新启动或重载 Nginx,可能会出现端口冲突,因为旧的 Nginx 进程尚未释放 3000 端口。

解决这个问题的方法可能是:

  1. 首先尝试优雅地停止 Nginx 服务,以确保所有的工作进程都正确地关闭,释放掉 3000 端口。可以使用以下命令:

    sudo nginx -s stop
    

    或者

    sudo systemctl stop nginx
    
  2. 停止服务后,确认 3000 端口是否已经释放,可以再次运行 netstat -tuln | grep :3000lsof -i :3000 查看端口状态。

  3. 如果确认端口已经释放,可以尝试重新启动 Nginx 服务:

    sudo systemctl start nginx
    
  4. 如果重新启动后 Nginx 服务仍然无法正常运行,并且依旧提示端口冲突,可能需要检查 Nginx 的配置文件,确认是否有多个配置块都尝试监听同一个 3000 端口。如果有,需要调整配置,确保每个端口只被监听一次。

  5. 如果确定 Nginx 的配置无误,但问题依旧存在,可以尝试重启整个服务器,以确保所有的网络端口都被正确地清理。

如果在执行这些步骤后仍然遇到问题,可能需要仔细检查 Nginx 的配置文件,或者提供更多的信息,以便进一步诊断问题。

然后我执行了nginx -s stop

image.png

看起来 Nginx 服务并没有被成功停止,因为 lsof -i :3000 的输出显示 Nginx 的进程仍然在监听 3000 端口。这可能是因为 Nginx 服务没有正确地响应停止命令,或者可能是因为有一些孤立的 Nginx 工作进程没有被正确地关闭。

因为 nginx -s stop 命令提示 “invalid PID number”,所以我怀疑的 Nginx 主进程可能已经停止,但是一些工作进程没有被正确地关闭。

可以尝试使用 kill 命令来强制关闭这些进程。可以使用以下命令来关闭所有名为 “nginx” 的进程:

sudo killall nginx

然后,可以再次运行 lsof -i :3000 来确认 3000 端口是否已经被释放。

如果 killall 命令没有关闭所有的 Nginx 进程,也可以尝试使用 kill 命令来单独关闭每个进程。可以从 lsof -i :3000 的输出中获取每个进程的 PID(第二列),然后使用 kill 命令来关闭它们,例如:

sudo kill 268015
sudo kill 273655
sudo kill 273656
sudo kill 273657
sudo kill 273658

请注意,强制关闭进程可能会导致数据丢失或其他问题,所以请只在必要时使用这种方法。

然后我使用了killall nginx命令,成功关闭了nginx进程

image.png

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值