日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Nginx19】Nginx學(xué)習(xí):FastCGI模塊(一)基礎(chǔ)配置

 硬核項(xiàng)目經(jīng)理 2023-08-21 發(fā)布于湖南

Nginx學(xué)習(xí):FastCGI模塊(一)基礎(chǔ)配置

萬(wàn)眾矚目啊,總算到 FastCGI 了??次椅恼潞鸵曨l的各位大佬們8成以上都是 PHPer 吧,要做 PHP ,F(xiàn)astCGI 的配置就少不了。CGI 、FastCGI 、PHP-FPM 這些概念,咱們?cè)诤茉缰暗?span> 了解PHP-FPMhttps://mp.weixin.qq.com/s/NUpDnfYfbPuWmal4Am3lsg 這篇文章中就學(xué)習(xí)過(guò)了。不記得的小伙伴可以回去看下哦,如果感覺(jué)說(shuō)得太簡(jiǎn)單了,大家還可以去自己搜索一下相關(guān)的資料。

FastCGI 模塊的全稱(chēng)是 ngx_http_fastcgi_module ,包含在核心源碼中,不需要單獨(dú)編譯了。

基本配置

還是拿我們?cè)?HTTP 核心模塊中第一篇文章中的例子來(lái)說(shuō)。最簡(jiǎn)單的配置就是下面這樣。

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include        fastcgi_params;
}

沒(méi)錯(cuò),就這么簡(jiǎn)單的幾個(gè)配置,我們后面會(huì)一一說(shuō)明它們的作用。標(biāo)準(zhǔn)的連接 PHP-FPM 就是這么簡(jiǎn)單,但是,CGI 是通用網(wǎng)關(guān)接口,因此,不僅僅是 PHP ,Python、Java、C++ 之類(lèi)的任何語(yǔ)言,只要是實(shí)現(xiàn)了 FastCGI 接口,那么他們都可以通過(guò)這種形式與 Nginx 進(jìn)行交互。并且 FastCGI 也提供這些語(yǔ)言的 API ,只不過(guò)我對(duì)這些語(yǔ)言不熟悉,而且大部分情況下,使用 Nginx 的 FastCGI 都是和 PHP 打配合的,因此,咱們也就不多贅述了。有興趣,并且精通這些語(yǔ)言的小伙伴可以自己找資料調(diào)試一下哦。

接下來(lái),我們今天就先看看上面這個(gè)配置中的這三條配置指令是干嘛的。

fastcgi_pass

設(shè)置 FastCGI 服務(wù)器的地址。

fastcgi_pass address;

沒(méi)有默認(rèn)值,也可以將這個(gè)配置項(xiàng)當(dāng)做是 FastCGI 的開(kāi)關(guān)。它只能配置在 location 子模塊中,也就是說(shuō),必須是指定路徑的或者條件的 location 才能使用 FastCGI 。

它的參數(shù)就一個(gè),之前我們就學(xué)習(xí)過(guò),可以使用 127.0.0.1:9000 這種端口形式的,也可以使用 unix:/var/sock/php-fpm/www.sock 這種形式。在開(kāi)頭 PHP-FPM 的文章中有過(guò)詳細(xì)的說(shuō)明。一般來(lái)說(shuō),本機(jī)使用,肯定是 UnixSocket 這種形式更好啦,畢竟不需要再走連接請(qǐng)求了。而且一般也很少人會(huì)把 Nginx 和 PHP-FPM 分開(kāi)放,即使是做負(fù)載均衡,也是直接代理到每臺(tái)主機(jī)的 Nginx 端口上。因此,建議本機(jī)的 Nginx+PHP 組合盡量都走 UnixSocket 。

另外,這個(gè)服務(wù)器地址也可以是一組服務(wù)器,會(huì)以循環(huán)的方式請(qǐng)求,類(lèi)似于默認(rèn)的負(fù)載均衡配置,不過(guò)還是那句話(huà),很少有人這么玩。詳細(xì)的負(fù)載均衡 upstream 模塊我們后面也會(huì)學(xué)到,主要還是看那邊的吧。

地址參數(shù)還可以包含變量,并且如果地址被指定為域名,則在所描述的服務(wù)器組中搜索該名稱(chēng),如果沒(méi)有找到,則使用解析器來(lái)確定。

fastcgi_index

 $fastcgi_script_name 變量的值中設(shè)置將附加在以斜杠結(jié)尾的 URI 之后的文件名。

fastcgi_index name;

