Назад | Перейти на главную страницу

Nginx не может передать трафик приложению Flask и uwsgi

Я пытаюсь развернуть приложение Flask и uwsgi с помощью Nginx, все работает, и я могу заставить свое приложение работать в моем домене: test.example.com:8080.

Проблема в том, что я не могу заставить его работать с портом по умолчанию 80, я получаю следующее сообщение об ошибке от Nginx, когда пытаюсь просмотреть test.example.com:

2016/09/02 10:21:29 [error] 2947#2947: *3 no live upstreams while connecting to upstream, client: 75.xxx.xxx.136, server: test.example.com, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://localhost", host: "test.example.com", referrer: "http://test.example.com/"

Это моя команда uwsgi:

uwsgi --socket 8080 --chdir /var/www/test.example.com --protocol=http --module myapp:app

А это мой конфиг Nginx:

server {

    listen 80;

    root /var/www/test.example.com;
    server_name test.example.com;

    location / {
        include         uwsgi_params;
        uwsgi_pass   0.0.0.0:8080;
    uwsgi_param SCRIPT_NAME /myapp;
    }
}

Nginx не может просто передать трафик на порт 8080 с 80 для моего сервера, я не знаю почему.

Ваша командная строка uwsgi неверна. Подтвердите, проверив, есть ли у вас файловый сокет с именем 8080 под /var/www/test.example.com. Если он там есть, вы перепутали сокеты TCP и UNIX.

Также, --protocol http означает, что для доступа к uwsgi следует использовать протокол HTTP, а не собственный протокол uwsgi, который также поддерживает nginx. Удалите этот параметр или используйте proxy_pass вместо того uwsgi_pass.

Правильная командная строка будет такой:

uwsgi --socket :8080 --chdir /var/www/test.example.com --module myapp:app

Для повышения безопасности вы также можете указать локальный IP-адрес сайта для прослушивания uwsgi, поэтому используйте, например, 127.0.0.1:8080 вместо просто :8080.

Еще один способ - использовать сокеты UNIX вместо прослушивания tcp / 8080, указав путь к сокету для командной строки uwsgi и используя uwsgi_pass unix:/file/path/passed/to/socket в конфигурации nginx. Это было бы еще безопаснее, потому что вы можете контролировать права доступа сокета с разрешениями каталога, ограничивая также возможность локального пользователя причинять вред.