Docker-compose: nginx 不适用于 django 和 gunicorn
Docker-compose: nginx does not work with django and gunicorn
我一直在尝试在 docker-compose 中设置一个环境,其中有多个容器:
- Django
- Nginx
- Postgres
- 数据库数据
- 存储空间
我使用了以下配置:
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 总是 returns 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"
所以我还没有看到您关于错误日志的任何进一步反馈,以及您可能会或可能不会发生的事情;但是,我已将您的示例简化为最简单的示例,作为 Docker+Django+NGINX
工作的演示:
注意: 这是 运行 在我的一些使用 autodock 的基础设施上 如果你想复制它,你需要 运行 的这个片段=12=]:
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
原来罪魁祸首是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
现在它可以正常工作了。
我一直在尝试在 docker-compose 中设置一个环境,其中有多个容器:
- Django
- Nginx
- Postgres
- 数据库数据
- 存储空间
我使用了以下配置:
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 总是 returns 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"
所以我还没有看到您关于错误日志的任何进一步反馈,以及您可能会或可能不会发生的事情;但是,我已将您的示例简化为最简单的示例,作为 Docker+Django+NGINX
工作的演示:
注意: 这是 运行 在我的一些使用 autodock 的基础设施上 如果你想复制它,你需要 运行 的这个片段=12=]:
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
原来罪魁祸首是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
现在它可以正常工作了。