设置如下:我在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
上运行的服务器不接受请求,但由于我可以通过浏览器访问它,我有点困惑。
提前谢谢。
答案 0 :(得分:10)
从
更改您的proxy_passproxy_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.1
,192.168.0.100
,10.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
来访问此内容。