阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 30638阅读
  • 21回复

[服务器教程]NGINX(Tengine)从入门到精通

级别: 研究猿
发帖
4672
云币
1641
— 本帖被 梦丫头 从 弹性计算 移动到本区(2014-03-18) —
NGINX简介 nW&$~d  
NGINX(通常读取“恩紧克斯/Engine X”),是开源的HTTP,HTTPS,POP3,SMTP,IMAP协议反向代理服务器,也因其负载均衡、HTTP CACHE、常规伺服而功能而出名。NGINX尤以其高并发、高效率、低内存占用而闻名于世。并且其要类BSD协议授权开源发布,被很多世界上著名互联网企业商用,如淘宝、百度、亚马逊、腾讯、新浪、CloudFlare等企业。其中有优惠互联网公司进行功能定制,二次开发,比较著名的有:CloudFlare-Nginx、Tengine(由淘宝某部和搜狗等互联网公司部门维护)、Openresty。 #{w5)|S#JD  
gfVDqDF  
2f`xHI/@fj  
因为NGINX现在已经商业运作,很多高级功能在免费开源版本里面并未发布,而绝大多数功能已经被Tengine集成进了Tengine的里,所以,本文章可能不适用于常规NGINX,但应当适用于绝大多数Tengine的版本(截止作者发文时,Tengine最新版本是1.50)。 5&qY3@I7l  
因为Linux分支比较多,而阿里云论坛常用的Linux系统应属CentOS,所以安装、SHELL等仅适用于CentOS。 1"$R 3@s;  
本帖子重点介绍Tengine的基础配置、和一些高级Scripting、安全配置和攻击应急处理等。 q u:To7  
:A*0]X;  
f+^c@0que  
Ps7_-cH  
L?.7\a@  
历史 h60\ Y 8  
NGINX作者是Igor Sysoev,俄国人,起初NGINX只是Igor的个人项目,现在已经成立NGINX INC.公司商业运作。 "GLYyC  
Tengine历史请见http://tengine.taobao.org/index_cn.html #动态# J=P;W2L  
CK Mv7  
tGqQJT#mr7  
1g81S_T .  
`uhL61cMp  
安装 {9'hOi50  
lnmp强化版(默认安装成tengine)一键包安装 {]@Qu"M  
4 4<v9uSK  
centos执行: E- KK  
  1. wget -c http://hexdata.qiniudn.com/lnmp1.0-full.tar.gz && tar zxvf lnmp1.0-full.tar.gz && cd lnmp1.0-full && ./centos.sh
<>&89E%j'  
[>wzl"cHW  
ubuntu执行: %Il;B~t  
  1. wget -c http://hexdata.qiniudn.com/lnmp1.0-full.tar.gz && tar zxvf lnmp1.0-full.tar.gz && cd lnmp1.0-full && ./ubuntu.sh
PAr|1i)mB  
#!Ze\fOC  
debian执行: Es~DHX  
  1. wget -c http://hexdata.qiniudn.com/lnmp1.0-full.tar.gz && tar zxvf lnmp1.0-full.tar.gz && cd lnmp1.0-full && ./debian.sh
B%y! aQep  
4UazD_`'  
至于mysql密码、是否使用innoDB引擎(建议选择Y)、MySQL版本(建议老版本)、PHP版本等(建议老版本),需要站长根本自己网站的业务自定义。 `:R-[>5P8  
^^'[%ok  
fX""xT NPi  
至此,安装教程基本完成,读者可以进入下一楼:conf配置和scripting
[ 此帖被enj0y在2013-08-15 19:33重新编辑 ]
本帖最近评分记录: 3 条评分 云币 +15
susan20120530 云币 +5 您的帖子很精彩!希望很快能再分享您的下一帖! 2013-08-16
cn0555 云币 +5 好帖要顶! 2013-08-05
牛逼王 云币 +5 感谢分享技术文章 2013-08-05
级别: 研究猿
发帖
4672
云币
1641
只看该作者 沙发  发表于: 2013-08-05
NGINX CONF配置和CONF SCRIPTING应用 M!xm1-,[  
. 1{vpX  
yDCooX0  
z4%Z6Y  
*.scripting教学来自章亦春老师的Nginx Conf Scripting PPT: oyKt({  
http://agentzh.org/misc/slides/recent-dev-nginx-conf jyY^iQ.2  
)z ?&" I  
Q9Y9{T  
NDs]}5#   
章亦春老师的Introduction to nginx.conf scripting中文版【译】 Ev$-P X  
;55tf l  
F8|5_214'  
原PPT:http://agentzh.org/misc/slides/nginx-conf-scripting/ +P> A P&  
翻译版: +WV_`Rx#  
4%',scn  
在NGINX这片大陆上说句hello吧!
  • >/kPnpJ  
    # 编译时启用echo-nginx-module模块(https://github.com/agentzh/echo-nginx-module g9FVb7In_  
    $ ./configure --prefix=/opt/nginx \ ZbZAx:L  
               --add-module=/path/to/echo-nginx-module
  • +(I`@5  
  • 3]:p!Y`$  
    配置文件
  • v$.JmL0^J  
    location = '/hello' {
  • Z?.p%*>`T=  
       echo "hello, world!";
  • 1A`?y& Ll  
    }
r2E>sHw  
Up /eV}C  
    测试效果 )"pxry4v7J  
     $ curl 'http://localhost/hello' #注:CURL URL是下载并输出 1,%#O;ya  
     hello, world! yVmtsQ-}a  
    上面我们成功地让我们的NGINX输出了"hello, world!",聪明的你会知道,这是静态化输出的,那么可不可以参数化输出呢?比如请求时加上person GET参数,就输出hello   参数值。答案是可以的: 9d,]_l.sB  
带参数化的echo输出
  • (N~zJ .o  
    配置文件
  • = h<? /Krs  
    location = '/hello' {
  • FkJ>]k  
       echo "hello, $arg_person!";
  • ^?K?\   
    }
gT5Ji~xI  
     测试效果 fo!Lp*'0  
    $ curl 'http://localhost/hello?person=agentzh' Q[ 9rA  
    hello, agentzh! DiYJlD&  
    $ curl 'http://localhost/hello' _Pfx_+  
    hello, ! :~0^ib<v;  
cvs"WX3  
细心的你可以发现,当没给person参数时,"hello,  "和"!"之间不再输出任何值。我们可不可以设置一个默认值呢? <mo^Y k3  
带默认值的变量scripting
  • ?;.1fJU>  
    配置文件
  • 08K.\3  
    location = '/hello' {
  • E-tNB{r@  
           if ($arg_person = '') {
  • qV,$bw  
               echo "hello, anonymous!";
  • jy__Y=1}  
               break;
  • P/gb+V=g!  
           }
  • \MFWK#W  
           echo "hello, $arg_person!";
  • Wf`Oye Rz  
       } 7QOC]:r  
hPqapz]HcP  
    测试结果 \}4#**]  
    $ curl 'http://localhost/hello?person=agentzh' ko+M,kjwR  
    hello, agentzh! j]F#p R}p  
