Nginx从入门到Spring Boot负载均衡以及多个Vue项目配置实战

1 Nginx简介

传统的 Web 服务器,每个客户端连接作为一个单独的进程或线程处理,需在切换任务时将 CPU 切换到新的任务并创建一个新的运行时上下文,消耗额外的内存和 CPU 时间,当并发请求增加时,服务器响应变慢,从而对性能产生负面影响。

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。

Nginx 的最重要的几个使用场景:

  1. 静态资源服务,通过本地文件系统提供服务;

  2. 反向代理服务,延伸出包括缓存、负载均衡等;

  3. API 服务,OpenResty ;

2 相关概念

2.1 简单请求和非简单请求

首先我们来了解一下简单请求和非简单请求,如果同时满足下面两个条件,就属于简单请求:

  1. 请求方法是 HEADGETPOST 三种之一;

  2. HTTP 头信息不超过右边着几个字段:AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type 只限于三个值 application/x-www-form-urlencodedmultipart/form-datatext/plain

凡是不同时满足这两个条件的,都属于非简单请求。

浏览器处理简单请求和非简单请求的方式不一样:

简单请求

对于简单请求,浏览器会在头信息中增加 Origin 字段后直接发出,Origin 字段用来说明,本次请求来自的哪个源(协议+域名+端口)。

如果服务器发现 Origin 指定的源不在许可范围内,服务器会返回一个正常的 HTTP 回应,浏览器取到回应之后发现回应的头信息中没有包含 Access-Control-Allow-Origin 字段,就抛出一个错误给 XHR 的 error 事件;

如果服务器发现 Origin 指定的域名在许可范围内,服务器返回的响应会多出几个 Access-Control- 开头的头信息字段。

非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUT 或 DELETE,或 Content-Type 值为 application/json。浏览器会在正式通信之前,发送一次 HTTP 预检 OPTIONS 请求,先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 请求方法和头信息字段。只有得到肯定答复,浏览器才会发出正式的 XHR 请求,否则报错。

2.2 跨域

在浏览器上当前访问的网站向另一个网站发送请求获取数据的过程就是跨域请求。

跨域是浏览器的同源策略决定的,是一个重要的浏览器安全策略,用于限制一个 origin 的文档或者它加载的脚本与另一个源的资源进行交互,它能够帮助阻隔恶意文档,减少可能被攻击的媒介,可以使用 CORS 配置解除这个限制。

关于跨域网上已经有很多解释,这里就不啰嗦,也可以直接看 MDN 的 <浏览器的同源策略> 文档进一步了解,这里就列举几个同源和不同元的例子,相信程序员都能看得懂。

# 同源的例子
http://example.com/app1/index.html  # 只是路径不同
http://example.com/app2/index.html

http://Example.com:80  # 只是大小写差异
http://example.com

# 不同源的例子
http://example.com/app1   # 协议不同
https://example.com/app2

http://example.com        # host 不同
http://www.example.com
http://myapp.example.com

http://example.com        # 端口不同
http://example.com:8080

2.3 正向代理和反向代理

反向代理(Reverse Proxy)对应的是正向代理(Forward Proxy),他们的区别:

正向代理: 一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见;

例如:你的浏览器无法直接访问跨域网站,这时候可以通过一个代理服务器来帮助你访问,那么这个服务器就叫正向代理。

反向代理: 与一般访问流程相比,使用反向代理后,直接收到请求的服务器是代理服务器,然后将请求转发给内部网络上真正进行处理的服务器,得到的结果返回给客户端。反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。

例如:去饭店吃饭,可以点川菜、粤菜、江浙菜,饭店也分别有三个菜系的厨师 👨‍🍳,但是你作为顾客不用管哪个厨师给你做的菜,只用点菜即可,小二将你菜单中的菜分配给不同的厨师来具体处理,那么这个小二就是反向代理服务器。

简单的说,一般给客户端做代理的都是正向代理,给服务器做代理的就是反向代理。

正向代理和反向代理主要的原理区别可以参见下图:

2.4 负载均衡

一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。

这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。

很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。

请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。

例如:晚高峰乘坐地铁的时候,入站口经常会有地铁工作人员大喇叭“请走 B 口,B 口人少车空....”,这个工作人员的作用就是负载均衡。

2.5 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。

使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响

3 环境准备

