Рейтинг:2

Ошибка Nginx - 110: время ожидания соединения истекло при подключении к восходящему потоку (django-python)

флаг ae

Ошибка

18.08.2021 8:57:28 [ошибка] 19915#19915: *36133 истекло время ожидания восходящего потока (110: время ожидания соединения истекло) при подключении к восходящему, клиент: 10.11.12.1(прокси-ip), сервер: example.com , запрос: "GET /static/css/bootstrap.min.css HTTP/1.1", восходящий поток: "http://127.0.0.1:8000/static/css/bootstrap.min.css", хост: "www.example .com"

краткое описание ошибки

Веб-сайт всегда работает нормально, но иногда возникает эта ошибка, описанная выше, которая, как я думаю, связана с большим трафиком на веб-сайт, когда веб-сайт отключается, сайт не открывается сразу после перезапуска nginx и супервизора.

Иногда требуется от 5 до 6 часов, чтобы сайт появился.

Серверы — Ubuntu-18.04 LTS

конфигурации веб-сервера, как показано ниже

у меня есть прокси-сервер и сервер приложений

  1. прокси-сервер - nginx

  2. сервер приложений — работает nginx & (супервизор — приложение django)

  3. прокси-сервер -nginx-config

     сервер {
    
         слушать 443 ssl http2;
         ssl_certificate /etc/nginx/ssl/bundle.crt;
         ssl_certificate_key /etc/nginx/ssl/start.example.com.key;
         имя_сервера example.com www.example.com ;
         местоположение = /basic_status {
         статус-заглушки;
         доступ_лог выключен;
         разрешить 1.2.3.4;
         отрицать все;
         }
         место расположения /{
    
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 300;
         send_timeout 300;
         прокси_пароль http://10.11.12.2; #прокси к серверу приложений
         прокси_http_версия 1.1;
         proxy_set_header Соединение "";
         add_header Access-Control-Allow-Origin .example.com;
         add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" всегда;
         add_header X-XSS-защита "1; режим = блок";
         add_header «Прагма» «без кеша»; 
         proxy_set_header Хост $http_host;
         proxy_set_header Обновить $http_upgrade;
         proxy_set_header Соединение "обновление";
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-схема $scheme;
    
         #add_header Content-Security-Policy "default-src 'unsafe-inline' 'self'; script-src 'unsafe-inline' 'self'";
         страница_ошибки 404 /404.html;
         местоположение = /404.html {
         корень /var/www/ошибка;
         внутренний;
         }
         error_page 500 502 503 504 /500.html;
         местоположение = /500.html {
         корень /usr/share/nginx/html;
         внутренний;
         }
    
     }
    
  4. сервер приложений - nginx

    сервер {
             слушать 80 default_server;
             слушать [::]:80 default_server;
             имя_сервера example.com www.example.com;
    
             место расположения /{
    
                 прокси_пароль http://127.0.0.1:8000;
                 proxy_read_timeout 180;
    
             }                                                                                                                    
      }
    
  5. сервер приложений - супервизор

     [программа:портал]
     command =/root/portal_env/bin/gunicorn portal.wsgi:application -b 0.0.0.0:8000 --timeout 180 --workers=3 ;
     пользователь = корень; Пользователь для запуска от имени
     каталог = /root/portal_env/portal
     stdout_logfile = /root/portal_env/logs/portal.log ; Куда писать сообщения журнала
     redirect_stderr = истина; Сохраните stderr в том же журнале
     автозапуск = правда
     автоперезапуск = правда
     среда = LANG = en_US.UTF-8,LC_ALL = en_US.UTF-8 ; Установите UTF-8 в качестве кодировки по умолчанию
    
Michael Hampton avatar
флаг cz
Проверьте журнал приложений.
Рейтинг:0
флаг us

Сначала я приду с некоторыми отзывами для вашей установки.

Когда вы создаете приложение Python, не рекомендуется использовать gunicorn в качестве хоста сервера, его сборка для разработки, вы закрываете использование uWSGI для своего приложения Python.

Далее, когда вы используете прокси в NGINX, я рекомендую вам отключить буферизацию для вашего прокси.

прокси_буферизация выключена;

Когда вы отключаете буферизацию, вы делаете сайт немного медленнее во время загрузки, потому что клиент нуждается в отправке полного пакета с сервера клиенту. Мои экспириенты говорят мне, что это не так много, когда мы говорим о веб-разработке, и это защищает вас в долгосрочной перспективе, если вы хотите запускать свое приложение на нескольких серверах за балансировщиком нагрузки, таким как NGINX Proxy, Docker Cluster или что-то в этом роде.

После моего отзыва это звучит так, как будто у вас есть что-то в вашем коде, просто входите в цикл и никогда не останавливаетесь, или у вас есть lonnnnnnnng SQL-соединение/запрос, выполнение которого занимает более 3 минут.

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

Обычному Python не требовалось 3 минуты для выполнения области сценария/кода, поэтому это звучит как внешние службы, например. база данных, API или что-то в этом случае.

Когда вы включили медленный журнал для своей базы данных, вторым случаем будет создание простого журнала для вашего скрипта с «временем начала» + «время окончания» и его дамп с помощью метода/страницы/url, которые попадают в эту область, и дамп его в файл, чтобы вы могли легко его открыть, поздно он запускается через 5-6 часов, как вы говорите, или дольше, чтобы поймать вашу ошибку.

Я думаю, что это лучший способ, первая проблема будет заключаться в том, чтобы выяснить, почему ваш код выполняется 3 минуты.

chjp avatar
флаг ae
Привет, Париж, как я узнал, что выполнение кода занимает 3 минуты, я установил тайм-аут 180, чтобы решить проблему тайм-аута бэкэнда.
ParisNakitaKejser avatar
флаг us
Это зависит от того, как работает ваш код, вам нужно проанализировать свой код, что он делает и какое внешнее соединение у вас есть, его звук похож на его запас в соединении, я думаю, это соединение с MySQL. для этого вам нужно добавить медленный журнал в ваш файл my.cnf, вы можете прочитать больше об этом в документации mysql.если это не поможет вам, я могу порекомендовать включить ведение журнала для вашего проекта django и печатать на терминал с временем «начало/окончание» для каждого запроса.
chjp avatar
флаг ae
привет, Париж, спасибо за вашу помощь, да, есть соединение mysql db с кодом django и о журнале, чтобы узнать время начала и окончания каждого запроса, это код, который вы имели в виду, время импорта start_time = время.время() главный() print("--- %s секунд ---" % (time.time() - start_time))
ParisNakitaKejser avatar
флаг us
Затем поздно, пока вы снова не столкнетесь с проблемой, и посмотрите, что происходит :) поздно я узнаю, когда у вас будет больше данных.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.