cgi 是什么
早期的 webserver 只处理 html 等静态文件,但是随着技术的发展,出现了像 php 等动态语言。
webserver 处理不了了,怎么办呢?那就交给 php 解释器来处理吧!
交给 php 解释器处理很好,但是,php 解释器如何与 webserver 进行通信呢?
为了解决不同的语言解释器 (如 php、python 解释器) 与 webserver 的通信,于是出现了 cgi 协议。只要你按照 cgi 协议去编写程序,就能实现语言解释器与 webwerver 的通信。如 php-cgi 程序。
fast-cgi 的改进
有了 cgi 协议,解决了 php 解释器与 webserver 通信的问题,webserver 终于可以处理动态语言了。
但是,webserver 每收到一个请求,都会去 fork 一个 cgi 进程,请求结束再 kill 掉这个进程。这样有 10000 个请求,就需要 fork、kill php-cgi 进程 10000 次。
有没有发现很浪费资源?
于是,出现了 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 代码真正执行的地方。
Nginx 如何与 Php-fpm 结合
Nginx 通过反向代理功能将动态请求转向后端 Php-fpm。
举例
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
|
|
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
|
|
等待处理...
本作品采用《CC 协议》,转载必须注明作者和本文链接
————————————————
原文作者:clz
转自链接:https://learnku.com/articles/42427
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。