Nginx应用案例篇三(nginx缓存,动静分离,下载站点,用户认证)

发布于 2021-09-10  9.47k 次阅读


一,Nginx缓存

一,Nginx缓存的概念

缓存概念:缓存就是数据交互的缓冲区(cache),当用户要获取数据的时候,会先从缓存中去查询获取数据,如果缓存中有就会直接返回数据给客户端,如果没有就从应用程序或者数据库查询数据,再将数据返回给客户端并同时将数据放入缓存,下次用户直接从缓存中获取数据缓存的多种应用场景:

场景
作用
操作系统磁盘缓存
减少磁盘机械操作
数据库缓存
减少对文件系统的IO操作
应用程序缓存
减少对数据库的查询
Web服务器缓存(Nginx)
减少对应用服务器的请求次数
浏览器缓存
减少对web后台服务器的交互
注:真实生产环境中,往往是使用的是多级缓存,一般作为开发可以使用两种种缓存:应用程序缓存(mybatis内置缓存,redis缓存……),web服务器缓存(Nginx缓存)

Nginx做为WEB应用服务器的反向代理服务器,它的缓存主要减少请求对应用服务器的访问,提高用户访问效率

缓存的优点:

  1. 减少数据传输,节省网络流量,加快响应速度,提升用户体验
  2. 减轻服务器压力
  3. 提供服务器压力

缓存的缺点:

  1. 数据的不一致
  2. 增加成本

二,Nginx的web缓存服务

Nginx是从0.7.48版本开始提供缓存功能,Nginx是基于Proxy Store来实现,其原理是把URL及相关组合当做Key,在使用MD5算法对key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中,它可以支持URL连接,同时也支持404/301/302这样的非200状态码,Nginx即可以支持对指定URL或者状态码设置过期时间,也可以使用purge命令来手动清除指定URL的缓存

三,Nginx缓存设置相关指令

Nginx的web缓存服务主要使用ngx_http_proxy_module模块相关指令集来完成

一,proxy_cache_path指令(重点指令)

该指令用于设置缓存文件的存放路径

语法 proxy_cache_path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size]
默认值 -
配置位置 http块

参数:

1,path:缓存路径地址

/usr/local/proxy_cache

2,levels:指定该缓存空间对应的目录,最多可以设置三层目录结构

levels=1:2:4  表示缓存空间有三层目录,第一层目录名为一个字符,第二层目录为两个字符,第三层为4个字符
假如url(wql.luoqin.ltd)做为key通过MD5加密的值为:318ae649df801ddfbb8d2a1d3593311f
那么:
levels=1:2:4   缓存存储目录为 /usr/local/proxy_cache/f/11/5933
levels=4:2     缓存存储目录为 /usr/local/proxy_cache/311f/93
levels=5:3:2  缓存存储目录为 /usr/local/proxy_cache/3311f/359/1d
最终用户最次访问,在通过MD5加密来寻找有没有对应缓存目录来判断缓存是否存在

3,keys_zone:用来为这个缓冲区设置名称和指定大小

 keys_zone=wql:200m 缓冲区名称为wql,大小为200MB,1MB大概能存储8000个keys

4,max_size:设置最大的缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源

max_size=20g

5,inactive:设置缓存过期时间,当多少时间该缓存没有被访问,就删除

inactive=1d 当一天没有访问就删除

配置实例:

proxy_cache_path /usr/local/proxy_cache levels=3:2 keys_zone=wql:200m inactive=1d max_size=10g;
启动后:在/usr/local/目录自动生产proxy_cache目录(如果没有说明配置错误)

二,其他指令

1,proxy_cache:该指令用来开启或者关闭代理缓存,如果开启则指定定使用那个缓存区来进行缓存

语法 proxy_cache zone_name |off
默认值 proxy_cache off
配置位置 http块,server块,location块

zone_name:指定缓冲区的名称

2,proxy_cache_key:用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存

语法 proxy_cache_key key
默认值 proxy_cache_key $scheme$proxy_host$request_uri
配置位 http块,server块,location块

3,proxy_cache_valid:用来对不同返回状态的URL设置不同的缓存时间

语法 proxy_cache_valid [code……] time
默认值 -
配置位置 http块,location块,server块
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
为200和302的响应URL状态码设置10分钟的缓存,为404的响应状态码设置1分钟的缓存
proxy_cache_valid any 1m; 对所有的响应状态码都设置1分钟的缓存

4,proxy_cache_min_uses:设置资源被访问多少次被缓存

语法 proxy_cache_min_uses number
默认值 proxy_cache_min_uses 1
配置位 http块,server块,location块

5,proxy_cache_methods:设置缓存那些HTTP请求方式

语法 proxy_cache_methods GET|HEAD|POST
默认值 proxy_cache_methods GET|HEAD
配置位置 http块,server块,location块

默认缓存GET和HEAD请求方式

四,缓存案例

准备:一台Linux服务器安装Nginx(192.168.68.133:9090),一台服务器安装Tomcat(192.168.68.153:8080),Tomcat的webapp下创建一个photo目录并放入一张wql.jpg的图片,使用nginx反向代理tomcat访问图片,并缓存

 

