docker 部署的 Nginx 配置

docker 部署的 Nginx 配置

我被委托重新部署一个已部署在 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 本身默认在其容器之间创建一个虚拟网络。

相关内容