我正在尝试使用 nginx 为两个项目设置一个开发服务器,一个在 rails 中,一个在 PHP 中。我想要两个项目的基本 URL (dev.example.com) 和每个项目的子位置 (dev.example.com/rails_proj 和 dev.example.com/php_proj)。我的 nginx conf 如下所示:
server {
listen 80;
server_name dev.example.com;
passenger_enabled on;
passenger_app_env development;
passenger_buffer_response off;
root /var/www/dev;
location ~ ^/rails_proj {
root /public;
passenger_base_uri /rails_proj;
passenger_app_root /var/www/dev/rails_proj;
passenger_document_root /var/www/dev/rails_proj/public;
}
location ~ ^/php_proj {
root /web;
try_files $uri /app_dev.php$is_args$args;
location ~ \.php(/|$) {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
rails 项目工作正常,但是当我尝试访问 dev.example.com/php_proj/app_dev.php 和日志时,PHP 项目给了我一个“找不到文件”它说:FastCGI sent in stderr:“Primary script unknown” .我发现了与它相关的问题,我尝试了多种方法,但我无法想出对这两个项目都适用的方法。我怎样才能解决这个问题?
最佳答案
我确定您现在已经继续或想通了这一点,但为了后代:您的位置块中的 root 指令会覆盖您的服务器 root 指令。它与它无关。根据您的配置方式,项目文件需要位于 Web 服务器上的绝对路径/web/php_proj 中。
我不能完全确定您的本地路径的设置方式,但如果 /var/www/dev/rails_proj/public
是包含您的应用程序根目录的目录,您可能需要执行以下操作:
location /rails_proj {
alias /var/www/dev/rails_proj/public;
}
使用 alias 而不是 root 将从请求路径的开头剥离/rails_proj 并提供相对于别名路径的文件。例如,如果您请求
http://dev.example.com/rails_proj/php/test.php
,它将提供文件 /var/www/dev/rails_proj/public/php/test.php
此外,我绝对建议将顶级位置路径从正则表达式更改为标准前缀路径。
location ~ ^/php_proj
实际上与 location /php_proj
相同,除了使用正则表达式与 nginx 决定服务位置的方式相混淆。正则表达式路径对性能的要求更高,根据第一次匹配而不是最佳匹配进行操作,并且将优先于所有前缀路径位置。另一件事要注意:使用
$document_root$fastcgi_script_name
可能并不总是按预期工作。特别是如果使用 alias 指令而不是 root。在大多数情况下,最好使用变量 $request_filename
。关于php - 带有子位置的 Nginx,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31460412/