2017-04-04吕力腾讯课堂Coding学院
来源 /腾讯课堂Coding学院(ID:ke_coding)
Tips
记《Nginx实战之配置详解》课程总结。这门课程会介绍Nginx的功能,市场发展趋势,与apache等其他http服务器的对比,nginx的详细配置,大型静态网站的发展历史(最终到如今腾讯所使用的整体架构),以及腾讯网对nginx的配置经验,能够使学生从大的框架了解nginx,又能从细节配置理解nginx的使用。
1、摘要
Nginx主要作为HTTP和反向代理服务器被用户所熟悉,近年来得到长足的发展,目前拥有接近30%的市场占有率。Nginx具有占有内存少,并发能力强的优点,区别于Apache的较为笨重的设计,不理想的并发与消耗内存高的缺点。不同于apache的底层I/O使用select,Nginx使用epoll,在访问量巨大的网站部署会得到更好的性能,例如腾讯网的30000qps/c1。nginx提供简单的平滑升级控制,提供服务质量保证,社区活跃存在多种第三方模块,自身稳固发展具有越来越多的新特性。
Nginx遵循特定的逻辑处理Http请求,通过配置文件用户可以制订访问策略,Nginx配置文件中的指令具有低层继承高层的特性,利用优先级规则匹配server_name和location并提供相应的服务。
大型站点需要考虑的核心要素是智能调度、负载均衡、集群化和业务拆分,公司有gslb、tgw等技术,加上对nginx配置文件的模块化拆分管理,共同保障大型站点的服务质量。
2、文章结构
全文分为四个部分,第一部分介绍Nginx的历史,市场发展,与Apache的比较以及典型的用例;第二部分对Nginx的配置文件的规则进行描述,用于构建常规站点,第三部分介绍nginx构建大型站点的问题;第四部分为总结与展望。
3、什么是Nginx
Nginx读作[‘endʒɪn ‘eks],是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。作为一个WEB ENGIN,提供基础的Proxy(缓存、负载均衡)、Web Server(静态服务)、Application Server(Fast-Cgi)功能。
4、为什么选择Nginx
Nginx第一个公开版本0.1.0发布于2004年10月4日,截止2017年1月,nginx拥有28.3%的市场占有率,预计2017年下半年nginx将超越微软IIS,成为第二大WE供应商,仅次于Apache。Nginx因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名,腾讯网、腾讯视频的WEB ENGIN均使用的nginx,自建CDN使用的NWS、淘宝的Tenginx、Google的GWS也是基于Nginx。
Apache和nginx采用不同的网络IO模型,性能差异很大,通过下表中Apache和Nginx主要指标的比较,可以看到Nginx在负载均衡、稳定性、对静态文件的处理等几个性能指标已经优于Apache,并拥有更简单的配置。

