AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 398936
Accepted
George Reith
George Reith
Asked: 2012-06-15 12:38:51 +0800 CST2012-06-15 12:38:51 +0800 CST 2012-06-15 12:38:51 +0800 CST

清漆,隐藏端口号

  • 772

我的设置如下:

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

Web 服务器: Nginx 监听 8080 端口

反向代理: Varnish 监听 80 端口

问题是 Varnish 将我的请求重定向到端口 8080,并且它像这样出现在地址栏中http://mysite.com:8080/directory/,导致站点上的相关链接在请求中包含端口号 (8080),从而绕过 Varnish。

该网站由 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 文件(通过 include in 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;
          }
     }
}
linux centos port nginx varnish
  • 4 4 个回答
  • 2276 Views

4 个回答

  • Voted
  1. Best Answer
    George Reith
    2012-06-16T07:00:48+08:002012-06-16T07:00:48+08:00

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

    在我应用 varnish 之前,我告诉 wordpress 我的站点 url 是playwithbits.com:8080为了它可以正确地提供内容,所以它将端口号附加到我的所有 url。

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

    • 1
  2. neovatar
    2012-06-17T12:44:37+08:002012-06-17T12:44:37+08:00

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

    • 0
  3. Tobe
    2012-06-28T15:41:06+08:002012-06-28T15:41:06+08:00

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

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

    • 0
  4. kworr
    2012-06-15T13:11:32+08:002012-06-15T13:11:32+08:00

    如果您的站点在某处发送 301 或 302 响应,它应该按照规范发送带有 http、主机和端口的完整 URI。当 nginx 代理请求时,这可以通过 proxy_redirect 选项修复。清漆中应该存在相同的机制。如果不是,则由您重写 Location: 标头。

    你能为将客户端发送到端口 8080 的响应提供 heaer 吗?这是网站某处的标头或直接链接吗?

    • -1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve