如何使用docker中的套接字将nginx套接字与gunicorn应用程序结合起来



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

Nginxgunicorn->flask应用程序通过unix套接字进行通信。在我的localhost环境中,我在应用根文件夹myapp/app.sock中使用了套接字,一切都很好。

现在的问题是,我不太明白如何告诉docker内部的nginx使用相同的套接字文件,并告诉gunicorn听它

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

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

docker组成文件:

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(对于main应用程序,它构建应用程序很好,一切正常(:

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%相同,只增加了上传到8M的文件大小proxy-params只是用于发出nginx代理请求的配置参数的预设远程应用程序是我的应用程序的配置(简单的一个(:

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,我会收到套接字错误(上面粘贴了强文本(。

我会避免使用套接字,因为容器/服务之间有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接口。

使用单独的服务app_server和当前的nginx服务,您可以简单地将这些值视为每个容器中的DNS别名。所以在nginx配置中:

proxy_pass http://app_server:5000/

所以如果我打开localhost(即使没有8000端口(,我也可以得到nginx的答案。

这听起来像是在端口80上连接到localhost,该端口可能是在主机上运行的nginx服务器。这也是您的撰写文件中的这一行所建议的:/etc/nginx/proxy_params:/etc/nginx/proxy_params

这是从主机上本地安装的nginx加载文件。您可能应该意识到这一点,因为在调试时,让服务器运行也可能会让您感到困惑,而在某个地方启动此撰写文件意味着主机上必须存在/etc/nginx/proxy_params

您可能应该像其他挂载的文件一样,将其存储在项目目录中,并像一样挂载它

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

相关内容

  • 没有找到相关文章

最新更新