【java-02】Nginx以及前后端分离项目在linux上的自动部署
写在开头
文章包含nginx的简单介绍和入门使用,包括目录结构、配置文件结构、反向代理和负载均衡等防方面,以及sprngboot项目在linux上的前后端分离部署过程。
Nginx
Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。Nginx官网:nginx.org。
重点目录/文件
文件 | 作用 |
---|---|
conf/nginx.conf | nginx配置文件 |
html | 存放静态文件(html、CSs、Js等) |
logs | 日志目录,存放日志文件 |
sbin/nginx | 二进制文件,用于启动、停止Nginx服务 |
配置文件结构
Nginx配置文件(conf/nginx.conf)整体分为三部分:
- 全局块:Nginx运行相关的全局配置
- events块:网络连接相关的配置
- http块:代理、缓存、日志记录、虚拟主机配置
- http全局块
- Server块
- server全局块
- location块
注意: http块中可以配置多个Server块,每个Server块中可以配置多个location块。
server块
server {
listen 80; #监听端口
server_name localhost; #服务器名称
location / { #匹配客户端请求url
root html; #指定静态资源根目录
index index.html index.htm; #指定默认首页
}
}
反向代理
- 正向代理
代理服务器是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问到目标服务器。 - 反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。用户不需要知道目标服务器的地址,也无须在用户端作任何设定。 - 配置
在conf/nginx.conf中修改配置
server {
listen 80; #监听端口
server_name localhost; #服务器名称
location / {
rewrite ^/api/(.*) /$1 break; #重写URL
proxy_pass http://192.168.132.100:8080; #反向代理配置,将请求转发到指定服务
}
}
-
rewrite
rewrite是Nginx服务器提供的一个重要的功能,它可以实现URL重写。rewrite regex replacement [flag];
rewrite:该指令是实现URL重写的指令,表示开始进行rewrite匹配规则。
regex:用于匹配URI的正则表达式。例子中为匹配含有/api/以及后面任意路径的地址。
replacement:将regex正则匹配到的内容替换成replacement。例子中的$1是取regex中()里面的内容。
flag:有如下值- last:本条规则匹配完成后,继续向下匹配新的location URI 规则。
- break:本条规则匹配完成即终止,不再匹配后面的任何规则。
- redirect:返回302临时重定向,浏览器地址会显示跳转新的URL地址。
- permanent:返回301永久重定向,浏览器地址会显示跳转新的URL地址。
负载均衡
- 简介
早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。- 应用集群:将同一应用部署到多台机器上,组成应用集群,接收负载均衡器分发的请求,进行业务处理并返回响应数据
- 负载均衡器:将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理,基于反向代理实现
- 配置
upstream xxx(自定义) {
#某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
server 192.168.132.100:80 weight=1 max_fails=1 fail_timeout=10; #这行配置均为默认值
server 192.168.132.101:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
}
- 负载均衡策略
名称 | 说明 |
---|---|
轮询 | 默认方式 |
weight | 权重方式,默认为1 |
ip_hash | 依据客服端ip的hash分配 |
least_conn | 依据服务器最少连接分配 |
url_hash | 依据访问url的hash分配 |
fair | 依据服务器响应时间分配 |
项目部署
部署环境说明
- 192.168.132.100(linux服务器A)
- jdk:运行java项目
- git:版本控制工具
- maven:项目构建工具
- jar:Spring Boot项目打包成jar包,并基于内部tomcat运行
- Mysql:主从复制结构中的主库
- 192.168.132.101(linux服务器B)
- Mysql:主从复制结构的从库
- 192.168.132.102(linux服务器C)
- nginx:部署前端项目、配置反向代理
- 192.168.132.1(windows本地)
- redis:缓存中间件
软件安装相关可参考软件安装
192.168.132.102
安装nginx并修改相关配置
-
在服务器C中安装Nginx,将前端代码dist文件夹上传到Nginx的html目录下
-
在conf/nginx.conf中修改配置
#nginx主页配置:在root下找index location / { root html/dist; index index.html; } #反向代理配置 location ^~ /api/ { #将正则表达式匹配到的请求路径替换为/.* rewrite ^/api/(.*)$ /$1 break; #代理地址 proxy_pass http://192.168.132.100:8080; }
192.168.132.1
安装redis并修改相关配置
192.168.132.100/101
安装jdk、git、maven和mysql并修改相关配置,创建sh脚本文件
-
在服务器A(100)上安装jdk、git、maven和mysql,在服务器B(101)上安装mysql
-
配置mysql开启主从复制,可参考【java-01】
-
在服务器A(100)使用Git克隆代码,创建本地仓库
cd /usr/local/git-local-rep git clone https://gitee.com/MrwangTianyu/tianyu_take_out.git
-
创建shell脚本文件
ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|grep -v sh|awk '{print $2}'
grep -v xxxx 剔除掉有xxxx的数据
awk '{print $2}' 打印第二列的数据
打包时,在maven项目中运行命令 -
为用户授权脚本文件的操作权限
#为所有用户授予对其的读、写、执行权限 chmod 777 tianyu_take_out.sh
chmod(英文全拼: change mode)命令是控制用户对文件的权限的命令。Linux中的权限分为:读(r)、写(w)、执行(x)三种权限,Linux的文件调用权限分为三级:文件所有者(Owner)、用户组 (Group)、其它用户(Other Users),只有文件的所有者和超级用户有修改文件或目录的权限,要执行Shell脚本需要有对此脚本文件的执行权限,如果没有则不能执行。
# 权限 读(r)、写(w)、执行(x) 7 读+写+执行 rwx 6 读+写 rw- 5 读+执行 r-x 4 只读 r-- 3 写+执行 -wx 2 只写 -w- 1 只执行 --x 0 无 --- 注意:三位数字分别代表不同用户的权限
- 第1位表示文件拥有者的权限
- 第2位表示同组用户的权限
- 第3位表示其他用户的权限
-
执行脚本文件
./tianyu_take_out.sh
本篇用到的软件安装包资源(密码关注b站账号私信获取) ↩︎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现