我想把 nginx 放在 Varnish 前面,同时 Varnish 会回到 nginx 来提供一些 PHP(Drupal)。
但是我只得到了空白页(来自 Varnish),响应数为 200,但长度为 0。只有重新启动 varnish 后的第一次访问才有效,但之后一直都是空白页。
这是 Nginx 的配置:
server{
listen 80;
server_name myserver
access_log /var/log/nginx/ssl_access.log main;
error_log /var/log/nginx/ssl_error.log warn;
location / {
proxy_pass http://127.0.0.1:6081;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
然后 varnish 配置就只是默认的了,尝试调试:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
再次,8080 的 nginx 配置为:
server{
listen 8080;
access_log /var/log/nginx/fromvarnish.log main;
error_log /var/log/nginx/fromvarnisherror.log warn;
server_name myserver
location / {
try_files $uri /index.php?$query_string;
}
location ~ '\.php$|^/update.php' {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
}
}
访问我的网页只返回空的 html,但响应为 200。没有 PHP 错误或任何其他错误。Nginx 上的访问日志只是访问,没有错误。
如果我直接从 Varnish 访问(通过端口 mywbpage.com:6081 访问)或者将其设置为端口 80,它就可以工作。
如果我将 php 执行后端设置为 Apache+php-fpm(而不是 Nginx:nginx->varnish->apache),它也可以正常工作(如果 php 执行器是 HHVM,我也会遇到同样的问题,但这可能是另一个问题)。
编辑:抱歉,我错了,如果我使用 apache,只有取消选中 drupal 的默认缓存(未经身份验证的用户的缓存页面)时,它才会起作用。对于 nginx,这无关紧要,无论是否选中此复选框,它都不会起作用。
你们当中有人知道一些可以指导我的事情吗?
答案1
所以我希望有人能给出答案,但与此同时我已经让它发挥作用了,所以我将解释如何:
nginx 配置在服务器部分端口 80。用户将首先访问的端口,添加以下内容:
proxy_http_version 1.1;
查看 varnish 日志,来自 nginx 的请求与空白页之间的一个小区别是:
ReqProtocol HTTP/1.0
并且一个直接来自网络浏览器访问 varnish 端口(例如:mypage:6081) - 工作正常 - 是:
ReqProtocol HTTP/1.1
因此我强制 nginx 使用 1.1,现在它可以工作了。