由于我们的服务器数量有限,就使用这三台服务器,具体的软件规划如下:
服务器 | 软件 | 名称 |
---|---|---|
192.168.220.128 | Nginx(部署前端项目、配置反向代理),MySQL(主从复制的主库) | 服务器A |
192.168.220.130 | JDK1.8、Git、Maven、jar(项目jar包基于内嵌Tomcat运行)、MySQL(主从复制的从库) | 服务器B |
172.17.2.94 | Redis(缓存中间件) | 服务器C |
1.在服务器A中安装Nginx,并将静态资源包上传到Nginx的html目录下
2. 修改Nginx配置文件nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html/dist; #dist就是刚刚上传的静态资源包的目录
index index.html;
}
#反向代理
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://192.168.220.130:8080; #从库的访问路径
}
location = /50x.html {
root html;
}
}
3). 通过nginx访问前端工程
http://192.168.220.128
在上述我们配置的nginx.conf中,除了配置了静态资源的加载目录以外,我们还配置了一段反向代理的配置,配置信息如下:
location ^~ /api/ { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://192.168.220.130:8080; }
这一段配置代表,如果请求当前nginx,并且请求的路径如果是 /api/ 开头,将会被该location处理。而在该location中,主要配置了两块儿信息: rewrite(url重写) 和 proxy_pass(反向代理)。 接下来我们就来解析一下这两项的配置。
1). 路径重写rewrite
rewrite ^/api/(.*)$ /$1 break;
这里写的是一个正则表达式,代表如果请求路径是以 /api/
开头,后面的请求路径任意,此时将原始的url路径重写为 /$1
,这里的$1
指代的就是通配符 .* 这一块的内容。比如:
/api/employee/login ------> ^/api/(.*)$ --------> 此时 (.*) 匹配的就是 employee/login ------> 最终重写为/$1 : /employee/login
2). 反向代理
proxy_pass http://192.168.220.130:8080;
路径重写后的请求,将会转发到后端的 http://192.168.138.101:8080 服务器中。 而这台服务器中,就部署的是我们的后端服务。
1). 在服务器B(192.168.138.101)中安装jdk、git、maven、MySQL,使用git clone命令将git远程仓库的代码克隆下来
A. 确认JDK环境
java -version
B. 确认Git环境
git -version
C. 确认Maven环境
mvn -v
D. 将我们开发完成的代码推送至远程仓库,并在服务器B中克隆下来
#创建java代码存放目录 mkdir -p /usr/local/javaapp #切换目录 cd /usr/local/javaapp #克隆代码 , 需要使用自己的远程仓库 git clone https://gitee.com/rangrang01/demo_take_out.git
准备好一个shell脚本文件,上传到javaapp中,执行,要注意shell脚本中的配置信息要跟你本身的项目中pom文件一致
#!/bin/sh
echo =================================
echo 自动化部署脚本启动
echo =================================
echo 停止原来运行中的工程
APP_NAME=demo_take_out
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
echo 准备从Git仓库拉取最新代码
cd /usr/local/javaapp/demo_take_out
echo 开始从Git仓库拉取最新代码
git pull
echo 代码拉取完成
echo 开始打包
output=`mvn clean package -Dmaven.test.skip=true`
cd target
echo 启动项目
nohup java -jar demo_take_out-1.0-SNAPSHOT.jar &> demo_take_out.log &
echo 项目启动完成
我这里的就不一样所以要改 ,一定要一致不然运行不起来
然后就让我们看一下Nginx的一些内容吧
1). 查看版本
./nginx -v
2). 检查配置文件
修改了nginx.conf核心配置文件之后,在启动Nginx服务之前,可以先检查一下conf/nginx.conf文件配置的是否有错误,命令如下:
./nginx -t
3). 启动
./nginx
启动之后,我们可以通过ps -ef指令来查看nginx的进程是否存在。
ps -ef | grep nginx
启动之后,我们可以直接访问Nginx的80端口, http://192.168.220.128
注意:
要想正常访问Nginx,需要关闭防火墙或开放指定端口号,执行的指令如下:
A. 关闭防火墙
systemctl stop firewalld
B. 开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
4). 停止
./nginx -s stop
停止之后,我们可以查看nginx的进程:
ps -ef|grep nginx
5). 重新加载
当修改了Nginx配置文件后,需要重新加载才能生效,可以使用下面命令重新加载配置文件:
./nginx -s reload
在上述我们在使用nginx命令在进行服务的启动、停止、重新加载时,都需要用到一个指令nginx,而这个指令是在nginx/sbin目录下的,我们每一次使用这个指令都需要切换到sbin目录才可以,使用相对繁琐。那么我们能不能在任意目录下都可以执行该指令来操作nginx呢?答案是可以的,配置nginx的环境变量即可。
通过vim编辑器,打开/etc/profile文件, 在PATH环境变量中增加nginx的sbin目录
配置完成以后执行
source /etc/profile 使文件生效
在任意目录下执行nginx的启动指令
nginx的配置文件(conf/nginx.conf)整体上分为三部分: 全局块、events块、http块。这三块的分别配置什么样的信息呢,看下表:
区域 | 职责 |
---|---|
全局块 | 配置和nginx运行相关的全局配置 |
events块 | 配置和网络连接相关的配置 |
http块 | 配置代理、缓存、日志记录、虚拟主机等配置 |
在全局块、events块以及http块中,我们经常配置的是http块。
在http块中可以包含多个server块,每个server块可以配置多个location块。
server {
listen 80; #监听端口
server_name localhost; #服务器名称
location / { #匹配客户端请求url
root html; #指定静态资源根目录
index index.html; #指定默认首页
}
}
如果配置了指定静态资源根目录
一下要检查一下配置文件(因为刚刚配置过,所以任意路径都可以访问,且不需要./)
nignx -t
重新加载一下才可以生效
nginx -s reload
测试
1). 将资料中提供的两个jar包,上传到192.168.200.201服务器上
jar | 运行端口 | 请求链接 | 响应数据 |
---|---|---|---|
helloword-1.0-SNAPSHOT.jar | 8080 | /hello | 8080 |
helloword-1.0-SNAPSHOT2.jar | 8081 | /hello | 8081 |
2. 运行上传上来的两个jar包,运行端口分别是 8080 , 8081
3. 在nginx中配置负载均衡
打开nginx的配置文件nginx.conf并增加如下配置:
#upstream指令可以定义一组服务器 upstream targetserver{ server 192.168.200.201:8080; server 192.168.200.201:8081; } server { listen 8080; server_name localhost; location / { proxy_pass http://targetserver; } } ```
4). 重新加载nginx配置文件,访问
nginx -s reload
测试时,我们直接访问nginx的8080端口(http://192.168.200.200:8080), 此时nginx会根据负载均衡策略,将请求转发到后面的两台服务器。
负载均衡策略
处理上述默认的轮询策略以外,在Nginx中还提供了其他的负载均衡策略,如下:
名称 | 说明 | 特点 |
---|---|---|
轮询 | 默认方式 | |
weight | 权重方式 | 根据权重分发请求,权重大的分配到请求的概率大 |
ip_hash | 依据ip分配方式 | 根据客户端请求的IP地址计算hash值, 根据hash值来分发请求, 同一个IP发起的请求, 会发转发到同一个服务器上 |
least_conn | 依据最少连接方式 | 哪个服务器当前处理的连接少, 请求优先转发到这台服务器 |
url_hash | 依据url分配方式 | 根据客户端请求url的hash值,来分发请求, 同一个url请求, 会发转发到同一个服务器上 |
fair | 依据响应时间方式 | 优先把请求分发给处理请求时间短的服务器 |
权重的配置:
#upstream指令可以定义一组服务器
upstream targetserver{
server 192.168.200.201:8080 weight=10;
server 192.168.200.201:8081 weight=5;
}
上述配置的weight权重是相对的,在上述的配置中,效果就是,在大数据量的请求下,最终8080接收的请求数是8081的两倍。