其實(shí)和大家最常見(jiàn)的那個(gè) index 是一樣的,只不過(guò) index 是拼接到 root 或者 alias 路徑的后面,而這個(gè)配置,則是將指定的默認(rèn)文件拼接到以斜杠結(jié)尾的 $fastcgi_script_name 變量的后面。這個(gè)變量又是哪里來(lái)的呢?它呀,就是 FastCGI 當(dāng)中的 $uri 變量,也就是我們的請(qǐng)求 URI 。

  • $fastcgi_script_name 請(qǐng)求 URI,如果 URI 以斜杠結(jié)尾,則請(qǐng)求帶有由 fastcgi_index 指令配置的索引文件名附加到它的 URI。此變量可用于設(shè)置確定 PHP 中腳本名稱(chēng)的 SCRIPT_FILENAME 和 PATH_TRANSLATED 參數(shù)。比如說(shuō),我們請(qǐng)求配置一個(gè) /php/ 路徑,加上上面的 FactCGI 配置。
location /php/ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /home/www/html1/php$fastcgi_script_name;
    include        fastcgi_params;
}

然后請(qǐng)求 /php/info/ ,那么實(shí)際訪問(wèn)的就是 $fastcgi_script_name 也就是 /php/info/ ,完整的 SCRIPT_FILENAME 路徑就是 /home/www/html1/php/info/ ,最后拼上 fastcgi_index 的設(shè)置,它是針對(duì) $fastcgi_script_name 的,因此實(shí)際 fastcgi_script_name 的內(nèi)容是 /php/info/index.php 。最終,完整的訪問(wèn)到的文件就是 /home/www/html1/php/info/index.php 。

需要注意的是,如果我們?cè)L問(wèn)的是靜態(tài)頁(yè)面,那么還是會(huì)走 root 或者 alias 的,不會(huì)走到 FastCGI 配置的路徑中。而且,之前的文章也說(shuō)過(guò)了,SCRIPT_FILENAME 指定的路徑需要是絕對(duì)路徑,這個(gè)也是容易配錯(cuò)的地方。

fastcgi_param

設(shè)置應(yīng)傳遞給 FastCGI 服務(wù)器的參數(shù)。

fastcgi_param parameter value [if_not_empty];

沒(méi)有默認(rèn)值,但可以配置在 http、server、location 模塊中。它的 value 值可以包含文本、變量及其組合。當(dāng)且僅當(dāng)當(dāng)前級(jí)別上沒(méi)有定義 fastcgi_param 指令時(shí),這些指令才從上級(jí)的配置級(jí)別繼承。一般來(lái)說(shuō),PHP 必須的主要是這兩個(gè)。

fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING    $query_string;

SCRIPT_FILENAME 不用多說(shuō),PHP-FPM 要執(zhí)行文件就要看它。但是我們的配置文件中沒(méi)有寫(xiě)下面這個(gè) QUERY_STRING 呀,注意哦,在我們的配置中,fastcgi_param 下面還 include 了一個(gè)文件。我們打開(kāi)這個(gè)文件看看。

// vim /etc/nginx/fastcgi_params
fastcgi_param  QUERY_STRING       $query_string; #請(qǐng)求的參數(shù);如?app=123  
fastcgi_param  REQUEST_METHOD     $request_method; #請(qǐng)求的方法(GET,POST)  
fastcgi_param  CONTENT_TYPE       $content_type; #請(qǐng)求頭中的Content-Type字段  
fastcgi_param  CONTENT_LENGTH     $content_length; #請(qǐng)求頭中的Content-length字段

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #腳本名稱(chēng)
fastcgi_param  REQUEST_URI        $request_uri; #請(qǐng)求的地址不帶參數(shù)  
fastcgi_param  DOCUMENT_URI       $document_uri; #與$uri相同
fastcgi_param  DOCUMENT_ROOT      $document_root; #網(wǎng)站的根目錄。在server配置中root指令中指定的值
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #請(qǐng)求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1
fastcgi_param  REQUEST_SCHEME     $scheme; #請(qǐng)求協(xié)議 http/https
fastcgi_param  HTTPS              $https if_not_empty; # 是否使用 https

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; #cgi 版本  
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version; #nginx 版本號(hào),可修改、隱藏

fastcgi_param  REMOTE_ADDR        $remote_addr; #客戶(hù)端IP  
fastcgi_param  REMOTE_PORT        $remote_port; #客戶(hù)端端口 
fastcgi_param  SERVER_ADDR        $server_addr; #服務(wù)器IP地址  
fastcgi_param  SERVER_PORT        $server_port; #服務(wù)器端口
fastcgi_param  SERVER_NAME        $server_name; #服務(wù)器名,域名在server配置中指定的server_name
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;  # 僅 PHP 可用,如果PHP編譯的時(shí)候使用了--enable-force-cgi-redirect 指令,REDIRECT_STATUS參數(shù)應(yīng)該傳輸200.