O%++0k;  
    $ curl 'http://localhost/hello' N5w]2xz!  
    hello, anonymous! 9i2vWSga  
'/yx_R K2?  
    其实不使用IF判断也可以实现上述功能。不过需要在编译NGINX时新增两个模块: ^?^|Y?f2P?  
         # enable the ngx_set_misc module and ;aRWJG  
         #  Marcus Clyne's ngx_devel_kit in your nginx build 4}_w4@(  
         $ ./configure --prefix=/opt/nginx \ r/q1&*T  
                   --add-module=/path/to/echo-nginx-module \ "za*$DU  
                   --add-module=/path/to/ngx_devel_kit \ YI),q.3X~  
                   --add-module=/path/to/set-misc-nginx-module sei!9+bZr  
Uhx2 _  
    按上述方法编译后,使用下面的配置也可实现变量默认值的效果:
  • (krG0S:0Q  
    配置文件
  • $hE'b9qx  
    location = '/hello' {
  • .IAHy)li"  
           set $person $arg_person;
  • M4hN#0("4  
           set_if_empty $person 'anonymous';
  • 4;c_%=cU  
           echo "hello, $person!";
  • \$HB~u%dr  
    }
E?q'|f  
    测试结果 ;'18  
     $ curl 'http://localhost/hello?person=agentzh' ah6F^Kpl{  
     hello, agentzh! eUw;!Du  
     HG3>RcB  
     $ curl 'http://localhost/hello' I{g2q B$6  
     hello, anonymous! rgZ rE;*;  
K?OX  
    如果请求参数中带有UTF8字符会怎么样? 36Z`.E>~L  
    测试 (b 2^d  
     # sigh... VU'l~%ql  
     $ curl 'http://localhost/hello?person=章亦春' k&"qdB(I  
     hello, 章亦春 tA u|8aL  
,l? 76g  
    其实,使用set_unescape_uri可以将上述字符在输出时转换成utf8字符,而不是类似
[ 此帖被enj0y在2013-08-15 20:46重新编辑 ]
级别: 研究猿
发帖
4672
云币
1641
只看该作者 板凳  发表于: 2013-08-05
NGINX防御CC攻击教程 FBk_LEcX  
~jOn)jBRZ  
}@Dgr)*+  
CC攻击即http flood,以攻击成本低(只需数台http代理服务器即可实现攻击)、隐蔽性强(中小CC攻击一般不会造成网络瓶颈)、难防御(与正常访问的请求很难区分开)、威力强大(造成和DDOS流量攻击一样的效果,网站长时间无法打开)等特点著称。常规的http flood防御为JS弹回,二次请求验证加入白名单 和 多层缓存(七层、四层共同缓存)实现防御体。 _X/`7!f  
yKb+bm&5:'  
=ICakh!TO  
CC攻击,首先造成的后果往往是被攻击服务器CPU爆满、内存占用高、甚至磁盘IO高占用。通常服务器上有永远处理不完的任务,所以,CC攻击,也是以拒绝服务为目的的攻击,属于DDOS攻击中的一种。 'Z{_w s  
a 9H^e<g  
93]67PL#+  
那么CC攻击应该如何防御呢? WUfPLY_c(  
sngM4ikhs  
&CcUr#|  
首先站长朋友需要冷静下来,对手攻击你的项目,目的就是要你自乱阵脚,冷静下来,才好准备拔剑迎战。 EG; y@\]  
'2=$pw  
l.3|0lopX)  
分析量有多少: zu52]$Vj  
  1. netstat -an | grep ':80 ' -c
