我正在尝试在同一个站点上测试 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 执行以下操作:
- 寻找位置
/checkout
- 匹配
location /checkout
-block - 找不到 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 进行切换的方法...