Nginx与子位置

时间:2015-07-16 17:05:09

标签: php ruby-on-rails nginx server

我正在尝试使用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项目给我一个“找不到文件”它说:在stderr中发送的FastCGI:“Primary脚本未知“。我发现了与它有关的问题,我尝试了很多方法,但我无法想出适用于这两个项目的东西。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我确定您现在已经进行了进一步的工作或已经弄清楚了,但是为了后人的缘故:位置块中的root指令覆盖您的服务器root指令。这不是相对的。使用conf的方式,项目文件必须位于Web服务器上的绝对路径/ web / php_proj中。

我不太确定本地路径的设置方式,但是如果/var/www/dev/rails_proj/public是包含应用程序根目录的目录,则可能需要执行以下操作:

location /rails_proj {
    alias /var/www/dev/rails_proj/public;
}

使用别名代替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可能并不总是能正常工作。特别是如果使用别名指令而不是root。在大多数情况下,最好使用变量$request_filename

答案 1 :(得分:0)

可能更容易管理为两个服务器块,每个服务器块都有一个额外的子域。它还减少了多个正则表达式位置引入的混淆:

server {
    server_name rails.dev.example.com;
    return 200 "Hello from rails app.
";
}

server {
    server_name php.dev.example.com;
    return 200 "Hello from php app.
";
}