最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP-FPM和Nginx的通信機(jī)制詳解

 更新時間:2019年02月01日 11:35:41   作者:jeffrey_up  
這篇文章主要給大家介紹了關(guān)于PHP-FPM和Nginx通信機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

PHP-FPM 介紹

CGI 協(xié)議與 FastCGI 協(xié)議

每種動態(tài)語言( PHP,Python 等)的代碼文件需要通過對應(yīng)的解析器才能被服務(wù)器識別,而 CGI 協(xié)議就是用來使解釋器與服務(wù)器可以互相通信。PHP 文件在服務(wù)器上的解析需要用到 PHP 解釋器,再加上對應(yīng)的 CGI 協(xié)議,從而使服務(wù)器可以解析到 PHP 文件。

由于 CGI 的機(jī)制是每處理一個請求需要 fork 一個 CGI 進(jìn)程,請求結(jié)束再kill掉這個進(jìn)程,在實際應(yīng)用上比較浪費資源,于是就出現(xiàn)了CGI 的改良版本 FastCGI,F(xiàn)astCGI 在請求處理完后,不會 kill 掉進(jìn)程,而是繼續(xù)處理多個請求,這樣就大大提高了效率。

PHP-FPM 是什么

PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的實現(xiàn),并提供了進(jìn)程管理的功能。進(jìn)程包含 master 進(jìn)程和 worker 進(jìn)程兩種;master 進(jìn)程只有一個,負(fù)責(zé)監(jiān)聽端口,接收來自服務(wù)器的請求,而 worker 進(jìn)程則一般有多個(具體數(shù)量根據(jù)實際需要進(jìn)行配置),每個進(jìn)程內(nèi)部都會嵌入一個 PHP 解釋器,是代碼真正執(zhí)行的地方。

Nginx 與 php-fpm 通信機(jī)制

當(dāng)我們訪問一個網(wǎng)站(如 www.test.com)的時候,處理流程是這樣的:

  www.test.com
        |
        |
      Nginx
        |
        |
路由到 www.test.com/index.php
        |
        |
加載 nginx 的 fast-cgi 模塊
        |
        |
fast-cgi 監(jiān)聽 127.0.0.1:9000 地址
        |
        |
www.test.com/index.php 請求到達(dá) 127.0.0.1:9000
        |
        |
     等待處理...

Nginx 與 php-fpm 的結(jié)合

在 Linux 上,nginx 與 php-fpm 的通信有 tcp socket 和 unix socket 兩種方式。

tcp socket 的優(yōu)點是可以跨服務(wù)器,當(dāng) nginx 和 php-fpm 不在同一臺機(jī)器上時,只能使用這種方式。

Unix socket 又叫 IPC(inter-process communication 進(jìn)程間通信) socket,用于實現(xiàn)同一主機(jī)上的進(jìn)程間通信,這種方式需要在 nginx配置文件中填寫 php-fpm 的 socket 文件位置。

兩種方式的數(shù)據(jù)傳輸過程如下圖所示:


二者的不同:

由于 Unix socket 不需要經(jīng)過網(wǎng)絡(luò)協(xié)議棧,不需要打包拆包、計算校驗和、維護(hù)序號和應(yīng)答等,只是將應(yīng)用層數(shù)據(jù)從一個進(jìn)程拷貝到另一個進(jìn)程。所以其效率比 tcp socket 的方式要高,可減少不必要的 tcp 開銷。不過,unix socket 高并發(fā)時不穩(wěn)定,連接數(shù)爆發(fā)時,會產(chǎn)生大量的長時緩存,在沒有面向連接協(xié)議的支撐下,大數(shù)據(jù)包可能會直接出錯不返回異常。而 tcp 這樣的面向連接的協(xié)議,可以更好的保證通信的正確性和完整性。

Nginx 與 php-fpm 結(jié)合只需要在各自的配置文件中做設(shè)置即可:

1) Nginx 中的配置

以 tcp socket通信為例

server {
 listen  80; #監(jiān)聽 80 端口,接收http請求
 server_name www.test.com; #就是網(wǎng)站地址
 root /usr/local/etc/nginx/www/huxintong_admin; # 準(zhǔn)備存放代碼工程的路徑
 #路由到網(wǎng)站根目錄 www.test.com 時候的處理
 location / {
  index index.php; #跳轉(zhuǎn)到 www.test.com/index.php
  autoindex on;
 } 

 #當(dāng)請求網(wǎng)站下 php 文件的時候,反向代理到 php-fpm
 location ~ \.php$ {
  include /usr/local/etc/nginx/fastcgi.conf; #加載 nginx 的 fastcgi 模塊
  fastcgi_intercept_errors on;
  fastcgi_pass 127.0.0.1:9000; # tcp 方式,php-fpm 監(jiān)聽的 IP 地址和端口
  # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 連接方式
 }

}

2) php-fpm 的配置

listen = 127.0.0.1:9000
# 或者下面這樣
listen = /var/run/php-fpm.sock

注意,在使用 unix socket 方式連接時,由于 socket 文件本質(zhì)上是一個文件,存在權(quán)限控制的問題,所以需要注意 nginx 進(jìn)程的權(quán)限與 php-fpm 的權(quán)限問題,不然會提示無權(quán)限訪問。(在各自的配置文件里設(shè)置用戶)

