Pages

Thursday, 23 January 2020

关于nginx与php fastcgi配置中的SCRIPT_FILENAME

配置过nginx服务器的童鞋肯定很熟悉下面这个配置,这表示如果请求的是php文件,那么把请求交给fastcgi处理(即php-fpm):
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
nginx
其中我要说的是下面这个配置:
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
nginx
你可以打开fastcgi_params文件看看,里面是的配置项是不是跟上面这句格式一模一样?
所以,为什么所有人都不把上面这句设置SCRIPT_FILENAME的配置加到fastcgi_params里面呢?他们的格式都长的一样,为什么不放进去?而要单独拿出来?
我简单说一下原因:因为历史原因,一开始SCRIPT_FILENAME是这么配置的(也主是说document_root部分是直接写死的,所以这一句才会放在fastcgi_params文件的外面):
fastcgi_param SCRIPT_FILENAME /var/www/foo$fastcgi_script_name;
nginx
但是后来有了$document_root这个变量,不需要直接写死document_root了,所以人们就直接把之前写死的部分直接改成$document_root,也就是本文开头那种写法,这也是我们目前常见的一种写法,既然这样,为什么官方配置不直接往fastcgi_params添加这一句,而是我要们自己写呢?原因是怕大家都这样用习惯了,如果在fastcgi_params里添加了这一句,但很多人不知道,还是在外面又自己加一句,这样一来就重复了,就会出问题,所以官方并没有在fastcgi_params文件里直接加这句,而是采用了增加一个新文件的做法,这个新文件叫fastcgi.conf,该文件与fastcgi_params几乎完全一样,只是增加了前面说的定义SCRIPT_FILENAME的那句配置,然后再推荐大家用这个配置文件,所以实际上我们可以写成这样:
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    include        fastcgi.conf;
}
nginx
但由于长久以来各种资料文档一直都用本文开头那种写法,而且很多人其实并不太清楚这个的具体含义直接粘贴来用的,所以这就是为什么不把定义SCRIPT_FILENAME的配置项放入fastcgi_params文件中的原因,因为fastcgi_params其实是被抛弃了的。
另外,fastcgi.conf里的这句:
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
nginx
其实可以写成(我目前就是这么写的):
fastcgi_param  SCRIPT_FILENAME  $request_filename;
nginx
原因,有可能是$request_filename变量是后来才有的吧。
关于fastcgi_params与fastcgi.conf文件的区别原文: