Django Nginx在Docker外部工作但不在内部
我正在使用Django、Gunicorn、Nginx和Docker制作一个个人网站。当我执行:Django Nginx在Docker外部工作但不在内部,django,docker,nginx,gunicorn,Django,Docker,Nginx,Gunicorn,我正在使用Django、Gunicorn、Nginx和Docker制作一个个人网站。当我执行: gunicorn --chdir personal-website --bind :8000 personal_website.wsgi:application 输出为: [arturocuya@localhost personalwebsite]$ gunicorn --chdir personal-website --bind :8000 personal_website.wsgi:applic
gunicorn --chdir personal-website --bind :8000 personal_website.wsgi:application
输出为:
[arturocuya@localhost personalwebsite]$ gunicorn --chdir personal-website --bind :8000 personal_website.wsgi:application
[2018-09-09 11:49:02 -0500] [5161] [INFO] Starting gunicorn 19.6.0
[2018-09-09 11:49:02 -0500] [5161] [INFO] Listening at: http://0.0.0.0:8000 (5161)
[2018-09-09 11:49:02 -0500] [5161] [INFO] Using worker: sync
[2018-09-09 11:49:02 -0500] [5165] [INFO] Booting worker with pid: 5165
它可以工作(有点像,静态文件的配置还没有完成)
问题是,当我用sudocker compose up
运行Docker容器时,我得到了502坏网关
我怀疑问题在于我如何使用端口,但我真的不明白应该如何做
这是我的文件夹结构
.
├── config
│ └── nginx
│ └── conf.d
│ └── local.conf
├── docker-compose.yml
├── Dockerfile
└── personal-website
└── manage.py
Dockerfile
# Start from an official image
FROM python:3.6
# The following is an arbitrary location choice
RUN mkdir -p /opt/services/personalwebsite/src
WORKDIR /opt/services/personalwebsite/src
# Copy the project code
COPY . /opt/services/personalwebsite/src
# Install dependencies
RUN pip install django gunicorn Pillow
# Expose Port 8000
EXPOSE 8000
# Define the default command to run when starting the container
CMD ["gunicorn", "--chdir", "personal-website", "--bind", ":8000", "personal_website.wsgi:application"]
docker-compose.yml
version: '3'
services:
personalwebsite:
build: .
volumes:
- .:/opt/services/personalwebsite/src
networks:
- nginx_network
nginx:
image: nginx:1.13
ports:
- 8000:80
volumes:
- ./config/nginx/conf.d:/etc/nginx/conf.d
depends_on:
- personalwebsite
networks:
- nginx_network
networks:
nginx_network:
driver: bridge
config/nginx/conf.d/local.conf
# first we declare our upstream server, which is our Gunicorn application
upstream personalwebsite_server {
# docker will automatically resolve this to the correct address
# because we use the same name as the service: "personalwebsite"
server personalwebsite:8000;
}
# now we declare our main server
server {
listen 80;
server_name localhost;
location / {
# everything is passed to Gunicorn
proxy_pass http://personalwebsite;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
我还确保在Django项目的settings.py
ALLOWED_HOSTS = ['127.0.0.1', '149.248.5.164', '0.0.0.0']
编辑1:
正如有人在评论中建议的那样,我使用sudocker compose exec Nginx bash
访问了Nginx容器,然后访问了curl personalswebsite:8000
。我得到了一个不允许的主机
错误,所以我在settings.py
中向允许的主机添加了personalwebsite
,然后我再次尝试卷曲,输出的是我页面的HTML,这很好
这似乎在容器中起了作用,因为输出是我页面的HTML。但后来我做了sudocker组合
,我又得到了502坏网关
。确切的结果是:
[arturocuya@localhost personalwebsite]$ sudo docker-compose up
[sudo] password for arturocuya:
Starting personalwebsite_personalwebsite_1 ... done
Starting personalwebsite_nginx_1 ... done
Attaching to personalwebsite_personalwebsite_1, personalwebsite_nginx_1
personalwebsite_1 | [2018-09-10 02:07:12 +0000] [1] [INFO] Starting gunicorn 19.9.0
personalwebsite_1 | [2018-09-10 02:07:12 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
personalwebsite_1 | [2018-09-10 02:07:12 +0000] [1] [INFO] Using worker: sync
personalwebsite_1 | [2018-09-10 02:07:12 +0000] [10] [INFO] Booting worker with pid: 10
nginx_1 | 172.26.0.1 - - [10/Sep/2018:02:07:17 +0000] "GET / HTTP/1.1" 502 576 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36" "-"
nginx_1 | 2018/09/10 02:07:17 [error] 8#8: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.26.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://172.26.0.2:80/", host: "0.0.0.0:8000"
nginx_1 | 2018/09/10 02:07:18 [error] 8#8: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.26.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://172.26.0.2:80/favicon.ico", host: "0.0.0.0:8000", referrer: "http://0.0.0.0:8000/"
nginx_1 | 172.26.0.1 - - [10/Sep/2018:02:07:18 +0000] "GET /favicon.ico HTTP/1.1" 502 576 "http://0.0.0.0:8000/" "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36" "-"
您的Nginx配置应该是
upstream personalwebsite {
server personalwebsite:8000;
}
# now we declare our main server
server {
listen 80;
server_name localhost;
location / {
# everything is passed to Gunicorn
proxy_pass http://personalwebsite;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
您的Nginx服务是否在容器内运行
请在Nginx容器中点击下面的命令并让我知道输出
curl -I localhost:80
这很容易理解,你的
代理\u通行证
URL和上游
关键字应该是相同的
要深入Nginx上游配置,请通过尝试进入Nginx容器(docker compose exec Nginx bash)然后在personalwebsite:8000上创建curl以查看连接是否正常?@JakubBujny我执行了
sudo-docker-compose-up-d
以重新启动容器,然后sudo-docker-compose-exec-nginx-bash
以访问nginx容器,正如您所说,但当我尝试curl-personalwebsite:8000
时,输出是无效的bash:curl:未找到命令
。我从未使用过curl,所以很可能是我做错了。没关系-curl没有安装,请先在容器中尝试apt-get-update&&apt-get-y-curl
,然后运行curl命令。我安装了它,并尝试了curl-personal-website:8000
。输出是Django在收到错误不允许的主机时显示的调试页面。我在settings.py
中将personalwebsite
添加到ALLOWED_HOSTS
列表中,并在nginx容器中再次尝试curl personalwebsite:8000
。这似乎在容器中起了作用,因为输出是我页面的HTML。但是后来我又做了一个SudoDocker撰写的。确切的输出将在下一条注释中:[arturocuya@localhost个人网站]$sudo docker正在启动个人网站\u个人网站\u 1。。。已完成启动个人网站\u nginx\u 1。。。已附加至个人网站[2018-09-09 18:47:47+0000][1][1][信息]开始于gunicorn 19.9.0个人网站[2018-09-09 18:47:47+0000][1][信息]收听:http://0.0.0.0:8000 (1) 个人网站|[2018-09-09 18:47:47+0000][1][INFO]使用worker:sync personalswebsite_1 |[2018-09-09 18:47:47+0000][10][INFO]启动带有pid:10的worker。请解释为什么这是解决方案,以便其他人(和我)能够完全理解这一点。非常感谢你!!!