docker 错误请求上的 django + nginx (400)

dot*_*dot 8 django nginx gunicorn docker docker-compose

我正在尝试让 django (在 Gunicorn 上)和 nginx 与 docker 一起运行。Bad Request (400)不幸的是,我运行后不断收到错误docker-compose up -d --build。帮助。

\n\n

我尝试更改目录、目录名称、卷、网络和公开端口,但无济于事。我还尝试server_name在我的nginx.conf文件中添加和删除。

\n\n

settings.py我有:

\n\n
DEBUG = False\n\nALLOWED_HOSTS = [\'127.0.0.1\', \'localhost\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的docker-compose.yml文件:

\n\n
version: \'3.3\'\n\nservices:\n  web:\n    build: ./app\n    command: gunicorn my_server.wsgi:application --bind 0.0.0.0:8000\n    volumes:\n      - ./app/:/usr/src/app/\n    expose:\n      - 8000\n    environment:\n      - DATABASE=${DATABASE}\n      - SECRET_KEY=${SECRET}\n      - SQL_DATABASE=${POSTGRES_USER}\n      - SQL_ENGINE=django.db.backends.postgresql\n      - SQL_HOST=${POSTGRES_HOST}\n      - SQL_PASSWORD=${POSTGRES_PASSWORD}\n      - SQL_PORT=${POSTGRES_PORT}\n      - SQL_USER=${POSTGRES_USER}\n      - SU_NAME=${SU_NAME}\n      - SU_EMAIL=${SU_EMAIL}\n      - SU_PASSWORD=${SU_PASSWORD}\n    depends_on:\n      - db\n    logging:\n      driver: "json-file"\n      options:\n        max-size: "100k"\n        max-file: "20"\n\n  db:\n    image: postgres:11.2-alpine\n    volumes:\n      - postgres_data:/var/lib/postgresql/data/\n    environment:\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n      - POSTGRES_USER=${POSTGRES_USER}\n    logging:\n      driver: "json-file"\n      options:\n        max-size: "100k"\n        max-file: "20"\n\n  nginx:\n    build: ./nginx\n    restart: unless-stopped\n    volumes:\n      - static_volume:/usr/src/app/assets\n    ports:\n      - 80:80\n    depends_on:\n      - web\n    logging:\n      driver: "json-file"\n      options:\n        max-size: "100k"\n        max-file: "20"\n\nvolumes:\n  static_volume:\n  postgres_data:\n    external: true\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的nginx.conf文件:

\n\n
upstream my_server {\n    server web:8000;\n}\n\nserver {\n\n    listen 80;\n\n    location / {\n        proxy_pass          http://my_server;\n        proxy_set_header    Host                $http_host;\n        proxy_set_header    Host                $host;\n        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;\n        proxy_set_header    X-Real-IP           $remote_addr;\n        proxy_redirect off;\n    }\n\n    location /assets/ {\n        alias /usr/src/app/assets;\n    }\n\n    location  /robots.txt {\n        alias  /var/www/html/robots.txt;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的 django Dockerfile 中,我运行makemigrationsmigrate确认数据库表已创建。

\n\n

我希望访问localhost127.0.0.1查看那里提供的我的网站。相反,我收到此错误:Bad Request (400)

\n\n

当我跑步时docker ps我得到:

\n\n
version: \'3.3\'\n\nservices:\n  web:\n    build: ./app\n    command: gunicorn my_server.wsgi:application --bind 0.0.0.0:8000\n    volumes:\n      - ./app/:/usr/src/app/\n    expose:\n      - 8000\n    environment:\n      - DATABASE=${DATABASE}\n      - SECRET_KEY=${SECRET}\n      - SQL_DATABASE=${POSTGRES_USER}\n      - SQL_ENGINE=django.db.backends.postgresql\n      - SQL_HOST=${POSTGRES_HOST}\n      - SQL_PASSWORD=${POSTGRES_PASSWORD}\n      - SQL_PORT=${POSTGRES_PORT}\n      - SQL_USER=${POSTGRES_USER}\n      - SU_NAME=${SU_NAME}\n      - SU_EMAIL=${SU_EMAIL}\n      - SU_PASSWORD=${SU_PASSWORD}\n    depends_on:\n      - db\n    logging:\n      driver: "json-file"\n      options:\n        max-size: "100k"\n        max-file: "20"\n\n  db:\n    image: postgres:11.2-alpine\n    volumes:\n      - postgres_data:/var/lib/postgresql/data/\n    environment:\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n      - POSTGRES_USER=${POSTGRES_USER}\n    logging:\n      driver: "json-file"\n      options:\n        max-size: "100k"\n        max-file: "20"\n\n  nginx:\n    build: ./nginx\n    restart: unless-stopped\n    volumes:\n      - static_volume:/usr/src/app/assets\n    ports:\n      - 80:80\n    depends_on:\n      - web\n    logging:\n      driver: "json-file"\n      options:\n        max-size: "100k"\n        max-file: "20"\n\nvolumes:\n  static_volume:\n  postgres_data:\n    external: true\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我跑步时,docker logs my_server_nginx_1我得到这样的行:

\n\n
172.18.0.1 - - [08/May/2019:22:25:07 +0000] "GET / HTTP/1.1" 400 37 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" "-"\n172.18.0.1 - - [08/May/2019:22:25:07 +0000] "GET /favicon.ico HTTP/1.1" 400 37 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" "-"\n
Run Code Online (Sandbox Code Playgroud)\n

rud*_*dra 6

可能您需要添加my_server到允许的主机(与 NGINX 配置中的上游相同):

ALLOWED_HOSTS = ['my_server']
Run Code Online (Sandbox Code Playgroud)


dot*_*dot 1

在尝试实施 upinder kumar 的解决方案时,我偶然发现了该解决方案。我会在这里为将来遇到这个问题的其他人添加:

两者nginx.conf不能兼得

proxy_set_header    Host                $http_host;
Run Code Online (Sandbox Code Playgroud)

proxy_set_header    Host                $host;
Run Code Online (Sandbox Code Playgroud)

删除其中任何一个都可以解决问题。