PHP與Nginx之間的運行機制以及原理

Nginx是俄國人最先開發的Webserver,如今已經風靡全球,相信你們並不陌生。PHP也經過二十多年的發展來到了7系列版本,更加關注性能。這對搭檔在最近這些年,叱吒風雲,基本上LNMP成了當下的標配。但是,你用了這麼多年的Nginx+PHP的搭配,你真正知道他們之間是怎麼交互怎麼通訊的麼?

php

1、普及Nginx與Php-fpm相關知識點

Nginx是什麼

Nginx ("engine x") 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。html

Php-fpm是什麼

一、cgi、fast-cgi協議
cgi的歷史

早期的webserver只處理html等靜態文件,可是隨着技術的發展,出現了像php等動態語言。
webserver處理不了了,怎麼辦呢?那就交給php解釋器來處理吧!
交給php解釋器處理很好,可是,php解釋器如何與webserver進行通訊呢?
python

爲了解決不一樣的語言解釋器(如php、python解釋器)與webserver的通訊,因而出現了cgi協議。只要你按照cgi協議去編寫程序,就能實現語言解釋器與webwerver的通訊。如php-cgi程序。nginx

fast-cgi的改進

有了cgi協議,解決了php解釋器與webserver通訊的問題,webserver終於能夠處理動態語言了。
可是,webserver每收到一個請求,都會去fork一個cgi進程,請求結束再kill掉這個進程。這樣有10000個請求,就須要fork、kill php-cgi進程10000次。
web

有沒有發現很浪費資源?後端

因而,出現了cgi的改良版本,fast-cgi。fast-cgi每次處理完請求後,不會kill掉這個進程,而是保留這個進程,使這個進程能夠一次處理多個請求。這樣每次就不用從新fork一個進程了,大大提升了效率。瀏覽器

二、php-fpm是什麼

php-fpm即php-Fastcgi Process Manager.
php-fpm是 FastCGI 的實現,並提供了進程管理的功能。
進程包含 master 進程和 worker 進程兩種進程。
master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則通常有多個(具體數量根據實際須要配置),每一個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。

bash

2、Nginx如何與Php-fpm結合

咱們知道Nginx不僅有處理http請求的功能,還能作反向代理。
故Nginx經過反向代理功能將動態請求轉向後端Php-fpm。
服務器

下面咱們來配置一個全新的Nginx+Php-fpmphp-fpm

一、配置nginx.conf文件

進入nginx目錄下,編輯 nginx.conf文件。
如圖,在nginx.conf最後一行,添加include文件
image_1b08eroasu1dr0kk0m12pg1572d.png

二、添加對應的server

進入上面include的路徑,添加一個server.
image_1b08f7sqm1ub71es9jrr1v3h1emp2q.png

下面咱們解釋一下配置項的含義:

server { listen 80; #監聽80端口,接收http請求 server_name www.example.com; #就是網站地址 root /usr/local/etc/nginx/www/huxintong_admin; # 準備存放代碼工程的路徑 #路由到網站根目錄www.example.com時候的處理 location / { index index.php; #跳轉到www.example.com/index.php autoindex on; } #當請求網站下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; #nginx fastcgi進程監聽的IP地址和端口 } }

總而言之:當咱們訪問www.example.com的時候,處理流程是這樣的:

  1.  
        www.example.com        
  2.  
               |
  3.  
            |
  4.  
           Nginx        
  5.  
             |
  6.  
            |
  7.  
       路由到www.example.com/index.php        
  8.  
            |
  9.  
            |
  10.  
      加載nginx的fast-cgi模塊        
  11.  
               |
  12.  
            |
  13.  
      fast-cgi監聽 127.0 .0 .1: 9000地址        
  14.  
               |
  15.  
            |
  16.  
      www.example.com/index.php請求到達 127.0 .0 .1: 9000
  17.  
            |
  18.  
            |
  19.  
         等待處理...

下面咱們啓用php的php-fpm來處理這個請求

打開php-fpm.conf文件,咱們看到以下配置:
image_1b08gcs3g1msg9mf1ie7rks1b7o37.png

即:php-fpm模塊監聽127.0.0.1:9000端口,等待請求到來去處理。

3、總結

nginx與php-fpm的結合,完整的流程是這樣的。

  1.  
         www.example.com        
  2.  
                |
  3.  
            |
  4.  
          Nginx        
  5.  
             |
  6.  
            |
  7.  
        路由到www.example.com/index.php        
  8.  
              |
  9.  
            |
  10.  
        加載nginx的fast-cgi模塊        
  11.  
              |
  12.  
            |
  13.  
        fast-cgi監聽 127.0 .0 .1: 9000地址        .
  14.  
              |
  15.  
            |
  16.  
       www.example.com/index.php請求到達 127.0 .0 .1: 9000
  17.  
            |
  18.  
            |
  19.  
      php-fpm 監聽 127.0 .0 .1: 9000
  20.  
            |
  21.  
            |
  22.  
      php-fpm 接收到請求,啓用worker進程處理請求        
  23.  
               |
  24.  
            |
  25.  
       php-fpm 處理完請求,返回給nginx        
  26.  
               |
  27.  
            |
  28.  
      nginx將結果經過http返回給瀏覽器

5、效果展現

一、啓動nginx與php-fpm模塊

image_1b08gunh4cf81rt61cbrr9m1og73k.png

啓動成功,咱們查看php-fpm進程
image_1b08h6i849is2hkqs1uct136h4e.png

如上圖,有一個master進程,3個worker進程。

二、在網站目錄下創建文件

咱們編輯文件以下圖:
image_1b08hafbi8lvr161pf21tq91f8a4r.png

三、訪問網站

image_1b08hctce1ucf1e081jk6151kpcn58.png

轉載地址:http://www.sangeng.org/news/detail_88.html

相關文章
相關標籤/搜索