反向代理示意图:
用户无法直接访问服务器,发来的请求会由Nginx进行转发,然后到达服务器;而服务器的响应也是需要经过Nginx来传达给用户,Nginx在这里充当了一个网关的角色。Nginx是服务端的代理,这种代理方式就是反向代理。正向代理客户端,反向代理服务端。
配置反向代理,需要配置Nginx location块中的proxy_pass。通过配置proxy_pass来实现代理转发功能。
location说明
proxy_pass说明
更多关于proxy_pass
的用法可以参考下面的文章:
https://www.jb51.net/article/227243.htm#_label1
使用举例:
将配置文件按下图修改,可以将用户请求路由到b站:
访问我们的Nginx虚拟机的地值后来到了b站:
也可以根据需求,将请求路由到我们自己的服务器进行处理。
1、先克隆出两个虚拟机:
2、此时一共有三台装有Nginx的虚拟机,它们的ip地址分别为:192.168.190.111
、192.168.190.112
、192.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地址转发同一台服务器,可以保持回话。
最少连接访问
根据用户访问的url定向转发请求
根据后端服务器响应时间转发请求
为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片、js、css等文件,可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。对于用户请求的动态文件,如servlet、jsp,则转发给Tomcat,Jboss服务器处理,这就是动静分离。即动态文件与静态文件的分离。并且Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
原理示意图:
实现动静分离需要以下几个步骤:
location / {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
假设我们在一台服务器上部署了Tomcat服务器,用于运行一个网站。这里就是将Nginx作为网关,请求经过Nginx转发到Tomcat服务器上。
将网站相关的静态资源都放到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 ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址。这也是Nginx中实用的功能之一。
优点:
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 ....;
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实现高可用有这样几个方式:
KeepAlived实现方式图示:
利用KeepAlived这个工具实现虚拟ip,如图中有两个Nginx服务器,第一台是主机,如果主机是用的ip就是虚拟ip(Virtual IP),如果主机宕机了,从机就接过主机的任务处理请求,并且也是使用了相同的虚拟ip。
更多高可用相关可以参考这篇文章:https://blog.csdn.net/chuanchengdabing/article/details/119727185