Nginx 超详细详解和部署实例
目录
一、Nginx介绍
二、Nginx安装
2.1、安装环境准备
2.2、下载 Nginx 安装包
2.3、解压与配置编译环境
2.4、编译与安装
2.5、启动与基本管理
三、Nginx配置和使用
3.1、基础配置逻辑
3.1.1、按域名 / 端口区分不同业务
3.1.2、root 指令:路径拼接方式
3.1.3、alias 指令:路径替换方式
3.2、Nginx正向代理与反向代理
3.2.1、正向代理
3.2.2、反向代理
3.3.3、正向代理和反向代理区别
3.3、负载均衡算法
3.3、跨域问题(CORS)
3.3.1、跨域问题详解
3.3.2、Nginx 解决跨域的原理与配置
3.4、动静态资源分离
3.4.1、什么是动静态资源分离?
3.4.2、为什么需要动静态分离?
3.4.3、Nginx 实现动静态分离的核心思路
五、配置说明
四、SpringBoot+Vue项目部署
4.1、需部署的环境
4.2、注意事项
4.2.1 安装方式
1. 安装方式分类
(1)yum 安装
(2)源码编译安装
(3)二进制包安装
(4)rpm 包安装
4.2.2、不同方式的启动和关闭
4.2.3、端口号的开放
4.3、后端项目打包部署
4.4、前端项目打包部署(使用Nginx代理)
一、Nginx介绍
Nginx是一款轻量级、高性能的 HTTP 和反向代理服务器,
Nginx 采用事件驱动的异步非阻塞模型,能够高效地处理大量并发连接。与传统的 Web 服务器(如 Apache)相比,Nginx 在性能表现上具有显著优势,尤其在高并发场景下,Nginx 能够保持较低的资源消耗,提供更快的响应速度
二、Nginx安装
2.1、安装环境准备
本文以 CentOS 系统为例进行安装演示。在安装 Nginx 之前,需要确保系统已经安装了必要的依赖包,Nginx 基于 C 语言开发,因此需要安装 C 语言编译环境以及其他相关依赖。执行以下命令安装依赖包:
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
其中,gcc
是 C 语言编译器,pcre-devel
用于支持 PCRE 正则表达式库(Nginx 配置中常用到正则表达式),zlib-devel
用于支持数据压缩,openssl
和openssl-devel
用于支持 SSL/TLS 加密功能。
2.2、下载 Nginx 安装包
Nginx 官方网站提供了稳定版本和开发版本的下载。通常建议在生产环境中使用稳定版本,以确保系统的稳定性和安全性。访问 Nginx 官网的下载页面(nginx: download),选择合适的稳定版本,本文以nginx-1.24.0
为例,使用wget
命令下载安装包:
yum install wget
wget https://nginx.org/download/nginx-1.24.0.tar.gz
2.3、解压与配置编译环境
下载完成后,解压 Nginx 压缩包,并进入解压后的目录进行编译环境配置:
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx
--prefix=/usr/local/nginx
参数指定了 Nginx 的安装目录为/usr/local/nginx
,你可以根据实际需求进行调整。configure
脚本会检查系统环境,确保满足 Nginx 编译所需的依赖条件,并生成相应的 Makefile 文件。
2.4、编译与安装
执行以下命令进行编译和安装:
make & make install
make
命令根据之前生成的 Makefile 文件编译 Nginx 源代码,make install
则将编译好的 Nginx 二进制文件及相关配置文件安装到指定的目录(即/usr/local/nginx
)。
2.5、启动与基本管理
安装完成后,进入 Nginx 的安装目录/usr/local/nginx/sbin
,可以使用以下命令对 Nginx 进行管理:
# 查看版本
./nginx -v
# 检查配置文件语法
./nginx -t
# 启动Nginx
./nginx
# 停止Nginx
./nginx -s stop
# 重新加载配置文件(修改配置后使用)
./nginx -s reload
为了方便使用,建议将 Nginx 的sbin
目录添加到系统的环境变量中。编辑/etc/profile
文件,在PATH
环境变量中增加/usr/local/nginx/sbin
,修改完成后执行source /etc/profile
使配置生效。这样,在系统的任何目录下都可以直接执行nginx
命令。
三、Nginx配置和使用
3.1、基础配置逻辑
Nginx 存放静态资源的核心是:通过 server
块区分不同访问入口(域名或端口),再用 location
块指定资源存放路径,让不同请求对应到正确的本地文件。
3.1.1、按域名 / 端口区分不同业务
nginx
# 用域名区分(需解析域名)
server {listen 80;server_name member.hltop.cn; # 会员业务域名location / {root html/member; # 资源存放在 Nginx安装目录/html/memberindex index.html; # 访问根路径时默认找index.html}
}
server {listen 80; # 同一80端口,不同域名server_name order.hltop.cn; # 订单域名location / {root /var/www/order;index index.html;}
}
-------------------------------------------------------
# 用端口区分(适合本地测试)
server {listen 8081; # 用8081端口访问会员业务location / {root html/member;index index.html;}
server {listen 8082; # 测试端口2location / {root /var/www/test2;index index.html;}
}
3.1.2、root 指令:路径拼接方式
root
是最常用的指定资源目录的指令,它的路径拼接规则很简单:
最终文件路径 = root 指定的目录 + location 匹配的路径 + 请求的文件名
location /img/ {root /var/www/static; # 根目录设为/var/www/static
}
当客户端请求 http://domain.com/img/logo.png
时:
location
匹配到/img/
- 拼接路径:
/var/www/static
(root) +/img/
(location 匹配的路径) +logo.png
(请求的文件名) - 实际查找的文件:
/var/www/static/img/logo.png
3.1.3、alias 指令:路径替换方式
alias
用于替换 location
匹配的路径,适合需要重命名目录的场景。它的拼接规则是:
最终文件路径 = alias 指定的目录 + 请求中 location 之后的部分
(注意:alias
后面的目录路径必须以 /
结尾)
nginx
location /img/ {alias /var/www/static/image/; # 用/image/替换/img/
}
当客户端请求 http://domain.com/img/logo.png
时:
location
匹配到/img/
,但这个路径会被alias
替换- 拼接路径:
/var/www/static/image/
(alias) +logo.png
(请求中/img/
之后的部分) - 实际查找的文件:
/var/www/static/image/logo.png
root 和 alias 的核心区别
场景 | root 指令 | alias 指令 |
作用 | 设定根目录,路径叠加 | 替换 location 匹配的路径 |
路径要求 | 无特殊要求 | 目录必须以 结尾 |
适用场景 | 大多数静态资源映射 | 需重命名目录的场景(如 URL 显示 /img/,实际用 /image/ 目录) |
简单说:root
是「在指定目录下追加路径」,alias
是「直接替换路径」。根据实际目录结构选择即可。
3.2、Nginx正向代理与反向代理
3.2.1、正向代理
3.2.1 概念
正向代理是位于客户端和目标服务器之间的代理服务器。当客户端需要访问外部资源时,客户端将请求发送到正向代理服务器,代理服务器代替客户端向目标服务器发送请求,并将目标服务器的响应返回给客户端。
正向代理是指代理服务器代理客户端,使得客户端可以访问被代理的服务器上的资源。举个例子,我们可以使用正向代理访问一些境外网站,这些网站被代理服务器所代理,客户端看到的是代理服务器响应的内容。这时,被代理的服务器并不知道客户端的存在,只知道代理服务器的存在。正向代理主要应用于隐藏客户端的 IP 地址、访问互联网被封锁的资源等场景
3.1.2 Nginx 实现正向代理配置
在 Nginx 中配置正向代理,需要编辑 Nginx 的配置文件,通常位于/usr/local/nginx/conf/nginx.conf
。在http
块内添加如下配置:
nginx
server {listen 8080; # 代理服务器监听端口resolver 8.8.8.8; # 指定DNS服务器,用于域名解析location / {proxy_pass http://$http_host$request_uri;}
}
上述配置中,listen
指令指定了代理服务器监听的端口为8080
,客户端将请求发送到该端口。resolver
指令指定了 DNS 服务器地址(这里使用 Google 的公共 DNS 服务器8.8.8.8
),用于将域名解析为 IP 地址。location /
块表示对所有请求进行处理,proxy_pass
指令将客户端的请求转发到目标服务器,$http_host
和$request_uri
是 Nginx 的内置变量,分别表示客户端请求的主机名和请求的 URI。
配置完成后,检查配置文件语法并重新加载 Nginx 配置:
nginx -t
nginx -s reload
此时,客户端需要将代理服务器的地址和端口配置到网络设置中,才能通过 Nginx 正向代理访问外部资源。需要注意的是,Nginx 的正向代理默认不支持 HTTPS 站点,如果需要代理 HTTPS 请求,还需要进行额外的配置。
3.2.2、反向代理
3.2.1 概念
反向代理位于客户端与目标服务器之间。客户端向反向代理服务器发送请求,反向代理会依据配置规则,把请求转发到后端的目标服务器,再将目标服务器的响应回传给客户端。对客户端而言,它不清楚具体是后端哪台服务器处理了请求,仅与反向代理交互,反向代理隐藏了后端服务器的真实 IP 和架构细节。
反向代理常用于为服务器端提供服务,可实现负载均衡(比如按算法选合适服务器转发请求)、缓存加速、安全防护(隐藏后端信息、抵御直接攻击),还能进行 SSL 加密等,主要在数据安全性、访问速度、系统弹性等方面发挥作用。
3.2.2 Nginx 实现反向代理配置
在 Nginx 中配置反向代理同样需要编辑配置文件。假设后端有一台 Web 服务器,IP 地址为192.168.1.100
,端口为8080
,现在要通过 Nginx 反向代理将客户端对http://example.com
的请求转发到该后端服务器。在nginx.conf
文件的http
块内添加如下server
块配置:
server {listen 80; # 监听端口server_name example.com; # 域名或IP地址location / {proxy_pass http://192.168.1.100:8080; # 反向代理到后端服务器proxy_set_header Host $host; # 设置请求头,将客户端请求的主机名传递给后端服务器proxy_set_header X-Real-IP $remote_addr; # 设置请求头,将客户端的真实IP传递给后端服务器}
}
listen
指令指定 Nginx 监听的端口为80
,server_name
指定了反向代理的域名或 IP 地址(这里假设为example.com
,实际使用时需替换为真实的域名或 IP)。location /
块表示对所有请求进行匹配处理,proxy_pass
指令将请求转发到后端服务器http://192.168.1.100:8080
。proxy_set_header
指令用于设置请求头信息,将客户端的一些信息(如主机名、真实 IP)传递给后端服务器,这在后端服务器需要根据这些信息进行处理时非常重要。
配置完成后,同样需要检查配置文件语法并重新加载 Nginx 配置,使配置生效。
这段配置的作用就是:当用户访问 example.com
(通过 80 端口)时,Nginx 会自动将请求悄悄转发到后端的 http://192.168.1.100:8080
服务器,而用户完全感知不到这个转发过程 —— 在用户看来,自己就是直接访问 example.com
并得到了响应。
3.3.3、正向代理和反向代理区别
区别:
- 正向代理:客户端明确知道自己在通过代理服务器访问目标服务器(比如设置浏览器代理),整个过程是 “客户端→代理→目标服务器”,客户端主动依赖代理才能完成请求。
- 反向代理:客户端以为自己直接访问的是 “目标服务器”(实际是反向代理服务器的地址),完全不知道后端有多少台真实服务器,也不关心代理如何转发请求。对客户端来说,“反向代理服务器” 就是它眼中的 “目标服务器”,整个过程是 “客户端→反向代理(以为是目标服务器)→后端真实服务器”,代理行为对客户端完全透明。
在简单说:
- 正向代理是 “客户端主动找代理帮忙上网”;
- 反向代理是 “后端服务器偷偷用代理对外提供服务”,客户端被蒙在鼓里。
3.3、负载均衡算法
Nginx 支持多种负载均衡算法,每种算法都有其特点和适用场景:
1.轮询(Round Robin):默认算法,每个请求按时间顺序逐一分配到不同的后端服务器。如果后端服务器出现故障,Nginx 会自动将其剔除,请求将分配到其他正常的服务器上。例如:
nginx
upstream backend_servers {server 192.168.1.101:8080;server 192.168.1.102:8080;
}
2.权重(Weighted Round Robin):为后端服务器设置不同的权重,权重越高的服务器被分配到的请求越多。适用于后端服务器性能不均的情况,例如:
nginx
upstream backend_servers {server 192.168.1.101:8080 weight=3;server 192.168.1.102:8080 weight=1;
}
这里192.168.1.101
服务器的权重为 3,192.168.1.102
服务器的权重为 1,那么在负载均衡时,192.168.1.101
服务器被分配到请求的概率将是192.168.1.102
服务器的 3 倍。
3. IP 哈希(IP Hash):根据客户端的 IP 地址计算哈希值,将请求分配到固定的后端服务器上。这样可以确保同一客户端的请求始终被转发到同一台后端服务器,适用于需要保持会话一致性的场景,例如:
upstream backend_servers {ip_hash;server 192.168.1.101:8080;server 192.168.1.102:8080;
}
3.3、跨域问题(CORS)
3.3.1、跨域问题详解
1. 什么是跨域?
跨域是指浏览器出于安全考虑(同源策略),限制一个域的网页去请求另一个域的资源。
- 同源:指两个 URL 的 协议、域名、端口 完全一致。例如:
http://example.com
与https://example.com
(协议不同,跨域)http://example.com
与http://api.example.com
(域名不同,跨域)http://example.com:80
与http://example.com:8080
(端口不同,跨域)
2. 跨域的常见场景
- 前端页面(
http://frontend.com
)请求后端 API(http://backend.com
) - 静态资源(如图片、JS)从
http://a.com
加载到http://b.com
的页面中 - 前后端分离项目中,前端本地开发环境(
http://localhost:3000
)请求后端服务器(http://localhost:8080
)
3. 跨域的本质:浏览器的同源策略限制
同源策略是浏览器的安全机制,防止恶意网站窃取其他网站的资源或数据。当跨域请求发生时,浏览器会拦截响应(即使服务器正常返回数据),并在控制台报类似错误:
Access to fetch at 'http://backend.com/api' from origin 'http://frontend.com' has been blocked by CORS policy...
3.3.2、Nginx 解决跨域的原理与配置
Nginx 解决跨域的核心思路是:通过反向代理将跨域请求转为同域请求。
即前端页面请求 Nginx 服务器(同域),Nginx 再转发请求到真实后端服务器,从而绕过浏览器的同源策略限制。
1. 场景假设
- 前端页面地址:
http://frontend.com
(端口 80) - 后端 API 地址:
http://backend.com:8080
(跨域,协议 / 域名 / 端口任一不同) - 目标:让前端通过
http://frontend.com/api
访问后端 API,实现 “同域” 请求。
2. Nginx 配置示例
server {listen 80;server_name frontend.com; # 前端页面的域名(同域)# 处理前端页面的静态资源(如 HTML、CSS、JS)location / {root /path/to/frontend; # 前端代码存放目录index index.html;}# 反向代理后端 API,解决跨域location /api/ { # 前端请求以 /api 开头的路径时,触发代理proxy_pass http://backend.com:8080/; # 转发到真实后端(注意末尾的 / 含义)# 关键:设置跨域相关响应头,允许浏览器接收add_header Access-Control-Allow-Origin $http_origin; # 允许请求的源($http_origin 为动态值,或者为*允许所有的跨域调用)add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; # 允许的请求方法add_header Access-Control-Allow-Headers Content-Type,Authorization; # 允许的请求头add_header Access-Control-Allow-Credentials true; # 允许携带 Cookie(需前后端配合)}
}
3. 配置说明
proxy_pass
转发规则:
当前端请求http://frontend.com/api/user
时,Nginx 会转发到http://backend.com:8080/user
(/api/
被替换为后端的根路径)。- 跨域响应头作用:
Access-Control-Allow-Origin
:告诉浏览器 “允许frontend.com
这个源的请求”,$http_origin
表示动态匹配请求的源(更灵活)Access-Control-Allow-Credentials
:如果前端请求需要携带 Cookie 或认证信息,必须设置为true
,且Allow-Origin
不能为*
(需指定具体域名)。
4. 效果
前端只需请求同域的 http://frontend.com/api/xxx
,Nginx 自动转发到后端,浏览器认为是同域请求,不再拦截,跨域问题解决。
3.4、动静态资源分离
3.4.1、什么是动静态资源分离?
动静态分离是指将网站的动态资源和静态资源分开部署、管理和访问的架构设计。
- 静态资源:即所说的前端资源,指内容不随请求变化的文件,如 HTML、CSS、JS、图片(jpg/png)、视频、字体等(可被浏览器缓存)。
- 动态资源:即后端请求,指内容随请求参数或业务逻辑动态生成的资源,如 PHP/JSP/Java 代码生成的页面、API 接口返回的 JSON 数据等(需服务器计算后返回)。
通过分离,可让静态资源由专门的服务器(如 Nginx)处理,动态资源由应用服务器(如 Tomcat、Node.js)处理,从而提升整体性能。
3.4.2、为什么需要动静态分离?
- 减轻应用服务器压力:
静态资源访问频率高(如首页图片、样式表),若全部由处理动态逻辑的应用服务器承担,会占用其 CPU / 内存资源,影响动态请求的响应速度。 - 提升静态资源加载速度:
Nginx 处理静态资源的效率远高于应用服务器(底层基于异步非阻塞 IO,适合高并发静态文件读取),且可配合浏览器缓存、CDN 进一步加速。 - 便于缓存和扩展:
静态资源可设置长期缓存策略,或通过 CDN 分发到边缘节点;动态资源则可专注于业务逻辑,按需扩容应用服务器。
3.4.3、Nginx 实现动静态分离的核心思路
Nginx 通过 location
指令匹配不同资源路径,将静态资源请求直接由 Nginx 本地处理(读取服务器文件),动态资源请求转发到后端应用服务器(如 Tomcat、Spring Boot 等)。
假设场景:
- 静态资源(CSS/JS/ 图片)存放路径:
/usr/share/nginx/static
- 动态资源由后端应用服务器
http://192.168.1.101:8080
处理
配置如下:
nginx
server {listen 80;server_name example.com; # 网站域名# 1. 处理静态资源:匹配以 /static/ 开头的路径(如 CSS、JS、图片)location /static/ {root /usr/share/nginx; # 静态资源根目录(实际路径为 /usr/share/nginx/static/)try_files $uri =404; # 若文件不存在,返回404}# 2. 处理动态资源:所有非静态资源的请求转发到后端应用服务器location / {proxy_pass http://192.168.1.101:8080; # 转发到动态服务器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
五、配置说明
后面部署实例有更加详细的解释
- 静态资源处理(
location /static/
):
- 当用户请求
http://example.com/static/css/style.css
时,Nginx 会直接读取服务器上的/usr/share/nginx/static/css/style.css
文件并返回。 try_files $uri =404
:若请求的静态文件不存在,直接返回 404 错误,避免转发到后端服务器。
- 动态资源处理(
location /
):
- 除了
/static/
路径外的所有请求(如http://example.com/api/user
、http://example.com/login
),都会被转发到后端应用服务器192.168.1.101:8080
处理。
四、SpringBoot+Vue项目部署
以下是在 Linux 下部署 SpringBoot 前后端分离项目时,所需环境(JDK、MySQL、Redis、Tomcat、Nginx)的安装方式及注意事项整理:
4.1、需部署的环境
需在 Linux 系统中部署以下环境:
- JDK
- MySQL
- Redis
- Tomcat
- Nginx(用于部署前端项目)
部署时需要注意以下三点:
4.2、注意事项
4.2.1 安装方式
1. 安装方式分类
共四种常见安装方式,适用场景及操作特点如下:
(1)yum 安装
- 操作方式:通过
yum
命令直接安装(如yum install 软件名
)。 - 特点:
-
- 自动解决依赖关系,安装 / 卸载便捷。
- 安装后默认生成 systemd 服务单元文件,可通过
systemctl
命令(如start
/stop
/status
)管理服务。 - 适合快速部署、生产环境基础版本需求。
(2)源码编译安装
- 操作流程:
1. 下载源码包(通常为 .tar.gz
格式),使用 tar -xvzf 文件名
解压。
如图,nginx目录就是我们刚解压好的目录:
2.进入解压目录,配置编译参数(如 ./configure
或 cmake
,指定安装路径、功能模块等),此步骤会检查系统依赖,缺失则报错。
3.编译并安装:
make
:根据配置生成的Makefile
,调用编译器(如gcc
)将源码编译为二进制可执行文件。make install
:将编译好的文件复制到配置阶段指定的系统目录(如/usr/local/软件名
),完成部署。
注意事项:
- 服务器中会存在两份文件:下载的源码包目录 +
make install
后的系统指定目录。 - 配置文件需修改
make install
后的系统目录中的文件,而非原始源码包目录中的文件(如 Nginx 配置需修改/usr/local/nginx/conf/nginx.conf
)。 - 适用场景:需定制化功能(如启用 / 禁用特定模块)、需指定版本时使用。
(3)二进制包安装
- 操作方式:
-
- 下载预编译的二进制包(通常为
.tar.gz
格式),使用tar -xvzf 文件名
解压。 - 解压后可直接使用(无需编译),文件集中在解压目录内。
- 下载预编译的二进制包(通常为
- 与源码编译安装的核心区别:
- 二进制包解压后不会自动复制到系统指定目录,需手动处理(如直接在解压目录运行,或手动复制到
/usr/local/
等路径)。 - 无源码文件,无需
configure
、make
等编译步骤。
- 二进制包解压后不会自动复制到系统指定目录,需手动处理(如直接在解压目录运行,或手动复制到
区分源码包与二进制包:
特征 | 源码包 | 二进制包 |
文件名 | 仅含软件名 + 版本(如 标识 | 含系统架构 (如 |
解压后内容 | 含 | 含 |
是否需编译 | 是(需 | 否(直接运行) |
(4)rpm 包安装
- 操作方式:通过
rpm
命令手动安装(如rpm -ivh 包名.rpm
)。 - 特点:
- 可精确控制版本,无需依赖 yum 仓库(需提前下载对应 rpm 包)。
- 需手动解决依赖关系(依赖缺失时需单独安装)。
- 适用场景:需固定版本且无法使用 yum 仓库时。
除了第一种可以使用systemctl管理查看状态,其他方式安装的都不可使用该命令查看。
4.2.2、不同方式的启动和关闭
1、若使用yum安装的软件
# 临时启动(当前会话生效,重启后失效)
sudo systemctl start 服务名# 开机自启(永久生效)
sudo systemctl enable 服务名# 临时停止(当前会话生效,重启后若已设置自启则会重新启动)
sudo systemctl stop 服务名# 禁止开机自启(仅关闭自启,不影响当前运行状态)
sudo systemctl disable 服务名# 查看服务状态(是否运行、启动失败原因等)
sudo systemctl status 服务名# 重新加载服务配置
sudo systemctl reload 服务名# 若不支持重新加载,则重启服务
sudo systemctl restart 服务名
2、若使用安装包安装的软件
这个并没有统一规范,多数源码文件会在安装目录下生成bin/sbin目录,包含启动/关停脚本(如start.sh,stop.sh或直接以软件命名的可执行文件),具体的需要查看官网文档说明。
- 启动:直接执行启动脚本(通常需要指定配置文件路径)
示例(以 Nginx 源码安装为例):
# 启动(假设安装在/usr/local/nginx)
/usr/local/nginx/sbin/nginx# 示例:重新加载配置
/usr/local/nginx/sbin/nginx -s reload
- 关停:执行停止脚本,或通过软件自带的参数停止
# Nginx停止(通过自带参数)
/usr/local/nginx/sbin/nginx -s stop# 若软件支持信号停止(如Redis)
kill -9 进程ID # 强制杀死(不推荐,可能导致数据丢失)
4.2.3、端口号的开放
一般每个服务都有对应的端口号,我们可以从配置文件中看到这个端口号。如果要访问这个服务,那么一定要放行这个端口号,一共有两个位置需要更改:
如在 Linux 系统中放行 8081 端口,通常需要在云服务器控制台配置安全组规则,并在服务器终端配置防火墙规则。
1、终端配置防火墙规则:
sudo firewall-cmd --add-port = 8081/tcp --permanent
命令,添加 8081 端口到防火墙规则中,--permanent
参数表示永久生效。
然后执行
sudo firewall - cmd --reload
命令,重新加载防火墙规则,使新规则生效。
2、云服务器控制台配置:
登录腾讯云控制台,找到对应的云服务器实例,进入 “网络与安全” 部分,查看或编辑安全组策略。在安全组规则中添加允许入站流量的规则,协议选择 TCP,端口范围设置为 8081,来源设置为0.0.0.0/0
,保存规则即可。
4.3、后端项目打包部署
我们对springBoot项目进行打包,在依赖中加入下面代码
<build><plugins>
<!-- 负责将 Java 源代码编译为字节码(.class 文件),是 Maven 原生的编译工具。--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin>
<!-- 是 Spring Boot 提供的专用插件,用于将项目打包为可直接运行的jar/war包(包含嵌入式服务器,如 Tomcat),并支持 Spring Boot 特有的构建功能。--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
打包好后,会生成两个jar包,一个jar包,一个jar.original包,我们把第一个jar包上传到云服务器上。
上传好后,执行java -jar 项目名即可启动后端项目
4.4、前端项目打包部署(使用Nginx代理)
因为我们是前后端分离项目,刚才的只是部署后端到云服务器上,下面我们部署前端vue项目
我们打开vue项目,在终端输入命令
npm run build
将前端代码(如Vue的.vue、.js文件,以及样式图片等)编译、压缩、打包成浏览器可以直接运行的静态资源(HTML,CSS,JS、图片等),输出到dist目录
然后我们将dist目录打包成压缩包,上传到云服务器上,记住上传的位置
然后我们打开Nginx配置文件,开始进行配置:
# 前端静态文件 + 后端接口代理配置server {# 监听端口(根据需求调整,如 80、8080,确保未被占用)listen 81;# 绑定的域名或 IP(替换为你的服务器公网 IP 或域名)server_name 124.220.90.82;# 字符集(按需启用,如前端是中文,可设为 utf-8)# charset koi8-r;# 静态文件配置:直接加载前端打包文件location / {# 前端静态文件目录(替换为你的实际路径)root /usr/local/nginx/html/staticResource;# 默认首页文件index index.html index.htm;# 解决 Vue/Router History 模式刷新 404 问题try_files $uri $uri/ /index.html;}# 后端接口代理配置(假设前端请求以 /prod-api 开头)location /prod-api/ {# 后端服务地址(替换为你的实际后端地址,如 Spring Boot 端口 8081)proxy_pass http://124.220.90.82:8081/;# 传递客户端真实 IP 和 Host 头(解决后端获取客户端 IP 异常问题)proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 处理长连接(可选,优化性能)proxy_http_version 1.1;proxy_set_header Connection "";}# 错误页面配置(404/50x 等)error_page 404 /404.html;error_page 500 502 503 504 /50x.html;location = /404.html {root /usr/local/nginx/html/staticResource;}location = /50x.html {root /usr/local/nginx/html;}}
4.4.1、配置项详细说明
1. location /
:匹配所有根路径请求
location /
是 Nginx 中最基础的路由规则,表示匹配所有以 /
开头的请求(即网站的所有访问路径,如 http://域名/
、http://域名/about
、http://域名/user
等)。
2. root /usr/local/nginx/html/staticResource;
:指定静态文件目录
- 作用:告诉 Nginx,当请求匹配
location /
时,去root
配置的目录中查找对应的静态文件(HTML、CSS、JS、图片等)。 - 举例:
当访问http://124.220.90.82/index.html
时,Nginx 会去/usr/local/nginx/html/staticResource/index.html
查找文件;
当访问http://124.220.90.82/css/app.css
时,会去/usr/local/nginx/html/staticResource/css/app.css
查找。 - 注意:路径必须准确指向 Vue 项目
npm run build
打包后的dist
目录(或解压后的实际路径),否则会出现 404 错误。
3. index index.html index.htm;
:设置默认首页
- 作用:当请求的是一个目录(而非具体文件)时,Nginx 会自动返回
index
配置的文件。
例如:访问http://124.220.90.82/
(根路径,本质是请求目录)时,Nginx 会默认返回root
目录下的index.html
。 - 为什么是
index.html
:Vue 项目打包后,dist
目录的入口文件就是index.html
,所有页面内容都通过这个文件动态渲染。
4. try_files $uri $uri/ /index.html;
:解决 Vue Router History 模式的核心
这是单页应用部署的关键配置,专门解决 Vue Router 使用 history
模式时的刷新 404 问题,逐部分解释:
$uri
:Nginx 变量,表示当前请求的文件路径。
例如:请求http://域名/css/app.css
时,$uri
就是/css/app.css
,Nginx 会先去root
目录下查找这个文件,如果存在则直接返回。$uri/
:表示当前请求的目录路径。
例如:请求http://域名/user
时(假设user
是一个路由,而非实际目录),$uri/
就是/user/
,Nginx 会检查root
目录下是否有user
文件夹,如果存在则返回该文件夹下的index.html
(通常不存在,所以继续下一步)。/index.html
:当$uri
和$uri/
都不存在时,直接返回root
目录下的index.html
。
为什么需要这行配置?
Vue 项目使用 history
模式时(路由路径如 /about
、/user
),这些路径对应的物理文件或目录并不存在(所有内容都由 index.html
通过 JavaScript 动态渲染)。
如果没有 try_files
:
- 直接访问
http://域名
(根路径):会返回index.html
,正常加载。 - 刷新
http://域名/about
:Nginx 会去查找/about
文件或目录,发现不存在,直接返回 404 错误。
有了 try_files
后:
- 刷新
http://域名/about
时,Nginx 找不到/about
文件 / 目录,会自动返回index.html
,此时 Vue Router 会根据 URL 中的/about
动态渲染对应的页面,避免 404。
1. location /prod-api/
:匹配特定前缀的请求
location /prod-api/
表示:只处理所有以 /prod-api/
开头的请求。
例如:
- 前端发起的
http://前端域名/prod-api/user/login
- 前端发起的
http://前端域名/prod-api/article/list
这些请求会被该规则匹配并处理,其他不以 /prod-api/
开头的请求(如静态资源请求)则不会进入该规则。
2. proxy_pass http://124.220.90.82:8081/;
:核心代理转发
这是代理配置的核心,作用是将匹配到的请求转发到指定的后端服务地址。
- 拆解说明:
-
proxy_pass
:Nginx 代理指令,用于指定后端服务的地址。http://124.220.90.82:8081/
:后端服务的实际地址(需替换为你的后端 IP: 端口)。
例如:如果后端服务部署在同一服务器的 8081 端口,就是http://127.0.0.1:8081/
;如果在其他服务器,就是对应的公网 / 内网 IP: 端口。
- 转发逻辑:
当天前端请求http://前端域名/prod-api/user/login
时,Nginx 会自动转发到:
http://124.220.90.82:8081/user/login
(注意:/prod-api/
前缀被去掉了,因为proxy_pass
最后有/
)。若proxy_pass
末尾没有/
(如http://124.220.90.82:8081
),则转发后会保留/prod-api/
前缀(即http://后端地址/prod-api/user/login
),需根据后端接口实际路径决定是否加/
。
3. proxy_set_header
:传递客户端信息给后端
后端服务通常需要获取客户端的真实 IP、请求域名等信息(例如用于日志记录、权限验证),但由于请求经过 Nginx 代理,后端直接获取的会是 Nginx 服务器的 IP,而非真实客户端 IP。这些配置用于解决此问题:
proxy_set_header Host $host;
$host
是 Nginx 变量,表示客户端请求的域名或 IP(如124.220.90.82
)。- 作用:将客户端请求的域名 / IP 传递给后端,确保后端能正确识别请求的来源域名(例如后端有多个域名绑定的情况)。
proxy_set_header X-Real-IP $remote_addr;
$remote_addr
是 Nginx 变量,表示客户端的真实 IP 地址。- 作用:在请求头中添加
X-Real-IP
字段,后端可通过该字段获取客户端真实 IP(例如 Java 中用request.getHeader("X-Real-IP")
)。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
$proxy_add_x_forwarded_for
是 Nginx 变量,记录请求经过的所有代理服务器 IP,格式为客户端IP, 代理1IP, 代理2IP...
。- 作用:当请求经过多层代理时,后端可通过该字段追溯完整的请求路径(常用于复杂网络环境的日志分析)。
这样前后端项目就都部署完成了,此时我们访问124.220.90.82:8081/便可以出现我们的项目首页了