nginx实现反向代理与动静分离

1 安装两个slaver

1.1 服务器配置

java37master:1G
java37slaver1:512M
java37slaver2:512M

1.2 创建虚拟机

  • 设置内存为512M

  • 设置网络

  • 设置主机名称并应用:java37slaver1+java37slaver2

  • 设置编码集

  • 设置张号密码

  • 注意:如果出现错误:法获得VMCI驱动程序的版本:句柄无效

    https://blog.51cto.com/xuan97916/1909845
    

image

1.3 添加基本的配置

  • 安装ifconfig
* 查看ifconifg是否存在:ll /sbin/ifconfig   不存在
* 安装ifconfig: yum install ifconifg      缺少包
* 查看依赖的包:  yum search ifconifg       缺少net-tools.x86_64
* 安装依赖的包:  yum install net-tools.x86_64 -y
  • 安装vim
 yum -y install vim*
  • 安装rz
yum install lrzsz -y

1.4 安装jdk

  • 安装环境gc++
* yum install glibc.i686 -y
* yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6
# 如果第二步出错:执行一下命令:yum install --setopt=protected_multilib=false libgcc
* yum update libstdc++-4.4.7-4.el6.x86_64
* yum install gcc-c++	-y
  • 创建文件夹
mkdir -p /usr/soft
  • 把jdk的压缩文件上传到/usr/soft下
  • 压缩
  • 重命名为java11
  • 配置环境变量
vim /etc/profile
# 配置jdk11
export JAVA_HOME=/usr/soft/jdk11
#  export JRE_HOME=$JAVA_HOME/jre  #jdk11没有jre 不要配置
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
  • 加载配置文件
source /etc/profile
  • 验证
java
javac
java -version

1.5 安装tomcat

  • 上传tomcat的压缩文件到/usr/soft下
  • 解压
  • 重命名为tomcat9
  • 关闭防火墙
[root@java37master tomcat9]# systemctl stop firewalld.service #关闭防火墙
[root@java37master tomcat9]# firewall-cmd --state   #查看防火墙状态
[root@java37master tomcat9]# systemctl status firewalld.service   #查看防火墙状态
[root@java37master tomcat9]# systemctl disable firewalld.service #关闭开机启动防火墙
  • 进入bin包启动tomcat
./startup.sh
  • 浏览器访问tomcat

1.6 两个slaver上面发布项目

  • 数据库使用master上的即可

  • 把war复制到slaver1和slaver2的webapps下

  • 开启tomcat

  • 浏览器访问即可

2 配置静态ip(三台都做)

2.1 查看三台服务器的名称

  • 应该不需要修改:安装虚拟机时已经指定
[root@java37master ~]# cat  /etc/hostname
java37master
[root@java37slaver1 ~]# cat  /etc/hostname
java37slaver1
[root@java37slaver2 ~]# cat  /etc/hostname
java37slaver2
  • 如果修改 需要重启虚拟机
reboot

2.2获取主机的网关(Gateway)

