如何使用 jwilder/nginx-proxy 部署 Flask 或 Django 应用程序?

How do you deploy a flask or django application using jwilder/nginx-proxy?

我正在研究将我们的一些 Web 服务器迁移到 docker 容器。 jwilder/nginx-proxy 图像看起来很有趣,似乎可以满足我们的需求,但是如何在容器中正确部署 Flask 应用程序,并使其与 jwilder/nginx-proxy 服务器一起工作?需要明确的是,烧瓶应用程序也将 运行 在 docker 容器中。

在一个单独但相关的问题中,如何为 django 应用程序执行此操作?

似乎有一张流行的 tiangolo/uwsgi-nginx-flask 图片和一张相似的 dockerfiles/django-uwsgi-nginx 图片。在此设置中,据我了解,nginx-proxy 容器会将流量定向到 uwsgi-nginx-flask 或 django-uwsgi-nginx 容器。这是执行此操作的常用方法吗?

我的主要想法是,在这样的设置中,我们有 运行 个额外的 nginx 实例 - 每个 python/django 个应用程序一个。这很常见吗?还是 possible/beneficial/common 以某种方式让 nginx-proxy 直接与 python 应用程序容器中的 uwsgi 对话?

我看到 nginx-proxy 镜像有一个 VIRTUAL_PROTO=uwsgi 选项可以启动其他容器。这是可以用来提高效率的东西吗?还是努力得不偿失?

编辑:或者 flask/django 项目附带的 nginx 实例是否有益,因为它可用于提供静态内容,如果没有它,您将需要使用以下位置配置 nginx-proxy 图像每个项目的静态文件?

就个人而言,我更喜欢让 Django 有一个容器,NGINX 在单独的容器中,其他应用程序在其他容器中等等。为此我更喜欢使用 docker-compose. You can checkout my implementation about using Django + NGINX + PostgreSQL in here。(我没有使用 jwilder/nginx-proxy ,相反,我使用了官方 NGINX docker 图片)

但是将 NGINX 和 Python 服务器放在同一个容器中听起来并没有那么糟糕。我使用了基于轻量级 alpine 的图像来部署 python,例如:

FROM nginx:mainline-alpine

# --- Python Installation ---
RUN apk add --no-cache python3 && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --upgrade pip setuptools && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
    if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
    rm -r /root/.cache

# --- Work Directory ---
WORKDIR /usr/src/app

# --- Python Setup ---
ADD . .
RUN pip install -r app/requirements.pip

# --- Nginx Setup ---
COPY config/nginx/default.conf /etc/nginx/conf.d/
RUN chmod g+rwx /var/cache/nginx /var/run /var/log/nginx
RUN chgrp -R root /var/cache/nginx
RUN sed -i.bak 's/^user/#user/' /etc/nginx/nginx.conf
RUN addgroup nginx root

# --- Expose and CMD ---
EXPOSE 5000
CMD gunicorn --bind 0.0.0.0:5000 wsgi --chdir /usr/src/app/app & nginx -g "daemon off;"

虽然看起来有点乱,但是效果很好。请在 here.

查看我的完整实现

根据您要部署 docker 图像的方式,您可以使用任何一种方法。但是使用 docker compose 将是恕我直言的最佳解决方案。在这两种设置中,您都可以使用 NGINX 来提供您的静态内容(无需为每个静态文件配置它)。