看到了吧,其實(shí)就是 Nginx 已經(jīng)幫我們準(zhǔn)備好了一堆配置。這些東西我們?cè)?PHP 的 $_SERVER 中可以獲取到。比如我們我們添加一個(gè),在外面的 location 中添加吧,盡量還是不動(dòng)這個(gè)默認(rèn)的 fastcgi_params 配置文件。需要修改哪個(gè)值的話(huà)也可以通過(guò)前后順序覆蓋修改。一定要修改原始的這個(gè) fastcgi_params 文件也可以,因?yàn)槟J(rèn)還有一個(gè) fastcgi_params.default 文件會(huì)在它的同級(jí)目錄中,如果沒(méi)有這個(gè)文件的話(huà),記得備份一下哦。

location ~ \.php$ {
    ………………
    include        fastcgi_params;
    fastcgi_param os_PPP "zyblog"; # 新添加的
    fastcgi_param SERVER_SOFTWARE nnn; # 覆蓋掉原始的值 nginx/1.23.0 ,變成 nnn
}

大小寫(xiě)沒(méi)事,普通變量的命名規(guī)則就好了。然后在 php 文件中打印 $_SERVER,就可以看到新配置的這個(gè)信息。

Array
(
………………
[os_PPP] => zyblog
………………
[SERVER_SOFTWARE] => nnn
………………
)

之前在講命令行時(shí),我們就講過(guò),如果是命令行運(yùn)行 php 文件打印的 $_SERVER 和通過(guò) phpcgi 以及 Nginx、Apache 打印的是不同的,這下知道這個(gè) $_SERVER 里的參數(shù)是怎么來(lái)的了吧。

另外還要注意的一點(diǎn)是,header 頭里的,在 PHP 的 $_SERVER 中是以 HTTP_ 開(kāi)頭的,同樣,Nginx 的 FastCGI 配置中也有單獨(dú)添加請(qǐng)求頭的,這個(gè)我們后面會(huì)學(xué)到。

在默認(rèn)的配置中,還有一個(gè) if_not_empty 的可選參數(shù),用于表示如果值不存在,就傳送到 CGI 程序中。上面的例子中,我們沒(méi)有開(kāi)啟 HTTPS 訪問(wèn),所以在 PHP 中,HTTPS 也不會(huì)在 $_SERVER 中顯示。

總結(jié)

今天的內(nèi)容很短,但是最基礎(chǔ)的 FastCGI 的配置我們都學(xué)習(xí)到了。其實(shí)到現(xiàn)在,一個(gè)正常的動(dòng)態(tài) LNMP 架構(gòu)中的 N 和 P 部分就已經(jīng)搭建完成了。使用 Nginx 來(lái)搭建 PHP 環(huán)境是不是非常地簡(jiǎn)單方便,這也是 PHP 在之前的 Web2.0 時(shí)代能夠大行其道的原因。整個(gè) LNMP 環(huán)境都不是特別復(fù)雜,而且還有很多一鍵安裝以及面板工具,能夠幫助我們?cè)诜址昼妰?nèi)就搭建起整個(gè)線上或者開(kāi)發(fā)環(huán)境。

除了 FastCGI 之外 ,Nginx 還提供了 uwsgi ,也就是 Python 以及 Python 框架常用的一類(lèi)通訊協(xié)議。PHP 也可以實(shí)現(xiàn)通過(guò) uwsgi 與 Nginx 聯(lián)通,但是,多此一舉嘛,正常情況下也沒(méi)人這么干,PHP-FPM 提供的 FastCGI 已經(jīng)是事實(shí)標(biāo)配了。如果硬要玩的話(huà),需要安裝額外的操作系統(tǒng)擴(kuò)展以及環(huán)境支持,還要學(xué)習(xí) uwsgi 相關(guān)的知識(shí)。因此,在 HTTP 模塊中,我們就不特意再去學(xué)習(xí) uwsgi 相關(guān)模塊的配置指令了,畢竟咱們是標(biāo)準(zhǔn)的 PHPer 。(它的指令和 FastCGI 的非常相似,功能也是大同小異)

此外,還有一個(gè) scgi 模塊也不單獨(dú)寫(xiě)了,都是差不多的。

FastCGI 相關(guān)的配置指令還有很多,我們接下來(lái)還要繼續(xù)學(xué)習(xí),這時(shí)候可不要隨便切換頻道啦,一起繼續(xù)前進(jìn)吧!

參考文檔:

http:///en/docs/http/ngx_http_fastcgi_module.html

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多