二、web应用层-lnmp

一、本章主题

lnmp/lamp

部署php语言编写的web应用程序
部署python语言编写的web应用程序

强调:
了解怎么部署时最最最简单的一个环节,非常非常的low
你要想达到通透的效果,无论什么应用给你,你瞅一眼就知道架构思路,任何环节出了问题都能够定位到问题在哪里

关键就在于:搞清楚上游与下游走的是什么协议,上游是怎么做的,下游是怎么做的,如此,便可以在自己的脑子里生成一整条链路或者说流水线,一个数据包就沿着这个流水线一个小节点一个小姐点的走下去,但凡某个小节点你是模糊的,你都应该花精力去搞定它,否则就是没学会,千万不要天真的以为,我能部署起来,能跑起来,就是学会了,那样子真的很低端,虽然可能也并不影响你面试甚至拿高薪,但后劲不足是肯定的。

二、先说重要结论

下述重要结论均来自于该文章:https://egonlin.com/?p=9138
一定要好好看看上面这篇文章,详解介绍了:cgi、fastcgi、php-fpm,以及python体系里的(wsgi、uwsgi、agi)
的演变历史,关系与区别

2.1 python体系与php体系总图

下图画的是web层服务器上的服务链路,最左侧的HTTP请求可以是用户发起的,也可以是上游的负载均衡器


作者自己留存作图地址:https://www.processon.com/diagraming/58883630e4b049e795e80bcf

2.2 nginx配置转发到不同协议的指令

nginx用于将请求转给其他进程的内置指令(不需要为nginx额外安装包,默认支持)

proxy_pass:http协议
fastcgi_pass:fastcgi协议
uwsgi_pass:uwsgi协议

强调:
1、uwsgi服务的配置文件uwsgi.ini
http = :8080 代表uwsgi服务监听http协议端口
socket = :8080 代表uwsgi服务监听uwsgi协议的端口

针对前者,在nginx里需要用proxy_pass转发
针对后者,在nginx里需要用uwsgi_pass转发

2、uwsgi协议肯定http协议更快

3、针对python体系-asgi协议,nginx配置转发给daphne服务,用的就是proxy_pass,
因为daphne支持的http协议,没有asgi_pass这种东西

2.3 web层部署python程序

uwsgi服务的配置文件uwsgi.ini可以配置开启http协议与uwsgi协议

# 1、监听http协议
http = :8081

# 2、监听uwsgi协议
socket = :8082

两条配置可以同时出现在uwsgi.ini中,只要端口不冲突就行,但通常情况下我们只会选择开启其中一种

python体系:

  • 1、uwsgi.ini配置为http=:8080,此时uwsgi服务可以充当web服务用,uwsgi服务处理的就是http协议
    uwsgi服务接收http协议请求,然后封装成wsgi协议往后面的应用程序传
  • 2、uwsgi.ini配置为socket=:8080,代表用uwsgi服务当中间件,配合nginx一起使用,uwsgi与nginx之间走的是uwsgi协议
    1、nginx服务接受http协议的请求,然后封装成uwsgi协议往后面的中间件即uwsgi服务传
    2、uwsgi服务将请求进一步处理成wsgi协议往后面的应用程序传
  • 3、同时配置有http=:8081、socket=:8082,端口一定不能冲突。同时开启的意义不大,一般都只开启一种来满足你的特定需求

2.3 web层部署php程序

PHP-frm不支持http协议,不能直接充当web服务!!!!!!!!!!!!!!!!!!!!
PHP-FPM 本身并不直接支持 HTTP 协议,它主要使用的是 FastCGI 协议。这意味着PHP-FPM并不能直接对外提供http协议的服务。通常它和 Nginx 或者 Apache 等 Web 服务器配合来使用。
HTTP 请求最先由 Web 服务器(如 Nginx 或 Apache)接收,然后由 Web 服务器通过 FastCGI 协议传递给 PHP-FPM来处理,

总结:nginx将请求转发给php-fpm,php-fpm负责调用php程序,整个过程涉及三种程序,nginx、php-fpm、php程序,这三者之间数据的转发分别走什么协议

  • 1、Nginx和PHP-FPM之间的通信:用的是FastCGI协议。当Nginx收到客户端的请求后,如果这个请求需要PHP进行处理,Nginx就会使用FastCGI协议,将请求转发给PHP-FPM进行处理。
  • 2、PHP-FPM和PHP程序之间的通通信:实际上并没有一个明确的协议。PHP-FPM启动时,会加载PHP解释器,然后保持在内存中。当PHP-FPM收到一个请求时,它会调用内存中的PHP解释器来处理请求,并传递给解释器所需的所有环境变量和请求内容。这些都是在本地进行的,不需要网络协议。
    file

