NginX->Varnish->PHP-FPM 空白页

NginX->Varnish->PHP-FPM 空白页

我想把 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,现在它可以工作了。

相关内容