lua + nginx 可能是最稳健的后端方案

最近虽然一直在搞 as3 (motherfucking flash!), 但心思却在 nginx 和 lua 上, 近几个月的使用我渐渐觉得这才是稳健的 server 选择

刚开始接触的时候我甚至还有点排斥这种用法, 我们用的是 @agentzhOpenResty, 由于他不是一个独立的程序, 而是一个依附在 nginx 的框架, 我们能操作的只有每个请求内的东西, 这有巨大的局限性. 我们难以做一些全局的事情, 比如定时同步数据, 定时发邮件等(其实都可以)

说这种方案好, 是和当今流行的做法比较的

首先是 php, php + nginx 配合看似和 lua + nginx 差不多, 但 php 用的是 fastcgi_pass, 相当于自己开了一个 server, nginx 收到请求后再转发给 php, 虽然并没有具体测试过 php 的性能, 但从实现上看是略显笨重的, 而 lua 则是作为胶水语言附着在 nginx 上, 作用在 nginx location 中, 并没有做代理转发, 而是把 req 对象直接交给 lua 处理, 因此 lua 能充分利用 nginx 的性能, 我跑过简单的 ab 压测, 仅在我的虚拟机上, nginx + lua 和 golang http server 都是 qps 1w+, 而 nodejs 只有2800左右, php 更低

其次是和现在的流行语言比, 一个是 nodejs, 另一个是 golang, 由于 golang 我自己用的不多, 因此并没有资格评论和 nginx + lua 的优劣, 但这本身也是 golang 的劣势之一, 就是你必须这门 golang 才可以开始开发, golang 并不是完全的 c-style 语言, 而且又是一门静态语言, 在入门上虽然比 c艹 容易, 但终究有门槛, 和 lua 这样语法简单的脚本语言上手难度实在是高下立判

nodejs 是当今大热, 我本人也非常喜欢, 但事实上 nodejs 用在 production 的案例并不如想象中的多, 更多的人是用在前端的构建打包上, 或者是搭建一些公司内部使用的规模较小的网络服务上. 有不少 nodejs 开发者都用的一手好 express, 最一些网络服务效率是 java 同事的很多倍, 但却不敢把服务对外大规模使用, 因为大规模使用就面临着很多实际问题, 首先是软重启, 你如何升级你的代码, 服务不能有任何的中断, 其次是访问日志和错误日志的管理, 这对于数据分析, 错误排查都非常重要, 但有些从前端转来的 nodejs 开发者往往容易忽视这些, 你可能说 pm2 早就解决的这些问题, 但问题又来了, 你如何保证 pm2 自己不挂掉, 如何让 pm2 每次都能放弃占用端口, 甚至是升级 pm2, 升级 nodejs 自身都成了问题, 也许你会说这些都是小问题, pm2早晚都会解决这些问题的

这就说到最大的差距了, 服务器维护一般不是自己, 而是专门的运维, 他们善用 nginx, 不会用 pm2