Nginx使用详解(反向代理,负载均衡,动静分离)

Nginx使用详解

反向代理

反向代理示意图:

在这里插入图片描述

用户无法直接访问服务器,发来的请求会由Nginx进行转发,然后到达服务器;而服务器的响应也是需要经过Nginx来传达给用户,Nginx在这里充当了一个网关的角色。Nginx是服务端的代理,这种代理方式就是反向代理。正向代理客户端,反向代理服务端。

为什么使用反向代理

  • 可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器。
  • 通过缓存静态资源,加速Web请求。
  • 实现负载均衡。顺便说下,目前市面上,主流的负载均衡方案,硬件设备有F5,软件方案有四层负载均衡的LVS,七层负载均衡的Nginx、Haproxy等。

配置反向代理

配置反向代理,需要配置Nginx location块中的proxy_pass。通过配置proxy_pass来实现代理转发功能。

location说明

  • 没有“/”时,location /abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等
  • 而有“/”时,location /abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求

proxy_pass说明

  • 有“/”时,表示绝对根路径;
  • 没有“/”时,表示相对路径,把匹配的路径部分也给代理走。

更多关于proxy_pass的用法可以参考下面的文章:

https://www.jb51.net/article/227243.htm#_label1

使用举例:

将配置文件按下图修改,可以将用户请求路由到b站:

在这里插入图片描述

访问我们的Nginx虚拟机的地值后来到了b站:

在这里插入图片描述

也可以根据需求,将请求路由到我们自己的服务器进行处理。

负载均衡

  • 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
  • 负载均衡*(Load Balance)*其意思就是分摊到多个操作单元上进行执行,例如Web服务器FTP服务器企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

轮询模式

1、先克隆出两个虚拟机:

在这里插入图片描述

2、此时一共有三台装有Nginx的虚拟机,它们的ip地址分别为:192.168.190.111192.168.190.112192.168.190.113

3、配置这三台虚拟机的Nginx,可以访问到默认的index页面。

4、修改要实现负载均衡的主机中的nginx.conf文件,主要修改内容如下:

