临头一砖——代理服务器Nginx

前言

不讲虚头八脑的东西,我们来看一下Nginx服务器能干什么?

  • 反向代理
  • 负载均衡
  • 动静分离

反向代理

注意看图的蓝色背景部分框起来的。
了解反向代理前先理解一下正向代理:

  • 简单的说就是多个客户机对应一个代理服务器(在本地局域网),对应一个云端服务器。中间的代理(Proxy)服务器负责转发到请求转发到公网(Intenet)。从某种意义上说,“客户端和正向代理服务器像是位于同一个局域网(LAN)”,就是学校内网机房的那种模式。
  • 这样的好处就是通过代理服务器访问Intenet,可以起到一个缓存作用以及防火墙的作用。缓存:将一些常使用资源放到代理服务器,客户端便直接通过ftp传输文件了;防火墙:内网不允许访问小网站,他那里都看得到设置的访问权限(你不给你转到公网对应的网站)。

临头一砖——代理服务器Nginx_第1张图片
而反向代理:

  • 简单的说就是多对多的形式,多个客户机,对应一个代理服务器(在云端),对应多个服务器。
  • 即访问www.coolboy.com/a.html;和该网站的b.html,两个文件可以放到不同的tomcat服务器进行分别请求数据。
  • 其设置是在nginx设置如果请求a则转到tomcat1上去请求,b则去tomcat2请求。
  • 反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

负载均衡

在上面的反向代理中我们可以将请求分发给不同的服务器,那么我们就能控制服务器处理的请求量,从而实现——负载均衡。
临头一砖——代理服务器Nginx_第2张图片

动静分离

有两种实现形式:

  1. 一种是将静态资源单独分离在一个服务器上,也就是挂CDN(Content Delivery Network,即内容分发网络),内容服务基于缓存服务器,也称作代理缓存(Surrogate)。
  2. 另外一种就是Nginx将动态资源放到tomcat分发请求,静态资源放到Nginx服务器的服务器上直接给出。

负载均衡的几种轮询策略

  • 轮询(服务器轮着处理)【默认】
  • weight(权重):权重越高被分配的客户请求越多
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
  • ip_hash(一ip一服务器)
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
  • fair(谁有空就分给谁)【第三方】
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}

5、url_hash(一资源一服务器)【第三方】
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

具体配置文件

nginx配置由三块组成:

  1. 全局块:全局配置,影响nginx运行的配置,;
  2. events块:主要影响nginx服务器与用户的网络链接;
  3. http块(主要配置块:代理、日志、缓存):也分为:http全局快和server块。

PS:location支持正则表达式噢!笔者用的是MarkDown编写,因为‘#’注释的原因就不贴配置代码了,网上一大堆,随意附上一个:完整的Nginx配置代码,或者参考文献的视频教学——“nginx的配置文件”,这种东西并不难。

关于分发服务带来的一些问题(高可用)

也许聪明的你发现了,分发到不同的tomcat服务器,如果是session这种域的信息那岂不是无法共享了?
我们先来了解一下session是怎么来的,这里我直接引用了一篇博客的文章,人家写的挺好的,就不累述了,参考文献有链接。

  • 总结一下:session通过HttpServletRequest创建后,后台存放session信息对象并生成独一无二的sessionid(相对于其它服务器也是独一无二的)。用户通过这个sessionid来获取服务器里面的session信息对象。

那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

那么怎么解决session共享问题呢?

1、不使用session,换用cookie;

session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session然后把它放到cookie里面,当你的请求被分配到B服务器时,服务器B先判断服务器有没有这个session,如果没有,再去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到服务器B,这样就可以实现session的同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

2、session存在数据库(MySQL等)中

可以配置将session保存在数据库中,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。

说明:用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。

3、session存在memcache或者redis中

memcache可以做分布式,php配置文件中设置存储方式为memcache,这样php自己会建立一个session集群,将session数据存储在memcache中。

说明:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

4、nginx中的ip_hash。最简单也是最好的方法,符合WEB开发的同源性策略

主备模式

从上面来看,一台tomcat挂掉后是不影响工作的(其它的tomcat服务器可能压力变大而已),但是如果nginx挂掉了呢?因此采用主备模式,两台nginx来保证项目的运行,备用的nginx一般是不用的。我们采用keepalived来实现。
临头一砖——代理服务器Nginx_第3张图片
PS:Redis和Nginx都最好用在Linux系统上,因为他们都在Linux系统上支持的IO的多路复用噢,windows就不支持了~

参考文献:
session的来由
解决sesion共享问题
跨域

图片来源以及整体知识体系:百度以及尚硅谷教学视频

你可能感兴趣的:(Web开发技术栈)