一. 背景说明
Nginx是一个高性能的HTTP和反向代理服务器,自诞生起,以其稳定性、丰富的功能集、示例配置文件和低系统资
源的消耗而闻名。在高连并发的情况下,Nginx是Apache服务器不错的替代品:能够支持高达50000个并发连接数的响
应。因此其作为web服务器被广泛应用到大流量的网站上,包括腾讯、新浪、网易等访问量巨大的网站。
二.为什么选择Nginx
(1) 更快
这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的
并发请求),Nginx可以比其他web服务器更快的饿响应请求。
(2)高扩展性
Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对
摸一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。这种低耦合度的优秀设计,早就了Nginx庞
大的第三方模块。
(3)高可靠性
高可靠性是我们选择Nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务
器上大规模使用Nginx。Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的
常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子
进程提供服务(在后续章节的demo中会演示该过程)。
(4)低内存消耗
一般情况下,10000个非活跃的HTTPKeep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的
基础。
(5)单机支持10万以上的并发连接
这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量
并发请求。理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。
(6)热部署
master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7*24小时不间断服务的前提
下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
三.关于反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网路上
的服务器,并将从服务器得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
通俗的说,反向代理方式实际上就是一台负责转发的代理服务器,冒死充当了真正服务器的功能,但实际上并不
是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。例如我们让Nginx监听一个9999端
口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完成后,tomcat返回,但数据此时没
直接返回,而是直接给Nginx,由Nginx进行返回,这里,我们会以为是Nginx进程了处理,但实际上进程处理的tomcat。
由于Nginx具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务于,通常
Nginx会被配置为即是静态web服务器也是反向代理服务器,不适合Nginx处理的请求就会直接转发到上游服务器中处
理。因此我们可以用Nginx缓存那个静态文件,比如CSS,JS,HTM,PNG,JPEG等文件。
下面将会用一个例子来演示Nginx的反向代理的配置过程。
(1) 首先我们要先下载软件。可以到官网下载http://nginx.org/en/download.html。由于我的电脑是Mac OS的, 所
以我下载的Mac版本的。但基本的操作在各个系统都类似。直接cd到下载的目录中,然后输入start nginx即可。在浏览
器地址栏中输入http://localhost,如果启动成功的话我们会看到如下界面:
(2) 我们在Nginx的安装目录中找到nginx.conf,可以看到
(mac版本的默认的监听端口是8080,windows版本的默认的监听端口是80).
这是nginx.conf最基础的配置,下面我们来简单介绍一下:
listen:表示当前的代理服务器监听的端口,注意,如果我们配置了多个server,这个listen要设置成不一样(我在这里监
听的9999)。
Server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,也就是Nginx本地的文件夹内。
Location:表示匹配的路径,后面的“/”表示匹配了/的所有请求会被匹配到这里。
Root:root表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对于我们将Nginx作为静态文件
缓存很有作用,我们可以把那些静态的文件都放在一个文件夹里,然后root指向这个路径即可。
Index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找
第二个,依次类推。
下面我们将介绍如何进行反向代理,其实很简单,我们只要更改location模块内的配置即可(#代表注释),如下图所示:
因为我的tomcat 7.0.68 是在8080端口的,可以根据自己的需要修改。这里有一个新元素proxy_pass,它表示代理路径,
相当于转发,而不像之前说的root必须指定一个文件夹。
此时我们修改了配置文件,我们需要reload一下nginx。
如果一切顺利,在浏览器地址栏中输入localhost:9999,我们会看到如下界面:
此时我们点击什么链接都是没有问题的,和访问http://localhost:8080一样。
上述小例子讲述了如何进行反向代理的配置,即将Ngnix作为代理服务器,tomcat作为上游服务器。
前面的例子让Nginx进行了转发,即所谓的反向代理。但实际上我们的需求不会是这样的,我们需要份文件类型来进
行过滤,比如jsp这种动态请求直接给tomcat处理,如前所述,nginx不适合处理动态的请求。而像html,css,js等一
些静态文件可以直接给nginx进行缓存。此处我们需要用到location已经在过滤时使用正则表达式。修改如下图所示:
我们可以打开root对应的路径看一下,该文件夹放置的静态文件:
该文件夹下主要放置的是tomcat首页的一些图片以及css等静态文件。修改完文件之后,还是需要reload一下。此时
我们在浏览器中输入http://localhost:9999。如下图所示:
当我们不指定jsp页面的时候,它会出现找不到,因为,此时并没有相应的location匹配,所以就会有404错误,这时
就跳到了nginx自定义的error页面了。
而当我们使用http://localhost:9999/index.jsp去访问时,我们看到了熟悉的页面:
而且图片那些都是显示正常,因为图片是png格式的,所以直接在tomcat/webapps/ROOT目录下直接查找,但是,如
果我们点击那些链接,例如Manager Application HOW-TO这个链接,我们发现:
这是因为html结尾的文件会被过滤到ROOT文件夹下,而该文件夹下并没有这个html文件,而是在docs下面的,所以就
会报错了。
五.关于负载均衡
作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平
均的分布到每一台上游服务器上。这里我来介绍下最基本的配置。
我们还是需要修改nginx.conf文件,在http模块里面新添加一个upstream 模块。并修改location中proxy_pass的参
数值。具体修改如下:
可以看见我们在upstream中添加了两台服务器,一台的8080对应的是tomcat7.0,而8088的对应的是tomcat8.5。此时,
我们reload之后,在浏览器地址栏中输入localhost:9999。我们发现页面显示有可能是tomcat7.0的主页,也有可能是
tomcat8.5的主页
此时,如果我们如果强制关掉其中任一个服务器(模拟一台服务器挂了),我们发现Nginx自动连接到另外一个服务器
中去了。
那如果我们只是希望一个服务器访问的机会比另外一个大,我们只需要在server后加上一个weight的权值即可,数字越
大,表面请求到的机会越大。如图所示:
此时我们再次刷新浏览器,我们发现tomcat8.5出现的概率明显大了很多。
HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议
封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层
协议。HTTPS使用的默认端口是443。
而在Nginx中我们也可以进行HTTPS虚拟服务器的搭建,具体如下:
这里我由于本机443端口被占用,这里我监听的4444端口。ssl_certificate 对应的是server.crt证书存放的url,
ssl_certifiate_key是密钥存放的url。此时我们访问https://localhost:4444,我们就又可以看到tomcat8.5的主页了。
然而对于用户而言,很多用户不了解http和https的区别,经常会误输,因此我们希望当用户输入http的,我们的页面还
是可以跳转到https的页面。在Nginx中也是可以做到的,保持上述配置不变,修改http服务器中的重转发地址即可,具
体配置如下:
此时,我们再次在浏览器中输入localhost:9999,我们发现浏览器跳转到了https://localhost:4444 上面。
七. 总结
因为篇幅有限,以上内容只对于Nginx主要的几个功能做了最简单的配置,Nginx还提供很多其他的个性化配置,
除此之外还有第三方的模块可供选择,甚至我们还可以自己编写http模块,为自己订制一个。其他的具体配置可参
考Nginx的wiki。