【问题标题】:configuring django with nginx gunicorn on docker在 docker 上使用 nginx gunicorn 配置 django
【发布时间】:2021-02-02 21:49:18
【问题描述】:

美好的一天,我是 docker 新手,我有一个 Django 应用程序,我想 dockerize,我已经搜索了帮助我使用 docker 设置我的 Django 应用程序的教程,我在测试驱动@987654321 上关注了这篇文章@。我在使 nginx 与我的应用程序一起工作时遇到问题。这是我的代码。

我的应用程序 docker 文件:

FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"

COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt


RUN mkdir /app
COPY ./testdocker /app
WORKDIR /app
COPY ./scripts /scripts

RUN chmod +x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static

RUN adduser -D user
RUN chown -R user:user /vol

RUN chmod -R 755 /vol/web

USER user

nginx docker file:

FROM nginx:1.19.3-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/conf.d

RUN mkdir -p /vol/static

my docker-compose file:

version: '3.7'

services:
    app:
        build:
            context: .
        command: sh -c "gunicorn testdocker.wsgi:application --bind 0.0.0.0:8000"
        volumes:
            - static_data:/vol/web
        expose:
            - "8000"
        environment: 
            - SECRET_KEY=MANME1233
            - ALLOWED_HOSTS=127.0.0.1, localhost
    
    nginx:
        build: 
            context: ./nginx
        volumes: 
            - static_data:/vol/static
        ports: 
            - "8080:80"
        depends_on:
            - app

volumes: 
    static_data:


my nginx conf file:

 upstream testapp {
     server app:8000;
 }

    server {
    listen 8080;
    server_name app;
    
    location / {
        proxy_pass http://testapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
  
    location /static {
        alias /vol/static;
    }

}

我似乎无法让 nginx 反向代理到我的网络应用程序,在浏览器上打开 URL 后,我收到 404 错误请求或找不到地址。请问我做错了什么或做错了什么?

【问题讨论】:

    标签: django docker nginx


    【解决方案1】:

    @victormazeli 看起来你错过了将服务放在同一个 docker 网络中,我在nginx conf 文件中看到了一些错误配置。尝试如下更新您的docker-compose.yml

    version: '3.7'
    
    services:
        app:
            build:
                context: .
            command: sh -c "gunicorn testdocker.wsgi:application --bind 0.0.0.0:8000"
            volumes:
                - static_data:/vol/web
            expose:
                - "8000"
            environment: 
                - SECRET_KEY=MANME1233
                - ALLOWED_HOSTS=127.0.0.1, localhost
            networks:
                - main
        
        nginx:
            build: 
                context: ./nginx
            volumes: 
                - static_data:/vol/static
            ports: 
                - "8080:80"
            depends_on:
                - app
            networks:
                - main
    
    volumes: 
        static_data:
    networks:
        main:
    

    然后,更新您的 nginx 配置如下:

    server {
      server_name nginx;
      listen 80;
    
      location /static {
        alias /vol/static;
      }
      location / {
        proxy_pass http://app:8000/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
      }
    
    }
    

    这里要记住的另一件事是,您有 2 个目标正在由 NGINX 反向代理提供服务:

    1. 位于testdocker 的Django 项目应该可以通过localhost:8080 访问
    2. 可通过localhost:8080/static/[relative_path] 访问的静态文件数据

    要访问静态数据,您需要在nginx 服务中相对于/vol/static 的路径(这是一个docker 卷挂载,也安装到app 服务中的/vol/web)。根据appDockerfilestatic_data 卷应该包含两个目录:mediastatic。因此,如果您说index.html 位于app 服务中的目录/vol/web/static 中,它应该可以通过localhost:8080/static/static/index.html 访问。

    试试这个,让我知道它对你有什么效果。

    【讨论】:

    • 嗨 Rapheal 我尝试了你的解决方案,但我仍然收到相同的错误“BAD REQUEST”,并且当我输入 localhost 地址时:127.0.0.1:8080 我得到一个空白的静态页面,我的web 应用仍然没有运行@127.0.0.1:8000 或 localhost:8000,都返回一个“BAD REQUEST”。
    • 您能分享一下您的Dockerfiles 中的内容吗?您尝试提供的实际静态内容存储在哪里?作为共享,看起来您正在使用 docker 卷,您是否有意将其保存在那里并验证它在那里有实际内容?要验证,请运行 docker exec [name_of_nginx_container] ls -la /vol/static。如果它不打印任何内容,则它是空的。告诉我,我可以根据结果更新答案。
    • 嗨 Rapheal,当我执行上述命令时,它会打印出存储在 vol/static 中的文件的信息。至于我的 docker 文件,上面都有。
    • @victormazeli 它应该可以工作,也许您没有检查正确的端点?关于提到的“错误请求”,由于您在 docker-compose.yml 中使用了 expose,因此它仅适用于内部“链接”的 docker 服务。要发布到主机以便正确解析localhost:8000,您需要将其修改为ports 配置,类似于nginx 服务中的配置。您需要在 ports 键中设置一个元素为 "8000:8000" 用于 app 服务。
    • @victormazeli 完成上述操作后,您可以验证localhost:8000localhost:8080 的结果是否匹配。如果是这样,则 NGINX 配置正确。如果它是一个空白页面并且这不是预期的,那么您的 Django 项目可能有问题(我已经使用 hello_django 进行了测试,它工作正常)。
    猜你喜欢
    • 2019-01-08
    • 2017-02-23
    • 2014-04-30
    • 1970-01-01
    • 2020-05-06
    • 2018-11-25
    • 2016-04-11
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多