2024年1月Java项目开发指南20:windows下使用Nginx部署应用
命令
启动
start nginx
重新加载配置文件
nginx -s reload
nginx -t
修改配置后执行上面两个语句
其他
# 停止
nginx.exe -s stop
# 关闭所有nginx
taskkill /IM nginx.exe /F
# 查看nginx版本
nginx -v
下载地址
https://nginx.org/en/download.html
部署Vue项目
1 打包Vue项目
得到dist文件件
2 启动Nginx,访问localhost
注意:Nginx需要占用80端口。
启动后访问localhost,成功后如下图所示:

3 部署Vue到Nginx
可以直接将编译后的dist文件夹放在nginx的html目录下
然后将“dist”改成你的项目名称(英文、无空格和特殊符号、简短、小写)
比如:/nginx/html/just_play/index.html
然后修改配置文件 /nginx/conf
添加
server {
listen 端口号;
server_name localhost;
location / {
root html/just_play;
index index.html index.htm;
}
}
改了之后保存,重新加载Nginx配置
nginx -s reload
nginx -t
就可以输入 localhost:端口号 访问项目地址
3 反代理配置
基于上述配置,继续修改
server {
listen 端口号;
server_name localhost;
location / {
root html/just_play;
index index.html index.htm;
}
# 注意 /反代理地址/ 这个和前端vite.config.ts或者vue.config.vue的配置保持一致
location /反代理地址/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://服务器地址:端口号/;
# 后端地址
}
}
举个例子,后端:

前端配置

