七、虚拟主机
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
由上可知,当访问 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
@Author:lanyy699
八、正反代理
正向代理
敏感问题,有兴趣自查
反向代理
敏感问题,有兴趣自查
二者比对
上述图解:
在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;
实际上,Proxy在两种代理中做的事情都是替服务器收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代理
实际开发
通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:
@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" />
配置 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>
SessionID:<%=session.getId()%>
</br>
SessionIP:<%=request.getServerName()%>
</br>
<h1>tomcat1</h1>
</html>
@Author:lanyy699
三篇入门上手Nginx
许久未更,在此致歉,后续会逐渐恢复正常的更帖,一路前行,与君共勉。
前两篇跳转链已附下,方便食用
1.Nginx负载均衡的实现(科普篇)
2.Nginx负载均衡的实现(进阶篇)
3.Nginx负载均衡的实现(尾声篇)如上