【问题标题】:unable connect flask web with nginx in container无法将烧瓶网络与容器中的 nginx 连接
【发布时间】:2023-04-09 09:38:01
【问题描述】:

环境: ubuntu docker 和容器(未预审,端口 = 6000->8080),烧瓶(serve.py),gunicorn,nginx。服务器ip:123.456.789.101

我希望其他人可以访问运行在 docker 容器中的 web(123.456.789.101:6000),并访问静态图像(123.456.789.101:6000/static/1.jpg)。

当我只使用flask和gunicorn,并运行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,成功,我可以在容器系统中 curl 了。

其次,$service nginx start,然后在 site-enables 中加载 conf 文件。

nginx 配置细节:

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。

那么,出了什么问题,我该如何解决。谢谢。

【问题讨论】:

  • 你运行 docker 的命令是什么?你在外面暴露端口吗?
  • 我没有权限运行 docker。 (这意味着服务器由某人收费,但我可以提出请求。)

标签: docker nginx flask gunicorn


【解决方案1】:
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;
         }
}

【讨论】:

  • 如果您添加了描述,此答案很有用
  • 好的,我会添加描述但是有什么不明白的,你能提一下,以便我修改......
  • 非常感谢。 DOCKER_CONTAINER_IP 是什么意思? 127.0.0.1 ? 172.17.0.5?因为我不能在容器中使用ifconfig,所以我猜ip:172.17.0.5(试试172.17.0.1~4,显示“无法绑定”)。
  • 而且我不知道如何验证 conf,因为如果我只运行 gunicorn 0.0.0.0:8080,我可以访问网络。所以我启动了nginx,我不知道它是否有效。
  • 我没有 nginx 关于图片路径的conf 不对?我在本地系统路径中的图像:/www/static/1.jpg 但我尝试123.456.789.101:6000/static/1.jpg,页面显示找不到 404。顺便说一句,我运行 'chmod -R 755 /www',并在 nginx.conf 中更改 'user root'
【解决方案2】:

终于,我成功了。 这是nginx conf文件中的一个大错误。 详情如下:

1,运行guincorn -w 2 -b 127.0.0.1:8000 serve:app(这个端口是随机的,但是不能使用已经使用的端口)

2,运行service nginx start nginx 配置:

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;
     }
}

我理解这个过程: 访问 web 123.456.789.101:6000,docker 主机服务器(也可能是在主机服务器中运行的 nginx)将 ip 映射到 docker 容器服务器 172.17.0.1:8080,然后 nginx 将 ip 映射到 127.0.0.1:8000,终于gunicorn flask回答了。

所以,我只使用 nginx 监听端口 0.0.0.0:8080,这就是为什么,我不使用 nginx 只有 gunicorn 可以工作。这个 nginx 就像一个媒介。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2022-01-25
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多