(转)nginx与PHP的关系
php是一门编程语言,可以编写很多程序,但是只有php的话,你的php只能在你的服务器里孤立的运行,比如你用php写了一个可以通过身高计算人的标准体重的程序,虽然这个程序可以在服务器运行,但是他还不能和客户交互,因为客户现在还不能访问你的php程序,他也不会去下载你的php程序到自己电脑里运行,他只想默默的通过浏览器告诉你他的身高,然后得到这个程序返回的体重,那么谁来得到这个用户发送过来的请求呢,又怎么把请求数据转发给对应的php程序呢 ?
nginx就是为了解决上述问题而出现的,nginx是一个已经写好的程序,需要安装配置,作用是专门接收处理客户通过浏览器等发送来的请求,并和你写的php程序交互,就这么简单,但是nginx不仅可以和你写的php程序交互,也可以和你写的其他程序交互,比如C,python,因为不是所有人都用php来写web程序,简单点说nginx是一个可以监听处理http请求(浏览器请求)的程序,会装会配置,知道流程就可以用了,当然深入了解下就更好了。
这样的话,nginx就可以比喻处理成处理http请求业务的部门,是服务器和外部千千万万浏览器等客户端进行沟通的关口。php是服务器内部一个数据加工部门,可以加工生成各种页面。客户端发送的http请求历经层层路由到达你的服务器,然后被nginx逮个正着,统一听候nginx大人的调度,如果客户请求的是其他静态资源,比如txt文本,图片等,nginx直接找到该资源,并返回给客户端,如果客户请求的是php程序,就找到对应的php程序,然后把客户数据给这个程序,让这个php程序运行一遍,再把这个程序运行的结果返回给客户端。
PHP的sapi有fpm的运行模式,或者说接口,就是一种访问PHP这个软件的方式,nginx配合fpm这个接口,访问PHP程序,实现和PHP的配合。
- 启动php-fpm后,监听一个端口,默认监听9000(见配置文件listen = 127.0.0.1:9000)
- 然后nginx配置,如果是PHP文件,则转发给php-fpm程序处理。
- 接下来,当nginx软件收到一个客户端的请求后,根据配置文件判断是否是PHP文件,如果是,则转发给fpm程序,fpm处理完之后返回结果给nginx,nginx再返回结果给客户端。
PHP-FPM,Nginx,FastCGI 之间的关系
FastCGI 是一个协议,它是应用程序和 WEB 服务器连接的桥梁。Nginx 并不能直接与 PHP-FPM 通信,而是将请求通过 FastCGI 交给 PHP-FPM 处理。
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
这里 fastcgi_pass 就是把所有 php 请求转发给 php-fpm 进行处理。通过 netstat 命令可以看到,127.0.0.1:9000 这个端口上运行的进程就是 php-fpm.

Nginx 反向代理
Nginx 反向代理最重要的指令是 proxy_pass,如:
location ^~ /seckill_query/ {
proxy_pass http://ris.xxmail.gdrive:8090/;
proxy_set_header Host ris.xxmail.gdrive;
}
location ^~ /push_message/ {
proxy_pass http://channel.xxmail.gdrive:8090/;
proxy_set_header Host channel.xxmail.gdrive;
}
location ^~ /data/ {
proxy_pass http://ds.xxmail.gdrive:8087/;
proxy_set_header Host ds.xxmail.gdrive;
}
通过 location 匹配 url 路径,将其转发到另外一个服务器处理。
通过负载均衡 upstream 也可以实现反向代理。
Nginx 负载均衡
介绍一下 upstream 模块:
负载均衡模块用于从”upstream”指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。
负载均衡配置:
upstream php-upstream {
ip_hash;
server 192.168.0.1;
server 192.168.0.2;
}
location / {
root html;
index index.html index.htm;
proxy_pass http://php-upstream;
}
该例定义了一个 php-upstream 的负载均衡配置,通过 proxy_pass 反向代理指令应用这个配置。这里用的 ip_hash 算法,负载均衡的算法有多种,就不一一列举了。
负载均衡也可以用在 fastcgi_pass 上。
如:
fastcgi_pass http://php-upstream
如果使用负载均衡,可能存在一个 session 失效的问题,你的每次请求可能分配到不同的服务器,一个解决方法是把 Memcached 或 Redis 作为 session 存储的方式,而且还可以提高性能。
一些问题
反向代理和负载均衡是什么关系
反向代理和负载均衡这两个词经常出现在一起,但他们实际上是不同的概念,负载均衡它更多的是强调的是一种算法或策略,将请求分布到不同的机器上,因此实际上也起到了反向代理的作用。
proxy_pass 和 fastcgi_pass 的区别
一个是反向代理模块,一个是转发给 factcgi 后端处理。

