一、Nginx是什么
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
以上摘自百度百科。
没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特点等局限并且各自的定位和发展都不尽相同。这也使得各个WEB服务器有着各自鲜明的特点。
Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。它是不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。
这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。
俄罗斯的工程师Igor Sysoev,他在为Rambler Media工作期间,使用C语言开发了Nginx。Nginx作为WEB服务器一直为Rambler Media提供出色而又稳定的服务。
然后Igor Sysoev将Nginx代码开源,并且赋予自由软件许可证。
Nginx是高性能的WEB服务器,最强大的三个功能是反向代理、负载均衡及动静分离。
二、反向代理
先解释一下什么叫WEB服务器的正向代理。
正向代理
正向代理类似一个跳板机,代理访问外部资源。
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了
正向代理服务器,用户可以知道web服务的数据库等系统的IP地址和端口号等敏感息,由于暴露了这些关键信息,容易遭受到恶意攻击所以安全性比较差。
正向代理的典型应用就是为火墙内局域网局域网客户端提供访问Internet的途径。其次使用正向代理还可以实使用缓冲特性减少网络使用率以及权限验证等功能(如上网权限:因为要连接互联网首先需要经过代理服务器)。
正向代理的用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息,只有正向代理服务器对外
反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理用到了反向代理服务器,使用反向代理,典型的应用是将防火墙后面的服务器提供给Intenet用户访问,隐藏了web应用服务,如数据库的IP地址、端口号等信息,提高了系统的安全性等,同时使用反向代理还可以实现多台服务器的负载均衡,启用高级的URL和管理技术,使处于不同web服务器系统的web界面同时存在一个URL空间下,提高系统性能。
反向代理的作用:
(1)保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载
三、负载均衡
名词解释:负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
大家都知道多进程、多线程在一定程度上可以提高并发量,增加可以工作的WEB服务器,让同一时刻来自客户端的多个请求,按照特殊的算法相对平衡的把请求分散到不同的服务器上去处理,这样就可以到达负载均衡的作用。
Nginx有下面几种负载均衡调度算法。
1、轮询(默认调度算法)
特点:每个请求按时间顺序逐一分配到不同的后端服务器处理,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。
upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
2、加权轮询
特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
适用业务场景:用于后端服务器硬件性处理能力不平均的情形。
upstream backendserver {
server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
}
3、ip_hash
特点:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。
upstream backendserver {
ip_hash;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
4、least_conn
特点:最少连接数优先,按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。
适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。
upstream backendserver {
least_conn;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
5、fair
特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。(需编译安装第三方模块 ngx_http_upstream_fair_module)
比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
适用业务场景:对访问响应速度有一定要求的业务。
upstream backendserver {
fair;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
6、url_hash
特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。(需编译安装第三方模块 ngx_http_upstream_hash_module)
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
适用业务场景:适用于后端服务器为缓存服务器时比较有效。
upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
hash $request_uri;
}
四、动静分离
动静是什么意思?
动态页面、动态资源
是指互联网架构中,不同用户不同场景访问,都不一样的页面,例如:百度搜索结果页、淘宝商品列表页、速运个人订单中心页,这些页面,不同用户,不同场景访问,大都会动态生成不同的页面。
静态页面、静态资源
是指互联网架构中,几乎不变的页面(或者变化频率很低),例如:首页等html页面、js/css等样式文件、jpg/apk等资源文件。
为什么要动静分离?
在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗。当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。
动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。
因此,动态资源转发到tomcat服务器我们就使用到了前面讲到的反向代理了。
###静态资源访问
server {
listen 80;
server_name static.haoworld.com;
location /static/imgs {
root /Users/Hao/Desktop/Test;
index index.html index.htm;
}
}
###动态资源访问
server {
listen 80;
server_name www.haoworld.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
转载文章
Nginx 相关介绍(Nginx是什么?能干嘛?)
正向代理&反向代理
web服务、正向代理、反向代理的一点理解
简单了解Nginx七层负载均衡的几种调度算法
【Nginx】实现动静分离