80 端口只有一个
在动手之前,先看一眼谁在听:
1 | |
输出不长,但信息密度很高。80 端口归 nginx,22 归 sshd,7500 是 frps 的管理口,5001–5008 是 frps 的隧道口,8081 被 docker-proxy 占着 —— 那是 OpenWebUI,映射在 172.17.0.1:8081。
一个端口只能有一个主人
OpenWebUI 是一开始就想放 80 的。它是个容器,-p 80:8080 写下去很自然。
问题是 80 上已经有 nginx 了。两个进程同时想 listen 同一个端口,谁先绑上谁赢,另一个直接报 Address already in use 起不来。Container 起不来还不会大声喊,只是反复重启,docker ps 里显示 Restarting,很容易以为是镜像的问题。
最后的做法是让容器退回去:只绑内网地址 172.17.0.1:8081,外面要访问就走 nginx。这样 80 上永远只有一个主人,也顺手把「公网直接打到容器」这条路关上了。
default_server 也只能有一个
nginx 的站点配置放在 sites-available/,靠 sites-enabled/ 里的软链接启用。我打开的时候只有一个:
1 | |
里面写着 listen 80 default_server; 和 server_name _; —— 意思是「任何没被别的 server 匹配到的请求都给我」。这是好事,说明之前那张截图页是兜底页。
但这也意味着:想换掉它,不能只是新增一个 listen 80 default_server 的配置。两个都是 default_server,nginx -t 会直接报 duplicate default server,然后 reload 什么都不做,站点还是旧的那张页。第一次遇到时我盯着浏览器刷新了三次才反应过来是配置没生效。
正确顺序是先禁用再启用。
动手前的备份
改 nginx 之前有一件事值得花三秒钟:
1 | |
配置是纯文本,备份成本几乎为零,而它就是那种「删掉之后想不起来原来写了什么」的东西。