Заказывал у ТС редизайн своего сайта. Заказ был в духе "незнаю как, но покрасивше" и с заказом он, по моему мнению, успешно справился! :) За что я ему очень благодарен.
Отдельно замечу про цену и время исполнения заказа - тут просто вне конкуренции.
Увеличивал - не помогло. Только после изменения этой настройки в апаче всё решилось.
А оптимизировать скрипты/сайты не моя забота :) Да и много их слишком для этого.
Возможно из-за того что прокси определяется через upstream? Незнаю.
Всё работает и так, только теперь лог ошибок nginx завален сообщениями об ошибке открытия файла на диске :) Придётся отключить его (лог).
Кстати ошибка превышения ожидания, которая
...[error] 22208#0: *3765 upstream timed out (110: Connection timed out) while sending request to upstream...
лечится не в nginx а в Апаче. Путём увеличения ListenBackLog. По умолчанию там 511, рекомендуют увеличивать от 1024 до 4096. Кому сколько не жалко. Мне 768 помогло.
Попытка снова не удалась :) результат:
[emerg]: "proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in /usr/local/nginx/conf/nginx.conf:136
configuration file /usr/local/nginx/conf/nginx.conf test failed
что там было:
error_page 404 = @apache2;
location @apache2 {
proxy_pass http://127.0.0.1:8080/;
...
}
где строка с proxy_pass и есть 136. Вот этого я откровенно не понял. В документации есть примеры использования именно proxy_pass внутри именованной локации. Причёи именно для error_page. Но у меня nginx 0.7.63 почему-то ругается.
Мануал читал тут http://wiki.nginx.org/NginxHttpCoreModule#error_page
там пример такой:
location / (
error_page 404 = @fallback;
)
location @fallback (
proxy_pass http://backend;
Есть идеи?
Всё решилось. Оказывается надо было писать не
а
proxy_pass http://127.0.0.1:8080;
хотя принципиальной разницы не вижу если честно...
Да, так я тоже попытался. Что-то вроде
затем
proxy_pass http://localhost:8080/;
но такую конфигурацию он не принял, поскольку определение error_page стоит внутри той самой location для статики, которая RegExp и поэтому нельзя внутри неё использовать proxy_pass :) Не конфиг а скрипт прямо. Все вложения учлись.
Хотя сейчас я думаю что возможно определять error_page не обязательно внутри условия if или location а просто внутри server? Ведь в конечном счёте мне любые ошибки надо отсылать к апачу на обработку. Одно правда неудобство ещё остаётся:
есть location / {} который фактически все адреса и обрабатывает. И именно его я так понимаю надо преобразовываь в именованный location @apache2. Но как тогда сделать так, чтобы не писать этот location дважды - для / и для @apache2? Тут мыслей никаких. Впринципе это не особо важно, накрайняк можно вынести все настройки прокси в инклюд и подключать его внутри этих двух одинаковых по содержанию location. Более удачного варианта не придумалось.
Всё так, но вопервых я прежде должен проверить наичие файла на диске. Почему?
1. не всегда сайт лежит как /var/www/$host/$uri бывает и что /var/www/domain.ru/$host/$uri
2. бывает что это хитрый реврайт. типа www.site.ru/news/2009/11/07/image.jpg который лежит на самом деле в www.site.ru/images/news/thnb/image.jpg
2. бывает, что обработчик 404 скриптом сайта перехвачивается и выдаёт какую-то "свою" страницу, либо вовсе подсовывает другой файл и меняет 404 на 200. и это должно работать как раньше.
поэтому в статике нужно отдавать только то, что сперва было проверено как -f а всё прочее скармливать уже апачу. вот на этом условии я и застрял в реализации. будь возможность вставить location внутрь if я уже всё давно сделал бы. Ну или как я сперва думал - подсунуть в переменной часть RegExp для location.
Оказалось это я криворучко. nginx не принимает в RegExp у location значение переменной $blox а считает это как текст, и поэтому условие никогда не сходится. В итоге удовлетворяется семое первое правило 'location / {}' а по нему запрос должен быть передан в апач как есть.
Мучался долго. Реально можно только if запихнуть внутрь location (а если наоборот, то ругается) но это не выход. Ведь если запрос уже удовлетворяет location то оно и выполняется и отбросить изнутри никак нельзя. Поскольку proxy_pass для условия и/или location с использование RegExp недопустим также. Я в тупике :(
Ну, как я уже писал, почему-то не вся статика, что точно должна была пройти проверку и выдаваться через nginx выдаётся им. Т.е. запрос долетает до апача. Но процессы плоятся сейчас в несколько раз меньше. И если раьше при максимальных 80 процессах (и соединениях соотв.) были тормоза и жалобы на "неоткрыване сайтов". То сейчас процессов в среднем 20, из них реально занято обычно около 1-5. Память экномится, цель достигнута :)
Да, я привёл часть ошбки из лога и по полной строке вдно что nginx не дождался от апача отдачи какого-нибудь файла типа script.js или style.css... Хотя нафига он к нему за этой ерундой полез, спрашивается. Увеличил до 120, посмотрю что даст.
Да. Но чисто номинально. Я сперва не мог никак составить рабочее правило, чтобы хоть часть запросов сгрузить с апача на nginx. Так вот особой пользы для сервера я не нашёл, плюс сам nginx начал занимать память. Но помоему в этой ситуации процессы апача плодились чуть ленивее чем без nginx.
Это неприятно. Собственно с настройкой этого модуля я совсем не разбирался - использовал хрестоматийный конфиг :), который встречается много где в рунете. Это который
---
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 1m;
Здесь есть три таймаута, но на мой взгляд они даже несколько больше чем надо. Поэтому я и в мыслях не держал что тут может быть ошибка...
Если вопрос ко мне, то я не сравнивал. Только как прокси. Полноценный сервер на основе nginx+FastCGI я не делал. Всегда nginx+Apache2+php5.
Вот в том и вопрос - как писать конфиги правильно. В вики nginx расматриваются простые конфиги с regexp в правилах. Я так сейчас и делаю. Но к сожалению, статика всёравно проскакивает до апача (смотрю сервер-статус апача). Причём проскакивает та, что должна была пойматься в мои правила. Пусть и не так много но неприятнт и непонятно. Вот кусок из конфига:
set $hostlt "";
if ( $host ~* ^(www\.)?([a-z0-9-]+\.[a-z]+) ) {
set $hostlt $2;
set $blox ".+";
if ( !-e /var/www/$hostlt/$uri ) {
set $blox "";
# Static files location
location ~* ^$blox\.(jpg|jpeg|gif|png|ico|css|arj|zip|tgz|gz|rar|bz2|doc|docx|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
root /var/www/$hostlt;
access_log off;
add_header Cache-Control public;
хедер я добавил чтобы промониторить - выдаётся статика nginx
У меня стоит keepalive_timeout 15 в блоке http { конфига nginx. В итоге много ошибок другого вида:
но всё работает и в имиты умещается :) Незнаю какая ошибка хуже.