首页 > 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: 回话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)


    具体的可以看下nginx的文档,和openresty用来做开发,另外由于我自己的特性,最近也搞了一个脚本,用来在centos上面一键搭建  openresty(nginx)+php+mysql用来当做开发用,也可以用来部署正式环境,php和mysql都有多个稳定版本可以选择,同时还可以脚本一键安装redis、memcache的相关扩展和服务器,欢迎来使用,目前在centos7.0上面稳定无bug运行。