DNS域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网
[root@java37slaver2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.56.2    0.0.0.0         UG    100    0        0 ens33
192.168.56.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

2.3 设置每台主机的静态ip

[root@java37slaver2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@java37slaver2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" #配置静态ip::1 设置为static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="d0371869-480f-4966-b578-f4c19877545a"
DEVICE="ens33"
ONBOOT="yes"

#配置静态ip::2 添加以下五项
# 添加下面五项  配置静态ip
IPADDR=192.168.56.130   #当前主机ip  #每台主机的ip不同:
NETMASK=255.255.255.0
GATEWAY=192.168.56.2   #网关
DNS1=8.8.8.8   
DNS2=114.114.114.114
  • 重启网络
systemctl restart network

3 设置三台服务器的dns(三台都做)

3.1 概念

三台服务器之间 通过主机名即可访问对方

3.2 编辑/etc/hosts::

[root@java37slaver2 ~]# vim /etc/hosts
[root@java37slaver2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

#配置三台服务器的dns
192.168.56.128 java37master
192.168.56.129 java37slaver1
192.168.56.130 java37slaver2

3.3 ping测试是否可以通信

[root@java37slaver2 ~]# ping java37slaver2
[root@java37slaver2 ~]# ping java37slaver1
[root@java37slaver2 ~]# ping java37master1
PING java37slaver2 (192.168.56.130) 56(84) bytes of data.
64 bytes from java37slaver2 (192.168.56.130): icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from java37slaver2 (192.168.56.130): icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from java37slaver2 (192.168.56.130): icmp_seq=3 ttl=64 time=0.036 ms
64 bytes from java37slaver2 (192.168.56.130): icmp_seq=4 ttl=64 time=0.059 ms
...
^C
--- java37slaver2 ping statistics ---
19 packets transmitted, 19 received, 0% packet loss, time 18027ms
rtt min/avg/max/mdev = 0.032/0.056/0.135/0.029 ms

4 ssh免密登录

SSH 为 [Secure Shell]的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为[远程登录]会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 
目的:在一个链接中在三台服务器之间来回切换

4.1 生成公钥和秘钥(三台服务器都做)

  • ssh-keygen
[root@java37slaver2 ~]# ssh-keygen  #生成公钥和秘钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rg+D53FfFk6WXKuVR1oW1lAYWT3Q03zwnecCl5VZRp0 root@java37slaver2
The key's randomart image is:
+---[RSA 2048]----+
|             .*&^|
|              +E@|
|            . +.@|
|           . = O.|
|        S   * * o|
|     . .   + + o |
|    . = o   =    |
|     o * . o     |
|      o.. .      |
+----[SHA256]-----+
# 其间看提示 点击enter键  或者输入yes

4.2 把公钥和秘钥发给master(三台都做)

  • ssh-copy-id java37master
[root@java37slaver2 ~]# ssh-copy-id java37master
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'java37master (192.168.56.128)' can't be established.
ECDSA key fingerprint is SHA256:nbd7BL+4vc6QScOYqafO9p7KkxDkPb+On1BEOSRgdpc.
ECDSA key fingerprint is MD5:01:22:0b:dc:39:de:ac:6e:8a:c8:a4:00:09:71:e9:3b.
Are you sure you want to continue connecting (yes/no)? yes   #输入yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@java37master's password:   #输入密码

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'java37master'"
and check to make sure that only the key(s) you wanted were added.

4.3 查看master上的文件/root/.ssh/authorized_keys

[root@java37master ~]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHwdT7gfnM1szAO3iEbtwIv2UicU99N+oqHYSHoEuz8O+4QL1WRYmal1UoeF6AKTeO2FFJR60+mRfIH3orl8euLyh0cVkl4P9lN+SYoRFhnX2qfs5OmN/3p/GRt1g6EZCTGn/JPBAbCn3ueQefABq09DnduMYaFo5x5+Bc/KilRgdF6Eb7n4ha/WoZP530FdLUi1oAHMX4sobu2hHj7//ciptdFPje6VxMRPXHx2kdddL4FqxsYH1WlSZhuNC0ZlXZ7raV5dWwIxeSjw8293PRXuq3dkGRUF9VYD74onyN/U4msIBQ5ZNEf9l+28Hp6R65MJWSAirXWIoT3JEnS65n root@java37slaver2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/HW7pqOk4lSVbO36hn59k9FCa+I2iWc0D6Zb5VtPLxEqvyVXpd+bVLrDdqLyPimET3P4p9AsDQ+dp5EGaBQMNOyjlD0SHfFHvhF8GR+XPa9w7K6mnuniQZq1bylt0Kh4bXVaLAsyvIKUJLiMnElb0L2bFmuO6gBzze1JPAJ+aEwUBcxPVI+wr1M9IMMfOWknBf3dzLY3CBni+e9g+YacsimgGG6A6lFveuF5Wb19Z2mEn+Ep7Qt108FJoTIjxqzfCNlRChA1o4fdJx52sIHT8xtFT8uuQo2UekSScdVVROE1mrJj/Bco28K/cXyyQu3D5dIsLclN/Dthw61weiK47 root@java37slaver1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1zZxKdO/kYyOFBQJdkSADm6oMQXxQxxCHQXUitaPB3ckD0XI9awkUvuzUuaGr2ApHpaAXd6gZGBexbsWfWBBwZB6lRDzJZEajEblp5KGvcHJdDLzG1sMNfs4oxFOh0Gf2NeG0to/tbFnMOZ/hHUyy6KQv9BmPzIH6gEaMoNYxms/mr0NzEIVNNtXp9dke89x4nNkHsILXMKDhkvbXAjIieX9p2zCZEhTWrwuFS+AabnewjV3lCEAxxVQ4OlPTnWjdHlEmAtLq2ZiHL7YGPpSjdBqDINE9ams1EZZcQY+Qv2cZgmAeyXo1LePEtH/2XcqEUnbYEkSGRNhLQgiBm4QN root@java37master

4.4 把master上的此文件发给两个slaver(只在master上做)

  • scp 本地文件 远程登录用户名@远程主机:远程主机的目录
[root@java37master ~]# scp /root/.ssh/authorized_keys  root@java37slaver1:/root/.ssh
The authenticity of host 'java37slaver1 (192.168.56.129)' can't be established.
ECDSA key fingerprint is SHA256:S8/WIYoiYeX3yEKdkcW7blvb6VvY5K7HLdIgKgvE4FI.
ECDSA key fingerprint is MD5:62:6b:14:c3:14:cb:de:8c:a9:2b:6a:07:88:dd:07:18.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'java37slaver1,192.168.56.129' (ECDSA) to the list of known hosts.
root@java37slaver1's password: 
authorized_keys                                                                       100% 1199     1.0MB/s   00:00    
[root@java37master ~]# scp /root/.ssh/authorized_keys  root@java37slaver2:/root/.ssh
The authenticity of host 'java37slaver2 (192.168.56.130)' can't be established.
ECDSA key fingerprint is SHA256:YVz8ctecowRD4iP5833WxJRi1gd4O4vm1piMKh5Xrls.
ECDSA key fingerprint is MD5:93:96:8e:81:79:43:92:13:46:86:6b:53:31:80:58:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'java37slaver2,192.168.56.130' (ECDSA) to the list of known hosts.
root@java37slaver2's password: 
authorized_keys                                                                       100% 1199   930.5KB/s   00:00 

4.5 通过ssh实现三台服务器的免密登录(三台都做)

  • 测试9次
[root@java37master ~]# ssh java37master
[root@java37master ~]# ssh java37slaver1
[root@java37master ~]# ssh java37slaver2
  • 退出当前账户:exit
[root@java37master ~]# exit
登出
Connection to java37master closed.

5 三台服务器都发布项目

  • 使用master的mysql
  • 把项目打包为war包
  • 把war包放入/tomcat9/webapps下
  • 启动三台服务器的tomcat
  • 监控tomcat的日志输出信息:tail -f xxx
  • 通过浏览器访问:

1 nginx

1.1 概念

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名

image

1.2 安装:只在master上安装

http://nginx.org/en/download.html

image-20211222105908838

image-20211222105925216

  • 安装nginx的依赖
[root@java37master ~]# yum install yum-utils
...
  • 创建yum的配置信息
[root@java37master ~]# touch /etc/yum.repos.d/nginx.repo #创建yum配置文件
[root@java37master ~]# vim /etc/yum.repos.d/nginx.repo 
[root@java37master ~]# cat /etc/yum.repos.d/nginx.repo  #添加如下代码  指定下载stable版本
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

image

  • 安装nginx
[root@java37master ~]# yum install nginx  -y

1.3 关闭linux自带杀毒软件selinux

  • 查看selinux的状态
[root@java37master ~]# getenforce
Enforcing  #处于防御状态
  • 修改配置文件 取消开机启动
[root@java37master ~]# vim /etc/selinux/config
[root@java37master ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled #取消开机启动
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
  • 重启master
reboot

1.4 启动并测试ngixn

[root@java37master ~]# systemctl start nginx    #开启nginx
[root@java37master ~]# systemctl restart nginx  #重启nginx
[root@java37master ~]# systemctl stop nginx     #关闭nginx
[root@java37master ~]# systemctl status nginx   #查看nginx状态
  • 通过浏览器访问nginx:nginx的默认端口和http一样 都是80端口

2 nginx实现反向代理

2.1 概念

通过nginx给服务器集群的多台服务器 提供一个统一的访问入口

2.2 实现其功能::只在master上执行

  • 创建文件:
[root@java37master conf.d]# touch /etc/nginx/conf.d/cloud37.conf
  • 编辑文件:指定url的解析规则
[root@java37master conf.d]# vim  /etc/nginx/conf.d/cloud37.conf
[root@java37master conf.d]# cat /etc/nginx/conf.d/cloud37.conf
#为三台服务器对应的集群 起个名字
upstream cloudserver
{
  server 192.168.56.128:8080;
  server 192.168.56.129:8080;
  server 192.168.56.130:8080;
}
#提供server配置 实现反向代理url转换规则
server
{
  #指定nginx监听的端口
  listen  80;
  #指定nginx的主机的ip地址 master的ip
  server_name  192.168.56.128;
  #指定url的转换规则
  location  /cloud37{
      proxy_pass  http://cloudserver/java37_08_cloud;
  }
  #浏览器请求:http://192.168.56.128:80/cloud37 时 会被nginx解析为
  #http://192.168.56.128:8080/java37_08_cloud
  #http://192.168.56.129:8080/java37_08_cloud
  #http://192.168.56.130:8080/java37_08_cloud
}
  • 重启ngixn
[root@java37master conf.d]# systemctl restart nginx.service
  • 对项目进行修改:所有请求都更改为http://192.168.56.128:80/cloud37
<!-- 主要是三个地方需要改进:1 所有style和script标签-->
<!-- 主要是三个地方需要改进:2 所有ajax的url-->
<!-- 主要是三个地方需要改进:3 img的src-->
<html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt"%>
<head>
        <!--#添加  定义一个pagescore域属性 记录nginx的地址-->
        <c:set  var="path" value="http://192.168.56.128:80/cloud37"/>
        <title>云盘项目</title>
        <!--1.1 引入min.css-->
        <link type="text/css" rel="stylesheet" href="${pageScope.path}/bootstrap-3.3.7-dist/css/bootstrap.min.css"/>
        <!--1.2 引入bootstrap-theme.min.css-->
        <link type="text/css" rel="stylesheet" href="${pageScope.path}/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css"/>

        <!--2.1 引入bootstrap-table.min.css-->
        <link type="text/css" rel="stylesheet" href="${pageScope.path}/bootstrap-3.3.7-dist/css/bootstrap-table.min.css"/>

        <!-- 3.1 bootstarp-editable基本使用:1引入bootstrap-editable.css -->
        <link type="text/css" rel="stylesheet" href="${pageScope.path}/bootstrap-3.3.7-dist/css/bootstrap-editable.css" />

        <!--1.3 引入jquery-->
        <script type="text/javascript" src="${pageScope.path}/js/jquery-3.3.1.min.js"></script>
        <!--1.4 引入bootstrap.min.js-->
        <script type="text/javascript" src="${pageScope.path}/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

        <!--2.2 引入bootstrap-table.min.js-->
        <script type="text/javascript" src="${pageScope.path}/bootstrap-3.3.7-dist/js/bootstrap-table.min.js"></script>
        <!--2.3 引入bootstrap-table-editable.min.js-->
        <script type="text/javascript" src="${pageScope.path}/bootstrap-3.3.7-dist/js/bootstrap-table-editable.min.js"></script>
        <!--2.4 引入bootstrap-table-zh-CN.min.js-->
        <script type="text/javascript" src="${pageScope.path}/bootstrap-3.3.7-dist/js/bootstrap-table-zh-CN.min.js"></script>

        <!--3.1 引入jquery.serializejson.min.js 使用serializeJSON方法-->
        <script type="text/javascript" src="${pageScope.path}/js/jquery.serializejson.min.js"></script>

        <!--3.3 bootstarp-editable基本使用:2引入bootstrap-editable.min.js -->
        <script type="text/javascript"
                src="${pageScope.path}/bootstrap-3.3.7-dist/js/bootstrap-editable.min.js"></script>
</head>

<body>
        <!--0:定义全局变量-->
        <script type="text/javascript">
            var uid;
            var dfu="0";
            var path="${pageScope.path}/"; //更改path的写法 不要出现核心标签库
        </script>
 
        <!--登录模态框:类似于弹出框-->
        <div class="modal fade" id="userLoginModal" >
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                           ...
                            <div class="form-group">
                                <label class="control-label">验&nbsp;证&nbsp;码:</label>
                                <img src="${pageScope.path}/user/yzmImg.action"  id="img_yzm" />
                                <input type="text" class="form-control"  name="uyzm" value="1234">
                            </div>
                        </form>
                    </div>
                         ...
                </div>
            </div>
        </div>
        <script type="text/javascript">
                 .....
                //更改验证码
                $("#img_yzm").bind("click",function(){
                     $("#img_yzm").attr("src","${pageScope.path}/user/yzmImg.action?n="+Math.random());
                });
            });
        </script>
</body>
</html>
  • 项目clean package
  • 把三台服务器的tomcat关闭 清除/webapps下的java37*
  • 把打好的war添加到webapps下
  • 开启tomcat
  • 开启日志监控
  • 通过浏览器访问:http://nginxip:nginxport/cloud37/index.jsp
注意:请求的时候一定要加资源名称

3 nginx实现负载均衡

3.1 概念

负载均衡:负载均衡也是 Nginx常用的一个功能,当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。
如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
nginx 根据服务器的性能 按制定策略来合理分配处理请求的比例

3.2 方式

更改nginx的配置文件:/etc/nginx/conf.d/cloud37.conf 的cloudserver信息

3.3 负载均衡策略

1 轮训

默认策略:
所有服务器按顺序轮流处理请求
适合于服务器性能相同的集群
upstream cloudserver
{
  #默认轮训
  server 192.168.56.128:8080;
  server 192.168.56.129:8080;
  server 192.168.56.130:8080;
}

2 权重

根据服务器性能 设置处理请求的比例
适合于服务器性能差别大的集群
upstream cloudserver
{
   #1轮训  默认
   #2权重
   #  #weight:指定比例
   #    #fail_timeout:指定最大等待时间
  server 192.168.56.128:8080 weight=1 fail_timeout=10s;
  server 192.168.56.129:8080 weight=1 fail_timeout=10s;
  server 192.168.56.130:8080 weight=4 fail_timeout=10s;
}
  • 注意 重启nginx
systemctl restart nginx

3 ip_hash

每台服务器设置个编号:从0开启
客户端ip的hashcode值%服务器台数 =n  :让编号为n的服务器处理此请求
特点:同一个客户端的所有请求都只被服务器处理
upstream cloudserver
{
   #1轮训  默认
   #2权重
   #  #weight:指定比例
   #    #fail_timeout:指定最大等待时间
   #server 192.168.56.128:8080 weight=1 fail_timeout=10s;
   #server 192.168.56.129:8080 weight=1 fail_timeout=10s;
   #server 192.168.56.130:8080 weight=4 fail_timeout=10s;
   
   #3ip_hash
   ip_hash;
   server 192.168.56.128:8080 fail_timeout=10s;
   server 192.168.56.129:8080 fail_timeout=10s;
    server 192.168.56.130:8080 fail_timeout=10s;
}

4 fair

nginx接受到请求 会询问整个服务器集群  把请求交给第一个响应的服务器
upstream cloudserver
{
  server 192.168.254.128:8080;
  server 192.168.254.129:8080;
  server 192.168.254.130:8080; 
  fair;
}
# fair测试出错::::需要添加插件:::添加插件失败!yum安装没有对应的配置文件
#unknown directive "fair" in /etc/nginx/conf.d/cloud37.conf:23
#nginx的错误日志位置:/var/log/nginx/error.log

5 url_hash

nginx根据请求的url的hashcode%服务器个数=n 把请求交给编号为n的服务器
upstream cloudserver
{
   #1轮训  默认
   #2权重
   #  #weight:指定比例
   #    #fail_timeout:指定最大等待时间
   #server 192.168.56.128:8080 weight=1 fail_timeout=10s;
   #server 192.168.56.129:8080 weight=1 fail_timeout=10s;
   #server 192.168.56.130:8080 weight=4 fail_timeout=10s;
   
   #3ip_hash
   #ip_hash;
   #server 192.168.56.128:8080 fail_timeout=10s;
   #server 192.168.56.129:8080 fail_timeout=10s;
   #server 192.168.56.130:8080 fail_timeout=10s;
   #
   
   #4 fair
   #server 192.168.56.128:8080;
   #server 192.168.56.129:8080;
   #server 192.168.56.130:8080;
   #fair;
   #
   
   #5 url_hash
   server 192.168.56.128:8080 fail_timeout=10s;
   server 192.168.56.129:8080 fail_timeout=10s;
   server 192.168.56.130:8080 fail_timeout=10s;
   hash $request_uri;
}

4 动静分离

4.1 概念

静态资源(html/css/js/img) 不需要依赖web应用服务器的解析  直接放在nginx上 访问时直接响应给客户端
提高响应效率 降低服务器压力

4.2 对项目进行修改

1 把jsp转化为html
2 把style和script的路径都更改为相对路径
3 把<c:set 删除
4 直接给path赋值:var path = "http://192.168.56.128:80/cloud37/";
5 去除所有的${}
  $(function () {
        //var user = "${sessionScope.user}";
        //alert(user);
        //if (user) {
        //    uid = "${sessionScope.user.uid}";
        //    setTableData();
        //} else {
            $("#userLoginModal").modal("show");//弹出登录模态框
        //}
    });
6 更改img的连接
    <div class="form-group">
                        <label class="control-label">验&nbsp;证&nbsp;码:</label>
                        <img src="user/yzmImg.action" id="img_yzm"/>
                        <input type="text" class="form-control" name="uyzm" value="1234">
    </div>
    
    ...
    //更改验证码
    $("#img_yzm").bind("click", function () {
         $("#img_yzm").attr("src", "user/yzmImg.action?n=" + Math.random());
    });

4.3 把所有静态资源存入一个文件夹cloud37中

image

4.4 把项目中这些静态资源删除

4.5 启动tomcat

  • 项目clean package
  • 关闭三个tomcat
  • 清除webapps下的java37*
  • 把war重新上传到webapps下
  • 开启三台服务器

4.6 把静态资源文件夹cloud37上传到/usr/share/nginx文件夹下

[root@java37master bin]# cd /usr/share/nginx
[root@java37master nginx]# ll
总用量 0
drwxr-xr-x  6 root root 102 12月 22 17:52 cloud37
drwxr-xr-x. 2 root root  40 12月 22 11:06 html

4.7 更改nginx的配置文件 并重启

[root@java37master conf.d]# pwd
/etc/nginx/conf.d
[root@java37master conf.d]# vim cloud37.conf  #更改配置文件
[root@java37master conf.d]# systemctl restart nginx.service #重启nginx
[root@java37master conf.d]# cat cloud37.conf 
#为三台服务器对应的集群 起个名字
upstream cloudserver
{
   #1轮训  默认
   #2权重
   #  #weight:指定比例
   #    #fail_timeout:指定最大等待时间
   #server 192.168.56.128:8080 weight=1 fail_timeout=10s;
   #server 192.168.56.129:8080 weight=1 fail_timeout=10s;
   #server 192.168.56.130:8080 weight=4 fail_timeout=10s;
   
   #3ip_hash
   #ip_hash;
   #server 192.168.56.128:8080 fail_timeout=10s;
   #server 192.168.56.129:8080 fail_timeout=10s;
   #server 192.168.56.130:8080 fail_timeout=10s;
   #
   
   #4 fair
   #server 192.168.56.128:8080;
   #server 192.168.56.129:8080;
   #server 192.168.56.130:8080;
   #fair;
   #
   
   #5 url_hash
   server 192.168.56.128:8080 fail_timeout=10s;
   server 192.168.56.129:8080 fail_timeout=10s;
   server 192.168.56.130:8080 fail_timeout=10s;
   hash $request_uri;
}
#提供server配置 实现反向代理url转换规则
server
{
  #指定nginx监听的端口
  listen  80;
  #指定nginx的主机的ip地址 master的ip
  server_name  192.168.56.128;

   #动静分离
  location ~ .*\.(html|css|js|eot|svg|ttf|woff|woff2)$
  {
           root  /usr/share/nginx;
  }

  #指定url的转换规则
  location  /cloud37{
      proxy_pass  http://cloudserver/java37_08_cloud;
  }
  #浏览器请求:http://192.168.56.128:80/cloud37 时 会被nginx解析为
  #http://192.168.56.128:8080/java37_08_cloud
  #http://192.168.56.129:8080/java37_08_cloud
  #http://192.168.56.130:8080/java37_08_cloud
}

4.8 浏览器访问:静态资源index.html

posted @ 2022-01-03 21:41  RenVei  阅读(150)  评论(0编辑  收藏  举报