Nginx与PHP-FPM运行原理详解
1. 代理与反向代理
1. 正向代理:访问google.com

- 如上图,因为google被墙,需要vpn才能访问google.com。
- vpn对于"我们"来说,是可以感知到的(我们连接vpn)
- vpn对于"google服务器"来说,是不可感知的(google只知道有http请求过来)。
- 对于人来说可以感知到,但服务器感知不到的服务器,我们叫他正向代理服务器。
2. 反向代理:通过反向代理实现负载均衡

- 如上图,我们访问baidu.com的时候,baidu有一个代理服务器,通过这个代理服务器,可以做负载均衡,路由到不同的server。
- 此代理服务器,对于“我们”来说是不可感知的(我们只能感知到访问的是百度的服务器,不知道中间还有代理服务器来做负载均衡)。
- 此代理服务器,对于"server1 server2 server3"是可感知的(代理服务器负载均衡路由到不同的server)
- 对于人来说不可感知,但对于服务器来说是可以感知的,我们叫他反向代理服务器。
2. 初识Nginx与PHP-FPM
1. Nginx是什么
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
2. CGI与FastCGI
1. CGI协议
- 早期的Web Server只处理html等静态文件,但是随着技术的发展,出现了像php等动态语言。
- Web Server处理不了了,怎么办呢?那就交给php解释器来处理吧!
- 交给php解释器处理很好,但是,php解释器如何与Web Server进行通信呢?
- 为了解决不同的语言解释器(如php、python解释器)与Web Server的通信,于是便出现了cgi协议。
- 只要按照cgi协议去编写程序,就能实现语言解释器与Web Server的通信,如php-cgi程序。
2. FastCGI协议
- CGI协议解决了php解释器与Web Server通信的问题,Web Server终于可以处理动态语言了。
- 通过CGI协议实现的程序,每收到一个Web Server请求,都会去fork一个cgi进程,请求结束再kill掉这个进程。因而导致在有大量请求的情况下,需要不断fork、kill php-cgi进程。
- 由于CGI协议处理比较浪费资源,于是,便出现了CGI的改良版本FastCGI。
- FastCGI每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了,大大提高了效率。
2. PHP-FPM是什么
- php-fpm即PHP FastCGI Process Manager.
- php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
- php-fpm包含 master 进程和 worker 进程两种进程。
- master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,
- worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
3. Nginx与与PHP-FPM结合
1. 配置nginx.conf文件
2. 添加对应的server
# Nginx通过反向代理功能将动态请求转向后端PHP-FPM
server {
listen 80; #监听80端口,接收http请求
server_name www.example.com; #就是网站地址
root /data/www/domain; # 准备存放代码工程的路径
#路由到网站根目录www.example.com时候的处理
location / {
index index.php; #跳转到www.example.com/index.php
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
}
#当请求网站下php文件的时候,反向代理到php-fpm
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www/domain$fastcgi_script_name;
include fastcgi_params; #加载nginx的fastcgi模块
}
}
3. 配置php-fpm.conf文件
# 取消注释
listen = 127.0.0.1:9000
# php-fpm模块监听127.0.0.1:9000端口,等待请求到来去处理
4. 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运行原理详解的更多相关文章
- JVM运行原理详解
1.JVM简析: 作为一名Java使用者,掌握JVM的体系结构也是很有必要的. 说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...
- 「JVM」知识点详解一:JVM运行原理详解
前言 JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易.JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理. 正文 1 什么是JVM? JVM是Java ...
- Kubernetes学习之路(二十)之K8S组件运行原理详解总结
目录 一.看图说K8S 二.K8S的概念和术语 三.K8S集群组件 1.Master组件 2.Node组件 3.核心附件 四.K8S的网络模型 五.Kubernetes的核心对象详解 1.Pod资源对 ...
- Nginx+Php-fpm运行原理详解
一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpnFQ才能访问google.com. vpn对于“我们”来说,是可以感知到的(我 ...
- (转)Nginx+Php-fpm运行原理详解
一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpn翻墙才能访问google.com. vpn对于“我们”来说,是可以感知到的(我 ...
- Hadoop 2.6 MapReduce运行原理详解
市面上的hadoop权威指南一类的都是老版本的书籍了,索性学习并翻译了下最新版的Hadoop:The Definitive Guide, 4th Edition与大家共同学习. 我们通过提交jar包, ...
- 正则表达式的运行原理详解(NFA,多分支原理)
原文:https://blog.csdn.net/yx0628/article/details/82722166
- TOMCAT原理详解及请求过程(转载)
转自https://www.cnblogs.com/hggen/p/6264475.html TOMCAT原理详解及请求过程 Tomcat: Tomcat是一个JSP/Servlet容器.其作为Ser ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
随机推荐
- 使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间。
1.使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间. package com.fline.aic.utils; import java.text.DateFormat ...
- zTree 3-- jQuery 树插件笔记
地址:http://www.treejs.cn/v3/demo.php#_507 数据结构json,里可以自定义属性. var zNodes =[ { name:"父节点1 - 展开&quo ...
- mysql性能监控软件pmm
具体配置操作步骤:1.在vmware或者virtualbox上安装centos镜像,可以选择阿里巴巴的镜像,下载速度快 centos7 修改yum源为阿里源,某下网络下速度比较快 首先是到yum源设置 ...
- 我的 FPGA 学习历程(03)—— 使用 Quaruts 自带仿真工具
在上一篇中详细的介绍了怎样创建原理图工程,这篇同样使用原理图工程新建一个多路选择器,目的是学习使用图形输入的仿真工具输入仿真激励. 新建工程,并绘制以下的原理图. 编译项目,会多出一个警告: Crit ...
- [CF542A]Place Your Ad Here
[CF542A]Place Your Ad Here 题目大意: 有\(n(n\le2\times10^5)\)个广告和\(m(m\le2\times10^5)\)个电视台,第\(i\)个广告只能在\ ...
- IOS开发中发布的时候取消日志打印
在PCH文件中定义如下宏 #if DEBUG #define NSLog(...) NSLog(__VA_ARGS__) #define debugMethod() NSLog(@"%s&q ...
- mobile_音悦台
音悦台 less 可以 width = 1080/67.5rem; /**** 变量定义 ****/ @px: 67.5rem; /**** Start ****/ #wrap { width: 10 ...
- PC_官网设计
1. 头部 header 固定 的两种方式 固定定位 内容区 包裹,使用 overflow: hidden; 2. 动画第二次起效 缺少动画初始参数 3. 隐藏元素 display: none; vi ...
- react_app 项目开发 (3)_单页面设计_react-router4
(web) 利用 react-router4 实现 单页面 开发 SPA 应用 ---- (Single Page Web Application) 整个应用只有 一个完整的页面 单击链接不会刷新页面 ...
- ElasticSeaarch 遇到的问题 (-)
1 elasticSearch 不能通过ip访问 智只能通过localhost访问,或者在外网部署的时候不能访问: elasticsearch.yml文件 中将下面的配置去掉注释符, network ...