Подтвердить что ты не робот

Тайм-ауты Nginx, когда uWSGI требует много времени для обработки запроса

У меня есть Nginx + uWSGI для приложения Python Django.

У меня есть следующее в nginx.conf:

location / {
    include uwsgi_params;
    uwsgi_pass   127.0.0.1:9001;
    uwsgi_read_timeout 1800;
    uwsgi_send_timeout 300;
    client_header_timeout 300;
    proxy_read_timeout 300;
    index  index.html index.htm;
}

но для длительных запросов на uWSGI, для завершения которых требуется около 1 минуты, я получаю ошибку тайм-аута в журнале ошибок Nginx, как показано ниже:

2013/04/22 12:35:56 [ошибка] 2709 # 0: * 1 тайм-аут восходящего потока (110: время ожидания соединения) при чтении заголовка ответа вверх, клиент: xx.xx.xx.xx, сервер:, request: "GET/entity/datasenders/HTTP/1.1", upstream: "uwsgi://127.0.0.1: 9001", хост: "xxx.xx.xx.x"

Я уже установил тайм-аут заголовка и тайм-ауты отправки/чтения uWSGI до 5 минут, может кто-нибудь, пожалуйста, скажите мне, что я могу сделать, чтобы преодолеть это?

4b9b3361

Ответ 1

Конфигурация, которая решает проблему:

location / {
    include uwsgi_params;
    uwsgi_pass   127.0.0.1:9001;
    uwsgi_read_timeout 300;
    index  index.html index.htm;
}

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

Чтобы правильно выяснить, какой путь ваш nginx собирает конфигурацию из прогона:

nginx -V  # V is caps

у этого будет --conf-path=[], который точно скажет вам, откуда он берет конфигурацию.

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

Ответ 2

В дополнение к ответу "uwsgi_read_timeout" вы также должны проверить правильность права собственности на каталог кеша nginx uwsgi. Собственность должна быть настроена на того же пользователя, что и выполняемый nginx-процесс... В моем случае я должен был сделать это

grep '^user' /etc/nginx/nginx.conf
ls -lah /var/cache/nginx/uwsgi_temp
for f in $( find /var/cache/nginx/uwsgi_temp ); do ls -lah $f; done

Являются ли эти файлы принадлежащими одному пользователю? Если нет, вы можете закрыть nginx и удалить все файлы кеша, убедитесь, что соответствующий владелец включен /var/cache/nginx/uwsgi _temp и перезагружен. Возможно, вы могли бы просто сделать рекурсивный chown, я не тестировал этот подход.

# store the user
THEUSER=$(grep '^user' /etc/nginx/nginx.conf | sed 's/.* //; s/;.*//' )

Удалить подход к кешу и перезагрузке

/etc/init.d/nginx stop
rm -rf /var/cache/nginx/uwsgi_temp/* 
chown $THEUSER:$THEUSER /var/cache/nginx/uwsgi_temp
/etc/init.d/nginx start

Рекурсивный подход chown

chown -R $THEUSER:$THEGROUP /var/cache/nginx/uwsgi_temp/
# not sure if you have to restart nginx here...