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