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

移除Docker Compose端口绑定后Nginx出现Connection refused错误求助

解决Docker Host网络模式下Nginx连接拒绝问题

问题背景

在AWS Ubuntu实例上运行Docker容器时,为了让容器的网络请求看起来来自主机,给所有容器设置了network_mode: "host",并注释了端口绑定(host模式下端口绑定不兼容)。但现在访问时出现Connection refused错误,尝试移除URL中的8501也没用,需要修改Nginx的project.conf配置文件,但不确定具体改法。

提供的配置文件

docker-compose.yml

version: '3'

services:
    app:
        restart: always
        build: ./app
        #ports:
        #    - "8501:8501"
        env_file:
            - .env
        command: streamlit run Main.py
        network_mode: "host"

    mariadb:
        image: mariadb:10.9.3
        #ports:
        #    - "3306:3306"
        volumes:
            - db_data:/var/lib/mysql
            - db_conf:/etc/mysql/conf.d
        environment:
            MYSQL_ROOT_PASSWORD: "xxx"
            MYSQL_DATABASE: "xxx"
            MYSQL_USER: "xxx"
            MYSQL_PASSWORD: "xxx"
            MYSQL_ROOT_HOST: "xxx"
        network_mode: "host"
    nginx:
        restart: always
        build: ./nginx
        #ports:
        #    - "80:80"
        depends_on:
            - app
            - mariadb

volumes:
    db_data:
    db_conf:                

project.conf

server {

    listen 80;
    server_name helloworld-st-app;

    location / {
        proxy_pass http://app:8501/;
    }
    location ^~ /static {
        proxy_pass http://app:8501/static/;
    }
    location ^~ /healthz {
        proxy_pass http://app:8501/healthz;
    }
    location ^~ /vendor {
        proxy_pass http://app:8501/vendor;
    }
    location /stream {
        proxy_pass http://app:8501/stream;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

}                          

解决方案

核心原因

容器启用host网络模式时,Docker会关闭容器间的DNS解析服务,Nginx配置里用容器名app访问服务的方式会失效,直接导致连接被拒绝。

具体修改步骤

  1. 更新Nginx的project.conf配置
    把所有proxy_pass指令中的app替换为localhost(host模式下容器端口直接绑定在主机网络上),修改后的配置如下:
server {

    listen 80;
    server_name helloworld-st-app;

    location / {
        proxy_pass http://localhost:8501/;
    }
    location ^~ /static {
        proxy_pass http://localhost:8501/static/;
    }
    location ^~ /healthz {
        proxy_pass http://localhost:8501/healthz;
    }
    location ^~ /vendor {
        proxy_pass http://localhost:8501/vendor;
    }
    location /stream {
        proxy_pass http://localhost:8501/stream;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

}
  1. 给Nginx容器添加host网络模式
    原docker-compose中Nginx未设置network_mode: "host",导致它无法访问主机上的8501端口,需要补上该配置:
nginx:
    restart: always
    build: ./nginx
    #ports:
    #    - "80:80"
    depends_on:
        - app
        - mariadb
    network_mode: "host"
  1. 验证端口监听状态
    在AWS Ubuntu实例上执行以下命令,确认8501(Streamlit)、3306(MariaDB)、80(Nginx)端口都被对应进程正常监听:
netstat -tulpn
  1. 检查App的数据库连接配置
    如果Streamlit应用连接MariaDB时用的是容器名mariadb,同样要改成localhost或者主机内网IP,否则也会出现连接失败问题。

内容的提问来源于stack exchange,提问作者divyashie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:45:22