反向代理(Reverse Proxy):
是指代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器得到的结果返回给internet上请求连接的客户端;
基本的反向代理:
location [option] URI {
proxy_pass http://192.168.122.1/;
}
其中 option 包括:
= 路径精确匹配,只包含当前路径,不包含其它任何路径。
^~ 不做正则表达式元字符匹配,做逐个字符搜索匹配
~* 不区分大小写,元字符匹配
~ 区分大小写,元字符匹配
例:
location /forum/ {
proxy_pass http://192.168.122.1:8080/maiya/;
}
http://www.example.com/forum/ → http://192.168.122.1:8080/maiya/;
如果location的URI前没有任何操作符[op],上游服务器的URL中必须以"/"结尾或明确指定URI;否则nginx会将客户端输入的URI追加到上游服务器的URL上,导致访问异常。
如果location的URI是通过模式匹配定义的,其URI将直接被传递至上游服务器,而不能为上游服务器指定转换后的URI; 而且后端服务器URL中不能包含任何URI信息。
Nginx负载均衡
upstream 指令:
后端服务器组,可以定义多个
语法:
upstream name {
server IP [option];
}
name 是给后端服务器组起的名字,名字不能重复,花括号中列出后端服务器组中包含的服务器
默认情况下,某个服务器收到请求后,按照轮训调度(RR)策略选择组内服务器的请求
定义位置:
在http上下文的下方定义upstream
server:定义一个upstream服务器的地址,还可包括一系列可选参数
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;
1.upstream模块的负载均衡算法主要有三种(调度策略):
round-robin轮训 (默认): 每个请求按照时间顺序逐一分配到不同的后端服务器
ip_hash (哈希算法): 保持会话-每个访客固定一个后端服务器
least_conn (最少连接): 有的服务器负载较高,在这种情况下把请求转发给连接数较少的后端,能够达到更好的负载均衡的效果
2.upstream模块常用的指令有:
weight:权重; 按比例分发,可以根据服务器配置的高低来设置权重的大小
maxfails:最大失败连接次数,默认为1,失败连接的超时时长由fail_timeout指定;
failtimeout:等待请求的目标服务器发送响应的时长;
backup:用于fallback的目的,所有服务均故障时才启动此服务器,类似于LVS Sorry Server;
down: 暂停对该服务器的调度
注:当使用ip_hash时可以解决clientsession问题,但服务器状态不可使用weight和backup。
fair: 可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块
url_hash: 按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的hash模块
例1:
upstream backserver {
server 192.168.1.2 max_fails=3 fail_timeout=2;
server 192.168.1.3 max_fails=3 fail_timeout=2;
server 192.168.1.4 max_fails=2 fail_timeout=5 down;
server 127.0.0.1:8080 backup;
}
同样upstream模块也能为非http类的应用实现负载均衡,如下面的示例定义了nginx为memcached服务实现负载均衡的目的。
upstream memcachesrvs {
server 192.168.122.85:11211;
server 192.168.122.86:11211;
}
如何正确获取客户端的IP地址?
在实际应用中,我们的程序可能需要获取用户的真实的IP地址,比如做异地登陆的判断,或者统计IP的访问次数等
(1).proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#我们通常将真实的IP地址赋值给 X-Real-IP或者X-Forwarded-For,然后upstream服务器组中的程序通过这两个字段获取真实的客户端的IP地址
(2).有后端服务器上配置:
LogFormat "%{X-Real-IP}i ......."
Rewrite相关指令
rewrite的组要功能是实现RUL地址的重定向
Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的
默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持
rewrite语法格式及参数语法说明:
关键字:其中关键字error_log不能改变,表示开始进行rewrite匹配规则
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
例如:
rewrite应用场景:
1.可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
2.为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
3.网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com
4.根据特殊变量、目录、客户端的信息进行URL调整等
Nginx目录别名
Nginx是通过alias设置虚拟目录,实现虚拟路径功能
例如:
防盗链问题
要实现防盗链,需要了解HTTP协议中的请求头的Referer头域,通过该头域的值,可以检测到访问目标资源的源地址.
这样,如果我们检测到Referer头域中的值并不是自己站点内的URL时就采取阻止措施,实现防盗链;
但是HTTP协议头都会可能被篡改,所以这种方法并不能完全阻止盗链行为;
Niginx中如何配置防盗链?
实例:
转载于:https://blog.51cto.com/13581826/2095210