Fire Sphere

Fire Sphere
Рейтинг
28
Регистрация
22.03.2008

Заказывал у ТС редизайн своего сайта. Заказ был в духе "незнаю как, но покрасивше" и с заказом он, по моему мнению, успешно справился! :) За что я ему очень благодарен.

Отдельно замечу про цену и время исполнения заказа - тут просто вне конкуренции.

Увеличивал - не помогло. Только после изменения этой настройки в апаче всё решилось.

А оптимизировать скрипты/сайты не моя забота :) Да и много их слишком для этого.

Возможно из-за того что прокси определяется через 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://127.0.0.1:8080;

хотя принципиальной разницы не вижу если честно...

Да, так я тоже попытался. Что-то вроде

error_page 404 = @apache2;

затем

location @apache2 {

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, посмотрю что даст.

myhand:
Какой же это прокси, если он у вас и статику отдает? :) В чем и вопрос - сравнивали вы такую конфигурацию с тем случаем, когда nginx просто проксирует запросы дальше?

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

myhand:
значит так. к keepalive_timeout указанная ошибка отношения _не_имеет_ копать в сторону настроек http_proxy_module
естественно, ваша ошибка хуже - ибо вы теряете клиенты не получают содержательного ответа от сервера :D

Это неприятно. Собственно с настройкой этого модуля я совсем не разбирался - использовал хрестоматийный конфиг :), который встречается много где в рунете. Это который

---

location / {

proxy_pass http://127.0.0.1:8080/;

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;

}

---

Здесь есть три таймаута, но на мой взгляд они даже несколько больше чем надо. Поэтому я и в мыслях не держал что тут может быть ошибка...

myhand:
nginx нормально умеет сложные конфиги :) если они корректно написаны ;)

вы как-то сравнивали результат работы nginx со статикой и как просто
прокси. это реально что-то вам дало? кроме ********ки сложного конфига nginx ?

Если вопрос ко мне, то я не сравнивал. Только как прокси. Полноценный сервер на основе 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

argo90:
ну я там нашел что:
nginx enables keep-alive if keepalive_timeout >0 and
1) an request has the "Connection: keep-alive" header
2) or an request has no "Connection" header and the request version is > 1.0.

я не могу понять, кип-алайв - это настройка апача или nginx самого? Просто в конфиге nginx ничего подобного нету...

У меня стоит keepalive_timeout 15 в блоке http { конфига nginx. В итоге много ошибок другого вида:

...[error] 22208#0: *3765 upstream timed out (110: Connection timed out) while sending request to upstream...

но всё работает и в имиты умещается :) Незнаю какая ошибка хуже.

Всего: 61