Бесконечная перезагрузка страницы в приложении Flask, поданном с использованием Nginx + Gunicorn - PullRequest
0 голосов
/ 09 марта 2020

Я запускаю приложение Flask на дроплете DigitalOcean, используя Gunicorn и Nginx на Ubuntu 18.04 VPS. Я выполнил этот урок для настройки.

У меня возникают две странные проблемы при доступе к приложению из моего домена -

  1. * JavaScript элементы либо не отвечают, либо реагируют слишком долго. Это в основном связано с кнопками, которые запускают JS, которые совершают вызовы Ajax и отображают результаты. Все остальные не Ajax JS работают нормально.
  2. На определенном маршруте приложение, кажется, вводит бесконечную перезагрузку l oop. Это связано с планом Я использую для отображения и просмотра тегов. Маршрут - @tags_bp.route('/<language>/tags/<tag_search>', methods=['GET']) - представляет шаблон с некоторыми ответами от сервера. Союзный маршрут - @tags_bp.route('/<language>/tags/<tag_search>/<variable>', methods=['GET']) - возвращает только ответы сервера в виде JSON, которые отображаются на странице.

Интересно, что ни одна из этих проблем не появляется, когда я запускаю приложение на localhost (порт 5000 ) используя Gunicorn на <Droplet IP>:5000. Проблемы возникают только тогда, когда я получаю доступ к <domain>.

Мои файлы конфигурации в точности соответствуют предложенным в учебном пособии . Я использую отдельный блок сервера для своего домена вместо значения по умолчанию.

Я подозреваю, что проблема лежит где-то между Nginx и Gunicorn. Я попытался изменить headers в Nginx на основе этой страницы в Flask документации , но это тоже не помогло.

Кроме того, на сайте есть сертификат SSL выпущено Let's Encrypt с использованием certbot.

Есть предложения, как отладить / исправить это?

Приветствия.

Редактировать: Конфигурационные файлы следующие -

системный файл systemmd в /etc/systemd/system/myproject.service

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/<USER>/myproject
Environment="PATH=/home/<USER>/myproject/myprojectenv/bin"
ExecStart=/home/<USER>/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

Серверный блок на /etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name your_domain www.your_domain;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/<USER>/myproject/myproject.sock;
    }

  # Let's Encrypt credentials ...
}

nginx.conf точно по умолчанию, за исключением того, что server_names_hash_bucket_size 64; равно без комментариев .

1 Ответ

0 голосов
/ 09 марта 2020

Исправлено с помощью более опытных друзей.

Проблема перезагрузки l oop заключалась в строке URL, которую я использовал для выполнения Ajax обращений к базе данных. Я маскировал идентификаторы базы данных, используя пакет Python Cryptography , но это дало действительно длинные строки (~ 100 символов). Это вызвало некоторые проблемы с XHR - я не совсем понимаю, что и как.

Вместо этого я переключился на создание более коротких строк с использованием функции secrets.token_urlsafe(X) из встроенного модуля секреты в Python.

Первая проблема была связана с задержкой, правильно диагностированной @JoranBeasley. Исправлено это путем изменения техники кэширования на сервере с помощью Flask Caching .

...