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,成功后如下图所示:
image

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://服务器地址:端口号/;
			# 后端地址
		}
    }

举个例子,后端:
image

前端配置
image

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 应用实践

没有实现数据库的分布式管理和数据同步的话,可以采用下面这种架构

image

多个后端的话直接用云数据库。但是,要注意数据库性能瓶颈的问题。
毕竟那么多个后端的数据库操作请求都压力到了一个数据库身上

虽然共用数据库和 Redis,但在高并发场景下,不同后端对数据的读写操作仍可能引发数据一致性问题。

我有两台服务器,一台的带宽高,配置低,server1
一台配置高,带宽低,server2

image

接下来就是对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/

posted @ 2025-03-21 10:12  萌狼蓝天  阅读(59)  评论(0)    收藏  举报