nginx + php-fpm 运行原理

眉间皱痕 提交于 2020-04-04 12:41:03

一、关于nginx

  • 1.1 简单认知
我们都知道nginx 是web服务器。
也知道 用户访问时通过ip和端口访问 nginx。
那么nginx 是如何 通过php 获取数据并返回数据的呢?
  • 1.2 代理与反向代理

    • 1.2.1 正向代理 : 访问google.com
        如上图,因为google 被墙,我们需要vpn翻墙才能访问google.com
        
        vpn 对于“我们”来说,是可以被感知的(我们连接了vpn)
        vpn 对于“google服务器”来说,是不可感知的(google 只知道有http 请求过来)。
    
    • 1.2.2 反向代理
        如上图 ,我们访问baidu.com 的时候,baidu有一个代理服务器,通过这个代理服务器,可以做负载均衡,路由到不同的server
        
        代理服务器 对于 “我们” 来说,是不可感知的(我们只能感知到访问的是百度的服务器,不知道中奖还有代理服务器来在负载均衡)。
        代理服务器,对于“server1,server2 server3” 是可感知的(代理服务器负载均衡路由到不同的server)
    
    • 1.2.3 总结
        说白了:“正向”、“反向” 是相对于人的感知来说的。
        人能感受到的就是正向代理,人感受不到的就是反向代理。
    

二、php-fpm

  • 2.1 cgi 协议

    `在说php-fpm 之前,先了解一下,什么的是cgi

    • 2.1.1 cgi
        百度百科的解释:
        cgi 即 通过网关接口 
        cgi 是 协议
        CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。
        CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。
        CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
    
    • 2.1.2 cgi 历史
        早期的webserver 只能处理HTML等静态文件,但是随着技术的发展,出现了php等动态语言,
        此时的webserver 已处理不了,那怎么办的,那就交给PHP解释器处理吧
        交给解释器处理很好,但是如何使得解释器与webserver 之间通讯呢?
    
    • 2.1.3 cgi 的出现
        cgi协议 的出现是为了解决webserver 和 解释器(php,java,python)之间的通讯问题,
        只要你按照cgi协议编写程序,就能实现语言解释器与webserver之间的通讯。如php-cgi程序
    
    • 2.1.4 cgi 程序 结合webserver 的运行方式
        webserver 接收到请求,会fork(创建) 一个cgi 程序,处理请求,处理完成后 kill cgi程序。
        
        问题: 如果有10000 次请求 就会创建 10000 个cgi 程序。是不是很浪费资源?        
    
  • 2.2 fastcgi 协议
    为了解决cgi 程序 执行浪费资源的问题
    2.2.1 fastcgi

        百度百科的解释:
        FastCGI全称 快速通用网关接口(FastCommonGatewayInterface)。
    

    2.2.2 fastcgi 的出现

        为了改良cgi 程序运行时资源的浪费,出现了fastcgi 协议。
    

    2.2.3 fastcgi 程序

        fastcgi 程序, 每次处理完请求后,不会kill 掉这个进程,而是保留这个进程,
        使这个进程可以一次处理多个请求。这样不用每次重新fork一个进程了,大大提高了效率
    
  • 2.3 php-fpm (fastcgi 进程管理器)

    php-fpm即php-Fastcgi Process Manager.
    php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
    
    进程包含 master 进程和worker 进程两种进程。
    master 进程只有一个,负责监听端口,接收webserver的转发,而worker 进程,一般有多个(具体根据配置),
    每个进程内部都嵌入了一个php解释器,是php代码执行的地方。
       
    执行操作:
    master进程监听端口,接收webserver的请求,交友worker进程执行。

三、nginx 与 php-fpm 结合

上面我们说过nginx不只有http请求的功能,还能做反向代理。
nginx 通过反向代理功能将动态请求转向后端php-fpm.

  • 3.1 nginx.conf 配置

  • 3.2 添加对应的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 /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
         fastcgi_intercept_errors on;
         fastcgi_pass   127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
     }
 
 }
  • 3.3 php-fpm.conf
即:php-fpm模块监听127.0.0.1:9000端口,等待请求到来去处理。
  • 3.4 运行
    nginx php-fpm原理图

  • 3.5 php-fpm worker 运行原理
    php-fpm 运行原理

原文出自https://segmentfault.com/a/1190000007322358?utm_source=tag-newest

如果大家喜欢看小说可以到,183小说网

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!