On Fri, Nov 16, 2007 at 04:38:01AM +0200, Gena Makhomed wrote:
> очень похоже на то, что опция optimize_server_names
> работает не совсем так, как описано в документации.
>
> > Если оптимизация разрешена и все name-based сервера,
> > слушающие на одной паре адрес:порт, имеют одинаковую конфигурацию,
> > то во время исполнения запроса имена не проверяются и в редиректах
> > используется первое имя сервера. Если в редиректе нужно использовать
> > имя хоста, переданное клиентом, то оптимизацию нужно выключить.
>
> у меня есть два name-based сервера, которые имеют разную конфигурацию,
> запросы на www.onesite.com через отдельный server перенаправляются
> на основное имя сайта onesite.com, и если файл на основном сайте
> не найден - 404 ответ клиенту приходит от имени new.server.com
>
> вот конкретный пример: запрашивается страница
> http://www.onesite.com/en/news_en.html
> сначала срабатывает rewrite и делает permanent redirect на
> http://onesite.com/en/news_en.html
> потом запрос посылается backend`у, который отвечает "GET /en/news_en.html
> HTTP/1.0" 404 4643
> совершенно неожиданно для себя обнаруживаю в лог-файле сервера new.server.com
> такую запись:
>
> [error] 16674#0: *8666 open() "/usr/share/nginx/html/en/news_en.html" failed
> (2: No such file or directory),
> client: 77.77.77.77, server: new.csdoc.com, URL: "/en/news_en.html", host:
> "www.onesite.com"
>
> получается, что некоторая часть запросов к www.onesite.com обрабатывается как
> и положено,
> сервером с именем onesite.com, а другая часть запросов - сервером
> new.server.com ?
>
> в файле new.csdoc.com-access.log наблюдаю запросы к сайту www.onesite.com
> HTTP/1.1 с ответами сервера 404 и 200, UserAgent`ы - Opera и боты.
> запросы HTTP/1.0 - ответы только 404 и UserAgent`ы - только боты.
>
> сейчас явно прописал в конфиге "optimize_server_names off".
>
> после чтения документации ожидал, что optimize_server_names
> будет оптимизировать имена только внутри одного server { }.
optimize_server_names оптимизирует для listen-пары внутри одного сервера.
В данном случае, насколько я вижу, optimize_server_names вообще не должен
влиять. Странные запросы, скорее всего, приходят на адреса
11.11.11.11:80 и 22.22.22.22:80 с "Host: www.onesite.com" и т.д.
В это можно убедиться если писать в лог $server_addr.
Решение - продублировать эти адреса во всех серверах.
> фрагмент конфигурации nginx/0.5.31:
>
> # default: proxy_intercept_errors off
> # default: optimize_server_names on
>
> #
> # new.server.com
> #
>
> server {
> listen 11.11.11.11:80 default;
> listen 22.22.22.22:80 default;
> listen 33.33.33.33:80 default;
> listen 44.44.44.44:80 default;
>
> server_name new.server.com;
>
> access_log /var/log/nginx/new.server.com-access.log;
> error_log /var/log/nginx/new.server.com-error.log warn;
>
> root /usr/share/nginx/html;
> }
>
> #
> # onesite.com
> #
>
> server {
>
> listen 33.33.33.33:80 default;
> listen 44.44.44.44:80 default;
>
> server_name onesite.com;
> server_name en.onesite.com;
> server_name onesite.com.ua;
>
> access_log /var/log/nginx/onesite.com-access.log;
> error_log /var/log/nginx/onesite.com-error.log warn;
>
> location / {
> proxy_pass http://127.0.0.1;
> proxy_set_header Host $host;
> proxy_set_header X-Real-IP $remote_addr;
> proxy_redirect off;
> }
> }
>
> server {
>
> listen 33.33.33.33:80;
> listen 44.44.44.44:80;
>
> server_name w.onesite.com;
> server_name ww.onesite.com;
> server_name www.onesite.com;
> server_name wwww.onesite.com;
> server_name wwwww.onesite.com;
> server_name wwwwww.onesite.com;
> server_name wwwwwww.onesite.com;
>
> rewrite ^(.*)$ http://onesite.com$1 permanent;
> }
>
> server {
>
> listen 33.33.33.33:80;
> listen 44.44.44.44:80;
>
> server_name w.en.onesite.com;
> server_name ww.en.onesite.com;
> server_name www.en.onesite.com;
> server_name wwww.en.onesite.com;
> server_name wwwww.en.onesite.com;
> server_name wwwwww.en.onesite.com;
> server_name wwwwwww.en.onesite.com;
>
> rewrite ^(.*)$ http://en.onesite.com$1 permanent;
> }
>
> server {
>
> listen 33.33.33.33:80;
> listen 44.44.44.44:80;
>
> server_name w.onesite.com.ua;
> server_name ww.onesite.com.ua;
> server_name www.onesite.com.ua;
> server_name wwww.onesite.com.ua;
> server_name wwwww.onesite.com.ua;
> server_name wwwwww.onesite.com.ua;
> server_name wwwwwww.onesite.com.ua;
>
> rewrite ^(.*)$ http://onesite.com.ua$1 permanent;
> }
>
> --
> Best regards,
> Gena mailto:makhomed@xxxxxxxxxxxxxx
>
>
>
--
Игорь Сысоев
http://sysoev.ru