(转)nginx与PHP的关系的更多相关文章
- 转载:2.1 运行中的Nginx进程间的关系《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19624.html 在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker进程,一般情况下,w ...
- nginx与PHP的关系和交互方式【转】
nginx与PHP的关系. 对比, apache和PHP的关系, 将PHP安装成apache的一个功能模块, 导致的结果, 对外只有一个apache程序, PHP并不独立出现, 仅仅是apache的模 ...
- nginx fastcgi php-fpm的关系梳理
CGI(Common Gateway Interface)CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具 ...
- nginx,wsgi,django的关系
http://blog.csdn.net/lihao21/article/details/52304119 wsgi用于连续 nginx和django,客户端发来的请求,先经过wsgi,然后再传给dj ...
- 如何在Nginx下配置PHP程序环境
1.nginx与PHP的关系 首先来看nginx与php的关系, FastCGI的关系(而不是像apache那样安装成nginx的模块) FastCGI的意思是, 快速的通用网关接口:CGI Comm ...
- nginx有关.htaccess小结
可能很多朋友都常用nginx不支持.htaccess,只有apache才支持.htaccess文件,其实这是错误的看法nginx也是支持.hatccess的哦. 其实nginx和.htaccess一点 ...
- Nginx系列4之基础配置
preface 公司跑得大多数是LNMP平台,所以借此机会多多了解下Nginx.下面主要说说Nginx下面几点: 防盗链 日志切割 负载均衡 虚拟主机 location匹配解释 substatus状态 ...
- 【Nginx笔记】nginx配置文件具体解释
本文主要对nginx的配置做重点说明,关于nginx的其他基本概念.建议參考官网描写叙述.这里推荐Nginx Beginner's Guide这篇文档.对刚開始学习的人高速认识nginx非常有帮助. ...
- Nginx之(一)Nginx是什么
Nginx("engine x")是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大 ...
随机推荐
- 洛谷 P4316绿豆蛙的归宿
题目描述 记f[i]表示经过i号点的概率. 那么点v从点u到达的概率=经过点u的概率/点u的出度.由于v可以由多个点走到,所以f[v]+=f[u]/out[u]. 计算f的过程可以在拓扑中完成,同时可 ...
- LG4074【WC2013】糖果公园 【树上莫队,带修莫队】
题目描述:给出一棵 \(n\) 个点的树,点有颜色 \(C_i\),长度为 \(m\) 的数组 \(V\) 和长度为 \(n\) 的数组 \(W\).有两种操作: 将 \(C_x\) 修改为 \(y\ ...
- idea乱码问题
## 1. 文件中内容中文乱码 这个原因是文件的编码和项目的编码不一致导致,将项目工程和文件的编码设置成一致的(如,文件编码是GBK,那就都设置为GBK,若为UTF-8就都设置为UTF-8) ## 2 ...
- 第07组 Beta冲刺(1/5)
队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:代码编辑器 展示GitHub当日代码/文档签入记录:(组内共用,已询问过助教小姐姐) ...
- gradle 使用maven repository 的设置
repositories { //Maven中心库(http://repo1.maven.org/maven2) mavenCentral() //本地库,local repository ...
- 超线程技术(Hyper—Threading Technology,HTT)
什么是超线程技术 超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算.具体讲,就是通过CPU的寄存器构成了两个逻辑处理器,来共享处理器的物理执行单元 ...
- CSS MDN - 选择器与样式化文字
- win 10 关闭或打开 测试模式
一.关闭测试模式 方法: 以管理员身份运行 cmd 运行:bcdedit /set testsigning off 重启电脑 二.开启测试模式 以管理员身份运行 cmd 运行:bcdedit /set ...
- git 版本找回方法
在 git reset --hard 之后,git 的版本会回退. 这个时候,需要使用 git reflog 去查看之前的操作 然后, 找到相对应的 hash 数值. git reset --hard ...
- asp.net core项目 Nlog直接写入集群ElasticSearch的配置方法
1.NuGet 项目引用 NLog.Web.AspNetCore NLog.Targets.ElasticSearch 2.nlog.config配置文件: <?xml version=&quo ...