optimize_server_names

Igor Sysoev is at rambler-co.ru
Fri Nov 16 09:40:04 MSK 2007


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 at pbank.lutsk.ua
> 
> 
> 

-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list