Varnish и Nginx редирект 8080 -> 80

Я пытаюсь использовать Varnish в качестве прокси-сервера обратного кэширования для моей установки nginx на Ubuntu 10.10, я настроил Varnish на порт 8080 для тестирования, и nginx нормально работает на порту 80.

Мой nginx.conf:

user {user} {group};
worker_processes  16;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    client_max_body_size 4M;
    client_body_buffer_size 128k;
    access_log  /var/log/nginx/access.log;

    gzip        on;
    gzip_proxied any;
    gzip_comp_level 2;
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml$

    sendfile        on;
    tcp_nopush     off;

    keepalive_timeout  30;
    tcp_nodelay        on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Файл .conf моего сайта:

server {
     listen  80;
     server_name www.mylesgray.com dev.mylesgray.com;

     access_log /var/www/mylesgray.com/logs/access.log;
     error_log /var/www/mylesgray.com/logs/error.log;

     location / {
        root /var/www/mylesgray.com/public;
        index index index.php;
        try_files $uri/ $uri index.php?q=$uri&$args;
        port_in_redirect off;
     }

     location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
        access_log        off;
        expires           30d;
        root /var/www/mylesgray.com/public;
     }

     location ~ .php$ {
        fastcgi_split_path_info ^(.+.php)(.*)$;
        fastcgi_pass   backend;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/mylesgray.com/public/$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_intercept_errors        on;
        fastcgi_ignore_client_abort     off;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ /.ht {
        deny  all;
    }

    location ~ /.git {
        deny  all;
    }

#    include /var/www/mylesgray.com/public/nginx.conf;
}

upstream backend {
    server 127.0.0.1:9000;
}

Моя конфа с Лаком:

backend default {
     .host = "localhost";
     .port = "80";
}

acl purge {
        "localhost";
}

sub vcl_recv {
        if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return(lookup);
        }

        if (req.url ~ "^/$") {
               unset req.http.cookie;
         }
}

sub vcl_hit {
        if (req.request == "PURGE") {
                set obj.ttl = 0s;
                error 200 "Purged.";
        }
}

sub vcl_miss {
        if (req.request == "PURGE") {
                error 404 "Not in cache.";
        }

        if (!(req.url ~ "wp-(login|admin)")) {
                        unset req.http.cookie;
        }

        if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?$
                unset req.http.cookie;
                set req.url = regsub(req.url, "\?.$", "");
        }

        if (req.url ~ "^/$") {
                unset req.http.cookie;
        }
}

sub vcl_fetch {
        if (req.url ~ "^/$") {
                unset beresp.http.set-cookie;
        }

        if (!(req.url ~ "wp-(login|admin)")) {
                unset beresp.http.set-cookie;
        }
}

Итак, при всем при этом, когда вы заходите на мой сайт через порт 8080: http://www.mylesgray.com:8080 он просто перенаправляет на старый добрый: http://www.mylesgray.com Вместо этого он должен делать следующее: (в его нынешнем виде), если я получаю доступ к порту 80, я должен получать только файлы обслуживания nginx, а если я получаю доступ к 8080, у меня должны быть файлы обслуживания nginx + Polish.

Я делаю это, чтобы проверить преимущества лака в производительности по сравнению с обычным nginx.

Любая помощь высоко ценится!


