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


  1. 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访问不合理次数等等)

发表评论

电子邮件地址不会被公开。 必填项已用*标注