一、本章主题
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额外安装包,默认支持)
2.3 web层部署python程序
uwsgi服务的配置文件uwsgi.ini可以配置开启http协议与uwsgi协议
两条配置可以同时出现在uwsgi.ini中,只要端口不冲突就行,但通常情况下我们只会选择开启其中一种
python体系:
- 1、uwsgi.ini配置为http=:8080,此时uwsgi服务可以充当web服务用,uwsgi服务处理的就是http协议
- 2、uwsgi.ini配置为socket=:8080,代表用uwsgi服务当中间件,配合nginx一起使用,uwsgi与nginx之间走的是uwsgi协议
- 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解释器来处理请求,并传递给解释器所需的所有环境变量和请求内容。这些都是在本地进行的,不需要网络协议。
Nginx 作为web服务,无法直接与 FastCGI 程序(例如php-fpm)进行通信,需要启用ngx_http_fastcgi_module模块进行代理配置,才能将请求发送给 FastCGI 程序(例如php-fpm)。
其中,包括我们熟知的配置指令:
fastcgi_pass 用于设置 FastCGI 服务器的 IP 地址(TCT 套接字)或 UNIX 套接字。
fastcgi_param 设置传入 FastCGI 服务器的参数。
接下来看一下fastcgi_pass转发fastcgi协议的请求该如何配置
三、再简述核心发展史
3.1 php体系
php体系相关:cgi、FastCGI、php-fpm
包的协议封装与转发流程如下
3.2 python体系
python体系相关:wsgi、asgi、uwsgi
包的协议封装与转发流程如下
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服务用才行
四、lnmp-部署php
只有一种方案,就是必须搭配nginx用
部署案例见—》web层部署php程序:https://egonlin.com/?p=9154
五、lnmp-部署python
有两大类方案,如下
5.1 不在web层引入nginx
web层服务器上:不部署nginx
1、只部署uwsgi,并开启http协议
2、之部署uwsgi,并开启uwsgi协议
5.2 在web层引入nginx
web层服务器上:在uwsgi服务前挡一个nginx,那对外web层服务器对外提供服务的就是nginx,nginx对外暴漏的一定是http协议了
所以此时的
具体在web层服务器上还可以分两种情况讨论
1、部署nginx、部署uwsgi并开启http协议
2、部署nginx、部署uwsgi并开启uwsgi协议(推荐这种方案)
5.3 最终方案
部署案例见—》web层部署python程序:https://egonlin.com/?p=9152