潮白河社区网

潮白河社区
北三县区域最大的社区服务网站!
查看: 3174|跟帖: 0
打印 上一主题 下一主题

[IT技术] openresty (nginx lua结合体)

[复制链接]

1545

主题

3923

帖子

4301

潮白币

站长

Rank: 9

UID
1
积分
24460

优秀版主最佳新人

会员类型
业主
小区名称
温莎郡
小区楼号
10号楼 1单元
跳转到指定楼层
楼主
发表于 2014-4-16 13:05:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
公司打算把 apache nginx 全换成  openresty!所以查下资料。。研究下
http://house.chaobaihe.net 潮白房产网http://house.chaobaihe.net 潮白房产网
openresty是以ngx_lua模块为核心的nginx套件,详见春哥项目 http://openresty.org/
http://house.chaobaihe.net 潮白房产网

本文章来源于潮白家园网: http://www.chaobaihe.net

nginx充分利用epoll,擅长处理高并发;而lua作为天生的胶水语言,开发简单。两者结合起来,可以很容易实现以前PHP几乎不能完成的应用。

最近在某游戏激活码抢号专题中,有个场景并发较高,可虑采用lua做PHP应用层的防火墙。

抢号专题,前期评估预计2万人参加,并发峰值按20k来扛,网页前端采用随机延时发请求来减轻负载,实际产生的并发连接大概在0.5k。

架构方面,两台webserver + 一台mysql,32核,36G内存。其中一台webserver为主,起有memcache作为分布式session以及data cache,redis做队列,使用nginx反代做简单的负载均衡。内核参数皆已调优。

根据各种参数组合的基准压测,发现fpm响应在1ms,单核RPS为1K左右,32核可以跑到30K+,这是我实测见过的最高PHP 单机基准RPS了。但是nginx最高却只跑到25k,多方求解,至今无果。

