我被委托重新部署一个已部署在 Windows 服务器上的应用程序,其中 Python 后端、Postgress 数据库和前端都在同一台服务器上。我要求将其分离并放在 Linux Docker 上。最初聘请的顾问不再可用,所以我不太确定什么是关键,什么不是。
我在自己的 ubuntu 电脑上使用 --network=host 进行开发。我已经设置了 postgress 和 python 后端,其中 waitress 监听 localhost:7000,现在我需要制作 nginx docker。
与nginx配置文件相关的windows服务器的部署说明是:
在远程机器上编辑配置后,你可以重新加载它psexec -w C:\tools\nginx -s nginx -s reload.
(nginx 保存在 C:\tools\nginx)
server_names_hash_bucket_size 64;
proxy_buffering on;
proxy_buffers 24 4k;
proxy_busy_buffers_size 32k;
proxy_set_header Host $host;
proxy_http_version 1.1;
gzip on;
gzip_proxied any;
gzip_min_length 1000;
gzip_types
text/css
text/plain
image/.*
application/javascript
application/json;
# Test setup
server {
listen 80;
server_name test.xxx.yyy.com localhost 127.0.0.1;
root C:/www/html-dev;
error_log C:/www/error-dev.log debug;
index index.html;
try_files $uri $uri/ /index.html;
charset utf-8;
location /api/ {
proxy_pass http://localhost:7000/;
}
location /nginx-status {
stub_status;
}
}
看到这个 nginx 设置后,我当前的 dockerfile 如下所示:
FROM nginx
COPY html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
有没有适合此设置的 nginx.conf 的建议,或者我遗漏了什么?一般来说,任何建议都会受到欢迎(我是菜鸟)。
答案1
根据发布的 nginx 配置,您主要要做三件事:
- 在 test.xxx.yyy.com:80 上收听
- 直接提供文件 vom
C:/www/html-dev
(我假设这是静态内容,如 img/css/js) - 预计
/api/
,这只是被代理到http://localhost:7000
(应该是应用服务器)
您可以使用此配置,但这需要在 Docker 端进行一些配置。nginx 容器需要访问位于C:/www/html-dev
旧 Win 服务器上的静态内容。可以将其包含在图像中(Dockerfile)
COPY html-dev /usr/share/nginx/html
或将其安装为体积在运行时像这样docker-compose
version: "2.4"
services:
web:
image: nginx:1.16-alpine
volumes:
- ./html-dev:/usr/share/nginx/html
# Access nginx on port 80 of the host (if already taken, change it)
- 80:80
卷方法更快,特别是在开发过程中文件夹包含大量文件时。
一般来说,我建议你使用docker-compose这里。它使处理多个容器变得容易。这正是您在这里所需要的,因为 Docker 方法要求每个应用程序一个容器。因此您不必将 Python 应用程序放在 nginx 容器中。
由于 nginx 无法直接与 Python 后端通信,因此您需要WSGI
。如果没有它,则只能使用 Python 开发服务器。但根据文档,它尚未准备好用于生产,不应在开发之外使用。您的配置看起来像是后端是这种开发服务器(或者它们之间有未显示的内容)。
我建议使用 WSGI 正确解决这个问题,例如你可以使用[uWSGI]
(http://flask.pocoo.org/docs/1.0/deploying/uwsgi/) 即可。在此处可以找到文档齐全的 Docker 镜像:https://github.com/tiangolo/uwsgi-nginx-flask-docker
简而言之,这将导致您将 nginx 上游到另一个容器。localhost
需要用此服务名称替换。例如,如果uwsgi
在 中调用服务docker-compose.yml
,请使用uwsgi
相应的主机而不是 localhost。这是可能的,因为 docker-compose 本身默认在其容器之间创建一个虚拟网络。