nginx是一个高性能的HTTP和反向代理服务器,也是一个通用的TCP/UDP代理服务器,最初由俄罗斯人Igor Sysoev编写。
nginx现在几乎是众多大型网站的必用技术,大多数情况下,我们不需要亲自去配置它,但是了解它在应用程序中所担任的角色,以及如何解决这些问题是非常必要的。
下面我将从nginx在企业中的真实应用来解释nginx在应用程序中起到的作用。
为了便于理解,首先先来了解一下一些基础知识,nginx是一个高性能的反向代理服务器
那么什么是反向代理呢?
代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。不管是正向代理还是反向代理,实现的都是上面的功能。
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。
正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
下面是一个nginx配置文件的基本结构:
events { } http { server { location path { ... } location path
NGINX 在网络应用中表现超群,在于其独特的设计。许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接。
NGINX 内部信息图从进程框架的顶层开始,向下逐步揭示NGINX如何处理单个进程中的多个连接,并进一步探讨其工作机制。
为了更好地理解这种设计模式,我们需要明白NGINX是如何运行的。NGINX拥有一个主线程,用来处理配置文件的读取、端口的绑定等特权操作,以及一组工作进程、辅助进程。
1 2 3 4 5 6 7 8 9 10 11 | # service nginx restart * Restarting nginx # ps -ef --forest | grep nginx root 32475 1 0 13:36 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 32476 32475 0 13:36 ? 00:00:00 _ nginx: worker process nginx 32477 32475 0 13:36 ? 00:00:00 _ nginx: worker process nginx 32479 32475 0 13:36 ? 00:00:00 _ nginx: worker process nginx 32480 32475 0 13:36 ? 00:00:00 _ nginx: worker process nginx 32481 32475 0 13:36 ? 00:00:00 _ nginx: cache manager process nginx 32482 32475 0 13:36 ? 00:00:00 _ nginx: cache loader process |
在这个四核服务器中,主线程创建了四个工作进程和一组缓存辅助进程(cache helper processes),后者
编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由姚四芳在高可用架构群分享。转载请注明来自高可用架构公众号「 ArchNotes 」。
姚四芳,新浪微博高级技术专家,微博平台架构组技术负责人。2012 年加入新浪微博,参与微博 Feed 架构升级,平台服务化改造,混合云等多个重点项目,现任微博平台架构组技术负责人,负责平台公共基础组建的研发工作。曾在 QCon 进行《新浪微博高性能架构》技术分享,专注高性能架构及服务中间件方向。
Nginx 使用的业务背景与问题
Nginx 以其超高的性能与稳定性,在业界获得了广泛的使用,微博的七层就大量使用了 Nginx 。结合 Nginx 的健康检查模块,以及动态 reload 机制,可以近乎无损的服务的升级上线与扩容。这个时候扩容的频次比较低,大多数情况下是有计划的扩容。
微博的业务场景有非常显著的峰值特征。既有例行的晚高峰,也有像元旦、春晚、红包飞这样的预期内的极端流量峰值。更有#周一见# #我们#等明星/社会事件引发的偶发峰值。之前通常的做法就是 buffer + 降级。在不考虑降级时(会影响用户体验)buffer 小了无法承担峰值大了则成本无法承受。因此,从 2014 年开始,就在尝试利用容器化来实现 buffer 的动态调整,从而实现依据流量对 buffer 按需扩/缩容,以节省成本开销。
在这种场景下,会有持续的大量的扩/缩容操作。业界基于 Nginx 的 backend 变更有两种常用的解决方案。一种是 Tengine 提供的基于 DNS 的,一种是基于 consul-template 的 backend 服务发现。下面的表格简单对比了两种方案的特点。
基于 DNS : 该模块由 Tengine 团队开发,可以动态的解析 upstream conf 下的域名。这种方式操作简单,只要修改 dns 下挂载的 server 列表便可。
缺点:
DNS 定期轮询解析 ( 30s ),若配置的时间过短如 1s,则对 DNS server 形成压力,配置的时间过长,则时效性会受影响。
基于 DNS 的服务下面不能挂过多的 server,会发生截断 ( UDP 协议 ),也会对带宽造成压力。
基于 consul-template 与 consul : 作为一个组合,consul 作为 db,consul-template 部署于 Ng
waf本身有测试环境,但是在公司内网,我有的时候在家比较有空,所以需要一个测试环境在本机,同时也方便测试。之前在本地搭建过nginx,编译安装,没啥问题,自己本身对nginx还算了解,故障排查啥的都不是大问题,然后抱着这个想法就搞起来了。
刚开始比较简单,就是下个lua,然后安装,过程不多说,直接搞下。
[root@localhost ~]# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz --2017-02-15 17:30:30-- http://luajit.org/download/LuaJIT-2.0.4.tar.gz Resolving luajit.org... 163.172.177.144 Connecting to luajit.org|163.172.177.144|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 847615 (828K) [application/octet-stream] Saving to: `LuaJIT-2.0.4.tar.gz' 100%[======================================>] 847,615 309K/s in 2.7s 2017-02-15 17:30:33 (309 KB/s) - `LuaJIT-2.0.4.tar.gz' saved [847615/847615]
安装:
[root@localhost ~]# tar xvf LuaJIT-2.0.4.tar.gz [root@localhost ~]# cd LuaJIT-2.0.4 [root@localhost LuaJIT-2.0.4]# ls COPYRIGHT doc dynasm etc Makefile README src [root@localhost LuaJIT-2.0.4]# make ==== Building LuaJIT 2.0.4 ==== make -C src make[1]: Entering directory `/root/LuaJIT-2.0.4/src'
Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib库,rewrite模块需要pcre库,ssl功能需要openssl库等。建议把这些库都安装上。
安装 PCRE
PCRE(Perl兼容正则表达式,Perl Compatible Regular Expressions),一个由Philip Hazel开发的,为很多现代工具所使用的支持正则表达式的函数库。
编译Nginx时需要用到PCRE,同时Nginx的Rewrite和http模块也要用到PCRE的语法!需要安装pcre包pcre-devel包。pcre包负责提供库的编译版本,pcre-devel包提供编译项目时用到的开发头文件和代码!
PCRE在linux系统里被其它的软件所依赖,所以一般的linux系统里都会装有,但是否是最新版本,是否满足要求,那就得看需求了。如果满足不了的话,还是需要编译安装最新版本的pcre软件。
检查系统中是否安装了PCRE软件
系统里是否安装了pcre软件,我们可以使用rpm 命令进行查询,如下命令
rpm -qa pcre
如果没有显示则表示还没有安装,如果显示了,刚表示安装了。如下图
上图表示系统已经安装过 pcre-6.6-9.e15 版本,但是没有安装 pcre-devel。
如果需要新版本,则需要卸载掉就版本,然后安装新版本。相关方法参看:
http://jingyan.baidu.com/article/f7ff0bfc6bc0472e26bb13bf.html
安装方法:
yum install pcre pcre-devel
yum 安装的文件可以用下面命令来找安装在那个目录下:
rpm –ql pcre
参考: http://blog.csdn.net/ngvjai/article/details/7997743
安装 openssl
安装方法:
yum install openssl openssl-devel
在安装 openssl 时,会把我们需要的其他 zlib库也做了安装。
安装 lua
yum安装:
yum install lua lua-devel
安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJIT。下面的源码例子就是安装LuaJIT
源码安装:
lua下载地址: http://luajit.org/
我这里下载的是:LuaJIT-2.0.1.tar.gz
一、背景
为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP ,拒绝提供服务。
二、架构
实现 IP 黑名单的功能有很多途径:
1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;
2、在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单;
3、在应用层