person Myles Gray    schedule 03.02.2012    source источник
comment
Рассматривали ли вы возможность просто использовать Nginx и полностью отказаться от лака? Вы обнаружите, что все, чего вы достигли с помощью Varnish + Nginx, вероятно, можно сделать быстрее, чище и проще с помощью одного только Nginx.   -  person Dayo    schedule 04.02.2012
comment
У меня было, но потом я передумал, поскольку Varnish — это не веб-сервер, это просто кеш, поэтому он намного быстрее обслуживает статические элементы: danielmiessler.com/blog/   -  person Myles Gray    schedule 04.02.2012
comment
Вы должны быть осторожны, следя за случайными публикациями в Интернете, особенно когда речь идет о Nginx, поскольку там много плохих, а иногда даже небезопасных вещей. Конфигурация на этой странице вообще не имеет кэширования в Nginx, и каждый запрос проходит весь путь до запуска PHP. Так что да, Nginx + Varnish будет быстрее по сравнению с этим, но в лучшем случае будет так же быстро, как Nginx с включенным кэшированием, которое, как уже говорилось, будет чище и проще в реализации. По сути, нет необходимости запускать Varnish с Nginx.   -  person Dayo    schedule 04.02.2012
comment
Я согласен, что там много плохой информации, я не следую им в точности, мне просто нравится концепция, и я делаю свои собственные файлы конфигурации, я видел его тесты (danielmiessler.com/blog/) и подумал, а почему бы и нет?. Я проведу тест ab на 2 разных портах (один с nginx и один с nginx + лак), и посмотрим, что получится. Не помешает поэкспериментировать.   -  person Myles Gray    schedule 04.02.2012
comment
Нет, это не так. Просто убедитесь, что вы включили кеширование в Nginx, когда запускаете свой тест ... в отличие от его довольно бессмысленного.   -  person Dayo    schedule 04.02.2012
comment
Хороший звонок - попробуем это, мне нравится тот факт, что Varnish кеширует в оперативную память, а не на диск, я думаю, что nginx использует кеширование диска - может быть, мы все же увидим разницу.   -  person Myles Gray    schedule 04.02.2012
comment
Nginx действительно кеширует на диск, но Linux будет перемещать часто используемые данные в ОЗУ по мере необходимости. Кроме того, в Nginx есть модули, которые позволяют при желании кэшировать напрямую в оперативную память. Как было сказано, проще и чище, без необходимости возиться с другим приложением, которое делает только то, что уже можно сделать в Nginx. В любом случае, я думаю, что больше нечего добавить, так что всего наилучшего, что бы вы ни делали.   -  person Dayo    schedule 04.02.2012


Ответы (3)


Мое лучшее предположение, что это какой-то SEO-плагин, который думает: «О, запрос на порт 8080? Этого не должно быть, я буду добр и перепишу на порт 80»:

$ curl -I "http://www.mylesgray.com:8080/"
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.65
Location: http://www.mylesgray.com/

Вы можете нормализовать заголовки хоста, удалив номера портов:

set req.http.Host = regsub(req.http.Host, ":[0-9]+", "");

При необходимости просмотрите еще несколько примеров в этих конфигурации. примеры для лака

person Mojah    schedule 03.02.2012
comment
Я согласен. Вероятно, какой-то скрипт выполняет перенаправление (проверено с помощью wget -S). - person Marki555; 03.02.2012
comment
Странно, что скрипты вообще не включены - просто WP, не в моих конфигах nginx... чертовски странно. - person Myles Gray; 03.02.2012
comment
Вы пробовали дезинфицировать порт, который я разместил в своем комментарии? Это сработало для вас? - person Mojah; 07.02.2012

Хороший трюк - иметь оба сервера (nginx и лак) на одном порту, но с разными IP-адресами, скажем

nginx: локальный: 80 лак: 1.2.3.4:80

проверьте это: http://danielmiessler.com/blog/handling-redirects-with-varnish-and-nginx

person oliver    schedule 19.06.2013

Вам нужно будет зайти в общие настройки WP и изменить yourdoma.in на yourdoma.in:8080. Я столкнулся с той же проблемой.

В противном случае WordPress будет всегда прослушивать порт 80.

Вот объяснение от davide73 на форуме wp:

В WordPress есть ошибка; вы не можете использовать его для порта TCP, отличного от 80.

Это потому, что они используют $_SERVER['HTTP_HOST'] вместо $_SERVER['HTTP_HOST'].":".$_SERVER['HTTP_PORT']

person David    schedule 25.02.2013