You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx代理容器配置多个proxy_pass失效问题求助

Nginx代理容器配置多个proxy_pass失效问题求助

我用jwilder/nginx-proxy:alpine容器做反向代理已经好几年了,一直都很顺畅没出过问题,我的docker-compose.yml配置如下:

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx-certs:/etc/nginx/certs:ro
      - ./nginx-vhost:/etc/nginx/vhost.d
      - ./nginx-html:/usr/share/nginx/html
      - ./uploadsize.conf:/etc/nginx/conf.d/uploadsize.conf
      - ./subdomain1.mytld.com.conf:/etc/nginx/conf.d/subdomain1.mytld.com.conf:ro

最近我想配置proxy_pass转发到本地IP的其他服务,但遇到了问题:只有单个子域名的配置能正常工作,同时激活两个子域名的转发规则时,整个Nginx代理就失效了。

能正常工作的配置(subdomain1.mytld.com.conf):

server {
    listen 443 ssl default;
    ssl_certificate     certs/mytld.com.crt;
    ssl_certificate_key certs/mytld.com.key;

    server_name subdomain1.mytld.com;
    location / {
        proxy_pass https://10.8.0.4/;
    }

#        server_name subdomain2.mytld.com;
#        location / {
#                proxy_pass http://10.8.0.4:8096/;
#        }
}

不能工作的配置:

server {
    listen 443 ssl default;
    ssl_certificate     certs/mytld.com.crt;
    ssl_certificate_key certs/mytld.com.key;

    server_name subdomain1.mytld.com;
    location / {
        proxy_pass https://10.8.0.4/;
    }

    server_name subdomain2.mytld.com;
    location / {
        proxy_pass http://10.8.0.4:8096/;
    }
}

只要我把第二个子域名的配置取消注释,整个Nginx代理就挂了,我到底哪里没搞对?求各位帮忙看看!


解决方案:

兄弟,你踩了Nginx配置的一个基础小坑!在同一个server块里重复声明server_name是不符合Nginx配置规则的,而且你把两个不同子域名的转发规则塞在同一个server块里,Nginx根本无法正确匹配请求对应的转发逻辑。

正确的做法是为每个子域名单独创建一个独立的server块,因为两个子域名对应的转发地址和端口都不一样,必须分开配置。调整后的配置应该是这样:

# 第一个子域名的server块
server {
    listen 443 ssl;
    ssl_certificate     certs/mytld.com.crt;
    ssl_certificate_key certs/mytld.com.key;
    server_name subdomain1.mytld.com;

    location / {
        proxy_pass https://10.8.0.4/;
    }
}

# 第二个子域名的server块
server {
    listen 443 ssl;
    ssl_certificate     certs/mytld.com.crt;
    ssl_certificate_key certs/mytld.com.key;
    server_name subdomain2.mytld.com;

    location / {
        proxy_pass http://10.8.0.4:8096/;
    }
}

另外补充一点:你原来配置里的listen 443 ssl default中的default参数,应该只给你想作为默认 fallback的server块加上(比如当请求的域名没有匹配到任何server块时,就走这个默认的),如果多个server块都加default,也会导致Nginx的规则匹配出现冲突哦。

调整完配置后,重启nginx-proxy容器应该就能正常工作啦!

备注:内容来源于stack exchange,提问作者damarges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:37:59