Nginx 反向代理 负载均衡 动静分离 高可用 原理

1、Nginx简介

1.1 概述

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。

1.2 相关概念

(1)反向代理

服务器的代理,相对于web用户来说,就是反向代理。

(2)均衡负载

      很多人同时访问服务器同一资源的时候,为了保证访问质量。开发者首先会将服务部署在多个服务器上,然后按照某种规则(即负载均衡的方式)将压力分摊到不同服务器上。

(3)动静分离

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

2、Nginx安装(了解即可)

注意:本节内容了解下即可,实际项目都是用Docker来安装,Docker有办法很轻松的安装,比本节的方法简单几十倍。

2.1 准备好安装软件

(1)进入nginx官网,下载好软件

http://nginx.org/

注意:就像打游戏需要装一些环境一样,nginx也需要准备好以下3个插件,才能正常运行。最终准备好以下4个东西(包含nginx本体)

pcre-8.37.tar.gz
openssl-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.11.1.tar.gz

以上素材记得名字就好。linux有办法直接联网下载。

2.2 安装nginx及其插件

(1)安装pcre-8.37  (采用wget方式获取软件) https://www.cnblogs.com/ftl1012/p/9265699.html

用法: wget [选项]... [URL]...

step1:下载pcre

wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz

step2:解压压缩文件

 tar –xvf pcre-8.37.tar.gz

step3:安装文件(这里是和yum、rpm安装不一样的安装方式)

预备知识:linux命令 ./configure、make、make install https://www.cnblogs.com/tinywan/p/7230039.html

