清漆,隐藏端口号

我的设置如下:

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

Web服务器: Nginx监听端口8080

反向代理:在端口80上听取清漆

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

该网站是由WordPress的。

如何让Varnish在端口8080上使用Nginx作为后端,而无需将端口号添加到地址中?

编辑:清漆是这样设置的:

我已经告诉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的include)包含:

 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; } } } 

所以我设法解决这个问题,向那些试图find答案的人道歉,因为这不是我诊断的问题。

在我申请清漆之前,我告诉wordpress我的网站url是playwithbits.com:8080这样它就可以正确地提供内容,所以它将端口号添加到我的所有url。

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

Varnish本身从来不会自己发送301个答案(除非你做了一些主要的VCL魔术),所以如果你得到一个redirect,它必须来自你的后端。

我看到你已经解决了你的特殊问题。 在某些情况下,像一些CGI程序一样,端口仍然显示在URL中。

为了避免这种情况,您可以在127.0.0.1:80上运行Webserver(nginx),并在1.2.3.4:80(外部IP)上运行Varnish。

如果你的站点发送301或者302响应,它应该通过http,host和port发送完整的URI。 当nginx代理请求时,这可以通过proxy_redirect选项来修复。 清漆中应该存在相同的机制。 如果不是,则由您来重写Location:标题。

你能提供发送客户端到8080端口的回应吗? 这是标题或直接链接在某个网站的某个地方?