nginx > varnish > hhvm

nginx > varnish > hhvm

我在前端安装了 nginx,负责解释 ssl 并将所有非 https 流量重定向到 https:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.example.com$request_uri;
}

从那里,下一个服务器块解释 ssl 并传递给 varnish:

server {
    listen 443 ssl spdy;
    server_name example.com www.example.com;
    ...<ssl stuff>...

    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 X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

我已经把 varnish 中的所有内容都取出来以帮助调试我的问题,所以现在它只是通过端口 8080 传递回 nginx

backend default {
.host = "127.0.0.1";
.port = "8080";
}

回到 nginx 端口 8080 服务器块:

server {
   listen       8080;
   server_name  example.com www.example.com;
   ...<access logs root index stuff>...

   location ~ \.php$ {
       try_files $uri =404;
       include fastcgi_params;
       fastcgi_pass php;
   }
}

php 变量指向 127.0.0.1:hhvmport 上的 hhvm 上游,并回退到 127.0.0.1:php-fpmport。

当我尝试访问 wordpress 管理员时,出现了重定向循环。我不确定这是 wordpress 问题还是服务器设置问题,因为当我从上游删除 hhvm 并直接转到 php-fmp 时,我没有遇到任何问题。还有 curl -Ihttps://www.example.com/wp-admin/显示 302 重定向至https://www.example.com/wp-admin/而不是 301。此外,如果我完全将 varnish 移除,hhvm 就可以正常访问 wp-admin。添加的标头(X-Forwarded 等)是否会混淆 hhvm 并期望流量来自 443?

/var/log/hhvm/error.log 除了显示正在创建的 jit 之外没有显示任何内容。在 nginx 中启用重定向日志,但它也帮不上忙。我没想到它会帮上忙,但值得一试。

真的很困惑这里发生了什么。我不确定这是否属于 wordpress 部分,因为删除 varnish 可以修复该问题,或者绕过 wordpress 管理部分中的 hhvm 也可以修复该问题,这似乎更像是设置问题。任何帮助都将不胜感激。如果这有任何意义的话,请在 Ubuntu 14.04 上运行。

答案1

当您将 WordPress 配置为将所有不安全的流量重定向到安全 URL(例如通过.htaccess)时,可能会发生这种情况。 发生的情况是,第一个请求到达,被剥离 SSL 标头,并击中 WordPress,WordPress 注意到连接不安全,因此向客户端发送重定向上游。

如果您认为 WordPress 没有这样做,请尝试使用一些平面 PHP(一些非常简单的 PHP,如<?php phpinfo(); ?>)。如果它使用平面 PHP 这样做,则调试此问题的最佳方法往往是嗅探点 A 和点 B 之间的流量(以查看预期流量与实际流量之间的脱节出现在哪里),或者直接转到感兴趣的端口(例如通过http://host:port/URI 语法,通过修改“hosts”文件和/或使用端口转发)并一次向上堆栈一个服务,直到您获得的数据与预期不一致。

答案2

事实证明我需要添加:

fastcgi_param HTTPS on;

在传递给 php 的位置块中,现在一切都按预期工作。

相关内容