Nginx HTTP Ошибка 404 Django Rest Framework
Я пытаюсь установить обратный прокси с помощью Nginx для передачи статических файлов моему webapp внутри контейнера, но терплю неудачу... Проблема в том, что Nginx прекрасно обслуживает статические файлы, когда я захожу на страницу администратора django, но как только я пытаюсь перейти к конечной точке, используя rest framework, я получаю ошибку "HTTP Error 404. Запрашиваемый ресурс не найден." ошибка.
Вот как у меня все устроено:
Мои настройки Nginx:
upstream django {
server store:27036;
}
server {
listen 8080;
location / {
proxy_pass http://django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static {
alias /vol/static;
}
}
Мои настройки docker-compose:
version: "3.9"
services:
store:
build:
context: .
ports:
- "27036:27036"
depends_on:
- mysql
environment:
PYTHONUNBUFFERED: 1
DJANGO_SETTINGS_MODULE: my_app.settings.prod
STORE_HOST: ${STORE_HOST}
STORE_PORT: ${STORE_PORT}
DATABASE_NAME: ${STORE_DB_NAME}
DATABASE_HOST: ${STORE_DB_HOST}
DATABASE_USER: ${STORE_DB_USER}
DATABASE_PASSWORD: ${STORE_DB_PASSWORD}
SECRET_KEY: ${SECRET_KEY}
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
platform: "linux/amd64"
restart: on-failure
volumes:
- store_data:/app
# - static:/static
- static_data:/vol/web
mysql:
image: mysql:8.0
cap_add:
# suppress log messages from cluttering the shell output
- SYS_NICE
command: --default-authentication-plugin=mysql_native_password --mysqlx=0
ports:
- 3306:3306
environment:
MYSQL_HOST: ${STORE_DB_HOST}
MYSQL_PORT: ${STORE_DB_PORT}
MYSQL_DATABASE: ${STORE_DB_NAME}
MYSQL_ROOT_PASSWORD: ${STORE_DB_PASSWORD}
platform: "linux/amd64"
restart: always
volumes:
- mysqldata:/var/lib/mysql
nginx:
build: ./nginx
volumes:
# - static:/static
- static_data:/vol/static
ports:
- "8080:8080"
depends_on:
- store
volumes:
# static:
static_data:
mysqldata:
store_data:
Я понятия не имею, что именно я делаю неправильно или почему ошибка возникает только тогда, когда я пытаюсь получить доступ к конечной точке в api. Стоит упомянуть, что я использую windows
После вашей последней правки вопроса теперь ответ будет таким: вы можете добавить порт к вашему proxy_pass
в вашем конфигурационном файле Nginx ... также просто выставьте порт, через который Nginx будет общаться с Django на первом сервисе вашего docker-compose
docker-compose.yml:
version: "3.9"
services:
django:
build:
context: .
expose:
- "27036"
depends_on:
- mysql
environment:
PYTHONUNBUFFERED: 1
DJANGO_SETTINGS_MODULE: my_app.settings.prod
STORE_HOST: ${STORE_HOST}
STORE_PORT: ${STORE_PORT}
DATABASE_NAME: ${STORE_DB_NAME}
DATABASE_HOST: ${STORE_DB_HOST}
DATABASE_USER: ${STORE_DB_USER}
DATABASE_PASSWORD: ${STORE_DB_PASSWORD}
SECRET_KEY: ${SECRET_KEY}
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
platform: "linux/amd64"
restart: on-failure
volumes:
- store_data:/app
# - static:/static
- static_data:/vol/web
mysql:
image: mysql:8.0
cap_add:
# suppress log messages from cluttering the shell output
- SYS_NICE
command: --default-authentication-plugin=mysql_native_password --mysqlx=0
ports:
- 3306:3306
environment:
MYSQL_HOST: ${STORE_DB_HOST}
MYSQL_PORT: ${STORE_DB_PORT}
MYSQL_DATABASE: ${STORE_DB_NAME}
MYSQL_ROOT_PASSWORD: ${STORE_DB_PASSWORD}
platform: "linux/amd64"
restart: always
volumes:
- mysqldata:/var/lib/mysql
nginx:
build: ./nginx
volumes:
# - static:/static
- static_data:/vol/static
ports:
- "8080:8080"
depends_on:
- store
volumes:
# static:
static_data:
mysqldata:
store_data:
default.conf:
server {
listen 8080 default_server;
server_name localhost;
location / {
proxy_pass http://django:27036;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static {
alias /vol/static;
}
}
пример этого вы можете найти здесь https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
Надеюсь, это работает, и надеюсь, что вы нашли это полезным!