Как обслуживать локальное приложение с помощью официантки и Nginx

У меня есть черточное (плотно) приложение, настроенное с использованием фляги в качестве сервера, и я могу обслуживать его на нашем Windows Server для порта:8041, используя официантку. Мой код для запуска официантки ниже;

#!/usr/bin/env python3

from waitress import serve
from src.pacedash.app import server as application

if __name__ == "__main__":
    serve(application, threads=100, port=8041)

Все прекрасно работает, если я использую python run_waitress.py, за исключением того, что, когда кто-то в нашей сети переходит на имя сервера:8041, рядом с URL-адресом появляется предупреждение "Не защищено". Наш ИТ-поставщик смог получить файл сертификата и ключ, но я не уверен, как включить их в мои текущие настройки.

Я пытался использовать nginx, но я не могу найти руководство по настройке его с помощью официантки, и я не слишком знаком с веб-приложениями или wsgi, потому что я в основном работаю здесь как одинокий человек данных.

3 ответа

Я полностью решаю проблему заставить работать официантку за Nginx (HTTP), не так-то просто, но вкратце:

Если вы используете эту команду для запуска сервера официантки из кода Python:

      from waitress import serve

serve(app, listen='0.0.0.0:8080', url_scheme='https')

Здесь используем url_scheme='https', потому что в моем случае мне нужно разрешить только HTTPs-соединение, и для корректной работы между nginx и Waitress мы должны его использовать.

Общий шаблон:

  1. если у вас нет домена, просто используйте IP-адрес вашего сервера вместо your_domain (для получения бесплатных сертификатов вы можете использовать, например, https://zerossl.com/),

  2. вместо your_ip_address используйте свой IP-адрес, к которому вы подключаетесь, например через ssh.

            server {
         listen 443 ssl;
    
         ssl_certificate /etc/ssl/fullchain.crt;
         ssl_certificate_key /etc/ssl/private/private.key;
    
         server_name your_domain www.your_domain;
    
         location / {
             proxy_pass http://your_ip_address:8080;
             proxy_set_header X-Real-IP $remote_addr;
         }
    }
    

NGINX требует объединения всех файлов .crt, чтобы можно было установить SSL. поэтому fullchain.crt объединяет наши файлы certificate.crt и ca_bundle.crt (команда терминала UNIX):

      cat certificate.crt ca_bundle.crt >> certificate.crt

Если у нас есть доменное имя example.com и мы получаем сертификат через letsencrypt (certbot):

      server {
    listen 443 ssl;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    server_name example.com;

    location / {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Это руководство поможет мне. Если что-то неясно, спросите меня в комментариях или посмотрите это руководство, где вы также можете найти пример конфигурации nginx:https://dev.to/thetrebelcc/how-to-run-a-flask- приложение-через https-с использованием-официантки-и-nginx-2020-235c

Я работал над этой же проблемой и нашел решение. Расположение файла nginx .conf должно быть определено следующим образом:

location /myapp/ {
       # Define the location of the proxy server to send the request to
       proxy_pass http://localhost:8041/myapp/;

       # standard proxy_set_header stuff below...
}

Затем в вашем приложении Dash установите для url_base_pathname то же значение:

app = dash.Dash(__name__, url_base_pathname='/myapp/') 

Я бы использовал ngrok для показа вашего веб-приложения. Это удивительно просто:

Читать это: https://ngrok.com/

Я мог бы неправильно истолковать то, что вам нужно, потому что я не знаком с официанткой (почему бы не обслуживать приложение локально, просто используя колбу?), Но если вам нужно протестировать живое приложение, вам следует использовать ngrok.

Другие вопросы по тегам