#nginx #flask #uwsgi
#nginx #flask #uwsgi
Вопрос:
Я застрял. Я хочу развернуть приложение python dash на своем vps. Я начал с приложения flask, следуя этому руководству: https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uswgi-and-nginx-on-ubuntu-18-04
Итак, я создал сервис myproject. Проверка состояния, похоже, в порядке:
Моя конфигурация nginx:
server {
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name www.mysite.com mysite.com;
root /var/www/wordpress;
index index.php;
access_log /var/log/nginx/wordpress.log;
error_log /var/log/nginx/wordpress_error.log error;
ssl_certificate_key /etc/nginx/ssl/www.XXX.key;
ssl_certificate /etc/nginx/ssl/www.XXX.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security max-age=31536000;
location / {
try_files $uri $uri/ =404;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location /shiny/ {
rewrite ^/shiny/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:3838;
proxy_redirect http://127.0.0.1:3838 $scheme://$host/shiny/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 10080s;
proxy_send_timeout 10080;
proxy_read_timeout 10080;
proxy_buffer_size 64k;
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_request_buffering off;
proxy_buffering off;
}
location /rstudio/ {
rewrite ^/rstudio/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8787;
proxy_redirect http://127.0.0.1:8787 $scheme://$host/rstudio/;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
#proxy_redirect off;
proxy_buffering off;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
location /myproject/ {
uwsgi_pass unix:/home/XXX/XXX/python_dash/myproject/myproject.sock;
include uwsgi_params;
}
}
Но когда я перехожу к mysite.com/myproject / Я получаю:
Однако он отличается от обычного nginx (появляется в ответ на орфографическую ошибку):
Значит, что-то происходит. Это также видно в статусе службы myproject. Каждый раз, когда я пытаюсь получить к нему доступ, внизу отображается строка:
[pid: 1696|app: 0|req: 1/1] 213.134.X.XX () {58 vars in 1334 bytes} [Fri Dec 3 13:22:08 2021] GET /myproject/ => generated 232 bytes in 40 msecs (HTTP/2.0 404) 2 headers in 87 bytes (2 switches on core 0)
мой myproject.ini:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 666
vacuum = true
die-on-term = true
Можете ли вы дать мне подсказку? Я застрял на этом и не могу его решить…
С наилучшими пожеланиями, Томаш
Комментарии:
1. Я подозреваю, что ваше приложение flask возвращает 404, можете ли вы попробовать запустить:
curl -vL --no-buffer -XGET --unix-socket /home/XXX/XXX/python_dash/myproject/myproject.sock http://localhost/myproject/
2. Таек, вот ответ: Примечание: Ненужное использование -X или —request, GET уже выведено. * Попытка /home/lemur/Knight_Frank/python_dash/myprojec:0… * Подключен к локальному хосту (myproject.sock) порт 80 (# 0)> GET /myproject/ HTTP/ 1.1 > Хост: локальный хост> Пользовательский агент: curl / 7.68.0 > Принять: / > * Пустой ответ от сервера * Соединение # 0 с локальным хостом хоста осталось нетронутым curl: (52) Пустоответ с сервера
3. @Taek, есть идеи, как продолжить?
4. Извините, понятия не имею. Возможно, попробуйте отладку с помощью proxy_pass через http вместо сокета.
Ответ №1:
Наконец-то нашел его!
@app.route должен совпадать с местоположением в конфигурации nginx
итак, в моем случае, когда:
location /myproject/
маршрут приложения должен быть:
@app.route("/myproject/")
Помните о завершающем «/», потому что, если вы не добавите его, он вернет not found, если вы введете завершающий «/» в адресной строке (например https://website.com/myproject / не будет работать, только https://website.com/myproject )
Аналогичная ситуация с python dash, но на этот раз @app.route (или @server.route) не работает. Вам нужно добавить route_pathname_prefix=»/myproject/» в dash.Тире (…).
Я не понимаю, почему это так работает, но это работает.