V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
raw0xff
V2EX  ›  NGINX

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

  •  
  •   raw0xff · 230 天前 · 1290 次点击
    这是一个创建于 230 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    15 条回复    2023-09-10 16:17:58 +08:00
    putaozhenhaochi
        1
    putaozhenhaochi  
       230 天前 via Android
    外网访问要路由器里做端口映射的吧
    raw0xff
        2
    raw0xff  
    OP
       230 天前
    @putaozhenhaochi 不是端口的问题,可以访问。
    leonshaw
        3
    leonshaw  
       230 天前 via Android
    yinmin
        4
    yinmin  
       230 天前 via iPhone   ❤️ 1
    删除 server_name 参数
    kiml
        5
    kiml  
       230 天前 via Android   ❤️ 1
    server_name 0.0.0.0
    这样是否可行呢
    raw0xff
        6
    raw0xff  
    OP
       230 天前
    @yinmin 你确定吗? server_name 是必须设置的。
    yinmin
        7
    yinmin  
       230 天前   ❤️ 1
    @raw0xff #6 删除整行 server_name
    yinmin
        8
    yinmin  
       230 天前   ❤️ 1
    @raw0xff #6 你查一下所有的 server {} 配置,同一个端口只允许 1 个 server {}不设置 server_name ,如果有 2 个不设置 server_name 会出问题。
    raw0xff
        9
    raw0xff  
    OP
       230 天前   ❤️ 1
    @yinmin
    @kiml
    @yinmin

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

    server_name 0.0.0.0; 可用
    server_name 删掉也可用
    对不起是我马虎了
    nightcc
        10
    nightcc  
       230 天前 via Android
    server_name _ 讲道理不应该不行呀,这个不行是指 connection refused ,还是 403 ,404 什么的?
    建议拿日志来看看,具体怎么回事
    raw0xff
        11
    raw0xff  
    OP
       230 天前
    @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
        12
    yinmin  
       230 天前   ❤️ 1
    删除 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
        13
    raw0xff  
    OP
       229 天前
    @yinmin 感谢大佬。

    我是 docker compose 了一个运行着 nginx 的 alpine 服务,服务启动时会 scale 多个容器,nginx.conf conf.d html 这三个理解,log/nginx 是不是不适合我?我也在考虑如何监视多个 nginx 容器运行的状态的问题。扯远了哈哈
    yinmin
        14
    yinmin  
       229 天前 via iPhone   ❤️ 1
    @raw0xff #13 多个 nginx 容器的日志建议放在不同的主机目录,例如:/var/log/nginx1 、var/log/nginx2 等等,3 个好处:( 1 )容器重建能保留老日志(尤其被攻击时,经常会重建容器避免日志丢失) ( 2 )日志保存在主机速度更快( 3 )日志很大时,文件在主机上便于清理
    raw0xff
        15
    raw0xff  
    OP
       229 天前   ❤️ 1
    @yinmin 收到,感谢大佬不吝赐教,趁教师节也祝大佬教师节快乐哈哈!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2792 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:34 · PVG 13:34 · LAX 22:34 · JFK 01:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.