随着网络技术的发展,越来越多的新特性被加入到nginx,例如动态模块的支持、端口复用、线程池、http2的支持,需要注意的是,这些高版本才有的新特性理论上能够对nginx的服务性能有较大提升,但或多或少都是不够成熟的技术,有些依赖与内核例如端口复用,有些如果没有注意应用场景可能适得其反例如线程池不大适合小文件系统,尤其是启用了线程池不适合cache,也不适合ssi,启用SSI发现页面片有空白现象。
另外值得一提的是Nginx的一个隐患,商业版本的推出使得开源版本并不具备一些只被集成到商业版本的好的功能,不过可爱的开发者们开发除了类似功能的第三方模块可以在github上供使用,开源的淘宝Tengin也可以作为一个不错的尝试。
5、nginx编译安装
考虑到定制化、软件包配置等文件的管理,是否便于批量部署分发等方面,推荐使用源码编译的方式而不是RPM安装。
nginx的源码编译安装遵循官网的三步曲:
1、Downloading the Sources
2、Configuring the Build Options
Nginx默认编译了很多模块(上面的官网链接可查),非默认编译的模块如若需要编译需要在config中配置,也可以移除某些不需要的默认模块,例如
3、Completing the Installation
Nginx控制
详情查阅官方文档,安利osx下的dash和windows下的zeal,很好的文档api管理软件,提供丰富的官方文档资源。
Nginx启动
Nginx重新应用配置文件
Nginx立即停止
Nginx平滑升级二进制
1、重命名旧的bin文件,并将新的bin文件拷贝过来
手动备份旧二进制
知正在运行的旧进程,准备升级
$ kill -s USR2 $(cat $PIDFILE) //旧的进程pid文件会被改名为nginx.pid.old并启用新的二进制拉起新master
3、gracefully关闭旧master的worker
若失败,使用一下两种方式之一回退:
方法一
重新拉起旧master的worker
然后gracefully关闭新master的worker和新master本身
方法二
直接强制立即杀掉新master的worker和新master本身,旧master会自动重新拉取worker
4、gracefully杀掉就master
6、nginx配置
Nginx的处理逻辑
Nginx接受到http请求后有一个固定的处理逻辑,如下图所示,这个处理逻辑便于用户理解Nginx的工作模式,以及一些问题的定位。
配置文件的构造
课上老师给了一个典型的例子,配置文件由全局指令(directive,如worker_process),大的block块(如http)组成,block块里面会有小的context块(如location),解释了大部分的指令的含义,比较重要的如监听端口listen,虚拟主机名servername, 映射的根目录root等。
而这些指令的作用域与大部分编程语言的变量类似,有一个覆盖与继承的逻辑,如若在不同的块中存在同样的指令,子块是会继承父块的指令,而作用域小的会覆盖外层的指令,如下面的图中所示。
server_name与location的匹配规则
必须要了解server_name和location的匹配规则,用户才能够准确设计出一套针对不同域名、IP、端口的http请求配置以用户指定的响应。
server_name的规则
server_name的匹配按照下图中的优先级,nginx维护3颗树,分别是精确匹配、前缀通配符匹配、后缀通配符匹配,nginx会依次在这三颗树中查找,若找不到,会依照配置文件中的顺序查找正则匹配,第一个找到的正则匹配为所需要的。如果没有一个与请求的domain匹配,则会去寻找默认的server,用default_server指令在listen指令那一行的末尾指定,如果没有指定default_server则选择该监听端口的第一个server。
location的规则
location的规则按照精确匹配的原则,优先级整理归纳如下图,若同一优先级内有多个匹配中,生效的是配置文件中写在最前面的location。
7、大型站点的构建
EB站点的发展历程
WEB站点的发展是互联网硬件与WEB软件技术发展的体现,早起的WEB站点就是单机,访问量少,毕竟网民不多,带宽不大,各种技术不成熟。而随着互联网技术的发展,国家网络的建设,带宽的增大,更好的用户体验成为WEB站点维护者的目标,进而衍生出使用WEB ENGIN做代理进行缓存加速。随着业务的庞大,拆分业务变得必要,为了维护大中型WEB站点的服务保障,服务器集群、多地部署、各种负载均衡的策略出现,例如公司的智能dns GSLB,用于负载均衡的LVS和公司的TGW,如下图所示。
一个例子,qzone现在所用到的复杂的WEB架构,庞大而井井有条,一个用户的请求到源服务器中间的跳数增加了,链路复杂了,然而体验却更好了。一个普通用户发起的http请求首先由dns协议通过域名会从gslb请求到最近的cdnoc节点的ip,保障有较好的接入,而oc节点到源idc维护着高速通道,下图很好的展示了用户从发出请求到收到回包的整个过程。
通过nginx配置文件的拆分保障大型站点的服务质量
大型站点流量巨大,虽然已经有了集群、异地部署、负载均衡等方式提供有效的服务与灵活的配置,然而当需要做变更,或者遇到机器故障的情况下如何快速自动地恢复,如何保证配置的可维护性和一致性呢?那就来拆nginx的配置,如下图中将变动的业务属性从公共属性中拆分,并利用nginx的反向代理负载均衡设置回源等。例如将接入层和中间层同城部署,但为了容灾,允许跨城流量存在,但权重要低或者异地回源直接设置成backup;使用指令roxy_next_upstream指令设置网状回源,只要有1台服务器文件存在,就不会出现404。
课上老师给了腾讯网的配置实例,腾讯网的拆分策略以及公共配置如下,规则简单来理解就是变动的部分,业务的属性拆除去单独配置,并用include指令在公共属性的主配置文件中进行引用。
按照这个思想我实践了一下,将织云香港代理的nginx配置拆分成了下图中的几个部分。
8、总结与展望
从目前的市场规律看,Nginx是很有前途的,虽然商业化了,对虽然商业化了,就不谈它的商业化了。nginx免不了与apache比较,这个仁者见仁,还是看应用场景,需要高性能轻量那nginx可能更合适,主要它社区活跃啊。使用一个工具创造的价值往往不在工具本身,而在它的应用上,如果想在工具本身创造价值,那就要啃源码,这是我的展望。
文章转自:腾讯课堂Coding学院
温馨提醒:
1、微信端搜索课程
在“腾讯课堂”官方微信里,回复你想学习的内容,即可快速找到你期待的课程哦!
2、学习方式
【电脑端】
*可通过登录ke.qq.com进入学习;
*可通过windows PC版QQ客户端面板上的课堂入口进入学习。
【移动端】
*下载APP “腾讯课堂”即可进入学习;
*关注微信公众号或者手Q公众号“腾讯课堂”,进入学习。
(注:微信和QQ的课程报名信息独立,登录时请选择对应的登录方式)

网友评论