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在企业架构中的位置: 以上的架构只是众多企业里面 ...
随机推荐
- Mqtt使用教程,简介
1,简介 MQTT协议(Message Queuing Telemetry Transport),翻译过来就是遥信消息队列传输,是IBM公司于1999年提出的,现在最新版本是3.1.1.MQTT是一个 ...
- DAPP 开发直通车-如何基于NEL 轻钱包来开发DAPP
之前做了 DAPP 开发直通车,通讲了一下开发一个DAPP的过程. 但是涉及多工种,多步骤.入手还是非常困难的. 经过不懈的努力,做了很多铺垫工作之后,我终于可以告诉你: 开发DAPP f ...
- Data Science Project
https://drivendata.github.io/cookiecutter-data-science/
- centos官网下载地址
CentOS 7官方下载地址:https://www.centos.org/download/ 源自博友的博客:https://blog.csdn.net/yf9595/article/details ...
- 清除电脑缓存的bat文件
电脑在使用了之后,会产生垃圾缓存,若不及时清理会降低电脑的运行速度. 1.步骤: 2.新建一个记事本文件,命名“系统清理”;(或其他名字) 3.原封不动复制下面的文字到该记事本中 @echo off ...
- angular.identity()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 26 Arcpy跳坑系列——ExportToPNG
最近在学习Arcpy的时候,还真是遇到了一个磨人的小妖精,我本来是想得到一个透明背景的png图的,根据官方的帮助文档, https://desktop.arcgis.com/zh-cn/arcmap/ ...
- jquery常用语句
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SEED实验——Environment Variable and Set-UID Program实验描述与实验任务
第一部分:实验描述 该实验的学习任务是理解环境变量是如何影响程序和系统行为的.环境变量是一组动态命名的变量 第二部分:实验任务 2.1 任务一:操作环境变量 在这个任务中,我们研究可以用来设置和取消设 ...
- springboot/Mybatis整合
正题 本项目使用的环境: 开发工具:Intellij IDEA 2017.1.3 springboot: 1.5.6 jdk:1.8.0_161 maven:3.3.9 额外功能 PageHelper ...