简介

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。


官方地址 http://tengine.taobao.org/


特性

  • 继承Nginx-1.6.2的所有特性,兼容Nginx的配置;

  • 动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;

  • 支持SO_REUSEPORT选项,建连性能提升为官方nginx的三倍;

  • 同时支持HTTP v2协议SPDY v3协议可同时使用两种协议

  • 流式上传到HTTP后端服务器或FastCGI服务器,大量减少机器的I/O压力;

  • 更加强大的负载均衡能力,包括一致性hash模块会话保持模块还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名

  • 输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便;

  • 支持设置proxy、memcached、fastcgi、scgi、uwsgi在后端失败时的重试次数

  • 动态脚本语言Lua支持。扩展功能非常高效简单;

  • 支持管道(pipe)和syslog(本地和远端)形式的日志以及日志抽样

  • 支持按指定关键字(域名,url等)收集Tengine运行状态

  • 组合多个CSS、JavaScript文件的访问请求变成一个请求

  • 自动去除空白字符和注释从而减小页面的体积

  • 自动根据CPU数目设置进程个数和绑定CPU亲缘性;

  • 监控系统的负载和资源占用从而对系统进行保护

  • 显示对运维人员更友好的出错信息,便于定位出错机器;

  • 更强大的防***(访问速度限制)模块

  • 更方便的命令行参数,如列出编译的模块列表、支持的指令等

  • 可以根据访问文件类型设置过期时间;

  • ……



安装编译工具

yuminstall jemalloc jemalloc-devel -y   

或者

yumgroupinstall "Development Tools" "Server PlatformDeveopment"

 

建立nginx程序用户

groupadd-r www    

useradd-r -g www www -c "Web user" -d /dev/null -s /sbin/nologin    

 

安装依赖工具

Openssl:

cd/usr/local/src

wgethttp://www.openssl.org/source/openssl-1.0.1c.tar.gz

tar-zxvf openssl-1.0.1c.tar.gz

 

zlib:

cd/usr/local/src

wgethttp://zlib.net/zlib-1.2.8.tar.gz

tar-zxvf zlib-1.2.8.tar.gz

 

pcre:

cd/usr/local/src

tarzxvf pcre-8.30.tar.gz



1下载luajit2.0并安装

推荐使用lujit2.0以上做lua支持

ngx_lua如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。



http://luajit.org/download.html


wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz

 

make && make install


所以lib和include是直接放在/usr/local/lib和usr/local/include


2.源码安装Tengine

下载源码

wget http://tengine.taobao.org/download/tengine-2.1.2.tar.gz


tar xf tengine-2.1.2.tar.gz /usr/local/src/


./configure\

 --user=www --group=www\

 --prefix=/usr/local/nginx\

  --with-http_stub_status_module\

  --with-http_ssl_module\

--with-http_concat_module\

  --with-http_spdy_module\

  --with-http_gzip_static_module\

 --with-ipv6\

 --with-http_sub_module\

--with-ld-opt=-ljemalloc\

--with-openssl=/usr/local/src/openssl-1.0.1c\

    --with-pcre=/usr/local/src/pcre-8.30\

   --with-zlib=/usr/local/src/zlib-1.2.8\

  --with-http_lua_module\

  --with-luajit-inc=/usr/local/include/luajit-2.0\

 --with-luajit-lib=/usr/local/lib \


ln -s/usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2


查看 nginx -V 

wKioL1cXLhfQuk19AABk7Sre6FA103.png


安装ngx_lua_waf模块


防止sql注入,本地包含,部分溢出,fuzzing测试,xss,***F等web*** 

防止svn/备份之类文件泄漏 

防止ApacheBench之类压力测试工具的*** 

屏蔽常见的扫描***工具,扫描器 

屏蔽异常的网络请求 

屏蔽图片附件类目录php执行权限 

防止webshell上传


git clone https://github.com/loveshell/ngx_lua_waf.git


 cp -r ngx_lua_waf/ /usr/local/nginx/conf/waf



请提前新建/usr/local/nginx/logs/hack/目录***日志,并赋予nginx用户对该目录的写入权限。


mkdir-p /usr/local/nginx/logs/hack/

chown-R www:www /usr/local/nginx/logs/hack/

chmod-R 755 /usr/local/nginx/logs/hack/


使用说明:

nginx安装路径假设为:/usr/local/nginx/conf/

把ngx_lua_waf下载到conf目录下,解压命名为waf

在nginx.conf的http段添加

    lua_package_path "/usr/local/nginx/conf/waf/?.lua";
    lua_shared_dict limit 10m;
    init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 
    access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

配置config.lua里的waf规则目录(一般在waf/conf/目录下)

    RulePath = "/usr/local/nginx/conf/waf/wafconf/"

绝对路径如有变动,需对应修改

然后重启nginx即可

配置文件详细说明:

  RulePath = "/usr/local/nginx/conf/waf/wafconf/"  
 --规则存放目录  

   attacklog = "off"  
 --是否开启***信息记录,需要配置
 
 logdir  logdir = "/usr/local/nginx/logs/hack/"  
 --log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
 
   UrlDeny="on"  
   --是否拦截url访问  
 
   Redirect="on"  
   --是否拦截后重定向  
 
   CookieMatch = "on"  
   --是否拦截cookie***  
 
   postMatch = "on"
 --是否拦截post***  
 
 whiteModule = "on"
 --是否开启URL白名单
 
  ipWhitelist={"127.0.0.1"}  
  --ip白名单,多个ip用逗号分隔  
 
  ipBlocklist={"1.0.0.1"}  
  --ip黑名单,多个ip用逗号分隔
 
   CCDeny="on"  
   --是否开启拦截cc***(需要nginx.conf的http段增加lua_shared_dict limit 10m;)  
 
   CCrate = "100/60"
    --设置cc***频率,单位为秒.  
   --默认1分钟同一个IP只能请求同一个地址100次  

     html=[[Please go away~~]]  
   --警告内容,可在中括号内自定义  备注:不要乱动双引号,区分大小写

检查规则是否生效

部署完毕可以在其他机器尝试如下命令:

    curl http://xxxx/test.php?id=../etc/passwd
   返回"Please go away~~"字样,说明规则生效。