使用nginx作为反向代理时,连接到上游时连接被拒绝

时间:2017-09-17 14:06:36

标签: docker nginx gunicorn

设置如下:我在0.0.0.0:8000上运行了一个可以通过浏览器访问的Gunicorn / Django应用程序。为了提供静态文件,我将nginx作为反向代理运行。 /etc/nginx/nginx.conf配置为转发请求,如下所示:

server {
    location /static/ {
        alias /data/www/;
    }


    # Proxying the connections
    location / {
        proxy_set_header   Host $host;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_redirect     off;
        proxy_pass         http://0.0.0.0:8000;
    }
}

和我的docker-compose.yml文件如下:

version: '3.3'

services:
  web:
    restart: always
    build: ./web
    expose:
      - "8000"
    ports:
      - "8000:8000"
    volumes:
      - staticdata:/usr/src/app/static_files
    command: gunicorn wsgi:application --workers 2 --bind 0.0.0.0:8000
    depends_on:
      - postgres

  nginx:
    restart: always
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - staticdata:/data/www
    depends_on:
      - web

  postgres:
    image: postgres:9.2
    restart: always
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  staticdata:
  pgdata:

当我通过浏览器访问0.0.0.0:8000时,应用程序正常工作(尽管没有提供静态文件),但是当我访问127.0.0.1:80时出现以下错误:

nginx_1     | 2017/09/17 13:59:46 [error] 6#6: *5 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8000/", host: "127.0.0.1"

我知道这个错误表明在0.0.0.0:8000上运行的服务器不接受请求,但由于我可以通过浏览器访问它,我有点困惑。

提前谢谢。

1 个答案:

答案 0 :(得分:10)

更改您的proxy_pass
proxy_pass         http://0.0.0.0:8000;

proxy_pass         http://web:8000;

您的nginx需要转发才能请求网络容器

编辑-1:说明

0.0.0.0是一个特殊的IP地址,用于指代机器上的任何可用接口。因此,如果您的计算机具有环回(lo),以太网(eth0),Wifi(wlan0),其IP分别为127.0.0.1192.168.0.10010.0.0.100

所以现在在收听传入连接时,您可以选择以上任何IP

gunicorn wsgi:application --workers 2 --bind 10.0.0.100:8000

只能从您的Wifi网络访问。但Lan网络上的其他机器无法访问它。因此,如果您希望应用在计算机上的任何可用网络上收听,请使用特殊的IP 0.0.0.0。这意味着在所有网络接口上绑定

gunicorn wsgi:application --workers 2 --bind 0.0.0.0:8000

现在,当您使用http://0.0.0.0访问该应用时,它相当于使用127.0.0.1。因此,proxy_pass http://0.0.0.0:8000;相当于proxy_pass http://127.0.0.1:8000;

因此,当您在nginx容器中运行它时,它会在同一容器的端口8000上传递请求,并且在您的nginx容器中没有任何内容在8000上运行。因此,您需要将该请求发送到您的gunicorn容器。可以使用web中的服务名称docker-compose来访问此内容。

有关详细信息https://docs.docker.com/compose/networking/

,请参阅以下文章