Тайм-ауты 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 минут, может кто-нибудь, пожалуйста, скажите мне, что я могу сделать, чтобы преодолеть это?
Ответы
Ответ 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...