首页 > nginxlua学习一周心得、体会,已经lua和php搭配使用
我是半路出家开始学习的php的(php是最好的语言),从最开始的html开始,到后面的不断深入学习php mysql nginx的lnmp平台,接触过thinkphp3.1、3.2(和3.1差别很大,具体可以查看thinkphp官方文档);yii2.ci等框架,最优雅的php框架暂时没有去看,现在主要开发一个是够用,一个是快速开发上线,laravel针对实际应用开发接触不是很多。我的主要开发主要是thinkphp3.2用来做快速开发,做后台,一般的小游戏主要也是用他,yii2主要用来做restapi接口开发,相对thinkphp来说他更加严谨,在数据结构方面更加实在,一般设计项目我都是先uml建模,之后导入sql数据,在用yii2生成model,很是方便,基本上uml出来后,接口的实体也出来的差不太多了,不会出现thinkphp3.2,需要重新去命名实体,而且会出现实体于返回的数据结构有差别。在用这些开发,之前在性能方面主要在代码,mysql优化,堆机器,redis缓存,有损服务等相关来抗住大流量,大并发的情况。
nginx和php之间的通信是异步阻塞的模式,nginx可以异步处理大量的并发请求(万级别),php-fpm是阻塞模式,受制性能影响,php的并发处理不是很高,有时候由于受到通信处理,可能就假死在那,而nginx运行正常,不断接受到请求就造成大量的502请求。所以我们经常遇到,接口数据请求502,但是静态页面能正常访问。因为php已经假死,卡主了,只能重启php-fpm。这个也是php被诟病的性能问题,这种情况下,只能靠堆机器,加缓存,做负载均衡去做处理了。
我也遇到过,有人用脚本不断的去刷接口(非正常的业务请求),就是一个ip不停的调用接口,而造成服务中断,php-fpm假死,之前一直是用php和redis进行ip限制,但是同样的,这些请求全部都会穿透到php-fpm请求上来,最后还是服务器假死,(后面有运维做相关处理,在nginx进行拦阻,c语言,c处理也有问题,也麻烦,对后续扩展改动非常麻烦)。这些都影响着我的开发进程。
今天5月新进入一家公司工作后,最开始还是用php用来做接口开发,在优化相关上也考虑的是php,但是公司有用到新的语言,就是lua,在大并发的情况下,公司大部分的业务都用上了lua,不管是新进入公司的需求,还是之前遇到的问题,都使我有心,和机会学习lua。
lua在语法使用上和php差别不是很大,其实他更多的应该像C,也能直接调用c模块,而且他和nginx(ngx_lua)是同步非阻塞的应用,所以除非nginx挂了,不然不会出现php-fpm那样的假死情况,我们可以利用ngx_lua内存或者redis,在access_by_lua做ip限制,接口权限认证,请求加密、解密等等预处理,直至把请求真正发送到php处理,因为这些lua的特性,它会用php做这些处理快很多,我们甚至可以用lua做这些验证,在真正的处理放到php上。
ngx_lua处理http请求的过程:
当Nginx处理一个来自客户端的请求时,先根据请求头的host、ip和port来确定由哪个server处理,确定了server之后,再根据请求的uri找到对应的location,这个请求就由这个location处理。实际Nginx将一个请求的处理划分为若干个不同阶段(phase),这些阶段按照前后顺序依次执行,也就是说NGX_HTTP_POST_READ_PHASE在第一个,NGX_HTTP_LOG_PHASE在最后一个。
nginxHttpRequest的11个阶段:
1.NGX_HTTP_POST_READ_PHASE: 读取请求内容阶段
2.NGX_HTTP_SERVER_REWRITE_PHASE: Server请求地址重写阶段
3.NGX_HTTP_FIND_CONFIG_PHASE: 配置查找段
4.NGX_HTTP_REWRITE_PHASE: Location请求地址重写阶段
5.NGX_HTTP_POST_REWRITE_PHASE: 请求地址重写提交阶段
6.NGX_HTTP_PREACCESS_PHASE: 访问权限检查准备阶段
7.NGX_HTTP_ACCESS_PHASE: 访问权限检查阶段
8.NGX_HTTP_POST_ACCESS_PHASE: 访问权限检查提交阶段
9.NGX_HTTP_TRY_FILES_PHASE: 配置项try_files处理阶段
10.NGX_HTTP_CONTENT_PHASE: 内容产生阶段
11.NGX_HTTP_LOG_PHASE: 日志模块处理阶段
ngx_lua指令
set_by_lua: 流程分支处理判断变量初始化
rewrite_by_lua: 转发、重定向、缓存等功能(例如特定请求代理到外网)
access_by_lua: IP准入、接口权限等情况集中处理(例如配合iptable完成简单防火墙)
content_by_lua: 内容生成
header_filter_by_lua: 应答HTTP过滤处理(例如添加头部信息)
body_filter_by_lua: 应答BODY过滤处理(例如完成应答内容统一成大写)
log_by_lua: 回话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)
