如何合并nginx套接字与gunicorn应用程序使用该套接字内docker?

ltqd579y  于 2022-12-26  发布在  Nginx
关注(0)|答案(1)|浏览(178)

我用flask/tensorflow开发了一个小项目。它在应用服务器gunicorn下运行。我还必须将nginx包含到项目中以提供静态文件。没有docker应用程序运行良好。所有部分(gunicorn,nginx,flask)按预期进行合作。现在是时候将此项目移动到在线服务器上了,我需要通过docker来完成。

Nginxgunicorn-〉flask应用程序通过unix套接字通信。在我的本地主机环境中,我使用应用程序根文件夹中的套接字- myapp/app.sock,一切都很好。

现在的问题是,我不太明白如何告诉nginx inside docker使用相同的套接字文件,并告诉gunicorn监听它.我得到以下错误:

上游:http://unix:/var/run/app.sock在连接到上游时失败(没有此类文件或目录)

尝试使用不同的路径到套接字文件,但没有运气-相同的错误。

停靠器合成文件:

version: '3'
services:
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/remote-app:/etc/nginx/sites-enabled/remote-app
      - /etc/nginx/proxy_params:/etc/nginx/proxy_params
    ports:
      - 8000:8000
    
    build: .
    command: gunicorn --bind unix:/var/run/app.sock wsgi:app --reload --workers 1 --timeout 60
    
    environment:
      - FLASK_APP=prediction_service.py
      - FLASK_DEBUG=1
      - PYTHONUNBUFFERED=True
    restart: on-failure

main Dockerfile(对于主应用程序,它构建应用程序良好,一切正常):

FROM python:3.8-slim

RUN pip install flask gunicorn flask_wtf boto3 tqdm
RUN pip install numpy==1.18.5
RUN pip install tensorflow==2.2.0 onnxruntime==1.4.0

COPY *.ipynb /temp/
COPY *.hdf5 /temp/
COPY *.onnx /temp/
COPY *.json /temp/
COPY *.py /temp/

WORKDIR /temp

nginx.conf与默认值99%相同,只是增加了上传到8 M代理的文件大小-params只是用于制作nginx代理请求的配置参数的预设值,remote-app是我的应用程序的配置(简单的一个):

server {
    listen 8000;
    server_name localhost;

   location / {
      include proxy_params;
      proxy_pass htpp://unix:/var/run/app.sock; //**tried /temp/app.sock here same issue**
}
}

因此,如果我打开localhost(即使没有端口8000),我可以得到nginx答案。如果我试图打开localhost:8000,我得到套接字错误(这是粘贴在上面的强文本)。

zxlwwiss

zxlwwiss1#

我会避免为此使用套接字,因为容器/服务之间存在IP通信,并且您确实应该为应用服务器提供一个单独的服务。
例如:

version: '3'
services:

  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/remote-app:/etc/nginx/sites-enabled/remote-app
      - /etc/nginx/proxy_params:/etc/nginx/proxy_params
    ports:
      - 80:80
      - 143:143

  app_server:
    build: .
    command: gunicorn --bind '0.0.0.0:5000' wsgi:app --reload --workers 1 --timeout 60
    
    environment:
      - FLASK_APP=prediction_service.py
      - FLASK_DEBUG=1
      - PYTHONUNBUFFERED=True
    restart: on-failure

注意,gunicorn不是绑定到套接字,而是绑定到端口5000上app_server容器的所有IP接口。
在当前的nginx服务旁边有一个单独的app_server服务,您可以简单地将这些值当作每个容器中的DNS别名。

proxy_pass http://app_server:5000/

因此,如果我打开localhost(即使没有端口8000),我可以得到nginx的答案。
这听起来像是在端口80上连接到localhost,这可能是运行在主机上的nginx服务器。/etc/nginx/proxy_params:/etc/nginx/proxy_params.
这是从主机上本地安装的nginx加载文件,您可能应该意识到这一点,因为在调试时运行该服务器也会使您感到困惑,并且在某个地方启动此compose文件意味着主机上必须存在/etc/nginx/proxy_params
您可能应该将其存储在项目目录中,就像挂载的其他文件一样,并按如下方式挂载它:

- ./nginx/proxy_params:/etc/nginx/proxy_params

相关问题