Docker-compose:nginx不适用于django和gunicorn

时间:2015-04-22 09:56:08

标签: nginx docker uwsgi gunicorn docker-compose

我一直在尝试在docker-compose中设置一个环境,其中有几个容器:

  • Django的
  • Nginx的
  • 的Postgres
  • DbData
  • 存储

我使用了以下配置:

 app:
  restart: always
  build: src
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes_from:
    - storage_files_1
  env_file: .env
  command: gunicorn barbell.wsgi:application \
            -b 0.0.0.0:8000 -w 4

nginx:
  restart: always
  build: nginx
  ports:
    - "80:80"
    - "443:443"
  volumes_from:
    - storage_files_1
  links:
    - app:app

postgres:
  restart: always
  image: postgres:latest
  volumes_from:
    - storage_data_1
  ports:
    - "5432:5432"

我启用了nginx网站的配置文件如下所示:

server {

    listen 80;
    server_name localhost;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location /static {
        alias /static/;
        autoindex on;
    }

    location / {
         proxy_pass http://app:8000;
         proxy_set_header X-Forwarded-Host $server_name;
         proxy_set_header X-Real-IP $remote_addr;
         add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

它不起作用 - nginx总是返回502,但完全提供静态文件。我也尝试过与uwsgi相同的设置,没有运气。 然而,当我将Django与nginx结合并从同一个容器中提供所有内容时,一切正常(同样,在uwsgi和gunicorn上)。

知道我错过了什么吗?

更新

以下是nginx日志:

*1 connect() failed (111: Connection refused) while connecting to upstream,
client: 172.17.42.1, server: 0.0.0.0, request: "GET / HTTP/1.1", upstream:   
"http://172.17.1.75:8000/", host: "localhost"

2 个答案:

答案 0 :(得分:3)

原来,Gunicorn是罪魁祸首。将其配置放入文件解决了这个问题。

gunicorn_config.py与manage.py:

放在同一个文件夹中
bind = "0.0.0.0:8000"
loglevel = "INFO"
workers = "4"
reload = True

errorlog = "/var/log/gunicorn/error.log"
accesslog = "/var/log/gunicorn/access.log"

docker-compose.yml中的一些变化:

app:
  restart: always
  build: src
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes_from:
    - storage_files_1
  env_file: .env
  command: gunicorn --config=gunicorn_config.py barbell.wsgi:application

现在它可以正常工作。

答案 1 :(得分:-1)

因此,我没有看到您对错误日志的任何进一步反馈,以及可能会或可能不会为您带来的影响;然而,我已经将你的例子剥离到最简单,作为Docker+Django+NGINX工作的示范:

请参阅:docker-django-test

NB:这是在我使用autodock的某些基础架构上运行的。如果您想要复制此内容,则需要docker-compose.yml的此片段:

autodock:
    image: prologic/autodock
    ports:
        - "1338:1338/udp"
        - "1338:1338/tcp"
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock

autodockhipache:
    image: prologic/autodock-hipache
    links:
        - autodock
        - hipache:redis

hipache:
    image: hipache
    ports:
        - 80:80
        - 443:443

请参阅:A Docker-based mini-PaaS