配置 php-fpm 仅在一个目录中工作,其余目录使用 HHVM

配置 php-fpm 仅在一个目录中工作,其余目录使用 HHVM

我正在尝试在同一个站点上测试 HHVM 和 php-fpm,同时运行两者。但我希望 php-fpm 仅在一个目录上工作,但我认为我做得不对

location ~ \.(hh|php)$ {
fastcgi_pass   127.0.0.1:9000;
# or if you used a unix socket
# fastcgi_pass   unix:/var/run/hhvm/hhvm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
include        fastcgi_params;
}
location /checkout {
fastcgi_pass    unix:/var/run/php5-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
include        fastcgi_params;
}

当我进入 /checkout 时出现文件未找到的情况

Nginx 错误:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

这实际上有可能实现吗?

答案1

嗨,我也有同样的问题。而且解决了,耶!

试试这个:

location / {
    try_files $uri $uri/ /index.php?$args;
}
location ~ \.(hh|php)$ {
    fastcgi_keep_conn on;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

    # /checkout/ or /checkout - just try it out
    if ($request_uri = '/checkout') {
        # using php-fpm
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
    # using hhvm
    fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
}

重要提示:$request_uri 必须非常具体

我认为你的问题是,你的配置中也存在:

location / {
    try_files some_url /index.php?$args;
}

我认为(好吧,我是 nginx 新手)nginx 执行以下操作:

  1. 寻找位置/checkout
  2. 匹配location /checkout-block
  3. 找不到 fastcgi 脚本/checkout
    • 意味着它永远不会应用于try_files重写/index.php?$args

补充想法:

为了获得更好的可靠性,我使用 hhvm-routefastcgi_pass php;和 http-block:

upstream php {
    server unix:/var/run/hhvm/hhvm.sock; # hhvm
    server unix:/var/run/php5-fpm.sock backup; # php-fpm
}

有了这个配置,当 hhvm 崩溃时我有一个后备方案。

并且应该有一个更好的基于 $request_uri 进行切换的方法...

相关内容