[关闭]
@wangzhuanyun 2021-12-30T03:03:46.000000Z 字数 3290 阅读 1918

Nginx

springboot


代理

在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。

正向代理

访问外网(指在客户端进行一些设置)

反向代理

反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

负载均衡

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

nginx安装
1. 下载nginx包后解压到某盘(如:D盘nginx文件夹下)
2. 打开cmd,进入nginx下,输入命令start nginx.exe启动nginx
3. 浏览器输入127.0.0.1,进入nginx欢迎页面
4. 服务停止命令nginx -s stop 服务重启命令nginx -s reload

负载均衡简单设置
1.打开D:\nginx\conf目录下nginx.conf文件

  1. upstream servertest {
  2. server 192.168.1.146:8080 down;
  3. server 192.168.1.146:8081 weight=3;
  4. server 192.168.1.146:8082;
  5. server 192.168.1.146:8083 backup;
  6. }
  7. server {
  8. listen 80; #监听端口
  9. server_name localhost; #监听地址
  10. location / {
  11. proxy_pass http://servertest; #请求转向servertest 定义的服务器列表
  12. root html;
  13. index index.html index.htm;
  14. }
  15. }
  16. 说明:
  17. down:表示单前的server暂时不参与负载
  18. Weight:默认为1.weight越大,负载的权重就越大。
  19. max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  20. fail_timeout max_fails 次失败后,暂停的时间。
  21. Backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻

域名映射

  1. 找到电脑C:\Windows\System32\drivers\etc下host文件并打开
  2. 127.0.0.1 www.wzy.com 将www.wzy.com映射到127.0.0.1上
  3. 在nginx中配置server中server_name www.wzy.com

session共享解决方案

1.使用客户端的cookie作为存放登录信息的媒介
cookie是将用户登录信息存储在用户终端的数据载体,与session的最大区别就是,session是存储在服务器端的;所以这就很容易解决这种session的多台服务器共享问题。当我们客户端进行登录的时候,访问的是服务器a,登录成功之后我们将session抽取出来存放在客户端的cookie里面;然后当我们客户端第二次进行访问的时候,访问的是服务器b,这次我们先在服务器b去查找是否有登录成功的session,如果为空,我们再对客户端的cookie进行查找,如果cookie里面已经存储有session,那么再将cookie里面的session同步到服务器b,那么整个流程就能走通了,用户也不用再次登录;

优点:这种方法实现起来简单,方便,很容易上手操作,不会加大数据库的负担;

缺点:如果客户端把cookie禁掉了的话,那么session就无法同步了,而且cookie的安全性不高,很容易外部被伪造使用;



2.使用mysql数据库存储session
既然每个服务器都需要使用同一个session,那么我们可以将session存放在同一个数据库里面,每次访问的时候,我们去数据库check一下是否有这个session或者这个session是否过期,然后就可以进行多台服务器的session同步了;

优点:使用这种方法简单、方便,很容易上手操作;

缺点:使用数据库来同步session,会加大数据库的IO,增加数据库的负担;同时,每次访问都需要拦截请求、查询数据库,导致多一层访问的业务层以及浪费读取数据库session时间;



3.使用memcache或者redis等缓存机制存放session
使用memcache或者redis等分布式缓存机制存放session数据,是现在很多大型项目负载均衡同步session的热门方案;它的原理是项目都使用的是同一个地方的memcache或者redis的缓存,当用户登录的时候,会把session存放在缓存里面,之后不管访问的是项目的那一台服务器,都会从同一个地方去获取session缓存,这样就很轻松实现了session同步;

优点:用缓存来同步session,不会加大数据库的负担,也不用手动去判断session是否存在或过期,省去部分业务逻辑,同时,由于redis等缓存是存放于服务器端,安全性也大大提高;

缺点:memcache或redis把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache或redis不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。



4.ip_hash
nginx中的ip_hash技术能够将某个ip的请求固定到同一台后端应用服务器,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

  1. upstream servertest {
  2. server 192.168.1.146:8080 down;
  3. server 192.168.1.146:8081 weight=3;
  4. server 192.168.1.146:8082;
  5. server 192.168.1.146:8083 backup;
  6. ip_hash;
  7. }

优点:ip_hash算法可以把一个ip映射到一台服务器上,这样可以解决session同步的问题。这样每个访客固定访问一个后端服务器,可以解决session的问题;

缺点:使用ip_hash进行session共享,它的原理是为每个访问者提供一个固定的访问ip,让用户只能在当前访问的服务器上进行操作,保持了session同步的,但是也造成了负载不均衡的问题,如果当前用户访问的服务器挂了的话,那就会出现问题了;


5.springsession

  1. 导入jar
  2. <dependency>
  3. <groupId>org.springframework.session</groupId>
  4. <artifactId>spring-session-data-redis</artifactId>
  5.   <version>2.0.4.RELEASE</version>
  6. </dependency>
  7. 编写
  8. @Configuration
  9. @EnableRedisHttpSession
  10. public class RedisSessionConfig {
  11. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注