运行多个 docker nginx 容器时,如何设置 server_name 才能让外网(ipv6)都能访问 nginx 服务?

2023-09-09 16:26:57 +08:00
 raw0xff

运行多个 nginx 容器,宿主机的 9001 9002 9003 9004 转发容器 80 端口。配置文件中 server_name 设置为 localhost 127.0.0.1 和宿主机的 ipv6 地址,目前外网可以访问。

问题是,这个 v6 地址会变(光猫重启),有什么其他的设置方法吗?只要外网能访问就行。 "*" "_"好像都不行,不设置 server_name 也不行。

1523 次点击
所在节点    NGINX
15 条回复
putaozhenhaochi
2023-09-09 17:08:35 +08:00
外网访问要路由器里做端口映射的吧
raw0xff
2023-09-09 17:22:03 +08:00
@putaozhenhaochi 不是端口的问题,可以访问。
leonshaw
2023-09-09 17:40:31 +08:00
yinmin
2023-09-09 17:54:04 +08:00
删除 server_name 参数
kiml
2023-09-09 18:06:38 +08:00
server_name 0.0.0.0
这样是否可行呢
raw0xff
2023-09-09 18:13:04 +08:00
@yinmin 你确定吗? server_name 是必须设置的。
yinmin
2023-09-09 18:18:32 +08:00
@raw0xff #6 删除整行 server_name
yinmin
2023-09-09 18:20:33 +08:00
@raw0xff #6 你查一下所有的 server {} 配置,同一个端口只允许 1 个 server {}不设置 server_name ,如果有 2 个不设置 server_name 会出问题。
raw0xff
2023-09-09 18:51:30 +08:00
@yinmin
@kiml
@yinmin

对不起对不起,我的错,发现容器里/etc/nginx/http.d 文件夹中还有个 default.conf 文件,两个 conf 同时配置 80 端口,所以我改来改去都没作用。

server_name 0.0.0.0; 可用
server_name 删掉也可用
对不起是我马虎了
nightcc
2023-09-09 18:57:39 +08:00
server_name _ 讲道理不应该不行呀,这个不行是指 connection refused ,还是 403 ,404 什么的?
建议拿日志来看看,具体怎么回事
raw0xff
2023-09-10 10:51:44 +08:00
@nightcc
server_name _; 可行。

之前不行是因为没发现 http.d 目录还有个 default.conf ,内容是:
server {
listen 80 default_server;
listen [::]:80 default_server;

# Everything is a 404
location / {
return 404;
}

location = /404.html {
internal;
}
}

所以,无论另一个 d.conf 文件怎么改,只要不在 server_name 名单里都会 404.
server {
listen 80 ;
listen [::]:80 ;
server_name _;
default_type text/html;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
server_name 用_的话,localhost 127.1 0.0 外网 IP 全是 404 ,不知道为什么,可能 _ 没有 default_server 管的宽?哈哈
@yinmin 您给看看为啥?

我现在是 docker 启动时用 d.conf 直接覆盖这个 default.conf 。
yinmin
2023-09-10 11:23:01 +08:00
删除 default.conf 文件即可。我估计你的问题其实是 nginx 容器配置问题。

nginx 做容器要至少 volumes 以下 1 个文件和 3 个目录,然后在主机上配置参数。
volumes:
- /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/nginx/conf.d:/etc/nginx/conf.d:ro
- /var/www/html:/usr/share/nginx/html:ro
- /var/log/nginx:/var/log/nginx

容器最佳实践是内部无状态,所有数据 Volume 到主机上,使容器可以随意摧毁/重建/迁移。
raw0xff
2023-09-10 15:47:13 +08:00
@yinmin 感谢大佬。

我是 docker compose 了一个运行着 nginx 的 alpine 服务,服务启动时会 scale 多个容器,nginx.conf conf.d html 这三个理解,log/nginx 是不是不适合我?我也在考虑如何监视多个 nginx 容器运行的状态的问题。扯远了哈哈
yinmin
2023-09-10 16:01:20 +08:00
@raw0xff #13 多个 nginx 容器的日志建议放在不同的主机目录,例如:/var/log/nginx1 、var/log/nginx2 等等,3 个好处:( 1 )容器重建能保留老日志(尤其被攻击时,经常会重建容器避免日志丢失) ( 2 )日志保存在主机速度更快( 3 )日志很大时,文件在主机上便于清理
raw0xff
2023-09-10 16:17:58 +08:00
@yinmin 收到,感谢大佬不吝赐教,趁教师节也祝大佬教师节快乐哈哈!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX