這篇文章帶大家聊聊Nginx與php-fpm之間的通訊機制,希望對大家有幫助!
什麼是CGI?
講Fastcgi之前需要先講CGI,CGI是為了保證web server傳遞過來的資料是標準格式的,它是一個協定。每種動態語言( PHP,Python 等)的程式碼檔案需要透過對應的解析器才能被伺服器識別,而 CGI 協定就是用來讓解釋器與伺服器可以互相通訊。 PHP 檔案在伺服器上的解析需要用到 PHP 解釋器,再加上對應的 CGI 協議,讓伺服器可以解析到 PHP 檔案。
#1.使用者透過客戶端(瀏覽器)輸入網址,例如www. baidu.com。
2.瀏覽器經過一些列的處理(這裡省略其中的流程),請求到對應伺服器的。
3.伺服器網路卡根據監聽到的端口,將請求傳送給對應的軟體服務。
4.web伺服器(Nginx/Apache等web軟體)接收請求後,透過fast-cgi或cgi協議,將請求資料轉送給php-fpm進程管理器。 php-fpm將任務下發給下面空閒的work進程,此時work進程中的php解釋器開始處理檔案。
5.php解釋器處理好,透過fast-cgi或cgi協議,再將轉換後的資料回傳給web伺服器,web伺服器再回應給客戶端。
什麼是FastCGI?
Fastcgi是CGI的更高階的一種方式,是用來提升CGI程式效能的。由於CGI 的機制是每處理一個請求需要fork 一個CGI 進程,請求結束再kill掉這個進程,在實際應用上比較浪費資源,於是就出現了CGI 的改良版FastCGI,FastCGI 在請求處理完後,不會kill 掉進程,而是繼續處理多個請求,這樣就大大提高了效率。
#什麼是php-fpm?
#PHP-FPM 即PHP-FastCGI Process Manager, 它是FastCGI 的實現,並提供了進程管理的功能。進程包含master 進程和worker 進程兩種;master 進程只有一個,負責監聽端口,接收來自伺服器的請求,而worker 進程則一般有多個(具體數量根據實際需要進行配置),每個進程內部都會嵌入一個PHP 解譯器,是程式碼真正執行的地方。在沒有php-fpm之前,每當我們修改了php.ini的配置信息,都會面臨著下面的幾個問題:
需要重啟php-cgi程式,才能使配置文件生效,同時php-cgi不支援平滑重啟。
kill掉php-cgi程式時,必須重新啟動,否則PHP就無法正常運作。
#因此可以把php-fpm理解為,是一個實現了Fastcgi協定的程式,用來管理Fastcgi啟動的進程的,即能夠調度php-cgi進程的程式。現已在PHP核心中就整合了PHP-FPM,使用--enalbe-fpm這個編譯參數即可。另外,修改了php.ini設定檔後,沒辦法平滑重啟,需要重啟php-fpm才可。此時新fork的worker會用新的配置,已經存在的worker繼續處理完手上的活。
Web服务器与程序解析器运行流程(Nginx与php-fpm通信机制(通信流程))
web server(如nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态资源。如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。此时CGI便是规定了要传什么数据/以什么格式传输给php解析器的协议。当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。
CGI与FastCGI相比较
两者的主要差距在于性能瓶颈。前者接受到一个请求就会fork一个进程,后者则是事先启动一部分的worker进程。
CGI工作原理
CGI针对每个http请求都是fork一个新进程来进行处理,接着读取php.ini文件配置信息,初始化执行环境等。
2.然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户。
3.刚才fork的进程也随之退出。
4.如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。
FastCGI工作原理
Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。
2.当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。
3.而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。
注:swoole作为httpserver,实际上也是类似这样的工作方式。
Nginx与php-fpm通信分析
Nginx与php-fpm通信有两种方式,一种是通过tcp socket和 unix socket。前者是通过ip:端口方式进行通信,后者是通过php启动生成的socket文件进行通信。因此tcp socket的方式可以将两者分布再不同的机器上,只要Nginx能够连接到php服务器的端口即可。后者的方式,是统一主机上进行通讯的方式,因此两者只能再同一台机器上面。
tcp socket和 unix socket两者的优缺点
由于 Unix socket 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。所以其效率比 tcp socket 的方式要高,可减少不必要的 tcp 开销。不过,unix socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而 tcp 这样的面向连接的协议,可以更好的保证通信的正确性和完整性。
如何选择tcp socket与unix socket
1.由于tcp方式相对unix的方式,并发量更高,因此针对并发量高的项目,建议采用tcp方式,现在Nginx配置示例文件默认的也是tcp方式。
2.使用unix方式,可以优化的点,就是将socket文件放在/dev/shm目录下面,至于为什么放在这个目录可以参考.https://www.linuxidc.com/Linux/2014-05/101818.htm。大致的意思,就是该目录下面的文件是不是存储再硬盘中的,而是存储再内存中的。至于硬盘读取和内存读取,谁快谁慢,肯定是内存最快了。
3.使用unix方式可以使用backlog,backlog的介绍,可以参考该文章。https://blog.csdn.net/raintungli/article/details/37913765。具体的配置可以参考下面。nginx 配置:
server { listen 80 default backlog = 100; }
php-fpm 配置:
listen.backlog = 1000
配置示例
Nginx与PHP通信的方式,取决于PHP启动的方式,下面直接演示两种方式的配置文件,后面记录PHP启动方式的配置 1.tcp socket
server { listen 80; server_name laravel_demo.com; charset utf-8; access_log logs/laravel_demo.com.access.log; root /usr/local/var/www/laravel64_demo/public/; index index.php index.html index.htm; error_page 500 502 503 504 /50x.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } ### 此处就是Nginx与tcp socket通信配置,这里部署的同一台及其,因此IP就是127.0.0.1 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
2.unix socket
server { listen 80; server_name laravel_demo.com; charset utf-8; access_log logs/laravel_demo.com.access.log; root /usr/local/var/www/laravel64_demo/public/; index index.php index.html index.htm; error_page 500 502 503 504 /50x.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } ### 此处就是Nginx与unix socket通信配置,我的socket文件在/usr/run/目录下 location ~ \.php$ { fasrcgi_pass /usr/tmp/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
上面演示了具体的配置示例,下面演示的是PHP启动方式的配置,这里需要和上面Nginx的配置一致,如果是tcp方式就采用tcp方式启动,如果是unix方式采用socket文件的方式启动。
# tcp方式启动 listen = 127.0.0.1:9000 # unix方式启动 listen = /usr/tmp/php-fpm.sock;
采用上面的两种方式中的任意一种,直接使用php-fpm方式启动php即可。
1、tcp方式启动的效果图
2、unix方式启动的效果图
注意在演示的过程中遇到一个问题就是提示Nginx无法读取php生成的unix socket文件。这中情况是因为权限组导致的。因此再php-fpm的配置配置文件中要设置权限组,同时Nginx也需要设置权限组,再很多的集成开发环境中已经配置好了,因此可以减少此步骤。下面就是示例 Nginx配置文件:
#配置php-fpm的用户以及所属用户组 user www www; worker_processes auto; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200;
php-fpm配置文件(我们平常可能更多的是配置php.ini的文件,这里需要区分两者之间的区别,php.ini是针对php的配置文件,可以简单的理解为php再编译源码时会用到这里的配置,而关于php这个应用程序执行的情况就会用到php-fpm的配置文件):
; 配置php-fpm的用户以及所属用户组 user = www group = www ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; ; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. ;listen = 127.0.0.1:9000 listen = /usr/tmp/php-fpm.sock;
推荐教程:nginx教程
以上是一文淺析Nginx與php-fpm間的通訊機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

NGINXUnit是一個開源應用服務器,支持多種編程語言,提供動態配置、零停機更新和內置負載均衡等功能。 1.動態配置:無需重啟即可修改配置。 2.多語言支持:兼容Python、Go、Java、PHP等。 3.零停機更新:支持不中斷服務的應用更新。 4.內置負載均衡:可將請求分發到多個應用實例。

NGINXUnit優於ApacheTomcat、Gunicorn和Node.js內置HTTP服務器,適用於多語言項目和動態配置需求。 1)支持多種編程語言,2)提供動態配置重載,3)內置負載均衡功能,適合需要高擴展性和可靠性的項目。

