lnmp强化版(默认安装成tengine)一键包安装
lnmp强化版(默认安装成tengine)一键包安装
NGINX简介
NGINX(通常读取“恩紧克斯/Engine X”),是开源的HTTP,HTTPS,POP3,SMTP,IMAP协议反向代理服务器,也因其负载均衡、HTTP CACHE、常规伺服而功能而出名。NGINX尤以其高并发、高效率、低内存占用而闻名于世。并且其要类BSD协议授权开源发布,被很多世界上著名互联网企业商用,如淘宝、百度、亚马逊、腾讯、新浪、CloudFlare等企业。其中有优惠互联网公司进行功能定制,二次开发,比较著名的有:CloudFlare-Nginx、Tengine(由淘宝某部和搜狗等互联网公司部门维护)、Openresty。
因为NGINX现在已经商业运作,很多高级功能在免费开源版本里面并未发布,而绝大多数功能已经被Tengine集成进了Tengine的里,所以,本文章可能不适用于常规NGINX,但应当适用于绝大多数Tengine的版本(截止作者发文时,Tengine最新版本是1.50)。
因为Linux分支比较多,而阿里云论坛常用的Linux系统应属CentOS,所以安装、SHELL等仅适用于CentOS。
本帖子重点介绍Tengine的基础配置、和一些高级Scripting、安全配置和攻击应急处理等。
历史
NGINX作者是Igor Sysoev,俄国人,起初NGINX只是Igor的个人项目,现在已经成立NGINX INC.公司商业运作。
Tengine历史请见http://tengine.taobao.org/index_cn.html #动态#
安装
lnmp强化版(默认安装成tengine)一键包安装
下载地址:http://pan.baidu.com/s/1bn8eYCn
- tar zxvf lnmp1.0-full.tar.gz && cd lnmp1.0-full && ./centos.sh
复制代码
至于mysql密码、是否使用innoDB引擎(建议选择Y)、MySQL版本(建议老版本)、PHP版本等(建议老版本),需要站长根本自己网站的业务
在NGINX这片大陆上说句hello吧!
- # 编译时启用echo-nginx-module模块(https://github.com/agentzh/echo-nginx-module)
$ ./configure –prefix=/opt/nginx
–add-module=/path/to/echo-nginx-module - 配置文件
- location = ‘/hello’ {
- echo "hello, world!";
- }
测试效果
$ curl ‘http://localhost/hello’ #注:CURL URL是下载并输出
hello, world!
上面我们成功地让我们的NGINX输出了"hello, world!",聪明的你会知道,这是静态化输出的,那么可不可以参数化输出呢?比如请求时加上person GET参数,就输出hello 参数值。答案是可以的:
带参数化的echo输出
- 配置文件
- location = ‘/hello’ {
- echo "hello, $arg_person!";
- }
测试效果
$ curl ‘http://localhost/hello?person=agentzh’
hello, agentzh!
$ curl ‘http://localhost/hello’
hello, !
细心的你可以发现,当没给person参数时,"hello, "和"!"之间不再输出任何值。我们可不可以设置一个默认值呢?
带默认值的变量scripting
- 配置文件
- location = ‘/hello’ {
- if ($arg_person = ”) {
- echo "hello, anonymous!";
- break;
- }
- echo "hello, $arg_person!";
- }
测试结果
$ curl ‘h
ttp://localhost/hello?person=agentzh’
hello, agentzh!
$ curl ‘http://localhost/hello’
hello, anonymous!
其实不使用IF判断也可以实现上述功能。不过需要在编译NGINX时新增两个模块:
# enable the ngx_set_misc module and
# Marcus Clyne’s ngx_devel_kit in your nginx build
$ ./configure –prefix=/opt/nginx
–add-module=/path/to/echo-nginx-module
–add-module=/path/to/ngx_devel_kit
–add-module=/path/to/set-misc-nginx-module
按上述方法编译后,使用下面的配置也可实现变量默认值的效果:
- 配置文件
- location = ‘/hello’ {
- set $person $arg_person;
- set_if_empty $person ‘anonymous’;
- echo "hello, $person!";
- }
测试结果
$ curl ‘http://localhost/hello?person=agentzh’
hello, agentzh!
$ curl ‘http://localhost/hello’
hello, anonymous!
如果请求参数中带有UTF8字符会怎么样?
测试
# sigh…
$ curl ‘http://localhost/hello?person=章亦春’
hello, 章亦春
其实,使用set_unescape_uri可以将上述字符在输出时转换成utf8字符,而不是类似
NGINX防御CC攻击教程
CC攻击即http flood,以攻击成本低(只需数台http代理服务器即可实现攻击)、隐蔽性强(中小CC攻击一般不会造成网络瓶颈)、难防御(与正常访问的请求很难区分开)、威力强大(造成和DDOS流量攻击一样的效果,网站长时间无法打开)等特点著称。常规的http flood防御为JS弹回,二次请求验证加入白名单 和 多层缓存(七层、四层共同缓存)实现防御体。
CC攻击,首先造成的后果往往是被攻击服务器CPU爆满、内存占用高、甚至磁盘IO高占用。通常服务器上有永远处理不完的任务,所以,CC攻击,也是以拒绝服务为目的的攻击,属于DDOS攻击中的一种。
那么CC攻击应该如何防御呢?
首先站长朋友需要冷静下来,对手攻击你的项目,目的就是要你自乱阵脚,冷静下来,才好准备拔剑迎战。
分析量有多少:
[url=]复制代码[/url]
- netstat -an | grep ‘:80 ‘ -c
这是判断80端口的连接数,用这个数字与网站上第三方统计代码相比对,如果差距悬殊,甚至服务器卡到统计不出来,那么就肯定是CC攻击。
如果资源占用太高甚至SSH命令执行都困难,先暂停一段时间的WEB服务(不要觉得失去什么,服务已经无法访问,何必留着继续耗资源?)
1.新手必备:限制访问速率
使用http://tengine.taobao.org/document_cn/http_limit_req_cn.html中的CONF字段配置限制语句 #详细后续编辑#
2.擒贼擒王:找出攻击共同特征
按连接数排序
[url=]复制代码[/url]
- netstat -nat|grep ":80"|awk ‘{print $5}’ |awk -F: ‘{print $1}’ | sort| uniq -c|sort -n
找出连接数最大的IP(假设是22.00.**.11),在日志中匹配
[url=]复制代码[/url]
- cat /log/nginx/access.log | grep "22.00.**.11" | more
找出访问日志中攻击者所用工具的特征,然后尝试在conf中封禁掉。
3.报仇不留情:封禁
假如攻击者使用工具的UA包含“Bench”字段,那么可以在conf中屏蔽掉:
[url=]复制代码[/url]
- location /{
- if ( $http_user_agent ~ "Bench" ) {
- return 444;
- }
- }
附录:常见防御CC攻击算法
日志分析
将日志中访问频率过高的IP封禁
将日志中不符合人的特征的IP封禁(同一URL访问不合理次数等等)