8 апреля 2011 г. 15:27 пользователь Maxim Dounin
<mdounin@xxxxxxxxxx> написал:
Just a side note: internal тут смысла не имеет, в именованный
location по другому не попадёшь.
спасибо
Just another side note: BTW, а зачем именованный location +
rewrite, вместо
error_page ... /sorry.html
location = /sorry.html {
...
}
?
там фокус несколько хитрее. sorry.html - это глобальная заглушка,
а у проектов может быть "индивидуальный" 500.htm с логотипом и прочими красивыми плюшками.
error_page 500 502 503 504 =503 @error500;
location @default500 {
internal;
root /bla/bla/www/htdocs;
set $original_uri $uri;
rewrite ^.*$ /sorry.html break;
access_log /bla/bla/nginx/error500.log outofsrv buffer=1m;
log_not_found on;
}
location @error500 {
internal;
try_files /500.htm @default500;
log_not_found on;
root $root_path;
set $original_uri $uri;
access_log /bla/bla/nginx/error500.log outofsrv buffer=1m;
}
И, BTW, для POST-запросов такая конструкция с именованным
location'ом выдаст стандартный текст от 405-й ошибки вместо
искомого /sorry.html.
я так понимаю, надо в error_page ловить и 405ю ошибку?
Отделить 503 от бекенда от 503-ей от limit_conn - можно анализируя
значение в $upstream_status (если там 503 - значит от бекенда).
Но делать это в конфиге на if'ах - будут ужасненько, я бы не
рекомендовал без крайней нужды.
Очень жаль. Искал кошерное решения в рамках штатных возможностей. Придется изобретать костыли.