Как обслуживать локальное приложение с помощью официантки и 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 мы должны его использовать.
Общий шаблон:
если у вас нет домена, просто используйте IP-адрес вашего сервера вместо your_domain (для получения бесплатных сертификатов вы можете использовать, например, https://zerossl.com/),
вместо 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.