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文件
二、添加對應的server
下面咱們解釋一下配置項的含義:
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的時候,處理流程是這樣的:
-
www.example.com
-
|
-
|
-
Nginx
-
|
-
|
-
路由到www.example.com/index.php
-
|
-
|
-
加載nginx的fast-cgi模塊
-
|
-
|
-
fast-cgi監聽 127.0 .0 .1: 9000地址
-
|
-
|
-
www.example.com/index.php請求到達 127.0 .0 .1: 9000
-
|
-
|
-
等待處理...
下面咱們啓用php的php-fpm來處理這個請求
即:php-fpm模塊監聽127.0.0.1:9000端口,等待請求到來去處理。
3、總結
nginx與php-fpm的結合,完整的流程是這樣的。
-
www.example.com
-
|
-
|
-
Nginx
-
|
-
|
-
路由到www.example.com/index.php
-
|
-
|
-
加載nginx的fast-cgi模塊
-
|
-
|
-
fast-cgi監聽 127.0 .0 .1: 9000地址 .
-
|
-
|
-
www.example.com/index.php請求到達 127.0 .0 .1: 9000
-
|
-
|
-
php-fpm 監聽 127.0 .0 .1: 9000
-
|
-
|
-
php-fpm 接收到請求,啓用worker進程處理請求
-
|
-
|
-
php-fpm 處理完請求,返回給nginx
-
|
-
|
-
nginx將結果經過http返回給瀏覽器
5、效果展現
一、啓動nginx與php-fpm模塊
如上圖,有一個master進程,3個worker進程。