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的配合。

  1. 启动php-fpm后,监听一个端口,默认监听9000(见配置文件listen = 127.0.0.1:9000)
  2. 然后nginx配置,如果是PHP文件,则转发给php-fpm程序处理。
  3. 接下来,当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的关系的更多相关文章

  1. 转载:2.1 运行中的Nginx进程间的关系《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19624.html 在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker进程,一般情况下,w ...

  2. nginx与PHP的关系和交互方式【转】

    nginx与PHP的关系. 对比, apache和PHP的关系, 将PHP安装成apache的一个功能模块, 导致的结果, 对外只有一个apache程序, PHP并不独立出现, 仅仅是apache的模 ...

  3. nginx fastcgi php-fpm的关系梳理

    CGI(Common Gateway Interface)CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具 ...

  4. nginx,wsgi,django的关系

    http://blog.csdn.net/lihao21/article/details/52304119 wsgi用于连续 nginx和django,客户端发来的请求,先经过wsgi,然后再传给dj ...

  5. 如何在Nginx下配置PHP程序环境

    1.nginx与PHP的关系 首先来看nginx与php的关系, FastCGI的关系(而不是像apache那样安装成nginx的模块) FastCGI的意思是, 快速的通用网关接口:CGI Comm ...

  6. nginx有关.htaccess小结

    可能很多朋友都常用nginx不支持.htaccess,只有apache才支持.htaccess文件,其实这是错误的看法nginx也是支持.hatccess的哦. 其实nginx和.htaccess一点 ...

  7. Nginx系列4之基础配置

    preface 公司跑得大多数是LNMP平台,所以借此机会多多了解下Nginx.下面主要说说Nginx下面几点: 防盗链 日志切割 负载均衡 虚拟主机 location匹配解释 substatus状态 ...

  8. 【Nginx笔记】nginx配置文件具体解释

    本文主要对nginx的配置做重点说明,关于nginx的其他基本概念.建议參考官网描写叙述.这里推荐Nginx Beginner's Guide这篇文档.对刚開始学习的人高速认识nginx非常有帮助. ...

  9. Nginx之(一)Nginx是什么

    Nginx("engine x")是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大 ...

随机推荐

  1. AD域服务器组策略实现文件夹重定向 保护文件安全

     网络管理员或许都遇到过类似的烦恼.如系统崩溃后,原来存放在 C盘的应用程序专署数据都丢失了;或者桌面上的文件莫名其妙少了,等等.有时候,我们也千方百计提醒员工不要把文件存放在桌面上,但是他们总是不听 ...

  2. 定量变量和定性变量的转换(Transform of Quantitative & Qualitative Variables)

    定量变量(Quantitative Variables):也称为数值型变量(Numerical Variables),可以用连续值或离散值表示.比如:气温(连续值),学生人数(离散值). 为什么要对定 ...

  3. 【cf contest 1119 G】Get Ready for the Battle

    题目 你有\(n\)个士兵,需要将他们分成\(m\)组,每组可以为0: 现在这些士兵要去攻打\(m\)个敌人,每个敌人的生命值为\(hp_i\) : 一轮游戏中一组士兵选定一个攻打的敌人,敌人生命值- ...

  4. Truncate使用注意事项

    1.TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志 ...

  5. git常用命名:自用,持续更新

    1.切换分支 git checkout -b dev origin/feature/迭代1.1 2.提交本地代码到github git init //初始化git git config --globa ...

  6. docker不能正常使用cron任务

    基于centos7的docker不能正常使用cron任务问题 修改docker centos7镜像对应的容器的/etc/pam.d/crond文件 把required 修改成sufficient,如下 ...

  7. OpenFOAM——90度T型管

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL010: Laminar Flow in a 90° Tee-Junction. ...

  8. 忘记zip密码咋办?python在手密码我有

    整理资料时发现几个 zip 文件的密码忘记了,于是尝试用python暴力破解 首先是读取和解压zip文件,使用 zipfile 库 import zipfile z = zipfile.ZipFile ...

  9. 2019年10~11月-NLP工程师求职记录

    求职目标:NLP工程师 为什么想换工作? 除了技术相关书籍,我没读过太多其他类型的书,其中有一本内容短但是对我影响特别大的书--<谁动了我的奶酪>.出门问问是我毕业后的第一份工作,无论是工 ...

  10. auto-sklearn

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...