摘要:可傳遞的參數(shù),遵循規(guī)范定義。作用域默認(rèn)獲取不到的值,得通過指定定義的正則表達(dá)式來給賦值。其正則表達(dá)式必須要有兩個(gè)捕獲。第一個(gè)捕獲的值會(huì)重新賦值給變量。如果使用本文中的傳遞方式,且隱藏,則的需要改為。
是什么?
顧名思義,是Nginx用來處理FastCGI的模塊。FastCGI是什么?這個(gè)以后再講,可以說的是現(xiàn)在LNMP架構(gòu)里面,PHP一般是以PHP-CGI的形式在運(yùn)行,它就是一種FastCGI,我們在進(jìn)程中看到的PHP-FPM是PHP-CGI的管理調(diào)度器。
為什么要詳解一下?因?yàn)長NMP不像LAMP,且早期Nginx不支持path_info,導(dǎo)致網(wǎng)上有大量舊版本的Nginx教程干擾視線。
為了更加清晰準(zhǔn)確使用LNMP,估需要深入了解一下整個(gè)ngx_http_fastcgi_module。
四個(gè)常見、重要的配置項(xiàng) fastcgi_pass作用域:location, if in location
設(shè)置FastCGI服務(wù),其值可以是一個(gè)域名、IP地址:端口、或者是一個(gè)Unix的Socket文件。
同時(shí),它也只支持一個(gè)FastCGI服務(wù)集群。
# TCP形式傳遞 fastcgi_pass localhost:9000; # Socket形式傳遞 fastcgi_pass unix:/tmp/fastcgi.socket; # 傳遞給集群 upstream cloud { server cgi_1.cloud.com; server cgi_2.cloud.com; } fastcgi_pass cloud;
upstream集群定義不在本次討論范圍,更多玩法請參考官方文檔。
fastcgi_param作用域:http, server, location
設(shè)置一個(gè)傳遞給FastCGI服務(wù)的參數(shù),可以是文本或者是變量。
# 例如在接入層Nginx上面?zhèn)鬟f如下5個(gè)參數(shù) fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # 那么在FastCGI上面,例如PHP-CGI上面就可以通過$_SERVER這個(gè)超全局變量獲取。 $_SERVER["REMOTE_ADDR"] $_SERVER["REMOTE_PORT"] $_SERVER["SERVER_ADDR"] $_SERVER["SERVER_PORT"] $_SERVER["SERVER_NAME"]
可傳遞的參數(shù),遵循CGI/1.1規(guī)范定義。
可以從Github上面看到Nginx在3年前實(shí)現(xiàn)FastCGI的參數(shù)傳遞后,基本就沒變過了。
fastcgi_index作用域:http, server, location
當(dāng)請求以/結(jié)尾的時(shí)候,會(huì)將請求傳遞給所設(shè)置的index.php文件處理。
fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;fastcgi_split_path_info
作用域:location
Nginx默認(rèn)獲取不到PATH_INFO的值,得通過fastcgi_split_path_info指定定義的正則表達(dá)式來給$fastcgi_path_info賦值。
其正則表達(dá)式必須要有兩個(gè)捕獲。
第一個(gè)捕獲的值會(huì)重新賦值給$fastcgi_script_name變量。
第二個(gè)捕獲到的值會(huì)重新賦值給$fastcgi_path_info變量。
例子:
location ~ ^(.+.php)(.*)$ { fastcgi_split_path_info ^(.+.php)(.*)$; fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; }
原始請求是 /show.php/article/0001。
通過分割,F(xiàn)astCGI得到的結(jié)果是:
SCRIPT_FILENAME: /path/to/php/show.php
PATH_INFO: /article/0001
Nginx在0.7.31以前是沒有fastcgi_split_path_info這個(gè)指令的,而0.7.x這個(gè)版本一直存活了好多年,后面才高歌猛進(jìn),導(dǎo)致網(wǎng)上存在大量舊版本通過正則自己設(shè)置PATH_INFO的方法。
踩了好多次依舊不記得怎么設(shè)置的ThinkPHP為什么總是踩坑?因?yàn)槲覀兌紩?huì)通過重寫來隱藏index.php文件,而ThinkPHP的教程,默認(rèn)教的是舊版Nginx寫法,且URL_MODE必須設(shè)置為3也說得很隱晦(URL_MODE默認(rèn)為0)。
例如ThinkPHP的說明有一段舊版的Nginx設(shè)置指引。
location / { // …..省略部分代碼 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } }
該規(guī)則是通過將請求rewrite給/index.php?s=來實(shí)現(xiàn)的,其ThinkPHP的URL_MODE配置必須為3,也就是兼容模式。
如果使用本文中的傳遞PATH_INFO方式,且隱藏index.php,則ThinkPHP的URL_MODE需要改為2。
如果使用本文中的傳遞PATH_INFO方式,但不隱藏index.php,則ThinkPHP的URL_MODE改為1。
還有個(gè)一個(gè)叫 cgi.fix_pathinfocgi.fix_pathinfo參數(shù),藏在PHP-FPM的php.ini配置里面,其默認(rèn)值為1。
這里存在一個(gè)安全風(fēng)險(xiǎn),我也不通,詳情不表,看鳥哥的文章:http://www.laruence.com/2010/05/20/1495.html
習(xí)慣性將其設(shè)置為0即可。
參考http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
http://wiki.nginx.org/PHPFcgiExample
同步發(fā)表于我的博客
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39145.html
摘要:異常處理異常處理一直是回調(diào)的難題,而提供了非常方便的方法在一次調(diào)用中,任何的環(huán)節(jié)發(fā)生,都可以在最終的中捕獲到錯(cuò)誤處理基本的小結(jié)具體的很多的用法可以參考阮一峰的入門教程,還有就是上面提到的電子書。 JS異步那些事 一 (基礎(chǔ)知識(shí))JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本...
摘要:向添加一個(gè)事件監(jiān)聽器當(dāng)傳遞消息時(shí),會(huì)執(zhí)行事件監(jiān)聽器中的代碼。終止當(dāng)我們創(chuàng)建對象后,它會(huì)繼續(xù)監(jiān)聽消息即使在外部腳本完成之后直到其被終止為止。 JS異步那些事 一 (基礎(chǔ)知識(shí))JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本加載) 什么是 Web Worker? 當(dāng)在 HTML ...
摘要:異步那些事一基礎(chǔ)知識(shí)異步那些事二分布式事件異步那些事三異步那些事四異步那些事五異步腳本加載事件概念異步回調(diào)首先了講講中兩個(gè)方法和定義和用法方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。功能在事件循環(huán)的下一次循環(huán)中調(diào)用回調(diào)函數(shù)。 JS異步那些事 一 (基礎(chǔ)知識(shí))JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers...
摘要:遵循的是異步模塊定義規(guī)范,遵循的是通用模塊定義規(guī)范。不同的腳本加載這個(gè)模塊,得到的都是同一個(gè)實(shí)例。關(guān)于異步那些事就寫到這里了,很多地方理解的不夠深刻希望大家多多指教。 JS異步那些事 一 (基礎(chǔ)知識(shí))JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本加載) 異步腳本加載 阻塞性...
閱讀 1232·2021-11-11 16:54
閱讀 882·2021-10-19 11:44
閱讀 1348·2021-09-22 15:18
閱讀 2455·2019-08-29 16:26
閱讀 2958·2019-08-29 13:57
閱讀 3101·2019-08-26 13:32
閱讀 1089·2019-08-26 11:58
閱讀 2339·2019-08-26 10:37