Nginx实现动静分离
最近学习了nginx,想起毕设项目,使用技术:SpringBoot,Mybatis,Mongodb(留言模块,很少一部分代码),Redis(做一个数据字典的缓存,也是最简单的应用),Mysql,Git,Maven
前端Vue ,BootStrap,Axios
写的很烂,前后端也没有完全分离,正好拿来练练手,项目效果如下,需要源码的话直接到gitlab克隆。
ssh克隆:git@39.98.240.98:majianguo/crmproject.git
http克隆:http://39.98.240.98:9012/majianguo/crmproject.git
项目结构如图
项目效果:
数据库环境修改一下就可以直接运行了。
-------------------------------------------我是分割线-------------------------------------------------------------------------------
准备好一台服务器。学习阶段没有服务器,使用虚拟机代替,版本Ubuntu
通过命令查看到虚拟机ip
打开项目,static文件夹下存放的静态资源
之前写的时候,请求接口,由于是一体项目都是相对路径如图
把项目中所有的请求,url前面添加服务器的ip 修改后如图,不写端口默认80
服务器安装好Nginx,安装教程可参考
https://www.cnblogs.com/hnxxcxg/p/11399566.html
进入到安装好的nginx目录
sbin目录存放nginx的启动程序
logs目录下存放nginx默认的访问日志,访问成功access.log失败error.log。这些都可以在nginx.conf中修改
html目录下存放nginx默认的一些静态页面,如nginx的欢迎页面,以及出错跳转的页面等。
nginx.conf 是nginx的配置文件,非常重要。
nginx的启动可以切换到sbin目录下,输入命令./nginx启动。也可以把nginx添加到系统服务通过systemctl来启停,比较方法。由于频繁的操作nginx启动停止,以及修改配置文件等操作,我写了一个nginx启动的shell脚本,使用起来方便不少,使用前提安装位置需要是默认位置。源码如下:
#!/bin/bash
#nginx启动脚本位置
export ngpath=/usr/local/nginx/sbin
num=$#
#开启ng服务
start(){
#查看进程信息,如果ng服务已开启给出提示结束
flag=$(ps -ef | grep "nginx" | grep -v grep | awk -F "" '/nginx$/ {print $1}' | wc -l)
if [ $flag -gt 0 ]
then
echo "nginx服务器已经启动,无需再次启动"
else
cd $ngpath
./nginx
echo "nginx服务器启动成功,进程信息如下"
ps -ef | sed "1p" -n
ps -ef | grep -v grep | grep nginx | grep -v nginx.sh
fi
exit
}
stop(){
flag=$(ps -ef | grep "nginx" | grep -v grep | awk -F "" '/nginx$/ {print $1}' | wc -l)
if [ $flag -gt 0 ]
then
cd $ngpath
./nginx -s stop
echo "nginx服务已关闭"
else
echo "nginx服务器未开启,无需关闭"
fi
}
reload() {
flag=$(ps -ef | grep "nginx" | grep -v grep | awk -F "" '/nginx$/ {print $1}' | wc -l)
if [ $flag -gt 0 ]
then
cd $ngpath
./nginx -s reload
else
start
fi
echo "nginx服务已重启"
ps -ef | grep -v grep | grep nginx
}
test() {
cd $ngpath
./nginx -t
}
log(){
#选择查看日志类型
read -p "请选择查看类型 1)查看nginx访问正确日志 2) 查看nginx访问错误日志" n
case $n in
1) cd $ngpath
cd ../logs
if [ -e access_copy.log ]
then
rm -rf access_copy.log
fi
touch access_copy.log
cat access.log >> access_copy.log
echo "" > access.log
echo -e "正确信息日志监控v1.1\n现在时间:`date +"%Y年%m月%d日%H时%M分"`\n按ctrl+c快捷键退出"
tail -f access.log
;;
2) cd $ngpath
cd ../logs
if [ -e error_copy.log ]
then
rm -rf error_copy.log
fi
touch error_copy.log
cat error.log >> error_copy.log
echo "" > error.log
echo -e "错误信息日志监控v1.1\n现在时间:`date +"%Y年%m月%d日%H时%M分"`\n按ctrl+c快捷键退出"
tail -f error.log
;;
*)echo "输入有误,程序结束"
exit;;
esac
}
conf(){
cd $ngpath
cd ../conf
vim nginx.conf
}
print(){
echo -e "\t\t\t\t--help : nginx快捷脚本-- 参数说明--\n
1:开启nginx服务\t\t2:关闭nginx服务\t\t3:重启nginx服务\n
4: 测试nginx配置\t5:动态查看nginx访问日志\t\t6:编辑nginx配置文件\n
7:编辑脚本配置\t8:配置hosts"
}
edit(){
cd /usr/local/bin
vim nginx.sh
}
domain(){
vim /etc/hosts
}
if [ $num == 0 ]
then
print
fi
if [ $num == 1 ]
then
# clear
echo
if [ $1 == "-v" -o $1 == "-V" -o $1 == "v" -o $1 == "V" ]
then
cd $ngpath
echo -e "当前Nginx版本:\n"
./nginx -V
exit
fi
if [ $1 == "ps" ]
then
ps -ef | grep -v grep | grep -v nginx.sh|grep nginx
exit
fi
case $1 in
1) start ;;
2) stop ;;
3) reload ;;
4) test ;;
5) log;;
6) conf;;
7) edit;;
8) domain;;
*) print;;
esac
fi
if [ $num -gt 1 ]
then
echo "参数不正确,参数0-1个"
fi
把脚本文件nginx.sh复制到/usr/local/bin目录下,这样就可以在任何目录执行脚本
cp nginx.sh /usr/local/nginx.sh
给脚本文件起个永久的别名,切换root用户,
cd ~ 到root家目录,通过ls -a 查看到隐藏文件.bashrc
通过vim打开这个文件
添加别名 :wq!保存退出
通过nginx --help 查看效果
启动nginx
通过 ps -ef | grep nginx 或者nginx ps 都可以查看到nginx的进程
切换到nginx的html目录下
在html目录下创建文件夹crm,保存项目的静态资源
通过xftp或者lrzsz都可以,把项目的静态资源复制到服务器的crm文件夹下
打开nginx 的配置文件,输入命令 nginx 6即可
在server块进行配置:
listen监听端口为80端口
server_name 由于没有域名直接使用localhost
添加两个localtion,匹配静态资源访问请求和其他请求
使用正则表达式匹配location,把文件中静态资源的后缀都添加上。
前面任意个数任意字符,以指定的后缀名结尾。
由于我们在html下创建了crm文件夹,那么就可以找到对应的静态资源。
:wq保存退出
测试,重启nginx
浏览器进行访问,发现静态资源已经可以访问。
再准备一台虚拟机(我的是Centos7),用来做真实服务器,ip192.168.19.130,上面的虚拟机作为代理服务器。这台服务器需要安装java环境
安装jdk参考:https://blog.csdn.net/BigCandidate/article/details/124192824
创建文件夹:
mkdir -p /usr/local/app/crm
保存项目的jar包
项目可以把static文件夹进行删除,然后通过maven打包插件,打成jar包
先点击clean再点击package即可
完成后再target目录下就能找到打包好的jar文件(为什么叫这个名字我也不知道)
打三个jar包 每次都修改application.yml配置文件port为不同端口。由于配置有限,没有多台服务器,使用端口来区分。
每修改一次重新打包,上传到130服务器的crm文件夹下的不同文件夹中,为了方便,我在crm文件夹下创建了1,2,3的文件夹来存储不同端口的jar包。
结构如图
进入不同文件夹通过命令
nohup java -jar demo-0.0.1-SNAPSHOT.jar > system.log 2>&1 &
可以看到三个项目都已经启动了
打开129服务器的nginx配置文件,进行配置反向代理和负载均衡
server {
listen 80;
server_name localhost;
location ~*\.(jpg|jpeg|gif|png|css|js|html|ttf)$ {
root html/crm;
index index.html;
}
location =/{
root html/crm;
index index.html;
}
location /{
proxy_pass http://crm;
}
}
upstream crm {
server 192.168.19.130:80 weight=1;
server 192.168.19.130:8080 weight=1;
server 192.168.19.130:8081 weight=1;
}
在页面访问
可以看到端口是可以访问到的,使用postman测试,也可以访问成功
即使停掉两个,只留一个,访问还是没问题的,因为已经配置了负载均衡,默认使用轮询算法。
把这三个项目全部停止后再次访问
最后实验成功,实现了Nginx的负载均衡动静分离和反向代理。Nginx的模块很多,配置也是非常丰富,个人只是学习了最基础的用法。还需要不断地去学习。
还有一个遗留的小问题,即使用户名和密码正确也无法再页面登录成功,是因为项目使用session存储用户信息,有一个权限的拦截器,在负载均衡的环境下,session会失效,这个问题之后在解决。