502 nginx 无法连接到 gunicorn 服务器
502 nginx can't connect to gunicorn server
我不知道出了什么问题。
我在单独的 docker 容器中安装了 nginx 和 gunicorn 运行。 Nginx 在端口 80 上 运行 转发到 8000 上的 gunicorn。我从 nginx 收到 502 错误。如果我访问端口 8000,我的 gunicorn 服务器会收到 200 响应。
如果我关闭 nginx docker 并在我的笔记本电脑上启动一个 nginx 服务器将流量转发到端口 8000,一切正常。 docker 化的 nginx 服务器设置会不会出错?
docker-compose.yml
version: '3.3'
services:
nginx:
build: ./nginx
ports:
- '1337:80'
depends_on:
- django-api
django-api:
build:
context: .
dockerfile: Dockerfile
command: gunicorn my_app.wsgi:application --log-level verbose --log-file=/var/log/guni --access-logfile=/var/log/gunia --bind 0.0.0.0:8000 --forwarded-allow-ips "*"
ports:
- '8000:8000'
depends_on:
- mysql
mysql:
image: mysql:5
volumes:
- type: bind
source: ./db/docker-entrypoint-initdb.d
target: /docker-entrypoint-initdb.d
- type: volume
source: mysql-data
target: /var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: toor
networks:
- backend
ports:
- '3306:3306'
volumes:
mysql-data:
static_volume:
networks:
backend:
gunicorn Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
ENV DJANGO_SETTINGS_MODULE dori.settings.dev
WORKDIR /app
COPY . /app
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
# Port to expose
EXPOSE 8000
nginx.conf
upstream hello_django {
server localhost:8000;
}
server {
listen 80;
location / {
proxy_pass http://hello_django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
问题出在您的 nginx 配置文件中。您正在尝试将来自 nginx 容器的请求转发到端口 8000
上的容器本身,只需将您的 nginx 配置文件更改为:
upstream hello_django {
server django-api:8000;
}
server {
listen 80;
location / {
proxy_pass http://hello_django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
django-api 是 docker-compose 创建的网络中容器的服务名称,您的其他服务可以在尝试连接到本地网络时。
我不知道出了什么问题。
我在单独的 docker 容器中安装了 nginx 和 gunicorn 运行。 Nginx 在端口 80 上 运行 转发到 8000 上的 gunicorn。我从 nginx 收到 502 错误。如果我访问端口 8000,我的 gunicorn 服务器会收到 200 响应。
如果我关闭 nginx docker 并在我的笔记本电脑上启动一个 nginx 服务器将流量转发到端口 8000,一切正常。 docker 化的 nginx 服务器设置会不会出错?
docker-compose.yml
version: '3.3'
services:
nginx:
build: ./nginx
ports:
- '1337:80'
depends_on:
- django-api
django-api:
build:
context: .
dockerfile: Dockerfile
command: gunicorn my_app.wsgi:application --log-level verbose --log-file=/var/log/guni --access-logfile=/var/log/gunia --bind 0.0.0.0:8000 --forwarded-allow-ips "*"
ports:
- '8000:8000'
depends_on:
- mysql
mysql:
image: mysql:5
volumes:
- type: bind
source: ./db/docker-entrypoint-initdb.d
target: /docker-entrypoint-initdb.d
- type: volume
source: mysql-data
target: /var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: toor
networks:
- backend
ports:
- '3306:3306'
volumes:
mysql-data:
static_volume:
networks:
backend:
gunicorn Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
ENV DJANGO_SETTINGS_MODULE dori.settings.dev
WORKDIR /app
COPY . /app
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
# Port to expose
EXPOSE 8000
nginx.conf
upstream hello_django {
server localhost:8000;
}
server {
listen 80;
location / {
proxy_pass http://hello_django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
问题出在您的 nginx 配置文件中。您正在尝试将来自 nginx 容器的请求转发到端口 8000
上的容器本身,只需将您的 nginx 配置文件更改为:
upstream hello_django {
server django-api:8000;
}
server {
listen 80;
location / {
proxy_pass http://hello_django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
django-api 是 docker-compose 创建的网络中容器的服务名称,您的其他服务可以在尝试连接到本地网络时。