【问题标题】:How do you deploy a flask or django application using jwilder/nginx-proxy?如何使用 jwilder/nginx-proxy 部署烧瓶或 django 应用程序?
【发布时间】:2018-08-26 00:28:31
【问题描述】:

我正在考虑将我们的一些网络服务器迁移到 docker 容器中。 jwilder/nginx-proxy 镜像看起来很有趣,并且似乎可以满足我们的要求,但是如何在容器中正确部署烧瓶应用程序,并让它与 jwilder/nginx-proxy 服务器一起工作呢?需要明确的是,flask 应用程序也将在 docker 容器中运行。

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

看起来有一个流行的 tiangolo/uwsgi-nginx-flask 映像,以及一个类似的 dockerfiles/django-uwsgi-nginx 映像。在此设置中,据我了解,nginx-proxy 容器会将流量定向到 uwsgi-nginx-flask 或 django-uwsgi-nginx 容器。这是一种常见的方法吗?

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

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

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

【问题讨论】:

    标签: python django docker nginx-reverse-proxy


    【解决方案1】:

    就个人而言,我更喜欢让 Django 有一个容器,NGINX 在单独的容器中,其他应用程序在其他容器中等等。为此,我更喜欢使用docker-compose。您可以在here 中查看我关于使用 Django + NGINX + PostgreSQL 的实现。(我没有使用 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 来提供静态内容(无需为每个静态文件进行配置)。

    【讨论】:

    • 我们有多个域,都指向同一个公共 IP,由 nginx-proxy 容器处理。它还处理 SSL 终止,所以我们想继续使用它。如果我理解正确,您在上面显示的方式对于每个运行应用程序的容器都有一个 nginx 实例。我想知道这种冗余是否必要,或者 nginx-proxy 容器是否可以拥有唯一的 nginx 实例,并为所有应用程序提供服务。即使可能,我也想知道这是否是一个好主意,或者每个应用程序有一个 nginx 实例是否是明智的做法。
    • 我在第一段也展示了另一个例子。使用 docker compose,现在我通过 Nginx 为一个 Django 服务器提供服务,但我也可以使用同一个实例来服务多个服务器(多个 Django/Flask 等)。我个人更喜欢这种设置。
    • 仔细查看了您的 GitHub 存储库。看起来很有趣。您在每个应用程序容器中运行 gunicorn,并从单个 nginx 实例连接到该容器,这基本上实现了我所希望的。我会看看我是否可以使用 nginx-proxy 复制它,但听起来我应该没有任何问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2014-11-13
    • 2018-12-19
    • 2023-03-25
    相关资源
    最近更新 更多