设为首页 收藏本站
查看: 416|回复: 0

[经验分享] 使用Nginx+Lua进行架构优化

[复制链接]

尚未签到

发表于 2016-12-25 12:17:45 | 显示全部楼层 |阅读模式
  方案一

  使用2台文件存储服务器安装nginx,通过rsync做文件同步

  上线后发现以下几个问题:

  1.首页加载需要8秒以上
  2.双机文件同步耗时过长,每次同步都在5min以上
  3.磁盘IO过高

  经过详细检查,存在以下问题:

  1.新闻编辑人员经常在页面中插入多张上百K图片,导致页面过大,特别是首页经常达到2~3M
  2.旧文件数据过多过大,350G文件总量,但文件数上千万

  好吧,其实海量小文件的解决方案才是需要说明的重点,于是就有了……

  sa:上缓存吧,速度快,效果好
  dev:不行,上缓存我还要写程序purge,代码改动很麻烦
  sa:…
  sa:那旧文件删除,0x年的新闻页面现在还有谁看
  dev:不行,业务领导那边不同意
  sa:怎么什么都不行,那你想个法
  dev:我们做冷热数据分离吧
  sa:说的容易,怎么实施,首先怎么判断数据冷热?
  dev:新的就是热的,旧的就是冷的
  sa:废话- -,怎么判断...
  dev:像http://news.qq.com/a/20140514/007123.htm,url中会带有时间戳
  sa:那你这个时间肯定是动态的,如果说最近3个月为热数据,1月份的热数据就是去年11月至今;5月份的热数据就是3月份至今
  dev:对呀,而且时间戳还有好多种,有yyyymmdd/hh/的,也有yyyy/mm/dd,也有yymm/dd的
  sa:卧槽,格式又多,判断条件也要随时间变化,哪个设备哪个服务都做不到啊
  sa:==我想到一个好像可以,nginx+lua

  方案二
  其实从往常的应用经验看,【nginx+不多的静态文件】即使是稍微老一点的服务器,服务性能也是非常好的;而本新闻站的最大拖累就在LOSF(海量小文件)
  这些几百G,上千万的小文件,其实多数是2006年-2012年的历史文件,作为一个新闻站点来讲,这种历史文件的访问量是非常小,几乎为0的
  所以我们决定,上线2台新设备,承担新文件的访问;而目前的设备,作为文件存储及承担旧文件访问的用途
  为什么选择lua?

  lua是目前所遇到过的速度最快的嵌入式脚本语言;一个完整的lua解释器不过200K;
  在下的脚本肯定会有多if等判断,引入lua在web server上做7层代理,不至于对server造成过大负载

  如果将lua应用到我们现在的架构中?当然是先学习,后部署
  首先,学习lua

  lua官方手册是最好的学习地址:http://www.codingnow.com/2000/download/lua_manual.html

  其次,了解nginx的lua module

  http://wiki.nginx.org/HttpLuaModule

  最后,可以参考其它同学的应用经验
  那么就开始lua安装

   1:  tar zxvf LuaJIT-2.0.0.tar.gz
   2:  cd LuaJIT-2.0.0
   3:  make && make install

  nginx安装,加入lua module即可

   1:  ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" --add-module=ngx_module/echo-nginx-module-master --add-module=ngx_module/lua-nginx-module-0.7.14rc2/
   2:  make && make install

  编辑nginx.conf,主要的地方就在于

  1.引入lua脚本
  2.制定访问的location


server {
    ...
    # 引入lua file
    location / {
        content_by_lua_file 'conf/proxy_pass.lua';
    }
    # 建两个location,@local为访问本地,@proxy_pass为访问后端
    location @local {
        #echo "@local";
        root  /www/webadmin;
        index index.shtml index.html;
    }
    location @proxy_pass {
        #echo "@proxy_pass";
        proxy_pass http://backend;
        include /usr/local/nginx/conf/proxy.conf;
    }
    ...
}

  编辑proxy_pass.lua文件,架构上线时间为2013年5月,lua脚本最后一次更新为2013年8月
  只po干货,判断部分就不说了,每个人业务情况不一样~

-- Version 0.9999 -- 2013/08/01 potaski@qq.com
ngx.req.read_body()
-- 获取url
url = string.gsub(ngx.unescape_uri(ngx.var.request_uri),'\\%','')
-- 上面获取url的方式,如果url为"news.qq.com/"这样的话,取得的值为nil,我被坑了一回~
...
-- 当判断结束后,可以通过ngx.exec('@location_name'),进行跳转处理
if url_date == jgp_time_1 or url_date == jpg_time_2  then
    ngx.exec('@local')
else
    ngx.exec('@proxy_pass')
end

  目前此架构已稳定运行一年,现在运行nginx+lua的设备,为2008年的单颗E2180,内存4G服务器,单台高峰时连接1K+,CPU损耗峰值在50%
  nginx+lua设备只存放最近3个月的文件数据,并定期删除;其余数据全部由后端存储;磁盘压力大大减小
  效果不错,所有人都很满意

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-319212-1-1.html 上篇帖子: 使用fastcgi_cache加速你的Nginx网站 下篇帖子: nagios+nginx+php配置监控平台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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