在http块中添加一个upstream块,将要负载均衡的server地址写入,之后修改server块中的proxy_pass代理路径:

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

	#添加upstream块
    upstream test {
        server 192.168.190.112;
        server 192.168.190.113;
    }

    server {
        listen       80;
        server_name  localhost;
	

        location / {
           #配置代理路径
           proxy_pass http://test;
           # root   html;
           # index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

5、重新部署Nginx,然后访问负责负载均衡的那台主机,会看到如下轮询的情况:

在这里插入图片描述

权重模式

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

#在末尾加上weight
upstream test {
	server 127.0.0.1:8050 weight =10 down;
	server 127.0.0.1:8060 weight=1;
	server 127.0.0.1:8060 weight=1 backup;
}
  • down:表示当前的server暂时不参与负载
  • weight:默认为1。weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

其它的方式

ip_hash

根据客户端的ip地址转发同一台服务器,可以保持回话。

least_conn

最少连接访问

url_hash

根据用户访问的url定向转发请求

fair

根据后端服务器响应时间转发请求

动静分离

为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片、js、css等文件,可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。对于用户请求的动态文件,如servlet、jsp,则转发给Tomcat,Jboss服务器处理,这就是动静分离。即动态文件与静态文件的分离。并且Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。

原理示意图:

在这里插入图片描述

实现动静分离需要以下几个步骤:

  1. 将静态资源部署到Nginx服务器上。
  2. 配置反向代理。
  3. 配置匹配到静态资源的location。

配置反向代理

location / {
    proxy_pass http://127.0.0.1:8080;
    root html;
    index index.html index.htm;
}

假设我们在一台服务器上部署了Tomcat服务器,用于运行一个网站。这里就是将Nginx作为网关,请求经过Nginx转发到Tomcat服务器上。

配置location

将网站相关的静态资源都放到Nginx所在的服务器中,这里是放到了/usr/local/nginx/static中:

location /css {
    root /usr/local/nginx/static;
    index index.html index.htm; 
}
location /images { root
    /usr/local/nginx/static;
    index index.html index.htm;
}
location /js {
    root /usr/local/nginx/static;
    index index.html index.htm;
}

同时可以通过正则表达式来设置location

location的前缀
  • / 通用匹配,任何请求都会匹配到。
  • = 精准匹配,不是以指定模式开头
  • ~ 正则匹配,区分大小写
  • ~* 正则匹配,不区分大小写
  • ^~ 非正则匹配,匹配以指定模式开头的location
location的匹配顺序
  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,=匹配 > ^~匹配 > 正则匹配 > 普通(最大前缀匹配)
location ~*/(css|img|js) {
    root /usr/local/nginx/static;
    index index.html index.htm;
}

UrlRewrite

UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址。这也是Nginx中实用的功能之一。

优点:

  • 提高安全性,可以有效的避免一些参数名、ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个404或错误页面,这比直接返回500或一大堆服务器错误信息要好的多。
  • 美化URL,去除了那些比如*.do之类的后缀名、长长的参数串等,可以自己组织精简更能反映访问模块内容的URL。
  • 更有利于搜索引擎的收入,通过对URL的一些优化,可以使搜索引擎更好的识别与收录网站的信息。
  • 可以很方便的重用,提高网站的移植性。如果我们后台方法改动的话,可以保证前台的页面部分不用改。这样就提高了网站的移植性。

rewrite语法格式及参数语法:

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容, 重定向到replacement,结尾是flag标记。
rewrite		<regex>		<replacement>	[flag];
关键字		  正则		 替代内容		  flag标记

关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记

rewrite参数的标签段位置:
server,location,if

flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

配置举例:

rewrite ^/([0-9]+).html$	/index.jsp?pageNum=$1 break;

防盗链

盗链的概念

盗链是指在自己的页面上展示一些并不在自己服务器上的一些内容, 获取别人的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。 一般被盗链的都是图片、 音乐、视频、软件等资源。通过盗链的手段可以减轻自己服务器的负担。

防盗链的工作原理

通过Refer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以追踪到显示他的网页地址 一旦检测到来源不是本站,即进行阻止或者返回指定的页面。

防盗链配置

valid_referers none | blocked | server_names | strings ....;
  • none, 检测 Referer 头域不存在的情况。
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

location中配置示例:

valid_referers 192.168.44.101;
if ($invalid_referer) {
    return 403;
}

举例演示:

1、先准备三台虚拟机:

在这里插入图片描述

要访问的资源在NginxClone1中,NginxDemo这台作为网关,NginxClone2用来做盗链测试。

2、修改nginx.conf配置文件:

#NginxDemo:
location / {
   proxy_pass http://192.168.190.112;
   # root   html;
   # index  index.html index.htm;
}

#NginxClone1:
location ~*/(css|images|js) {
    #valid_referers 指令,配置是否允许 referer 头部以及允许哪些 referer 访问。
    #注意后面填写的是ip地址或者域名
    valid_referers 192.168.190.111;  
    if ($invalid_referer) {  # 注意这里if后要加空格
        return 403; ## 返回错误码
    }
    root   /usr/local/nginx/static;
    index  index.html index.htm;
}

#NginxClone2
location / {
   proxy_pass http://192.168.190.112;
   # root   html;
   # index  index.html index.htm;
}

3、进行访问测试:

通过NginxDemo也就是允许的ip地址可以请求获得图片,但是其他的ip无法进行访问:

在这里插入图片描述

4、原理示意图:

在这里插入图片描述

高可用

在高访问量的情况下,服务器的压力会增大,所以需要服务器集群,通过Nginx来进行负载均衡。但是如果Nginx服务器因为大量的访问而宕机了,就会导致整个服务的入口消失。所以只有一台Nginx服务器是无法保障高可用的。

Nginx如何实现高可用

Nginx实现高可用有这样几个方式:

  • KeepAlived(主服务器 和 备份服务器 故障时 IP 瞬间无缝交接)
  • VRRP协议(路由器组,提供虚拟IP,一个master和多个backup,组播消息,选举backup当master)
  • Nginx+keepalived 双机主主模式(俩公网虚拟IP,负载);双机主从模式(热备服务器)

KeepAlived实现方式图示:

利用KeepAlived这个工具实现虚拟ip,如图中有两个Nginx服务器,第一台是主机,如果主机是用的ip就是虚拟ip(Virtual IP),如果主机宕机了,从机就接过主机的任务处理请求,并且也是使用了相同的虚拟ip。

在这里插入图片描述

更多高可用相关可以参考这篇文章:https://blog.csdn.net/chuanchengdabing/article/details/119727185

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神烦狗闯入了你的博客

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值