tomcat服务器安装和webapp直接访问不进行描述了,主要侧重nginx的配置

nginx的配置:

http {

    proxy_cache_path /usr/local/proxy_cache levels=2 keys_zone=wqlfq:200m inactive=1d max_size=10g;
    #负载均衡
    upstream up{
        server 192.168.68.153:8080;
}
    server {
        listen 9090;
        server_name localhost;
        location /{
        proxy_cache wqlfq;
        proxy_cache_key $scheme$proxy_host$request_uri;
        proxy_cache_min_uses 1;
        proxy_cache_valid 200 5d;
        proxy_cache_valid 404 405 30s;
        proxy_cache_valid any 1m;

        #$upstream_cache_status内置参数为是否被缓存,假如值为HIT为被缓存,MISS为没有被缓存
        add_header nginx-cache "$upstream_cache_status";

        #反向代理tomcat
        proxy_pass http://up;
}}

结果:

五,Nginx缓存的清除

Nginx缓存清除有两种方式:

  1. 删除对应的缓存目录:一般使用这种方式删除所有缓存
  2. 使用第三方拓展模块:这个方式一般用来删除某个具体的资源缓存

一,删除对应缓存目录

这个方式很简单

例:

rm -rf /usr/local/proxy_cache/…… 

二,使用第三方拓展模块

ngx_cache_purge第三方模块需要手动安装

子模块安装步骤(和之前with-http_ssl_module添加是一样的):

① 下载模块(地址)

http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

② 上传并解压

上传不多说有多种方式
tar -zxvf ngx_cache_purge-2.3.tar.gz

③ 修改文件名称方便配置(自选)

mv ngx_cache_purge-2.3/ purge

④ 查询Nginx的配置参数

nginx -V

⑤ 使用./configure进行模块添加

./configure --add-module=/home/ceat/purge

⑥ 使用make进行编译

make

⑦ 备份sbin目录下的nginx可执行文件

mv nginx nginxfq

⑧ 将objs目录下的nginx可执行文件拷贝到sbin文件中

cp ./objs/nginx /usr/local/nginx/sbin/

⑨ 使用make upgrade对nginx进行更新

make upgrade

清除指令:

语法 proxy_cache_purge cachename cachekey
默认值 -
配置位置 http块,location块,server块
  • cachename:指定缓存的名称,要和proxy_cache保持一致
  • cachekey:指定缓存的key,要和proxy_cache_key保持一致

例:

location ~ /purge(/.*){    
    proxy_cache_purge wql fq;
#访问/purge/url地址,就把名为wql的cache下的fq为key的缓存目录删除
}

二,设置指定资源不缓存

在使用Nginx缓存时,会遇到一个问题就是不是使用的数据都适合缓存,一般经常发生变化的数据如果进行缓存会导致用户无法访问真实服务器的数据造成数据错误,所以在缓存过程中需要对数据进行过滤

nginx提供过滤缓存的功能设置,主要使用两个指令

一,proxy_no_cache指令

该指令用来定义不将数据进行缓存的条件

语法 proxy_no_cache string…
默认值 -
配置位置 http块,location块,server块

二,proxy_cache_bypass指令

该指令用来设置不从缓存中获取数据的条件

语法 proxy_cach_bypass string…
默认值 -
配置位置 http块,location块,server块

这两个指令都需要一个条件,它主要使用三个内置参数来进行条件判断,当三个条件至少有一个不为空且不等于0,则条件处理

三个内置参数作为条件进行设置过滤:

  • $cookie_nocache:使用cookie来判断是否需要缓存,如果不为空就不缓存(默认为空,需要在add_header进行设置值)
  • $arg_nocache:获取url的请求中的nocache参数,不为空将不缓存(默认为空,需要自己在url中添加)
  • $arg_comment:获取url的请求中comment参数,不为空将不缓存(默认为空,需要自己在url中添加)

例:

server{
    if($request_uri ~ /.*\.js$){
    set $cookie_nocache 1;
}
}
表示访问任何.js文件,都将cookie_nocache值设置为1,不进行缓存

二,Nginx动静分离

一,动静分离的概念

动静分离的两个名词一个动词:

  • 动:后台应用程序的由于处理
  • 静:web前端的静态资源(如:jpg,html,css,js等文件)
  • 分离:将两种分开部署访问,将所有静态资源相关内容都交给Nginx来部署访问,非静态内容则交类似于Tomcat的web服务器进行部署访问

动静分离的原因:

  • Nginx在处理静态资源的时候,效率非常高,而且Nginx的并发访问效率在多种服务器软件中也是出类拔萃,而Tomcat则相对比较弱一点,所有静态资源交与nginx后,可以减轻Tomcat服务器的访问压力并提高资源的访问效率
  • 动静分离后,降低了动态资源和静态资源的耦合度,动态资源服务器的宕机也不会影响静态资源的展示

动静分离的实现的两种方式:

  1. 把纯粹的静态资源独立成单个域名,放在独立的Nginx服务器上(主流方案)
  2. 动态和静态资源混合发布,提高nginx进行区别

二,动静分离的配置

动静分离的原理很简单,通过location对请求url进行匹配即可,在/Users/Hao/Desktop/Test(任意目录)下创建 /static/imgs 配置如下:

###静态资源访问(直接访问本地)
server {
listen 80;
server_name static.haoworld.com;
location /static/imgs {
root /usr/local/nginx/html;
index index.html index.htm;
}
}

###动态资源访问(代理Tomcat服务器)
server {
listen 80;
server_name www.haoworld.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;}
}