Nginx配置
server {
listen 10001;
server_name localhost;
location / {
root html/just_play;
index index.html index.htm;
}
location /api/ {
proxy_pass http://localhost:12080; # 替换为你的后端服务器地址
rewrite ^/api/(.*)$ /$1 break;
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_set_header X-Forwarded-Proto $scheme;
# 重新设置 client_max_body_size 和 client_body_buffer_size
client_max_body_size 100M;
client_body_buffer_size 128k;
}
client_max_body_size 100M;
client_body_buffer_size 128k;
proxy_buffering on;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_read_timeout 600; # 设置为10分钟
proxy_send_timeout 600; # 设置为10分钟
}
重新加载nginx配置。
!!!!注意注意!!!!
rewrite ^/api/(.*)$ /$1 break;
这行代码根据你项目实际情况来
比如我的项目
请求地址:localhost:10001/api/login
给后端的地址是 localhost:12080/login
而不是 localhost:12080/api/login
也就是要把/api去掉,所以有 rewrite ^/api/(.*)$ /$1 break;
4 处理刷新404
配置 try_files $uri $uri/ /index.html; 处理页面刷新404
location / {
root html/just_play;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
5 实现负载均衡
5.1 简述
负载均衡(Load Balancing)是一种将工作负载分布到多个服务器上的技术,其主要目的是优化资源使用、最大化吞吐量、减少响应时间,并避免任何单个服务器过载。Nginx 作为一款高性能的 Web 服务器和反向代理服务器,具备强大的负载均衡能力
客户端(如浏览器)向 Nginx 服务器发送 HTTP 请求。Nginx 接收到请求后,作为反向代理服务器,它会根据配置的负载均衡策略,决定将该请求转发到哪个后端服务器上
所以想要有效的实现负载均衡,需要你有多台服务器。加载资源为主的服务器可以以带宽优先(比如专门放前端的服务器),处理业务逻辑的可以以算力优先(比如后端),将不同优势的服务器进行组合使用,降本增效,减少资源浪费。
5.2 负载均衡策略
Nginx 支持多种负载均衡策略,不同的策略决定了请求如何分配到后端服务器上:
(1)轮询(round - robin):默认的负载均衡策略,Nginx 按顺序将请求依次转发到后端服务器列表中的每台服务器。例如,有服务器 A、B、C,第一个请求会被转发到 A,第二个请求到 B,第三个请求到 C,然后再回到 A,以此类推。
(2)加权轮询(weighted round - robin):为每台后端服务器分配一个权重值,权重越高的服务器接收的请求越多。比如,服务器 A 权重为 2,服务器 B 权重为 1,那么在每 3 个请求中,服务器 A 会接收 2 个请求,服务器 B 会接收 1 个请求。
(3)IP 哈希(ip - hash):根据客户端的 IP 地址进行哈希计算,将相同 IP 地址的客户端请求始终转发到同一台后端服务器上。这种策略可以保证同一客户端的请求总是被发送到同一台服务器,适用于需要保持会话状态的应用场景。
(4)最少连接(least - connections):Nginx 会将请求转发到当前连接数最少的后端服务器上,这样可以避免某些服务器因连接过多而负载过高。
加权最少连接(weighted least - connections):结合了最少连接和加权的思想,在考虑服务器连接数的同时,还会根据服务器的权重来分配请求。
以下是Nginx常见负载均衡策略的表格呈现:
| 类型 | 命令 | 作用 | 使用情景举例 |
|---|---|---|---|
| 轮询 | upstream { server server1.example.com; server server2.example.com; }(默认策略,无需额外指令) |
按顺序依次将请求分配到后端服务器,均等分配请求 | 适用于后端服务器性能相近,且没有特殊业务需求的场景,如普通的Web应用服务器集群。 |
| 加权轮询 | upstream { server server1.example.com weight=3; server server2.example.com weight=2; } |
根据服务器的性能差异为不同服务器设置权重,权重越高,被分配到请求的概率越大 | 当后端服务器性能不同,例如配置高的服务器权重设为3,配置低的设为2,让性能好的服务器承担更多请求。 |
| IP哈希 | upstream { ip_hash; server server1.example.com; server server2.example.com; } |
根据客户端的IP地址计算哈希值,通过该哈希值将请求始终路由到同一台后端服务器 | 适用于有状态服务或需要保持会话一致性的场景,如用户登录后,后续请求需始终由同一服务器处理以维持登录状态。 |
| 最少连接 | upstream { least_conn; server server1.example.com; server server2.example.com; } |
将请求分配到当前连接数最少的后端服务器上 | 适合后端服务器处理请求的时间不确定,希望根据服务器当前负载情况动态分配请求的场景,避免服务器过载。 |
| 加权最少连接 | upstream { least_conn; server server1.example.com weight=3; server server2.example.com weight=2; } |
结合了加权和最少连接的特点,根据服务器权重和当前连接数综合判断分配请求 | 在后端服务器性能不同且处理请求时间有差异的情况下使用,让性能高且负载低的服务器优先处理请求。 |
5.3 应用实践
没有实现数据库的分布式管理和数据同步的话,可以采用下面这种架构

多个后端的话直接用云数据库。但是,要注意数据库性能瓶颈的问题。
毕竟那么多个后端的数据库操作请求都压力到了一个数据库身上
虽然共用数据库和 Redis,但在高并发场景下,不同后端对数据的读写操作仍可能引发数据一致性问题。
我有两台服务器,一台的带宽高,配置低,server1
一台配置高,带宽低,server2

接下来就是对Nginx的配置
http {
include mime.types;
default_type application/octet-stream;
upstream just_play_backend {
# 使用轮询策略
# 如果不指定策略,默认就是轮询
# 可以根据需要修改为其他策略,如 ip_hash, least_conn 等
least_conn;
server localhost:12080;
server 212.**.**.**:9420;
}
……
server {
listen 10001;
server_name localhost;
location / {
root html/just_play;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://just_play_backend; # 替换为你的后端服务器地址
rewrite ^/api/(.*)$ /$1 break;
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_set_header X-Forwarded-Proto $scheme;
# 重新设置 client_max_body_size 和 client_body_buffer_size
client_max_body_size 100M;
client_body_buffer_size 128k;
}
client_max_body_size 100M;
client_body_buffer_size 128k;
proxy_buffering on;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_read_timeout 600; # 设置为10分钟
proxy_send_timeout 600; # 设置为10分钟
}
保存,重载配置。
然后我关闭其中一个后端,再访问,请求就被转发到了另外一个正常的后端。
其他
相关文档推荐:
https://nginx.mosong.cc/guide/
作者:萌狼蓝天
QQ:3447902411(仅限技术交流,添加请说明方向)
转载请注明原文链接:https://www.cnblogs.com/zwj/p/18784554/project202401-20

浙公网安备 33010602011771号