总得来说,我还是相信nginx比fpm更加健壮以及更少的资源占用。 下面是我们在nginx层面的lua实践。
http://house.chaobaihe.net 潮白房产网
http://bbs.chaobaihe.net 潮白河社区网
  1. vim /usr/local/openresty/nginx/conf/nginx.conf本文章来源于潮白家园网: http://www.chaobaihe.net
  2. http://fj.chaobaihe.net 潮白河点评网
  3. http {http://news.chaobaihe.net 潮白新闻网

  4. http://house.chaobaihe.net 潮白房产网
  5.     # access dict,初始化使用到的共享内存
    http://fj.chaobaihe.net 潮白河点评网
  6.     lua_shared_dict access_whitelist 1m;http://house.chaobaihe.net 潮白房产网
  7.     lua_shared_dict access_blacklist 1m;http://fj.chaobaihe.net 潮白河点评网
  8.     lua_shared_dict access_iplist 40m;http://news.chaobaihe.net 潮白新闻网
  9.     lua_shared_dict access_total 1m;http://fj.chaobaihe.net 潮白河点评网

  10. http://fj.chaobaihe.net 潮白河点评网
  11.     # access 访问控制lua脚本http://news.chaobaihe.net 潮白新闻网
  12.     access_by_lua_file /usr/local/openresty/lualib/com/access.lua;
复制代码

  1. http://bbs.chaobaihe.net 潮白河社区网
  2. vim /usr/local/openresty/lualib/com/access.lua
    http://news.chaobaihe.net 潮白新闻网

  3. http://news.chaobaihe.net 潮白新闻网
  4. --[[本文章来源于潮白家园网: http://www.chaobaihe.net
  5. -- access.lua, 访问控制http://house.chaobaihe.net 潮白房产网
  6. -- @author 楚吟风 <<a href="mailto:chuyinfeng@gmail.com" target="_blank">chuyinfeng@gmail.com</a>>http://fj.chaobaihe.net 潮白河点评网
  7. -- @version 1.0
    http://fj.chaobaihe.net 潮白河点评网
  8. -- @update 2013-04-25本文章来源于潮白家园网: http://www.chaobaihe.net
  9. -- @package comhttp://house.chaobaihe.net 潮白房产网
  10. ]]
    本文章来源于潮白家园网: http://www.chaobaihe.net
  11. http://news.chaobaihe.net 潮白新闻网
  12. -- 静态白名单,从文件加载http://bbs.chaobaihe.net 潮白河社区网
  13. local whitelist = ngx.shared.access_whitelist
    http://bbs.chaobaihe.net 潮白河社区网
  14. -- 静态黑名单,从共享内存载入http://bbs.chaobaihe.net 潮白河社区网
  15. local blacklist = ngx.shared.access_blacklist
    http://bbs.chaobaihe.net 潮白河社区网
  16. -- IP计数器,从共享内存载入http://news.chaobaihe.net 潮白新闻网
  17. local iplist = ngx.shared.access_iplist
    本文章来源于潮白家园网: http://www.chaobaihe.net
  18. -- 全局计数器,从共享内存再入
    http://news.chaobaihe.net 潮白新闻网
  19. local total = ngx.shared.access_totalhttp://house.chaobaihe.net 潮白房产网
  20. -- 获取客户端IP
    本文章来源于潮白家园网: http://www.chaobaihe.net
  21. local ip = ngx.var.remote_addr
    http://news.chaobaihe.net 潮白新闻网
  22. -- 单个IP RPS限制http://bbs.chaobaihe.net 潮白河社区网
  23. local ip_rps = 50
    http://fj.chaobaihe.net 潮白河点评网
  24. -- 单个IP RPS 系统防火墙拦截标准http://bbs.chaobaihe.net 潮白河社区网
  25. local iptable_rps = 100
    本文章来源于潮白家园网: http://www.chaobaihe.net
  26. -- 总RPS限制本文章来源于潮白家园网: http://www.chaobaihe.net
  27. local total_rps = 3000
    http://news.chaobaihe.net 潮白新闻网
  28. -- 重新载入名单http://bbs.chaobaihe.net 潮白河社区网
  29. local ctrl_path = '/access_ctrl/reload/'
    http://house.chaobaihe.net 潮白房产网
  30. -- 防火墙静态黑白名单存放路径本文章来源于潮白家园网: http://www.chaobaihe.net
  31. local file_path = '/usr/local/openresty/lualib/com/access/'http://bbs.chaobaihe.net 潮白河社区网
  32. -- ip认证本文章来源于潮白家园网: http://www.chaobaihe.net
  33. local auth = {
    http://news.chaobaihe.net 潮白新闻网
  34.     ['/admin/'] = {http://bbs.chaobaihe.net 潮白河社区网
  35.         '192.168.20.15'
    http://house.chaobaihe.net 潮白房产网
  36.     }
    http://bbs.chaobaihe.net 潮白河社区网
  37. }
    http://house.chaobaihe.net 潮白房产网
  38. -- ip 认证http://news.chaobaihe.net 潮白新闻网
  39. local is_banned = falsehttp://news.chaobaihe.net 潮白新闻网
  40. local uri = string.lower(ngx.var.request_uri)http://house.chaobaihe.net 潮白房产网
  41. for path, iplist in pairs(auth) do
    本文章来源于潮白家园网: http://www.chaobaihe.net
  42.     local i, _ = string.find(uri, path)
    http://news.chaobaihe.net 潮白新闻网
  43.     if i == 1 thenhttp://bbs.chaobaihe.net 潮白河社区网
  44.         is_banned = truehttp://news.chaobaihe.net 潮白新闻网
  45.         for _, cip in pairs(iplist) do
    http://bbs.chaobaihe.net 潮白河社区网
  46.             if string.find(ip, cip) then
    本文章来源于潮白家园网: http://www.chaobaihe.net
  47.                 is_banned = falsehttp://house.chaobaihe.net 潮白房产网
  48.             end
    http://fj.chaobaihe.net 潮白河点评网
  49.         endhttp://fj.chaobaihe.net 潮白河点评网
  50.     end
    本文章来源于潮白家园网: http://www.chaobaihe.net
  51. end
    http://house.chaobaihe.net 潮白房产网
  52. if is_banned then
    http://bbs.chaobaihe.net 潮白河社区网
  53.     --ngx.header['Content-Type'] = 'text/plain'http://house.chaobaihe.net 潮白房产网
  54.     --ngx.say(ip .. ' is banned')
    http://bbs.chaobaihe.net 潮白河社区网
  55.     --ngx.exit(ngx.HTTP_OK);
    http://house.chaobaihe.net 潮白房产网
  56. end
    http://fj.chaobaihe.net 潮白河点评网

  57. 本文章来源于潮白家园网: http://www.chaobaihe.net
  58. -- 从文件载入字典
    http://house.chaobaihe.net 潮白房产网
  59. function load_file_to_dict(file, dict)本文章来源于潮白家园网: http://www.chaobaihe.net
  60.     dict:flush_all()http://bbs.chaobaihe.net 潮白河社区网
  61.     local fh = io.open(file, 'r')
    http://fj.chaobaihe.net 潮白河点评网
  62.     for line in fh:lines() do
    http://bbs.chaobaihe.net 潮白河社区网
  63.         dict:set(line, '')
    本文章来源于潮白家园网: http://www.chaobaihe.net
  64.     endhttp://news.chaobaihe.net 潮白新闻网
  65.     fh:close()http://house.chaobaihe.net 潮白房产网
  66. endhttp://news.chaobaihe.net 潮白新闻网
  67. http://bbs.chaobaihe.net 潮白河社区网
  68. -- 载入静态名单http://bbs.chaobaihe.net 潮白河社区网
  69. if (whitelist:get('0.0.0.0') == nil) or (ngx.var.request_uri == ctrl_path) then本文章来源于潮白家园网: http://www.chaobaihe.net
  70.     load_file_to_dict(file_path .. 'whitelist.txt', whitelist)
    本文章来源于潮白家园网: http://www.chaobaihe.net
  71.     load_file_to_dict(file_path .. 'blacklist.txt', blacklist)
    http://house.chaobaihe.net 潮白房产网
  72. endhttp://fj.chaobaihe.net 潮白河点评网
  73. http://fj.chaobaihe.net 潮白河点评网
  74. --[[http://news.chaobaihe.net 潮白新闻网
  75. -- is_block, 检测当前IP是否被屏蔽http://fj.chaobaihe.net 潮白河点评网
  76. ]]
    http://news.chaobaihe.net 潮白新闻网
  77. function is_block()http://house.chaobaihe.net 潮白房产网
  78.     -- 如果在静态白名单,则直接放行http://news.chaobaihe.net 潮白新闻网
  79.     if whitelist:get(ip) thenhttp://house.chaobaihe.net 潮白房产网
  80.         return false
    http://fj.chaobaihe.net 潮白河点评网
  81.     end
    http://bbs.chaobaihe.net 潮白河社区网
  82. http://bbs.chaobaihe.net 潮白河社区网
  83.     -- 如果在静态黑名单,则拦截
    http://news.chaobaihe.net 潮白新闻网
  84.     if blacklist:get(ip) thenhttp://house.chaobaihe.net 潮白房产网
  85.         return {本文章来源于潮白家园网: http://www.chaobaihe.net
  86.             ['status'] = 1,
    http://news.chaobaihe.net 潮白新闻网
  87.             ['tips'] = (ip .. ' is in blacklist, please contact us'),本文章来源于潮白家园网: http://www.chaobaihe.net
  88.         }
    http://bbs.chaobaihe.net 潮白河社区网
  89.     end
    http://fj.chaobaihe.net 潮白河点评网
  90.     -- 当前IP请求次数加1http://bbs.chaobaihe.net 潮白河社区网
  91.     local ip_times = iplist:incr(ip, 1)
    http://news.chaobaihe.net 潮白新闻网
  92.     -- 如果访问记录为空,则设置访问次数为1
    http://bbs.chaobaihe.net 潮白河社区网
  93.     if ip_times == nil then
    http://house.chaobaihe.net 潮白房产网
  94.         ip_times = 1
    http://news.chaobaihe.net 潮白新闻网
  95.         iplist:set(ip, 1, 1)http://house.chaobaihe.net 潮白房产网
  96.     end
    http://news.chaobaihe.net 潮白新闻网
  97. 本文章来源于潮白家园网: http://www.chaobaihe.net
  98.     -- 如果请求频率超过单个IP系统防火墙限制,则写入防火墙名单
    http://news.chaobaihe.net 潮白新闻网
  99.     if ip_times == iptable_rps then
    本文章来源于潮白家园网: http://www.chaobaihe.net
  100.         local file = io.open(file_path .. 'blocklist.txt', 'a')
    http://house.chaobaihe.net 潮白房产网
  101.         file:write("\r\n" .. ip)
    本文章来源于潮白家园网: http://www.chaobaihe.net
  102.         file:close()本文章来源于潮白家园网: http://www.chaobaihe.net
  103.         ngx.say('will in iptables');ngx.exit(ngx.HTTP_OK)
    http://news.chaobaihe.net 潮白新闻网
  104.     endhttp://bbs.chaobaihe.net 潮白河社区网
  105. http://news.chaobaihe.net 潮白新闻网
  106.     -- 如果请求频率超过单个IP限制则封禁,超过多少个封禁多少秒http://fj.chaobaihe.net 潮白河点评网
  107.     if ip_times > ip_rps thenhttp://fj.chaobaihe.net 潮白河点评网
  108.         local sec = (ip_times - ip_rps)http://bbs.chaobaihe.net 潮白河社区网
  109.         iplist:set(ip, ip_times, sec)
    http://bbs.chaobaihe.net 潮白河社区网
  110.         return {
    http://bbs.chaobaihe.net 潮白河社区网
  111.             ['status'] = 2,
    本文章来源于潮白家园网: http://www.chaobaihe.net
  112.             ['tips'] = ip .. ' is  blocked for ' .. sec .. ' seconds.',http://fj.chaobaihe.net 潮白河点评网
  113.             ['sec'] = sec,本文章来源于潮白家园网: http://www.chaobaihe.net
  114.         }http://fj.chaobaihe.net 潮白河点评网
  115.     endhttp://house.chaobaihe.net 潮白房产网
  116. http://house.chaobaihe.net 潮白房产网
  117. -- 全局请求次数加1
    http://bbs.chaobaihe.net 潮白河社区网
  118.     local total_times = total:incr('total', 1)
    http://bbs.chaobaihe.net 潮白河社区网
  119.     if total_times == nil thenhttp://news.chaobaihe.net 潮白新闻网
  120.         total_times = 1
    本文章来源于潮白家园网: http://www.chaobaihe.net
  121.         total:set('total', 1, 1)
    http://fj.chaobaihe.net 潮白河点评网
  122.     endhttp://house.chaobaihe.net 潮白房产网
  123. http://news.chaobaihe.net 潮白新闻网
  124.     -- 全局请求拦截
    http://house.chaobaihe.net 潮白房产网
  125.     if total_times > total_rps then
    http://fj.chaobaihe.net 潮白河点评网
  126.         return {
    http://house.chaobaihe.net 潮白房产网
  127.             ['status'] = 3,本文章来源于潮白家园网: http://www.chaobaihe.net
  128.             ['tips'] = total_times .. ' is request, please wait for a moment',http://news.chaobaihe.net 潮白新闻网
  129.             ['total'] = total_times,
    本文章来源于潮白家园网: http://www.chaobaihe.net
  130.         }
    http://fj.chaobaihe.net 潮白河点评网
  131.     endhttp://bbs.chaobaihe.net 潮白河社区网
  132. endhttp://news.chaobaihe.net 潮白新闻网
  133. http://house.chaobaihe.net 潮白房产网
  134. -- 主函数本文章来源于潮白家园网: http://www.chaobaihe.net
  135. function main()
    http://news.chaobaihe.net 潮白新闻网
  136.     local block = is_block()
    http://news.chaobaihe.net 潮白新闻网
  137.     if block then
    http://house.chaobaihe.net 潮白房产网
  138.         ngx.req.set_header("Content-Type", "text/plain")
    http://news.chaobaihe.net 潮白新闻网
  139.         --ngx.say(block['status'])本文章来源于潮白家园网: http://www.chaobaihe.net
  140.         ngx.say(block['tips'])
    http://news.chaobaihe.net 潮白新闻网
  141.         ngx.exit(ngx.HTTP_OK)
    http://fj.chaobaihe.net 潮白河点评网
  142.     end
    本文章来源于潮白家园网: http://www.chaobaihe.net
  143. end
    http://fj.chaobaihe.net 潮白河点评网
  144. main()
复制代码
http://fj.chaobaihe.net 潮白河点评网
压测结果显示,采用ngx_lua,与原生nginx性能几无差别,应用层防护效果非常显著
http://news.chaobaihe.net 潮白新闻网本文章来源于潮白家园网: http://www.chaobaihe.net
分享到: 0
关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表