Varnish,隐藏端口号

Varnish,隐藏端口号

我的设置如下:

操作系统:CentOS 6.2 在 OpenVZ 虚拟机上运行。

网络服务器:Nginx 监听 8080 端口

反向代理:Varnish 监听 80 端口

问题是 Varnish 将我的请求重定向到端口 8080,并且在地址栏中显示如下内容http://mysite.com:8080/directory/,导致网站上的相关链接在请求中包含端口号(8080),从而绕过 Varnish。

该网站由 WordPress 提供支持。

如何允许 Varnish 使用 Nginx 作为端口 8080 上的后端,而不在地址后附加端口号?

编辑:Varnish 设置如下:

我已经告诉 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

Varnish 调用的 VCL 文件(通过包含在内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;
          }
     }
}

答案1

所以我设法解决了这个问题,向任何试图寻找答案的人道歉,因为这不是我诊断的问题。

在我应用 varnish 之前,我告诉 wordpress 我的站点 urlplaywithbits.com:8080以便它能够正确提供内容,所以它将端口号附加到我的所有 URL 上。

我完全忘记了这个设置,一旦我删除了端口号,我的网站就开始正常工作。

答案2

Varnish 本身永远不会自行发送 301 答案(除非您做了一些主要的 VCL 魔法),所以如果您得到重定向,它必须来自您的后端。

答案3

我发现您已经解决了您的特定问题。在某些情况下,例如某些 CGI 程序,端口仍会显示在 URL 中。

为了避免这种情况,你可以在 127.0.0.1 上运行你的 Web 服务器 (nginx):80以及 1.2.3.4 版的 Varnish:80(外部 IP)。

答案4

如果您的网站正在向某处发送 301 或 302 响应,则按照规范,它应该发送带有 http、主机和端口的完整 URI。当 nginx 代理请求时,可以使用 proxy_redirect 选项修复此问题。Varnish 中应该存在相同的机制。如果没有,则由您来重写 Location: 标头。

您能否提供将客户端发送到端口 8080 的响应标头?这是标头还是网站上的直接链接?

相关内容