whitebear
whitebear

Reputation: 12423

nginx and django setting for docker-compose

I have setting with nginx and django(named python container).

I can access see the top page with localhost:8000, however I cannot fetch the static file nor use API localhost:8000/api/items

I am newbee for nginx and django so still confusing.

I am planning the setting like this belo

normal files browser ->8000 -> nginx -> 8001 ->django

for static file

django ->8000 -> nginx

am it correct???or where should I fix??

These are settings below.

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;

Upvotes: 1

Views: 204

Answers (1)

Oleg Russkin
Oleg Russkin

Reputation: 4404

Static files are generated on django management command collectstatic.

If run in django container - these files will be generated and present only in django container. So, STATIC_ROOT should be shared with nginx - i.e. one common docker volume mounted both to django container STATIC_ROOT and to nginx container static files path.

This command may be used as part of entrypoint script of django container to be auto-run on every start.

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

  nginx:
    volumes:
      - static-volume:/static

volumes:
  static-volume:

Or static files can be generated and provided to nginx /static in other way, i.e. as an artifact during ci build / deploy.


Or you can use whitenoise and make django serve its static files (but not media files).

Also, files can be stored (and distributed by) in cloud like Amazon S3.

Upvotes: 1

Related Questions