NGINXUnit通過其模塊化架構和動態重配置功能提高了應用的性能和可管理性。 1)模塊化設計包括主控進程、路由器和應用進程,支持高效管理和擴展。 2)動態重配置允許在運行時無縫更新配置,適用於CI/CD環境。 3)多語言支持通過動態加載語言運行時實現,提升了開發靈活性。 4)高性能通過事件驅動模型和異步I/O實現,即使在高並發下也保持高效。 5)安全性通過隔離應用進程提高,減少應用間相互影響。

NGINXUnit可用於部署和管理多種語言的應用。 1)安裝NGINXUnit。 2)配置它以運行不同類型的應用,如Python和PHP。 3)利用其動態配置功能進行應用管理。通過這些步驟,你可以高效地部署和管理應用,提升項目效率。

NGINX更适合处理高并发连接,而Apache更适合需要复杂配置和模块扩展的场景。1.NGINX以高性能和低资源消耗著称,适合高并发。2.Apache以稳定性和丰富的模块扩展闻名,适合复杂配置需求。

NGINXUnit通過其動態配置和高性能架構提升應用的靈活性和性能。 1.動態配置允許在不重啟服務器的情況下調整應用配置。 2.高性能體現在事件驅動和非阻塞架構以及多進程模型上,能夠高效處理並發連接和利用多核CPU。

NGINX和Apache都是強大的Web服務器,各自在性能、可擴展性和效率上有獨特的優勢和不足。 1)NGINX在處理靜態內容和反向代理時表現出色,適合高並發場景。 2)Apache在處理動態內容時表現更好,適合需要豐富模塊支持的項目。選擇服務器應根據項目需求和場景來決定。

NGINX適合處理高並發請求,Apache適合需要復雜配置和功能擴展的場景。 1.NGINX採用事件驅動、非阻塞架構,適用於高並發環境。 2.Apache採用進程或線程模型,提供豐富的模塊生態系統,適合複雜配置需求。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器