最近在折腾服务器环境的时候,遇到了一个挺让人头秃的问题,估计不少朋友也踩过这个坑。

事情是这样的:服务器上跑着 Nginx 提供网站服务,为了方便挂机,装了 Hermes。结果每次服务器重启或者 Hermes 设了自启之后,访问网站直接 502。上去一查进程,好家伙,Nginx 直接没了,被 Hermes 给“杀”了。

这到底是咋回事?其实原因通常只有一个:端口冲突

冲突根源:端口被抢占了

Hermes 这类程序,默认可能会监听 80 或者 443 端口。而 Nginx 作为 Web 服务器,这两个端口更是它的“大本营”。

在 Linux 系统的服务启动机制里,如果配置了自启动,服务的启动顺序或者同时占用的竞争可能导致悲剧:

  1. Nginx 先启动,占用了 80 端口。
  2. Hermes 跟着启动,尝试绑定 80 端口,发现被占用,部分版本的程序会直接尝试“清理”占用的进程,或者因报错退出并牵连了环境。
  3. Hermes 先启动,占用了 80 端口。Nginx 随后启动,尝试绑定失败,直接服务崩溃。

不管哪种情况,结果就是 Web 服务挂掉。那怎么破?总不能每次重启完手动去拉 Nginx 吧,太不极客了。

解决方案

方案一:修改 Hermes 监听端口(推荐)

这是最稳妥的治本方法。既然 80 端口是 Nginx 的地盘,咱们就让个路,把 Hermes 换个地方待着。

  1. 找到 Hermes 的配置文件(通常在 /root/hermes/config.json 或者程序目录下的配置文件)。
  2. 搜索 port 或者监听相关的设置。
  3. 将默认的 80 修改为其他不常用的高端口,比如 80808888 等。
    "port": 8080
    
  4. 保存配置,重启 Hermes 服务。
  5. 此时通过 http://你的IP:8080 访问 Hermes,而 Nginx 继续安安稳稳地吃 80 端口。

方案二:利用反向代理 "套娃"

如果你非要用 80 端口访问 Hermes,也不想改 Nginx 的域名配置,那就得靠 Nginx 自己来“中转”。

  1. 先按方案一,把 Hermes 的监听端口改成 8080。此时它只监听本地或者特定端口。
  2. 修改 Nginx 的配置文件,为 Hermes 添加一个反向代理规则。
    server {
        listen 80;
        server_name hermes.yourdomain.com; # 你的域名

location / {
            proxy_pass http://127.0.0.1:8080; # 转发到本地的 8080 端口
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    ```

![Nginx反向代理架构示意图](/media-load/019f4a0e-34e6-73ae-ac44-239d3ab68fe9)

*Nginx 反向代理数据流向示意图*

3.  重载 Nginx (`nginx -s reload`)。这样用户访问 80 端口,Nginx 收到请求后,再偷偷转发给 8080 端口的 Hermes,两者相安无事。

#### 方案三:调整服务启动顺序(治标)
如果你不想改配置,也可以尝试 systemd 的启动依赖管理,确保 Nginx 是老大。

编辑 Hermes 的 systemd 服务文件(通常在 `/etc/systemd/system/hermes.service` 或类似路径):

在 `[Unit]` 部分添加:

```ini
[Unit]
Description=Hermes Daemon
After=nginx.service  # 表示在 nginx 之后启动
Requires=nginx.service # 表示依赖 nginx

然后运行 systemctl daemon-reload 生效。但这种方法依然有风险,一旦端口配置冲突,即便顺序对了,高并发或重启时仍可能出现异常,所以还是改端口最靠谱。

总结

服务器环境的稳定性,细节决定成败。遇到服务“互杀”的情况,第一时间检查 netstat -tlnp 看看端口占用情况,基本就能猜个八九不离十。希望这几个方案能帮大家省下排查时间,不论是挂代理还是建站,系统稳了才能睡个安稳觉。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