Назад | Перейти на главную страницу

Лак, скрыть номер порта

Моя установка выглядит следующим образом:

ОПЕРАЦИОННЫЕ СИСТЕМЫ: CentOS 6.2, работающая на виртуальной машине OpenVZ.

Веб сервер: Nginx прослушивает порт 8080

Обратный прокси: Varnish прослушивает порт 80

Проблема в том, что Varnish перенаправляет мои запросы на порт 8080, и это отображается в адресной строке так http://mysite.com:8080/directory/, заставляя относительные ссылки на сайте включать номер порта (8080) в запрос и таким образом обходя Varnish.

Сайт работает на WordPress.

Как разрешить Varnish использовать Nginx в качестве бэкэнда на порту 8080 без добавления номера порта к адресу?

Редактировать: Настраивается лак так:

Я сказал демону Varnish по умолчанию прослушивать порт 80.

VARNISH_VCL_CONF=/etc/varnish/default.vcl
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=1
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=1G
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120

Файл VCL, который вызывает Varnish (через включение в default.vcl) состоит из:

backend playwithbits {
     .host = "127.0.0.1";
     .port = "8080";
}
acl purge {
     "127.0.0.1";
}
sub vcl_recv {
     if (req.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          set req.backend = playwithbits;
          set req.http.Host = regsub(req.http.Host, ":[0-9]+", ""); 
          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.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          if (req.request == "PURGE") {
               set obj.ttl = 0s;
                    error 200 "Purged.";
          }
     }
}
sub vcl_miss {
     if (req.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          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.http.Host ~ "^(.*\.)?playwithbits\.com$") {
          if (req.url ~ "^/$") {
               unset beresp.http.set-cookie;
          }
          if (!(req.url ~ "wp-(login|admin)")) {
               unset beresp.http.set-cookie;
          }
     }
}

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

Перед тем, как нанести лак, я сказал wordpress, что адрес моего сайта был playwithbits.com:8080 чтобы он правильно обслуживал контент, поэтому он добавлял номер порта ко всем моим URL-адресам.

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

Я вижу, вы решили свою конкретную проблему. В некоторых случаях, как в некоторых программах CGI, порт все еще отображается в URL-адресе.

Чтобы избежать этого, вы можете запустить свой веб-сервер (nginx) на 127.0.0.1.: 80 и Varnish на 1.2.3.4: 80 (внешний IP).

Сам Varnish никогда не отправляет 301 ответ сам по себе (если вы не используете какую-либо серьезную магию VCL), поэтому, если вы получаете перенаправление, оно должно исходить от вашего бэкэнда.

Если ваш сайт куда-то отправляет ответ 301 или 302, он должен по спецификации отправить полный URI с http, хостом и портом. Когда nginx проксирует запросы, это можно исправить с помощью опции proxy_redirect. Такой же механизм должен существовать в лаке. Если нет, вам нужно переписать Location: header.

Не могли бы вы предоставить ответ, который отправляет клиента на порт 8080? Это заголовки или прямая ссылка где-то на сайте?