file

Nginx 作为web服务,无法直接与 FastCGI 程序(例如php-fpm)进行通信,需要启用ngx_http_fastcgi_module模块进行代理配置,才能将请求发送给 FastCGI 程序(例如php-fpm)。
其中,包括我们熟知的配置指令:
fastcgi_pass 用于设置 FastCGI 服务器的 IP 地址(TCT 套接字)或 UNIX 套接字。
fastcgi_param 设置传入 FastCGI 服务器的参数。
接下来看一下fastcgi_pass转发fastcgi协议的请求该如何配置

# 官网:https://www.php.net/manual/zh/install.fpm.php
# This is the origin nginx conf.
location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index  index.php;
    include  fastcgi.conf;
}

# You can replace it by
upstream php {
    server  127.0.0.1:9000;
    server  127.0.0.1:9001;
    server  127.0.0.1:9002;
    server  127.0.0.1:9003;
}

location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  php;
    fastcgi_index  index.php;
    include  fastcgi.conf;
}

三、再简述核心发展史

3.1 php体系

php体系相关:cgi、FastCGI、php-fpm

1、在传统的 CGI 模式下,每次 HTTP 请求都需要 fork 一个新的进程用于处理,进程结束后即释放资源。
这种方式在处理大量并发请求时会带来严重的性能问题。

2、FastCGI 协议是 CGI 协议的一种变种,设计之初就是为了弥补 CGI 协议在持久连接和性能上的不足。 
则允许一个长期运行的进程(比如 PHP-FPM)来处理多个 HTTP 请求,这大大提高了处理效率。

3、PHP-FPM 是FastCGI 协议的具体实现,从名字上也能看出来PHP-FPM (PHP FastCGI Process Manager),
即php-fpm是基于FastCGI协议的进程管理器

包的协议封装与转发流程如下

必须要有一个nginx一样的web服务存在才行

nginx服务---(FastCGI协议)-------> php-fpm服务(内部调用web应用)

file

3.2 python体系

python体系相关:wsgi、asgi、uwsgi

1、web服务与web应用之间的协议可以是wsgi或asgi
2、web服务与其他web服务之间的协议可以是http或uwsgi协议

包的协议封装与转发流程如下

file

3.3 php体系与python体系总结与对比

相同点:
uwsgi程序==============拉起================python的web应用
php-fpm程序============拉起================php的web应用

不同点:
1、uwsgi程序可以解析uwsgi协议,也可以解析http协议,所以uwsgi程序可以启动为一个web服务用,并不是一定需要搭配nginx,虽然通常我们建议搭配nginx一起用
2、php-fpm程序启动之后,只能解析fastcgi协议,不支持http协议,所以php-fpm启动之后不能作为一个web服务用,一定要搭配像nginx一样的web服务用才行

虽然uWSGI可以直接提供HTTP协议的端口,所以可以作为一个简单的Web服务器,但实际上在大多数生产环境中,
uWSGI通常还是会搭配Nginx等Web服务器来使用,以便利用Nginx的高效静态文件处理,负载均衡等特性。
至于PHP-FPM,它并不能直接作为Web服务器。PHP-FPM是一个进程管理器,它维护了一组FastCGI进程,
可以处理PHP代码的执行。

所以,
uWSGI可以提供HTTP协议端口直接充当Web服务器,但PHP-FPM并不能这样做,
它只是作为处理PHP代码的应用程序,而非处理HTTP请求的Web服务器。

四、lnmp-部署php

只有一种方案,就是必须搭配nginx用

nginx---->php-fpm(内部调用执行php的web应用程序)

部署案例见—》web层部署php程序:https://egonlin.com/?p=9154

五、lnmp-部署python

有两大类方案,如下

5.1 不在web层引入nginx

web层服务器上:不部署nginx
1、只部署uwsgi,并开启http协议

负载均衡层:需要使用指令proxy_pass

2、之部署uwsgi,并开启uwsgi协议

负载均衡层:需要使用指令uwsgi_pass

5.2 在web层引入nginx

web层服务器上:在uwsgi服务前挡一个nginx,那对外web层服务器对外提供服务的就是nginx,nginx对外暴漏的一定是http协议了
所以此时的

负载均衡层一定需要使用指令proxy_pass

具体在web层服务器上还可以分两种情况讨论
1、部署nginx、部署uwsgi并开启http协议

web层上的nginx需要使用指令proxy_pass

2、部署nginx、部署uwsgi并开启uwsgi协议(推荐这种方案)

web层上的nginx需要使用指令uwsgi_pass

5.3 最终方案

file

部署案例见—》web层部署python程序:https://egonlin.com/?p=9152

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 青浦区尚茂路798弄 联系方式-13697081366