【问题标题】:nginx and django setting for docker-composedocker-compose 的 nginx 和 django 设置
【发布时间】:2020-03-23 16:09:01
【问题描述】:

我有nginxdjango(命名为python 容器)的设置。

我可以使用localhost:8000 访问查看首页,但是我无法获取静态文件,也无法使用 API localhost:8000/api/items

我是 nginx 和 django 的新手,所以还是很困惑。

我正在计划这样的环境

普通文件 browser ->8000 -> nginx -> 8001 ->django

静态文件

django ->8000 -> nginx

正确吗???或者我应该在哪里修复??

这些是下面的设置。

docker-composer.yml

version: '3'
services:
  python:
    container_name: python
    build: ./python
    command: uwsgi --socket :8001 --module myapp.wsgi --py-autoreload 1 --logto /tmp/mylog.log

    expose:
      - "8001"
  nginx:
    image: nginx:1.13
    container_name: nginx
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
      - ./nginx/static:/static
    depends_on:
      - python

app_nginx.conf

upstream django {
    ip_hash;
    server python:8001;
}

server {
    listen      8000;
    server_name 127.0.0.1;
    charset     utf-8;

    location /static {
        alias /static;
    }

    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params;
    }
}

server_tokens off;

uwsgi_prams

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

【问题讨论】:

  • for static file django ->8000 -> nginx - 不,django 与此设置中的静态文件无关。 Nginx 应该直接从驱动器为它们提供服务。
  • 我明白了...但是现在可以了,我将每个静态文件都放在 nginx /static 文件夹中。

标签: python django docker nginx docker-compose


【解决方案1】:

django管理命令collectstatic生成静态文件。

如果在 django 容器中运行 - 这些文件将生成并仅存在于 django 容器中。因此,STATIC_ROOT 应该与 nginx 共享 - 即一个公共 docker 卷同时安装到 django 容器 STATIC_ROOT 和 nginx 容器静态文件路径。

此命令可用作 django 容器的 entrypoint 脚本的一部分,以便在每次启动时自动运行。

  python:
    volumes:
      - static-volume:/app/static

  nginx:
    volumes:
      - static-volume:/static

volumes:
  static-volume:

或者可以生成静态文件并以其他方式提供给 nginx /static,即作为 ci 构建/部署期间的工件。


或者您可以使用whitenoise 并让 django 提供其静态文件(但不提供媒体文件)。

此外,文件可以存储(和分发)在 Amazon S3 等云中。

【讨论】:

  • 非常感谢。现在我将静态文件放在 nginx 容器 /static 目录中。
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2018-03-09
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 2021-01-08
  • 2023-03-17
相关资源
最近更新 更多