无法将烧瓶Web与容器中的Nginx连接

时间:2018-07-06 03:50:15

标签: docker nginx flask gunicorn

环境: 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。

那么,怎么了,我该怎么解决。谢谢。

2 个答案:

答案 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就像一个媒介。