三,Nginx下载站点

nginx使用的是模块ngx_http_autoindex_module来实现下载站点的,该模块处理以斜杠("/")结尾的请求,并生产目录列表

nginx再编译的时候会自动加载该模块所有不需要手动下载添加,但默认该模块是关闭的,需要使用指令配置才能开启

一,配置站点的指令

一,autoindex指令

该指令原来启用或禁用目录列表输出

语法 autoindex on | off
默认值 autoindex off
配置位置 http块,server块,location块

二,autoindex_exact_size指令

该指定对应HTML格式,指定是否再目录列表展示文件的纤细大小

  • 默认为on,显示出文件的确定大小,单位是byte
  • off,显示出文件的大概大小,单位是KB或者MB或者GB
语法 autoindex_exact_size on | off
默认值 autoindex_exact_size on
配置位置 http块,server块,location块

三,autoindex_format指令

设置目录列表的格式

语法 autoindex_format html | xml | json | jsonp
默认值 autoindex_format html
配置位置 http块,server块,location块

注:该指令在1.7.9及以后版本出现

四,autoindex_localtime指令

对应HTML格式,是否在目录列表上显示时间

  • 默认为off,显示的文件时间为GMT时间
  • on,显示的文件时间为文件的服务器时间
语法 autoindex_localtime on | off
默认值 autoindex_localtime off
配置位置 http块,server块,location块

二,配置实例

准备:在linux的/home新建一个download目录,再往里面放一些安装包,提供下载

配置nginx:

server{
    listen 9998;
    server_name localhost;
    location /{
    root /home/download;
    autoindex on;
    autoindex_exact_size on;
    autoindex_format html;
    autoindex_localtime on;
    }
}

四,Nginx用户认证

nginx用户认证在生产环境中一般是作为内部测试用,假如项目上线需要测试,一般只能在公司内局域网进行访问,假如你回家了,需要做紧急测试,当进不来,nginx就避免了这个问题,它使用认证,只要有用户名密正确就可以访问

Nginx对应用户认证的模块是ngx_http_auth_basic_module模块来实现,它允许通过使用"HTTP基本身份验证"协议验证用户名和密码来限制对资源的访问,默认情况下nginx是安装了该模块

认证使用比较简单

一,auth_basic指令

使用"HTTP协议基本认证"协议启用用户名和密码的验证

语法 auth_basic string | off
默认值 auth_basic off
配置位置 http块,server块,location块,limit_except

开启后,服务端返回401,指定的字符串会返回到客户端,给用户弹出用户名和密码的输入框,但是不同的浏览器对内容的展示不一致

二,auth_basic_user_file指令

指定用户名和密码所在的文件(浏览器输入用户名和密码会和这个文件进行比对)

语法 auth_basic_user_file file
默认值 -
配置位置 http块,server块,location块,limit_except

指定文件路径,该文件的用户名和密码的设置,密码需要加密,可以采用工具自动生成

三,htpasswd加密工具

指定加密文件file时,需要加密,使用htpasswd工具可以简便操作

①,下载htpasswd工具

yum install -y httpd-tools

② 操作

1,创建一个新文件并保存一个用户和密码
htpasswd -c 文件保存目录 用户名 
例:htpasswd -c /home wql  (回车之后需要手动输入密码)

2,在指定文件中追加用户名和密码
htpasswd -b 追加的文件路径 用户名 密码
例:htpasswd -b /home/htp wql 123456(往htp加密文件追加用户wql用户密码为123456)

3,指定文件删除一个用户信息
htpasswd -D 文件目录 用户名
例:htpasswd -D /home/htp wql(删除htp加密文件中wql用户) 

4,验证用户和密码是否正确
htpasswd -v 文件目录 用户名
例:htpasswd -v /home/htp wql(回车后需要输入密码)

四,配置实例

1,在/home下创建一个加密文件wql并添加用户fq密码为123456

htpasswd -c wql fq

2,配置nginx,在下载站点上加一层认证

server{
    listen 9998;
    server_name localhost;
    location /{
    root /home/download;
    autoindex on;
    autoindex_exact_size on;
    autoindex_format html;
    autoindex_localtime on;
    #字符串可以随便指定
    auth_basic "WQL shiro";
    #加密文件的位置
    auth_basic_user_file /home/wql;}}

3,访问下载站点

输入正确的用户密码就可以正常访问