我正在尝试使用 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/

10-15 00:16
查看更多