通過以上配置即可完成 php-fpm 與 nginx 的通信。

在應(yīng)用中的選擇

如果是在同一臺服務(wù)器上運行的 nginx 和 php-fpm,且并發(fā)量不高(不超過1000),選擇unix socket,以提高 nginx 和 php-fpm 的通信效率。

如果是面臨高并發(fā)業(yè)務(wù),則考慮選擇使用更可靠的 tcp socket,以負(fù)載均衡、內(nèi)核優(yōu)化等運維手段維持效率。

若并發(fā)較高但仍想用 unix socket 時,可通過以下方式提高 unix socket 的穩(wěn)定性。

1)將sock文件放在 /dev/shm 目錄下,此目錄下將 sock 文件放在內(nèi)存里面,內(nèi)存的讀寫更快。

2)提高 backlog

backlog 默認(rèn)位 128,1024 這個值最好換算成自己正常的 QPS,配置如下。

nginx.conf 文件中

server {
  listen 80 default backlog = 1024;
  }

php-fpm.conf 文件中

listen.backlog = 1024

3)增加 sock 文件和 php-fpm 實例

在 /dev/shm 新建一個 sock 文件,在 nginx 中通過 upstream 模塊將請求負(fù)載均衡到兩個 sock 文件,并且將兩個 sock 文件分別對應(yīng)到兩套 php-fpm 實例上。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 常見的5個PHP編碼小陋習(xí)以及優(yōu)化實例講解

    常見的5個PHP編碼小陋習(xí)以及優(yōu)化實例講解

    這篇文章主要介紹了常見的5個PHP編碼小陋習(xí)實例講解,講解了常見寫法和優(yōu)化方法,看一下是否自己也是這樣寫的呢
    2021-02-02
  • 基于thinkphp5框架實現(xiàn)微信小程序支付 退款 訂單查詢 退款查詢操作

    基于thinkphp5框架實現(xiàn)微信小程序支付 退款 訂單查詢 退款查詢操作

    這篇文章主要介紹了基于thinkphp5框架實現(xiàn)微信小程序支付 退款 訂單查詢 退款查詢操作,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Symfony2針對輸入時間進(jìn)行查詢的方法分析

    Symfony2針對輸入時間進(jìn)行查詢的方法分析

    這篇文章主要介紹了Symfony2針對輸入時間進(jìn)行查詢的方法,結(jié)合實例形式分析了Symfony2針對mysql及MongoDB的輸入時間進(jìn)行轉(zhuǎn)換與查詢的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • php去除字符串換行符示例分享

    php去除字符串換行符示例分享

    這篇文章主要介紹了php去除字符串換行符示例,下面整理一下常見的去除換行的方法,需要的朋友可以參考下
    2014-02-02
  • PHP執(zhí)行系統(tǒng)命令函數(shù)實例講解

    PHP執(zhí)行系統(tǒng)命令函數(shù)實例講解

    這篇文章主要介紹了PHP執(zhí)行系統(tǒng)命令函數(shù)實例講解,列舉的都是一些常用的函數(shù),有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • PHP跨文件傳遞參數(shù)的8種常見方法

    PHP跨文件傳遞參數(shù)的8種常見方法

    這篇文章主要介紹了PHP傳遞參數(shù)(跨文件)的8種常見方法,本文通過詳細(xì)說明和示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-04
  • 基于ThinkPHP刪除目錄及目錄文件函數(shù)

    基于ThinkPHP刪除目錄及目錄文件函數(shù)

    這篇文章主要介紹了基于ThinkPHP刪除目錄及目錄文件函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • php簡單中獎算法(實例)

    php簡單中獎算法(實例)

    下面小編就為大家?guī)硪黄猵hp簡單中獎算法(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • php cc攻擊代碼與防范方法

    php cc攻擊代碼與防范方法

    今天把客戶查找后門的時候發(fā)現(xiàn)的代碼,特分享下,看到這樣的代碼就是黑客用來攻擊別人訪問,不斷訪問指定網(wǎng)站,導(dǎo)致網(wǎng)站無法訪問,我們的網(wǎng)站就是幫兇了,同時我們自己的網(wǎng)站或服務(wù)器也會無法訪問,所以一定要注意防范。
    2012-10-10
  • 記Laravel調(diào)用Gin接口調(diào)用formData上傳文件的實現(xiàn)方法

    記Laravel調(diào)用Gin接口調(diào)用formData上傳文件的實現(xiàn)方法

    這篇文章主要介紹了記Laravel調(diào)用Gin接口調(diào)用formData上傳文件的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

台北县| 崇左市| 凉山| 竹溪县| 肥东县| 中方县| 通州区| 德保县| 张家界市| 浠水县| 北辰区| 视频| 安丘市| 格尔木市| 紫阳县| 汽车| 上饶县| 东台市| 彭水| 泰宁县| 金寨县| 潮州市| 大石桥市| 张家港市| 通河县| 封丘县| 大兴区| 屏东县| 克东县| 荥阳市| 三门县| 合肥市| 东城区| 措勤县| 华容县| 新泰市| 永安市| 筠连县| 太康县| 山阴县| 若尔盖县|