Проблемы с проксированием Nginx на Gunicorn: запросы возвращают 404 вместо корректного ответа от Flask
Описание:
Я пытаюсь настроить Flask-приложение с использованием Nginx и Gunicorn. Приложение запускается на 127.0.0.1:5000
и корректно работает при доступе напрямую через curl
:
curl http://127.0.0.1:5000/admin/login
Этот запрос возвращает HTML-страницу с формой входа. Однако при доступе к тому же URL через домен http://mydomain.com/admin/login
или напрямую по IP http://<my-ip>/admin/login
я получаю ошибку 404 Not Found
.
Моя конфигурация Nginx (/etc/nginx/sites-available/myproject
):
server {
listen 80;
server_name mydomain.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Конфигурация синтаксически правильная:
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
После этого я перезапускаю Nginx и Gunicorn:
sudo systemctl restart nginx
sudo systemctl restart gunicorn
Логи Nginx (/var/log/nginx/access.log
):
mydomain.com - <my-ip> - - - [дата-время] - /usr/share/nginx/html - /admin - GET /admin HTTP/1.1 - 404 - 555 - -
Логи ошибок Nginx (/var/log/nginx/error.log
) показывают, что запросы к mydomain.com/admin
ищут файлы в директории Nginx:
open() "/usr/share/nginx/html/admin" failed (2: No such file or directory), client: <my-ip>, server: mydomain.com, request: "GET /admin HTTP/1.1"
Конфигурация Gunicorn (/etc/systemd/system/gunicorn.service
):
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=example_user
Group=www-data
WorkingDirectory=/home/example_user/my_project
ExecStart=/home/example_user/my_project/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:5000 wsgi:app
[Install]
WantedBy=multi-user.target
Что я пробовал:
- Проверил, что приложение работает при доступе напрямую через
127.0.0.1:5000
. - Убедился, что конфигурация Nginx синтаксически корректна.
- Несколько раз перезапускал Gunicorn и Nginx.
- Проверил записи DNS и убедился, что они корректно разрешаются.
- Убедился, что
ufw
отключен (исключил проблему с брандмауэром).
Вопрос:
Почему Nginx пытается искать файлы в своей директории (/usr/share/nginx/html
) вместо того, чтобы проксировать запросы на Gunicorn, работающий на 127.0.0.1:5000
? Что я упускаю в конфигурации Nginx?