本次使用系统环境是centos7.5

如果要使用nginx,首先要准备环境,因为nginx是c语言写的,必须在安装nginx之前安装gcc、openssl、pcre、zlib这四个前提依赖。

本次实战是离线安装方式,需要下载安装包,请自行下载。

3.1 安装gcc

(1)上传压缩依赖包

(2)解压压缩文件

tar -xvf xxxxxx

(3)进入解压目录执行命令

./configure
make
make check
make install

3.2 安装openssl

(1)上传压缩依赖包

(2)解压压缩文件

tar -xvf xxxxxx

(3)进入解压目录执行命令

./configure
make
make check
make install

3.3 安装pcre

(1)上传压缩依赖包

(2)解压压缩文件

tar -xvf xxxxxx

(3)进入解压目录执行命令

./configure
make
make check
make install

3.4 安装zlib

(1)上传压缩依赖包

(2)解压压缩文件

tar -xvf xxxxxx

(3)查看编辑参数

./configure --help

(4)添加prefix路径

./configure --prefix=/usr/local/zlib

(5)查看执行结果

echo $?

(6)编译执行安装

make

make check

make install

(7)写入动态库的路径

echo "/usr/local/zlib/lib/" >> /etc/ld.so.conf

ldconfig -v

4 安装nginx

(1)上传压缩依赖包

(2)解压压缩文件

tar -xvf xxxxxx

(3)进入解压目录执行命令

./configure
make
make check
make install

(4)进入目录 /usr/local/nginx/sbin/nginx 启动服务

(5)nginx常用命令

进入nginx安装目录:cd /usr/local/nginx/sbin

查看nginx 版本号: ./nginx -v

启动nginx: ./nginx

停止nginx: ./nginx -s stop

重新加载nginx: ./nginx -s reload

5 负载均衡配置

因为我是微服务spring boot项目,至此以微服务为例,配置nginx负载均衡。

5.1 准备工作

部署两个微服务项目,一个是8073,一个是8072

5.2 配置示例

5.3 实现效果

浏览器地址栏输入地址 http://172.16.5.89:8070,负载均衡效果,平均 8072 和 8073 端口中

5.4 nginx分配服务器策略

(1)轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

(2)weight

weight 代表权重默认为 1,权重越高被分配的客户端越多。

例如:
        upstream bakend {
                server 192.168.0.14 weight=10;
                server 192.168.0.15 weight=10;

        }

(3)ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。

 例如:
        upstream bakend {
                ip_hash;
                server 192.168.0.14:88;
                server 192.168.0.15:80;

        }

(4)least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

upstream bakend  {
    least_conn;  #把请求转发给连接数较少的后端服务器
    server 192.168.0.14:8080  weight=2;
    server 192.168.0.15:8081; 
    server 192.168.0.16:8082 backup;
    server 192.168.0.17:8083  max_fails=3 fail_timeout=20s; #tomcat 9.0
  }

(5)fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {
                server 192.168.0.14:88;
                server 192.168.0.15:80;
                fair;

        }

(6)url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

 upstream backend {

                server squid1:3128;
                server squid2:3128;
                hash $request_uri;
                hash_method crc32;
        }

6 部署多个vue配置

通过node.js对vue项目进行打包,命令如下:

# 下载依赖
npm run install

# 启动vue项目
npm run serve

# 打包
npm run build

将已经打包好的vue项目上传到liunx服务器文件下,修改nginx配置文件;

        # 第一个vue项目
        location /api {
            alias  /home/work/nginx-1.18.0/html/api;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
        # 第二个vue项目
         location /api2 {
            alias  /home/work/nginx-1.18.0/html/api;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
        # 第一个sprig boot项目
         location ^~/service-api/ {
            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://172.31.67.232:8086/api/;
        }
        # 第二个sprig boot项目
        location ^~/service2-api/ {
            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://172.31.67.232:8086/api/;
        }
        # 第三个sprig boot 跨域访问
        location ^~/service2-api/ {
            add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-  Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
            proxy_pass http://172.31.67.232:8086/api/;
        }

7 结束语

至此nginx安装以及spring boot微服务项目负载均衡配置和前端多个vue项目完成。

如需要离线安装包,请自行下载,地址:https://download.csdn.net/download/lovelichao12/12503614

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十点摆码

有用你就打赏一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值