环境: ubuntu docker和容器(未特权,端口= 6000-> 8080),flask(serve.py),gunicorn,nginx。服务器ip:123.456.789.101
我希望其他人可以访问在docker容器中运行的Web(123.456.789.101:6000),并访问静态映像(123.456.789.101:6000/static/1.jpg)。
当我只使用长颈瓶和干姜,并运行guincorn -w 2 -b 0.0.0.0:8080 serve:app
时,我可以成功访问网络(123.456.789.101:6000)。
但是,如果我使用nginx代理,它将失败。 详细信息如下:
首先,$ gunicorn -w 2 -b 127.0.0.1:8080 serve:app
,成功,我可以将其卷曲在容器系统中。
second,$ service nginx start
,然后将conf文件加载到站点启用中。
nginx conf详细信息:
server {
listen 6000;
server_name 123.456.789.101;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
root /www;
expires 30d;
}
}
最终,它失败了。我无法访问网络(123.456.789.101:6000)。
要查找出什么问题,我尝试运行gunicorn -w 2 -b 127.0.0.1:8080 serve:app
,然后更改nginx conf文件
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
root /www;
expires 30d;
}
}
和curl 127.0.0.1
在容器系统中。成功。这意味着nginx可以正常工作,可以将80映射到8080。
那么,怎么了,我该怎么解决。谢谢。
答案 0 :(得分:0)
Application:
Try Running into Docker
gunicorn -w 2 -b 0.0.0.0:8080 serve:app
If you are using Dockerfile:
expose 8080
If you are using docker-compose.yml
expose:
- "8080"
Nginx Configuration (Replace DOCKER_CONTAINER_IP):
server {
listen 6000;
server_name 123.456.789.101;
location / {
proxy_pass http://DOCKER_CONTAINER_IP:8080;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
root /www;
expires 30d;
}
}
答案 1 :(得分:0)
最后,我成功了。 这是nginx conf文件中的一个大错误。 详细信息如下:
1,运行guincorn -w 2 -b 127.0.0.1:8000 serve:app
(此端口是随机的,但不能使用已在使用的端口)
2,运行service nginx start
nginx conf:
server {
listen 8080;
server_name _;# _ = 0.0.0.0
location / {
proxy_pass http://127.0.0.1:8000;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
root /www;
expires 30d;
}
}
我理解这个过程: 访问网站123.456.789.101:6000,docker主机服务器(也许也是在主机服务器上运行的nginx)会将IP映射到docker容器服务器172.17.0.1:8080,然后nginx将ip映射至127.0.0.1:8000,终于是金枪鱼烧瓶的答案。
所以,我只使用nginx来监听端口0.0.0.0:8080,这就是为什么,我不使用nginx只有gunicorn可以工作。这个nginx就像一个媒介。