转载:https://www.jianshu.com/p/aff916a26940
nginx是什么
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
php-fpm是什么
如果对php-fpm不了解,请移步我的这篇文章 -> CGI,FastCGI,PHP-FPM三者之间的关系
要搞清楚nginx和php-fpm是如何结合的,首先要搞清楚他们是怎么配置在一起的,主要有三个配置文件
1.先看虚拟主机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 fastcgi_params; #加载nginx的fastcgi模块
fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
}
}
2.再看下fastcgi.conf
的配置,这个配置主要用来把nginx中的变量,解释为PHP能够理解的变量:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
最后,我们看下php-fpm.conf的配置,主要看监听的服务器ip和端口,其他配置项请参考我的这篇文章 php-fpm进程数优化方法
listen = 127.0.0.1:9000
通过对三个配置文件的解读,我们可以看出,nginx是通过fastcgi_pass指令调用了php-fpm的监听端口,一个完整的流程如下图
www.example.com
↓
Nginx
↓
server,location路由到
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返回给浏览器
相关链接:
关于CGI和FastCGI的理解:https://www.cnblogs.com/tssc/p/10255590.html#_label1_0
Nginx+Php-fpm运行原理详解:https://segmentfault.com/a/1190000007322358