nginx fastcgi 通用配置

通用配置文件php和php_rewrite放在和nginx.conf同级目录。

php:

location ~* \.php($|/) {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME   $fastcgi_file;
        fastcgi_param SERVER_NAME       $server_name;
        fastcgi_param PATH_INFO         $fastcgi_script_name;
}

php配置使用了自定义变量$fastcgi_file。

php_rewrite

if (!-e $request_filename) {
    rewrite  ^/(.*)$  /index.php/$1;
}
set $fastcgi_file $document_root$fastcgi_script_name;
include php;

使用自定义变量$fastcgi_file。

常规server配置

server {
    listen 80;
    server_name xxx.com;
    root /srv/www/xxx.com/public;

    include php_rewrite;
}

带location的server配置

server {
    listen 80;
    server_name xxx.com;

    location /v1 {
        root /srv/www/xxx.com-v1/public/;
        include php_rewrite;
    }
    location /v2 {
        root /srv/www/xxx.com-v2/public/;
        include php_rewrite;
    }
    include php;
}

这个配置就有很多说法了,以location /v1为例,包含文件php_rewrite中include php语句不会起作用,包含文件php_rewrite中的rewrite ^/(.*)$ /index.php/$1会重写uri到/,然后匹配server下配置文件php中的location,因为位于/并且在/下没有定义root和alias所以$document_root使用默认值,例如:/etc/nginx/html,为了避免这种情况可以使用自定义变量保存fastcgi_param SCRIPT_FILENAME,正如代码中的$fastcgi_file变量。

其中rewrite有需要特别注意的地方:last和break
这两个参数官方文档写的不是很容易理解,参考资料:http://blog.csdn.net/brainkick/article/details/7475770

下面是更高级的配置:

server {
    listen 80;
    server_name local.api.1crud.com;

    access_log /var/log/nginx/api.1crud.com_access.log;
    error_log /var/log/nginx/api.1crud.com_error.log;

    location ~ ^/(?<version>v\d+) {
        root /srv/www/api.1crud.com-$version/public;
        include php_rewrite;
    }
    include php;
}

location和rewrite中的正则匹配可以后向引用,实例中使用的是带名称的后向引用,如果直接使用$1,$2之类的后向引用会出问题,因为root命令决定了$document_root变量的值,但是$document_root变量的值是在使用时动态计算的,所以使用$document_root之前如果有带子匹配的其他正则会导致$document_root的值和root命令期望的值不一样。