Rumah >Operasi dan penyelenggaraan >Nginx >Artikel yang menganalisis secara ringkas mekanisme komunikasi antara Nginx dan php-fpm
Artikel ini akan bercakap tentang mekanisme komunikasi antara Nginx dan php-fpm saya harap ia akan membantu semua orang!
Apakah itu CGI?
Sebelum bercakap tentang Fastcgi, anda perlu bercakap tentang CGI adalah untuk memastikan data tersebut yang diluluskan oleh pelayan web adalah Dalam format standard, ia adalah protokol. Fail kod bagi setiap bahasa dinamik (PHP, Python, dll.) perlu melepasi penghurai yang sepadan untuk diiktiraf oleh pelayan, dan protokol CGI digunakan untuk membolehkan jurubahasa dan pelayan berkomunikasi antara satu sama lain. Penghuraian fail PHP pada pelayan memerlukan penggunaan penterjemah PHP, ditambah dengan protokol CGI yang sepadan, supaya pelayan boleh menghuraikan fail PHP.
1. Pengguna memasukkan URL melalui klien (pelayar), seperti www . baidu.com.
2. Penyemak imbas melalui satu siri proses (proses ditinggalkan di sini) dan meminta pelayan yang sepadan.
3. Kad rangkaian pelayan menghantar permintaan kepada perkhidmatan perisian yang sepadan berdasarkan port yang dipantau.
4. Selepas pelayan web (perisian web seperti Nginx/Apache) menerima permintaan, ia memajukan data permintaan kepada pengurus proses php-fpm melalui protokol cgi atau cgi pantas. php-fpm menghantar tugas ke proses kerja terbiar di bawah Pada masa ini, penterjemah php dalam proses kerja mula memproses fail.
Jurubahasa 5.php memprosesnya dan mengembalikan data yang ditukar kepada pelayan web melalui protokol cgi atau cgi pantas dan pelayan web bertindak balas kepada pelanggan.
Apakah itu FastCGI?
Fastcgi ialah cara CGI yang lebih maju dan digunakan untuk meningkatkan prestasi program CGI. Memandangkan mekanisme CGI memerlukan setiap permintaan diproses, proses CGI perlu dicabang, dan kemudian proses itu dimatikan selepas permintaan selesai, yang merupakan pembaziran sumber dalam aplikasi praktikal Oleh itu, versi CGI yang dipertingkatkan, FastCGI , muncul Selepas permintaan diproses, FastCGI tidak akan mematikan proses dan terus memproses berbilang permintaan, yang meningkatkan kecekapan.
Apakah itu php-fpm?
PHP-FPM ialah Pengurus Proses PHP-FastCGI, yang merupakan pelaksanaan FastCGI dan menyediakan fungsi pengurusan proses. Proses ini merangkumi dua jenis: proses induk dan proses pekerja hanya terdapat satu proses induk, yang bertanggungjawab untuk mendengar port dan menerima permintaan daripada pelayan, manakala pada umumnya terdapat beberapa proses pekerja (nombor khusus dikonfigurasikan mengikut sebenar. keperluan), dan setiap proses akan mempunyai satu tertanam di dalamnya. Jurubahasa PHP adalah tempat kod itu sebenarnya dilaksanakan. Sebelum php-fpm, setiap kali kami mengubah suai maklumat konfigurasi php.ini, kami akan menghadapi masalah berikut:
Anda perlu memulakan semula program php-cgi untuk membolehkan konfigurasi Fail berkuat kuasa, dan php-cgi tidak menyokong mulakan semula lancar.
Apabila mematikan program php-cgi, ia mesti dimulakan semula, jika tidak PHP tidak akan berfungsi dengan baik.
Jadi anda boleh memahami php-fpm sebagai, A program yang melaksanakan protokol Fastcgi dan digunakan untuk mengurus proses yang dimulakan oleh Fastcgi, iaitu program yang boleh menjadualkan proses php-cgi. PHP-FPM kini disepadukan dalam kernel PHP, hanya gunakan parameter kompilasi --enalbe-fpm. Di samping itu, selepas mengubah suai fail konfigurasi php.ini, tiada cara untuk memulakan semula dengan lancar. Anda perlu memulakan semula php-fpm. Pada masa ini, pekerja garpu baharu akan menggunakan konfigurasi baharu dan pekerja sedia ada akan terus menyelesaikan kerja yang ada.
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教程
Atas ialah kandungan terperinci Artikel yang menganalisis secara ringkas mekanisme komunikasi antara Nginx dan php-fpm. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!