学习笔记,实现Nginx的动静分离,反向代理,负载均衡。

本文介绍了使用Nginx实现动静分离和负载均衡的步骤。通过在Ubuntu虚拟机上部署Nginx,将SpringBoot项目静态资源分离,并配置反向代理与负载均衡策略,实现了多实例的高可用性。详细过程包括项目结构、Nginx配置文件修改、日志监控以及虚拟机间的服务通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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会失效,这个问题之后在解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值