① 进入 pcre-8.37 执行   ./configure 命令(生成 Makefile,为下一步的编译做准备

② 编译和安装

make && make install

step4 查看是否安装成功

pcre-config --version

(2)安装 openssl 、zlib 、 gcc 依赖 (yum方式安装 推荐

yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

(3)安装nginx(已经从官网下载好了,只能用传统办法安装了)

step1:解压安装包nginx-1.12.2.tar.gz

tar -xvf nginx-1.12.2.tar.gz

step2:进入解压好的目录执行   ./configure 命令(生成 Makefile,为下一步的编译做准备

Step3:编译和安装

make && make install

2.3 启动Nginx

进入目录 /usr/local/nginx/sbin/nginx,执行【要换 root 用户下执行】

./nginx

浏览器访问:http://192.168.77.130:80

特别注意:

我们访问nginx可能会由于linux防火墙的原因导致访问不成功。

补充:Linux Centos7防火墙设置方法

查看开放的端口号

firewall-cmd --list-all

设置开放的端口号

firewall-cmd --add-service=http –permanent

firewall-cmd --add-port=80/tcp --permanent

重启防火墙

firewall-cmd –reload

3、Nginx常用命令和配置文件

3.1 Nginx常用命令

一定要进入nginx目录后,才能使用Nginx命令。否则命令无效

(1)查看nginx版本号

./nginx -v

(2)启动 nginx

./nginx

(3)停止nginx

./nginx	-s	stop

(4)重新加载nginx

./nginx -s reload

3.2 nginx配置文件(nginx.conf)  重点!!

对 nginx 的使用基本上都是对此配置文件进行相应的修改!

(1)配置文件位置

/usr/local/nginx/conf/nginx.conf

特别说明:配置文件那么多内容,全部写在nginx.conf里面,可读性会很差。因此配置文件的所在目录,除了有nginx.conf ,还会有一个conf.d目录,可以根据需要将不同server的配置文件单独写在conf.d目录下

(2)配置文件结构

(3)配置文件的内容

配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:

第一部分:全局块

    从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置:

① 运行 Nginx 服务器的用户(组)

② 允许生成的 worker process 数 (worker的数量,一般和cpu核心数相同)

③ 进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

exp:比如上面第一行配置的:worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,配置worker的数量,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约,一般和cpu核心数相同 。

第二部分:events 块

     events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。

exp:比如上面的配置:

 worker_connections    1024; 

上述例子就表示每个 work process 支持的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http 块(基本就是配这个了)

    这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http 全局块、server 块。

(1)http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

(2)server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

(2.1)全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

(2.2)location 块

一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
 

4、nginx应用—反向代理

4.1 反向代理实例1一需求:(基本功)

打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页面中 。

4.1.1 访问过程分析:

4.1.2 域名地址配置

    由于互联网上根本没有注册www.123.com,域名服务器是解析不了这个域名的。好在第一步是去本机的hosts文件里面找域名对应的ip,找不到再去问域名服务器。因此,我们只需修改hosts文件,让hosts文件中的ip与该域名对应即可。

(1)在 windows 系统的 host 文件进行域名和 ip 对应关系的配置  (windows系统指准备去访问web的windows主机)

末尾添加,将 www.123.com 映射到 192.168.17.129 (nginx所在的linux系统服务器的ip地址)

192.168.17.129   www.123.com

(2)在nginx进行请求转发的配置

进入配置文件nginx.conf

配置 HTTP块中的server 和 location

说明:80端口是默认监听端口。如果web浏览器的网址只写域名(ip地址),不写端口号。就自动认为端口号是80

(3)测试

切换到 /usr/local/nginx/sbin/重新启动 nginx

./nginx -s reload

访问:www.123.com,

如上配置,我们监听 80 端口,访问域名为 www.123.com,不加端口号时默认为 80 端口,故访问该域名时会跳转到 127.0.0.1:8080 路径上。测试成功!

4.2 反向代理实例2—需求 (进阶)

用windows上的web浏览器:

  • 访问 http://192.168.17.129:9001/edu/ 直接跳转到 127.0.0.1:8080
  • 访问 http:// 192.168.17.129:9001/vod/ 直接跳转到 127.0.0.1:8081

分析:

    使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,nginx 监听端口为 9001

4.2.1 配置Tomcat  

(1)将两个Tomcat的端口号分别修改为8080 和 8081

提示:通过Tomcat配置文件server.xml    /Tomcat8081/apache-tomcat-7.0.106/conf目录下

vim server.xml

(2)在两个tomcat内部分别创建 edu 和 vod 文件夹,文件夹里面随便写一个测试页面(一句话代码即可)

(2.1)在/Tomcat8080/apache-tomcat-7.0.106/webapps中,新建 edu 文件夹,并在该文件夹下新建文件 a.html

内容如下:

<h1>8080</h1>

(2.2)在/Tomcat8081/apache-tomcat-7.0.106/webapps中,新建 vod 文件夹,并在该文件夹下新建文件 a.html,

内容如下:

<h1>8081</h1>

(3)nginx配置(重点)

进入配置文件nginx.conf,依然配置HTTP的server和location

三处改变:监听端口(改9001) + nginx地址(改192.168.17.129) + 转发地址(改127.0.0.1:8080和127.0.0.1:8081)

(4)最终测试

重启 nginx ,

./nginx -s reload

特别注意:linux系统防火墙问题,如果访问不到,记得检查对外访问的端口号9001 8080 8081

扩展:location指令说明

该指令用于匹配 URL。

语法如下:

(1)= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

(2)~:用于表示 uri 包含正则表达式,并且区分大小写。

(3)~*:用于表示 uri 包含正则表达式,并且不区分大小写。

(4)^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

5、Nginx应用—负载均衡

5.1 需求:

浏览器地址栏输入地址 http://192.168.77.130/edu/a.html,Nginx将访问请求,平均到 8080和8081 端口中的两个Tomcat服务器中,实现负载均衡效果

5.2 准备工作:

(1)准备两台 tomcat 服务器,一台端口号为 8080,一台端口号为 8081

(2)在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试

5.3 在 nginx 的配置文件中进行负载均衡的配置(重点)

进入nginx.conf

(1)在HTTP块的全局位置添加绿色部分upstream.....

说明:myserver是自己取的名字,给后面的location用

(2)server块和它下面的location块中按下图配置

需求没写端口,就用默认的80。myserver已经在HTTP全局中的upstream那里自己取的名字,代表upstream下的多个server。

(3)重启Nginx

./nginx -s reload

(5)测试:

http://192.168.77.130/edu/a.html

访问结果在 8081 和 8080 之间切换 。

5.4 负载均衡策略

(1)轮询(默认)

upstream myserver{
        server 192.168.77.130:8080;
        server 192.168.77.130:8081;
}

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

(2)weight

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

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream myserver{
          server 192.168.77.130:8080 weight=10;
          server 192.168.77.130:8081 weight=5;
}

(3)ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题

也就是说客户端在第一次访问某个服务后,后面都是访问此服务 。

upstream myserver{
            ip_hash;
            server 192.168.77.130:8080;
            server 192.168.77.130:8081;
 }

(4)fair(第三方)

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

upstream myserver{
             server 192.168.77.130:8080;
             server 192.168.77.130:8081;
             fair;
}

6、Nginx应用—动静分离

6.1 什么是动静分离

目前主流的动静分离方案是:纯粹把静态文件独立成单独的域名,放在独立的服务器上。好处就是,静态资源数据访问交互比较少,静态服务器寿命就会非常的长。.

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开(本文演示的就是这种方案

特别说明:本节演示的是教学用动静分离!!  项目中动静分离 请看后文第9章 9.3

6.2 应用需求

web客户端访问 http://192.168.77.130/www/a.html,访问到的是静态服务器中的网页

web客户端访问 http://192.168.77.130/image/1.PNG 访问到的是静态服务器中的图像
 

6.2.1 准备工作

(1)在静态资源Tomcat服务器所在的Linux系统中,准备好静态资源

www 文件夹中存放好静态资源 a.html

<h1>test html !!!</h1>

image 中存放 1.PNG,

6.2.2 进入nginx配置文件进行配置(重点)

在HTTP块的server块添加监听端口、Nginx 地址

location块(重点):添加访问名字

autoindex on:目的是为了在访问 /image 时,能够显示目录里面的内容,当然这里也可以通过expire设置缓存过期时间 。

    通过 location 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。

6.2.3 最终测试

重启 Nginx

./nginx -s -reload

然后访问: 

再次访问:

http://192.168.77.130/image/1.PNG

 顺利出现图像。

7、Nginx搭建高可用集群

7.1 什么是高可用

        微服务中,为防止服务提供者宕掉,提供多个服务,nginx 同样,如果只使用一个 nginx ,可能发生单点故障,导致整个微服务不可用 。因此至少需要两胎nginx服务器,即可实现高可用。

7.2 准备工作

(1)需要两台 nginx 服务器 192.168.17.129 和 192.168.17.131

(2)两台服务器都需要安装 keepalived(一个脚本,帮你写好了相关切换和监控代码)

(3)需要虚拟 ip

7.3 安装在linux服务器上安装keepalived

(1)使用 yum 命令进行安装

yum install keepalived –y

(2)安装之后,在 /etc 里面生成目录 keepalived,有文件 keepalived.conf

7.4 完成高可用配置(主从配置  即配置keepalived)

Keepalived + Nginx 配合使用

7.4.1 主机 Nginx配置

(1)修改/etc/keepalived/keepalivec.conf 配置文件

! Configuration File for keepalived

global_defs {

    notification_email {

        acassen@firewall.loc

        failover@firewall.loc

        sysadmin@firewall.loc
     }

        notification_email_from Alexandre.Cassen@firewall.loc

        smtp_server 192.168.17.129

        smtp_connect_timeout 30

        router_id LVS_DEVEL # 主机名字
}


vrrp_script chk_http_port {
        script "/usr/local/src/nginx_check.sh"
        interval 2 #(检测脚本执行的间隔)
        weight 2 # 权重
   }
        vrrp_instance VI_1 {
        state MASTER # 备份服务器上将 MASTER 改为 BACKUP
        interface eth1 # 主机的网卡
        virtual_router_id 51  # 主、备机的 virtual_router_id 必须相同
        priority 100  # 主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
        }

        virtual_ipaddress {
             192.168.17.50 # VRRP H 虚拟地址
        }

}

扩展:主机名称 和 ip 映射

进入主机的hosts文件

vim /etc/hosts

添加映射内容:

127.0.0.1 LVS_DEVEL

便可以将主机名和ip地址进行映射 。

(2)在/usr/local/src添加检测脚本:nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header | wc -l`
if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
fi

7.4.2 从机 Nginx配置

(1)修改/etc/keepalived/keepalivec.conf 配置文件

! Configuration File for keepalived

global_defs {

    notification_email {

        acassen@firewall.loc

        failover@firewall.loc

        sysadmin@firewall.loc 

     }

        notification_email_from Alexandre.Cassen@firewall.loc

        smtp_server 192.168.17.129

        smtp_connect_timeout 30

        router_id LVS_DEVEL 
}


vrrp_script chk_http_port {
        script "/usr/local/src/nginx_check.sh"
        interval 2
        weight 2
   }
        vrrp_instance VI_1 {
        state BACKUP # 修改为从机 BACKUP
        interface eth2 # 修改为从机 的网卡
        virtual_router_id 51
        priority 90 # 优先级比主机低
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }

        virtual_ipaddress {
            192.168.17.50
        }

}

(2)在/usr/local/src添加检测脚本:nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header | wc -l`
if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
fi

7.5 测试

(1)启动Nginx

分别启动 主Nginx 和 从Nginx

切换到/usr/local/nginx/sbin/,执行

./nginx   #启动nginx

如果已经启动过,就选择重启
./nginx -s reload

查看 Nginx 是否启动成功

ps -ef | grep nginx

(2)启动keepalived

① CentOs 6 启动方式

启动 keepalived

service keepalived start

停止 keepalived

service keepalived stop

重启 keepalived

service keepalived restart

② CentOs 7 启动方式

启动 keepalived

systemctl start keepalived.service

(3)测试keepalived是否启动成功

ps -ef | grep keepalived

(4)最终测试

① 在浏览器地址栏输入 虚拟 ip 地址:http://192.168.17.50/

此时可以正常访问到nginx界面

把主服务器(192.168.17.129)nginx 和 keepalived 停止(让主机宕机),再输入 192.168.17.50(虚拟地址)

此时从机变成主机。依然可以访问到nginx主页面

8、nginx原理与优化参数配置

8.1 master 和 worker

Nginx 有一个 master 和 多个 worker,master 就相当于主管,worker 就是打工人 。

当客户端发送请求过来,会先通知 master ,然后由 mater 通知所有 worker 进行 争抢,然后由 woker 去完成静态资源加载或者方向代理 。

8.2 master-workers机制(一个master,多个worker)

     首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, master进程则很快启动新的worker进程。当然, worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

  • 好处:

(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作 。

(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断 。

8.3 设置多少个worker合适

     Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

  • 结论:worker 数和服务器的 cpu 数相等是最为适宜的 。

配置方法:配置文件全局块中(假设是4核cpu)

worker_processes 4;

8.4 连接数 worker_connection

     这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数:

(1)如果是HTTP请求本地资源来说,能够支持的最大并发数量是 worker_connections * worker_processes

(2)如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,

(3)如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
 

问题1:发送请求,占用了 woker 的几个连接数?

答:2 或者 4 个

问题2:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

答:普通的静态访问最大并发数是: worker_connections * worker_processes /2=4*1024/2=2048

如果是 HTTP 作 为反向代理来说,最大并发数量应该是: worker_connections * worker_processes/4=4*1024/4=1024

9、谷粒商城项目中的 nginx的应用(综合应用)

业务:访问nginx,nginx自动负载均衡到各个网关,网关再负载均衡到具体的微服务 

假设:nginx在docker中的ip地址是 192.168.163.131:80

9.1 前置工作

修改windows的 hosts文件,添加域名映射。位置:C:\Windows\System32\drivers\etc

(1)将gulimall.com 映射给 nginx 的ip(访问gulimall.com就相当于访问nginx)

(2)将search.gulimall.com 也映射给 nginx的ip(访问search.gulimall.com就相当于访问nginx)

在后面追加以下内容:

# guli mall #
192.168.163.131		gulimall.com
192.168.163.131		search.gulimall.com

(2)

9.2 Nginx配置(仿照4.1即可完成)

9.2.1 代理服务器配置(server)  (仿照4.1即可完成)

铺垫:如果仅仅转到一个网关,而非网关集群。集群的话,看9.2.2

server {
    #设置nginx的ip和端口号,我们将从web浏览器访问这个地址。域名已经映射好了
    listen       80;
    #*表示"所有"。即只要gulimall.com结尾的都转发
    server_name  *.gulimall.com;

   
    #设置要转到的真正ip 以及 端口号。
    location / {
      proxy_pass 192.168.163.1:88;
    }
  ......
}

9.2.2 负载均衡(仿照5.3即可完成)

(1)nginx 代理网关由网关进行转发,多个网关需要进行负载均衡

(2)配置

(2.1)复习

在http块中,upstream 配置需要负载均衡的服务器

upstream gulimall {  

     server ip:port

     server ip:port

}

说明:gulimall是自己取的名字,将多个ip:port聚合成一个名字,给后面的location(转发的实际地址)使用

(2.2)配置nginx.conf

(2.2.1)修改 http 块,配置上游服务器为网关地址

vim /mydata/nginx/conf/nginx.conf


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    ......
    upstream gulimall {  //gulimall自己取的名字,聚合了多个ip:port,给location 用
        server 192.168.163.1:88; //这里配置需要负载均衡的服务器,也是最终访问的服务器
        server 192.168.163.1:89;
    }
    include /etc/nginx/conf.d/*.conf;//代表conf文件分页了,conf.d里面继续conf的内容
}

(2.2.2)配置server

server {
    listen       80;
    #*表示"所有"。即只要gulimall.com结尾的都转发
    server_name  *.gulimall.com;

    .....

    location / {
      proxy_set_header Host $host; #nginx转发到目的地(这里是网关)过程中,会丢掉诸如请求头的信息
      proxy_pass http://gulimall; #gulimall是在上文upstream配置的名字,代表集群的多个网关ip和port
    }

   ......
}

特别注意:

nginx转发给网关的过程中,nginx在转发请求时会自动删除   header   中带有“_”的数据.因此host就被丢掉了。然而如果刚好网关匹配的路由规则是host规则(如下):只有指定主机的访问才路由

- id: gulimall_host_route
            uri: lb://gulimall-product #直接访问路径,默认就是去主页
            predicates:
              - Host=**.gulimall.com #host:只有指定的nginx主机才能路由去/gulimall-product

可是,刚好host在转发过程中,被nginx丢掉了,因此网关没法路由。

此时就需要加入:

proxy_set_header Host $host

$host是变量,从原http请求的header中取出的host字段

来确保host不丢失,这样网关才能正确转发

9.3 配置动静分离(性能优化)

从web浏览器访问nginx,转到网关,再转到微服务,每个中间件都会造成性能的损失。因此,为了性能最优,静态资源就放在nginx了

(1)以后将所有项目的静态资源都应该放在nginx里面

(2)规则:项目中/static/**所有请求都由nginx直接返回

  • 操作步骤:

(1)创建存放静态资源的文件夹

nginx文件夹中创建html/static 文件夹(目录全路径是:/mydata/nginx/html/static

(2)将项目中的静态文件 复制到 该目录

同理,仿照上面product微服务,将search微服务下的静态资源也复制到nginx的 /mydata/nginx/html/static目录下,此时nginx的static目录下就有两个文件夹,分别是product和search的静态资源(css,img以及js)

(3)修改 Nginx 配置文件 /mydata/nginx/conf/conf.d/gulimall.conf

 配置内容:

# /static/ 下所有的请求都转给 nginx
location /static/ {
	root /user/share/nginx/html;
}

 详细说明:

 

  (4)项目的所有页面(.html)静态链接 都加上 static 前缀

上一步已经配置了static都转发到nginx的 /user/share/nginx/html 目录下

通过idea 的替换功能,快速替换script标签的src, href标签的src, img标签的src 等等

ps:相当于把下面的 /static/index...  替换为  /user/share/nginx/html/index..

同理,search微服务的html页面也要加/static

 相当于访问/user/share/nginx/html/search/....(红色为替换static的部分)

最终效果:

     首页的静态资源,全部由Nginx返回,首页的数据,全部由微服务返回。动静分离后,再用JMeter做压力测试,性能大大的提升

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值