Очередные грабли на которые в LF многие наступили.

Есть nginx с такой конфигурацией:

server {
    listen 80;
    server_name _;

    location /app {
        proxy_pass http://localhost:5000;
    }
}

И есть приложение:

from flask import
Flask app = Flask(__name__)

@app.route('/')

def hello():
    return 'Привет, Linux Factory!'
    
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

Плюс к нему Dockerfile:

FROM python:3.8-slim
WORKDIR /app COPY . 
/app RUN pip install -r requirements.txt 
EXPOSE 5000
CMD ["python", "app.py"]

Собираем и запускаем контейнер:

docker build -t bashdays .
docker run -d -p 5000:5000 bashdays

Идем в браузере на http://bashdays.ru/app и получаем хуй с маслом:

Важно! Уже по этой ошибке можно сделать какие-то выводы, эт не стандартная ошибка от nginx, а значит запрос отлично доходит до приложения. Но где-то внутри приложения теряется. Тренируй насмотренность, у nginx ошибки обычно по центру выводятся, а тут align вправо.

Еще как вариант, можешь остановить контейнер и еще раз в браузере тыкнуться, если получишь 502 Плохой шлюх, то значит что nginx нормально всё у тебя передает запросы на Flask. Но где-то внутри Flask происходит какое-то гавнище.

А что случилось? Всёж верно? Локейшен в nginx прописан, прокси-пасс тоже присутствует, где ответ от приложения?

Все дело в слэшах!

location /app {
    proxy_pass http://localhost:5000/;
}

В конце порта 5000 ставим слэш и проверяем. Хуяк и оно начинает работать!

Что вообще происходит?

Когда мы делаем локейшен без последнего слэша в прокси-пассе, nginx проксирует запросы на приложение без изменения пути.

То есть приложение app.py получает роут /app а его там естественно нет. А есть просто корень /.

А когда мы добавляем слэш, nginx добавляет путь после /app к целевому урлу.

Короче опять заумно расписал, давай снова на котиках!

Без слэша запрос /app проксируется на http://localhost:5000/app, что не совпадает с маршрутом, настроенным в Flask.

С слэшем запрос /app проксируется на http://localhost:5000, и приложение Flask обслуживает его как корневой путь /.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
В общем с конечным слэшем nginx «удаляет» часть пути /app и отправляет запрос на корень приложения Flask.

Вот и вся наука. Грабли прям жизненные и порой доставляют проблемы с многочасовым дебагом.

Так что держи это в голове, если с виду вроде все правильно, но не работает, пиздани в конце слэш, типа метод тыка.

Вечерком еще чтива подвезу, случайно набрал интеграций, теперь отдуваюсь.