У меня есть приложение в рельсах, и оно запускает единорог в производстве. Некоторые запросы обрабатываются слишком долго. Я настроил сервер на увеличение тайм-аута, поэтому эти запросы работают правильно. Проблема в том, что когда на ответ требуется более 30 секунд, я получаю следующее сообщение:
Сервис недоступен
Сервис временно недоступен. Пожалуйста, попробуйте позже.
В unicorn.rb
у меня есть timeout 120
настроен, и мой nginx.conf:
upstream unicorn_my_app {
server unix:/tmp/my_app.socket fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name www.my_app.com;
proxy_read_timeout 120;
keepalive_timeout 5;
root /home/ubuntu/my_app/current/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://unicorn_my_app;
break;
}
}
error_page 404 500 502 503 504 /erro/erro.html;
location = /erro/ {
root /home/ubuntu/my_app/current/public;
}
}
Есть ли другие конфигурации, которые я забыл?
Используемая конфигурация правильная. Проблема в этом случае заключается в том, что вы находитесь за балансировкой нагрузки Rackspace, которая по умолчанию устанавливает тайм-аут на 30 секунд. Чтобы изменить значение тайм-аута балансировки нагрузки Rackspace, следуйте этим инструкциям. Говоря абстрактно, вы выполняете два вызова API:
1) Получите токен:
curl -s -d \
'{
"auth":
{
"RAX-KSKEY:apiKeyCredentials":
{
"username": "your_api_username",
"apiKey": "your_api_key"}
}
}' \
-H 'Content-Type: application/json' \
'https://identity.api.rackspacecloud.com/v2.0/tokens' | python -m json.tool
2) Изменить тайм-аут LB:
curl -s -d \ '{"loadBalancer":{
"timeout": 120
} }' \
-H 'X-Auth-Token: token_returned_in_last_request' \
-H 'Content-Type: application/json' \
-X PUT \ 'https://iad.loadbalancers.api.rackspacecloud.com/v1.0/<your_customer_id>/loadbalancers/<your_lb_id>'