1、Nginx简介
1.1 概述
Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。
1.2 相关概念
(1)反向代理
服务器的代理,相对于web用户来说,就是反向代理。
(2)均衡负载
很多人同时访问服务器同一资源的时候,为了保证访问质量。开发者首先会将服务部署在多个服务器上,然后按照某种规则(即负载均衡的方式)将压力分摊到不同服务器上。
(3)动静分离
为了加快网站的解析速度,可以把 动态页面 和 静态页面 由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2、Nginx安装(了解即可)
注意:本节内容了解下即可,实际项目都是用Docker来安装,Docker有办法很轻松的安装,比本节的方法简单几十倍。
2.1 准备好安装软件
(1)进入nginx官网,下载好软件
注意:就像打游戏需要装一些环境一样,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方式获取软件)
用法: 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
① 进入 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合适
所以 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做压力测试,性能大大的提升