我有点困惑,实际上非常困惑,不是关于 varnish 及其配置。目前我在 Nginx/PHP-FPM 上运行 Magento 2,并且只使用 SSL,即我将用户从 :80 重定向到 :443,因为我只希望他们通过 SSL 访问。此外,现在 Magento 2 已配置为 Redis 上的 cache/page_cache 和会话(在本地服务器上设置)。但是,我想使用 varnish 进行页面缓存。
1)为此,我想安装通过docker安装varnish使用给定的图像。我导出了从 Magento Admin 生成的 default.vcl 文件并将其放入/etc/varnish/default.vcl
并使用以下命令:
docker run -e VARNISH_CONFIG_FILE=/etc/varnish/default.vcl
--restart except-stopped
-v /etc/varnish/default.vcl:/etc/varnish/default.vcl
-Pit --name=varnish-alpine thiagofigueiro/varnish-alpine-docker
然而,在default.vcl
我配置的文件中.port = 6085
,Varnish 却开始监听端口32768
。看起来它没有读取我的default.vcl
文件。
2.
目前 Nginx 正在监听80
和443
,如果我用80:80
它运行 varnish,docker 日志中会出错Address already in use
。我想运行 varnish port 6085
,让 magento 在这个端口上缓存页面。但从我的研究来看,似乎我必须在端口 80 上运行 varnish,然后我的网站监听其他端口,并将端口 80 上的流量重定向到网站端口(代理)。我说的对吗?因此,Web 服务器(Nginx)实际上将在端口 8080(用于 HTTP)和 8082(用于 HTTPS)上运行,并且这些端口将仅在(localhost)内开放,而不会向公众开放。但那么 varnish 将如何在端口 443 上通信呢?
我是否可以在单独的服务器上安装 varnish?或者 varnish 应该与 Web 服务器安装在同一台服务器上。
如果我可以在单独的服务器上安装 varnish,那么如何使它与 nginx(在不同的服务器上)一起工作。
标题: 更改标题以反映下面给出的更新问题。
更新:
好的,我可以让 varnish 工作,但是它在www.domain.com
(主页)上给出“错误 503 后端获取失败”,但是在任何子文件夹或页面上都可以正常工作,例如www.domain.com/index.php
。
- 现在我的 Nginx 配置已配置为将 重写
/index.php/
为/
。没有 Varnish,它工作正常,但在 Varnish 上domain.com/index.php/
运行良好,但domain.com
出现错误。
清漆日志为/
:
<< Request >> 33
- Begin req 32 rxreq
- Timestamp Start: 1594304417.447698 0.000000 0.000000
- Timestamp Req: 1594304417.447698 0.000000 0.000000
- VCL_use boot
- ReqStart 1.1.0.1 47738 a0
- ReqMethod GET
- ReqURL /
- ReqProtocol HTTP/1.0
- ReqHeader Host: www.domain.com
- ReqHeader X-Real-IP: 162.158.155.131
- ReqHeader X-Forwarded-For: x.x.x.x, 162.158.155.131
- ReqHeader X-Forwarded-Proto: https
- ReqHeader X-Forwarded-Port: 443
- ReqHeader Connection: close
- ReqHeader Accept-Encoding: gzip
- ReqHeader CF-IPCountry:
- ReqHeader CF-RAY: 5b02af62b8a4ca78-
- ReqHeader CF-Visitor: {"scheme":"https"}
- ReqHeader accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- ReqHeader user-agent:
- ReqHeader accept-language: en-us
- ReqHeader cookie: PHPSESSID=;
- ReqHeader CF-Request-ID: 03d58bf1af0c200000001
- ReqHeader CF-Connecting-IP: x.x.x.x
- ReqHeader CDN-Loop: cloudflare
- ReqUnset X-Forwarded-For: x.x.x.x, 162.158.155.131
- ReqHeader X-Forwarded-For: x.x.x.x, 162.158.155.131, 1.1.0.1
- VCL_call RECV
- ReqHeader grace: none
- ReqURL /
- ReqUnset Accept-Encoding: gzip
- ReqHeader Accept-Encoding: gzip
- VCL_return hash
- VCL_call HASH
- VCL_return lookup
- VCL_call MISS
- VCL_return fetch
- Link bereq 34 fetch
- Timestamp Fetch: 1594304417.448049 0.000351 0.000351
- RespProtocol HTTP/1.1
- RespStatus 503
- RespReason Backend fetch failed
- RespHeader Date: Thu, 09 Jul 2020 14:20:17 GMT
- RespHeader Server: Varnish
- RespHeader content-type: text/html; charset=utf-8
- RespHeader Retry-After: 5
- RespHeader X-Varnish: 33
- RespHeader Age: 0
- RespHeader Via: 1.1 varnish (Varnish/6.4)
- VCL_call DELIVER
- RespUnset Age: 0
- RespHeader Pragma: no-cache
- RespHeader Expires: -1
- RespHeader Cache-Control: no-store, no-cache, must-revalidate, max-age=0
- RespUnset Server: Varnish
- RespUnset X-Varnish: 33
- RespUnset Via: 1.1 varnish (Varnish/6.4)
- VCL_return deliver
- Timestamp Process: 1594304417.448084 0.000386 0.000035
- Filters
- RespHeader Content-Length: 279
- RespHeader Connection: close
- Timestamp Resp: 1594304417.448153 0.000455 0.000068
- ReqAcct 1428 0 1428 264 279 543
- End
* << Session >> 32
- Begin sess 0 HTTP/1
- SessOpen 1.1.0.1 47738 a0 1.1.0.4 80 1594304417.447629 23
- Link req 33 rxreq
- SessClose REQ_CLOSE 0.001
- End
我已经将以下参数添加到 varnish 中,但错误仍然存在。
-p http_resp_hdr_len=65536
-p http_resp_size=98304
更新: 这些是我的 nginx 和 varnish 配置文件。
nginx.conf: https://pastebin.com/raw/tQ9wAmEP
答案1
根据当前配置,Varnish 会捕获对 http:// domain.com/ 的请求。Varnish 将此请求传输到 localhost:8080,Nginx 正在监听该请求。Nginx(不知道 domain.com,因此使用默认服务器配置,即第一个)会将请求重定向到 https://www.example.com。当浏览器尊重这一点时,第二个请求由 Nginx 本身处理,它将此请求 proxy_passes 到 http://127.0.0.1:80,Varnish 正在监听该请求。从头开始重新启动。