Nginx负载均衡的实现(尾声篇)

七、虚拟主机

7-1、何为虚拟主机

虚拟主机使用的是特殊的软硬件技术,它将网络服务器分出一定的磁盘空间,将运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,用户可以租用此部分空间,以供用户放置站点及应用组件,Ta具有独立的域名,具有完整的Internet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能,这种被虚拟化的逻辑主机被形象地称为“虚拟主机”。

优点

由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低。许多企业建立网站都采用这种方法,这样不仅大大节省了购买机器和租用专线的费用,网站服务器管理简单,诸如软件配置、防病毒、防攻击等安全措施都由专业服务商提供,大大简化了服务器管理的复杂性;同时也不必为使用和维护服务器的技术问题担心,更不必聘用专门的管理人员。

类别

1、基于域名的虚拟主机,通过域名来区分虚拟主机

2、基于端口的虚拟主机,通过端口来区分虚拟主机

3、基于 ip 的虚拟主机,很少用,不赘述,有兴趣自查。

7-2、基于域名的虚拟主机

http {
	upstream shsxt{
        server srv1.example.com;
        server srv2.example.com;
    }
    upstream bjsxt{
    server srv3.example.com;
    server srv4.example.com;
    }

    server {
    	listen 80;
		//访问 sxt2.com 的时候,会把请求导到 bjsxt 的服务器组
            server_name sxt2.com;
        location / {
            proxy_pass http://bjsxt;

		}

	}

    server {
    	listen 80;
		//访问 sxt1.com 的时候,会把请求导到 shsxt 的服务器组里
		server_name	sxt1.com;
        location / {
            proxy_pass http://shsxt;
        }
    }
}

注意:基于域名的虚拟主机 在模拟应用场景时,需要在 windows 系统的 hosts 文件里配置域名映射。路径如下(C:\Windows\System32\drivers\etc\hosts)

如上配置完成后,将 sxt1 和 sxt2 的域名映射到 nginx 服务器 IP 上。启动 nginx 后,分别访问 sxt1.com ,sxt2.com

image-20201011200910638

由上可知,当访问 sxt1.com 的时候,nginx 将请求分发给了 tomcat20 和 tomcat21

当访问 sxt2.com 的时候,nginx将请求分发给了 tomcat22.

7-3、基于端口的虚拟主机

http {
    upstream shsxt{
        server srv1.example.com;
        server srv2.example.com;
    }
    upstream bjsxt{
        server srv3.example.com;
        server srv4.example.com;
    }
    server {
        //当访问 nginx 的 80 端口时,将请求导给 bjsxt 组 listen 80;
        server_name localhost;
        location / {
            proxy_pass http://bjsxt;
        }
    }
    server {
        //当访问 nginx 的 81 端口时,将请求导给 shsxt 组 listen 81;
        server_name localhost;
        location / {
            proxy_pass http://shsxt;
        }
    }
}

当访问 nginx 的 80 端口时,请求被分发给了 tomcat20 和 tomcat21

image-20201011221612103

@Author:lanyy699

八、正反代理

正向代理

敏感问题,有兴趣自查

反向代理

敏感问题,有兴趣自查

二者比对

img

上述图解:

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;

在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

实际上,Proxy在两种代理中做的事情都是替服务器收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代理

实际开发

通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:

img

@Author:lanyy699

九、Session

http协议是无状态的,即你连续访问某个网页 100 次和访问1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session 的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离 http 协议以及任何现有的 web 技术

session的常见实现形式是会话 cookie(session cookie),即未设置过期时间cookie,这个 cookie 的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。

9-1、Session共享

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 id 在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的 session 数据可能存在其中一台机器,这个时候就会出现取不到 session 数据的情况,于是 session 的共享就成了一个问题

9-2、Session一致性解决方案

1、session 复制

– tomcat 本身带有复制 session 的功能。

2、共享 session

– 需要专门管理 session 的软件,

– memcached 缓存服务,可以和 tomcat 整合,帮助 tomcat共享管理 session。

9-3、安装memcached

安装 memcached 内存数据库

yum –y install memcached

可以用 telnet localhost 11211查看端口

web 服务器连接 memcached 的 jar 包拷贝到 tomcat 的 lib目录下

配置 tomcat 的 conf 目录下的 context.xml

<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.17.9:11211"
sticky="true"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />

image-20201011224344362

配置 memcachedNodes 属性,配置 memcached 数据库的 ip 和端口,默认 11211,多个的话用逗号隔开

操作目的?
让 tomcat 服务器从 memcached 缓存里面拿 session 或者是放 session

创建修改 index.jsp,取 sessionid 看一看

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%> <html lang="en">

    SessionID:<%=session.getId()%>
    </br>
    SessionIP:<%=request.getServerName()%>
    </br>
    <h1>tomcat1</h1>
    </html>

image-20201011224740436

    SessionID:<%=session.getId()%>
    </br>
    SessionIP:<%=request.getServerName()%>
    </br>
    <h1>tomcat1</h1>
    </html>

@Author:lanyy699

三篇入门上手Nginx

许久未更,在此致歉,后续会逐渐恢复正常的更帖,一路前行,与君共勉。
前两篇跳转链已附下,方便食用
1.Nginx负载均衡的实现(科普篇)
2.Nginx负载均衡的实现(进阶篇)
3.Nginx负载均衡的实现(尾声篇)如上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会撸代码的懒羊羊

打赏5元,买杯咖啡醒,继续创作

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值