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

python - Как развернуть Flask + Gunicorn + Nginx + supervisor на облачном сервере?

Со вчерашнего дня я прочитал много инструкций по этой проблеме, но все они имеют похожие шаги. Однако я следовал шаг за шагом, но до сих пор не могу все понять.

На самом деле я могу заставить работать Flask + Gunicorn + supervisor, но Nginx не работает.

Я подключаю свой удаленный облачный сервер с помощью SSH и не развертываю сайт на своем компьютере.

Nginx установлен правильно, потому что, когда я захожу на сайт через доменное имя (aka. example.com) отображается страница приветствия Nginx.

я использую supervisor для запуска Gunicorn и конфигурации

[program:myapp]
command=/home/fh/test/venv/bin/gunicorn -w4 -b 0.0.0.0:8000 myapp:app
directory=/home/fh/test
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
stdout_logfile=/home/fh/test/log/gunicorn.log
stderr_logfile=/home/fh/test/log/gunicorn.err

вот привязываю сервер к порту 8000 и Я на самом деле не знаю, что означает 0.0.0.0, но я думаю, что это не означает localhost, потому что я могу посетить сайт через http://example.com:8000 и это хорошо работает.

Затем я попытался использовать Nginx в качестве прокси-сервера.

я удалил /etc/nginx/sites-available/default' and '/etc/nginx/sites-enabled/default/ и создал /etc/nginx/sites-available/test.com и /etc/nginx/sites-enabled/test.com и связать их символически.

test.com

server {
        server_name www.penguin-penpen.com;
        rewrite ^ http://example/ permanent;
}

# Handle requests to example.com on port 80
server {
        listen 80;
        server_name example.com;

        # Handle all locations
        location / {
                # Pass the request to Gunicorn
                proxy_pass http://127.0.0.1:8000;

                # Set some HTTP headers so that our app knows where the request really came from
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

Насколько я понимаю, Nginx делает, когда я захожу http://example.com он передает мой запрос http://example.com:8000.

Я не совсем уверен, что мне следует использовать proxy_pass http://127.0.0.1:8000 здесь, потому что я не знаю, должен ли Nginx передавать запрос на localhost Но я попытался изменить это на 0.0.0.0:8000 но это все равно не работает.

Кто-нибудь может помочь?

Что nginx делает, так это для местоположения / передает запрос на значение proxy_pass. В этом случае запрос будет отправлен на адрес http://127.0.0.0:8000 это означает, что ваш пулемет должен слушать этот интерфейс. Обычно Gunicorn слушает локальный хост, например

 gunicorn --bind 127.0.0.1:8000 myapp:app

Это потому, что вы не хотите, чтобы внешние пользователи подключались к Gunicorn напрямую, а скорее через nginx.

Это образец конфигурации nginx, который отлично работает с запуском Gunicorn, как указано выше.

   location / {
    proxy_read_timeout 120;
    proxy_pass  http://127.0.0.1:8000;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_redirect off;
    proxy_buffering off;
    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;
}