服务器环境配置避坑:当 Hermes 自启动把 Nginx 杀了怎么办?
最近在折腾服务器环境的时候,遇到了一个挺让人头秃的问题,估计不少朋友也踩过这个坑。
事情是这样的:服务器上跑着 Nginx 提供网站服务,为了方便挂机,装了 Hermes。结果每次服务器重启或者 Hermes 设了自启之后,访问网站直接 502。上去一查进程,好家伙,Nginx 直接没了,被 Hermes 给“杀”了。
这到底是咋回事?其实原因通常只有一个:端口冲突。
冲突根源:端口被抢占了
Hermes 这类程序,默认可能会监听 80 或者 443 端口。而 Nginx 作为 Web 服务器,这两个端口更是它的“大本营”。
在 Linux 系统的服务启动机制里,如果配置了自启动,服务的启动顺序或者同时占用的竞争可能导致悲剧:
- Nginx 先启动,占用了 80 端口。
- Hermes 跟着启动,尝试绑定 80 端口,发现被占用,部分版本的程序会直接尝试“清理”占用的进程,或者因报错退出并牵连了环境。
- Hermes 先启动,占用了 80 端口。Nginx 随后启动,尝试绑定失败,直接服务崩溃。
不管哪种情况,结果就是 Web 服务挂掉。那怎么破?总不能每次重启完手动去拉 Nginx 吧,太不极客了。
解决方案
方案一:修改 Hermes 监听端口(推荐)
这是最稳妥的治本方法。既然 80 端口是 Nginx 的地盘,咱们就让个路,把 Hermes 换个地方待着。
- 找到 Hermes 的配置文件(通常在
/root/hermes/config.json或者程序目录下的配置文件)。 - 搜索
port或者监听相关的设置。 - 将默认的
80修改为其他不常用的高端口,比如 8080、8888 等。"port": 8080 - 保存配置,重启 Hermes 服务。
- 此时通过
http://你的IP:8080访问 Hermes,而 Nginx 继续安安稳稳地吃 80 端口。
方案二:利用反向代理 "套娃"
如果你非要用 80 端口访问 Hermes,也不想改 Nginx 的域名配置,那就得靠 Nginx 自己来“中转”。
- 先按方案一,把 Hermes 的监听端口改成 8080。此时它只监听本地或者特定端口。
- 修改 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 反向代理数据流向示意图*
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 看看端口占用情况,基本就能猜个八九不离十。希望这几个方案能帮大家省下排查时间,不论是挂代理还是建站,系统稳了才能睡个安稳觉。

评论已关闭