这是判断80端口的连接数,用这个数字与网站上第三方统计代码相比对,如果差距悬殊,甚至服务器卡到统计不出来,那么就肯定是CC攻击。 e]Q bC "  
如果资源占用太高甚至SSH命令执行都困难,先暂停一段时间的WEB服务(不要觉得失去什么,服务已经无法访问,何必留着继续耗资源?) "MX9h }7  
vlSSw+r9  
z-g"`w:Lj  
1.新手必备:限制访问速率 :41Ch^\E  
使用http://tengine.taobao.org/document_cn/http_limit_req_cn.html中的CONF字段配置限制语句 #详细后续编辑# X:kqX[\>  
8Ts_;uId  
>Y 8\I  
2.擒贼擒王:找出攻击共同特征 6(=>!+xpRr  
按连接数排序 2, R5mL$  
  1. netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
找出连接数最大的IP(假设是22.00.**.11),在日志中匹配 =4_Er{AT  
  1. cat /log/nginx/access.log | grep "22.00.**.11" | more
找出访问日志中攻击者所用工具的特征,然后尝试在conf中封禁掉。 S( Vssi|y  
~|kSQ7O^  
/OtLIM+7~{  
(Rs052m1  
3.报仇不留情:封禁 u !@(u!Qz  
+ rN&@}Jt.  
"f N=Y$G  
假如攻击者使用工具的UA包含“Bench”字段,那么可以在conf中屏蔽掉: dK d"2+fH  
x3tos!Y  
mi'3ibCG  
  1. location /{
  2.     if ( $http_user_agent ~ "Bench" ) {
  3.         return 444;
  4.     }
  5. }
pr.+r?la]  
{"WfA  
, aJC7'(  
+.pri  
oUNuM%g9Dy  
Pk/3oF  
附录:常见防御CC攻击算法 -"Hy%wE  
rS^+y{7  
hxQx$  
日志分析 FyV)Nmc%t  
将日志中访问频率过高的IP封禁 L?slIGp%-  
将日志中不符合人的特征的IP封禁(同一URL访问不合理次数等等) ROc)LCA  
#`(-Oj2hH  
@+P7BE}  
占位待编辑 <1(j&U  
zEYT,l  
[ 此帖被enj0y在2013-08-05 02:47重新编辑 ]
本帖最近评分记录: 1 条评分 云币 +14
susan20120530 云币 +14 你是我偶像 2013-08-12
级别: 程序猿
发帖
362
云币
379
只看该作者 地板  发表于: 2013-08-05
4楼不给你编辑了
级别: 科学怪人
发帖
9441
云币
14683
只看该作者 4楼 发表于: 2013-08-05
感谢分享技术文章
级别: 荣誉会员
发帖
1044
云币
1125
只看该作者 5楼 发表于: 2013-08-05
火钳留名
级别: 论坛版主
发帖
6215
云币
15223
只看该作者 6楼 发表于: 2013-08-05
     好东西 我前几天就被cc攻击 一开始没办法 最后还是根据ua特征封的
大家提问,请详细描述问题。
级别: 技术砖家
发帖
2678
云币
8106
只看该作者 7楼 发表于: 2013-08-06
好东西啊
级别: 小白
发帖
26
云币
44
只看该作者 8楼 发表于: 2013-08-09
Re阿里云版主教程帖NGINXTengine从入门到精通
谢谢分享
级别: 研究猿
发帖
4672
云币
1641
只看该作者 9楼 发表于: 2013-08-15
更新了一点内容。求分~~
级别: 码农
发帖
141
云币
204
只看该作者 10楼 发表于: 2013-08-15
Re服务器教程NGINXTengine从入门到精通
看不懂,凑个热闹
级别: 码农
发帖
131
云币
182
只看该作者 11楼 发表于: 2013-08-16
回9楼enj0y的帖子
求更详细的解说,为小白提供,感谢感谢。
级别: 小白
发帖
1
云币
2
只看该作者 12楼 发表于: 2013-09-26
Re服务器教程NGINXTengine从入门到精通
楼主那个一键包跟军哥那个版本号为什么出奇的相似?
本帖最近评分记录: 1 条评分 云币 +1
enj0y 云币 +1 其实就是军哥的,只是把默认的NGINX替换成了TENGINE,方便小白们使用 2013-09-26
级别: 科学怪人
发帖
9985
云币
21878

只看该作者 13楼 发表于: 2013-09-26
这标题,让我很蛋疼。
本帖最近评分记录: 1 条评分 云币 +1
enj0y 云币 +1 其实当时未写完,然后大批B事接连发生,没心情再写了 2013-09-26
级别: 小白
发帖
3
云币
3
只看该作者 14楼 发表于: 2013-09-28
Re服务器教程NGINXTengine从入门到精通
什么时候能升级好?
发表主题 回复主题
« 返回列表
«12»
共2页
上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)