nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

简介:

在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin、ip-hash、least-connected和weighted。当然在实际生产中或许使用最多的就是ip-hash了,一般会这样使用:

1
2
3
4
5
upstream h5 {
    ip_hash;
    server 192.168.100.104:9080;
    server 192.168.100.105:9080;
  }

如果用户是直连的话那还好,nginx可以根据用户的IP均匀地向多个服务器节点分配负载请求。但是如果我们的域名使用了CDN加速的话,那么用户在请求js、CSS、图片等静态资源时并没有直接请求到我们的服务器,而是请求的少量的CDN加速节点服务器,从而造成有少量IP(PS:CDN节点服务器IP)频繁大量访问nginx。同时又因为ip_hash策略的原因,导致出现部分服务器的负载非常大,其他服务器却没有多少请求的现象

因此,为了解决这个问题,我们可以通过在nginx中获取用户请求时的真实IP,然后根据这些真实IP做hash策略,也就是自定义nginx的hash策略。实现步骤如下:

(1)修改nginx配置文件nginx.conf:

1
[root@tkde-iphone ~] # vim /usr/local/nginx/conf/nginx.conf

http {
include mime.types; #设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
access_log logs/access.log main;

#获取用户真实IP,并赋值给变量$clientRealIP
map $http_x_forwarded_for $clientRealIp {
“” $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}

……..

include gzip.conf; #压缩配置文件
include proxy.conf; #proxy_cache参数配置文件
include vhost/*.conf; #nginx虚拟主机包含文件目录
include mysvrhost.conf; #后端WEB服务器列表文件
}

(2)修改nginx的配置文件mysvrhost.conf:

1
[root@tkde-iphone ~] # vim /usr/local/nginx/conf/mysvrhost.conf

upstream h5 {
hash $clientRealIp;
server 192.168.100.104:9080;
server 192.168.100.105:9080;
}

注:这种方式也并不是万无一失了,因为请求的Header中的HTTP_X_FORWARDED_FOR参数可以在请求时被修改的,因此就存在一定的安全隐患。不过现在的CDN一般都有加速防黑的功能,所有实际上问题也不是很大。如果实在不放心的话不是还可以使用SSL证书整站加密嘛




本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1864239,如需转载请自行联系原作者

相关文章
|
12天前
|
运维 负载均衡 应用服务中间件
LNMP详解(九)——Nginx虚拟IP实战
LNMP详解(九)——Nginx虚拟IP实战
30 2
|
4月前
|
Java 应用服务中间件 nginx
Nginx之服务端获取真实客户端IP
Nginx之服务端获取真实客户端IP
128 5
|
网络协议 NoSQL 关系型数据库
【宝塔部署PHP项目】含域名访问部署、IP访问部署、数据库、端口号、Nginx等知识
【宝塔部署PHP项目】含域名访问部署、IP访问部署、数据库、端口号、Nginx等知识
1871 0
【宝塔部署PHP项目】含域名访问部署、IP访问部署、数据库、端口号、Nginx等知识
|
1月前
|
域名解析 网络协议 应用服务中间件
nginx-ingress通过ipv6暴露服务,并在nginx ingress日志中记录客户端真实ipv6的ip地址
本文主要通过阿里云提供的clb和nlb来实现,建议是提前创建好双栈的vpc和vsw(使用clb可以不用双栈vpc和vsw)
172 1
|
2月前
|
网络协议 应用服务中间件 Apache
在 NGINX 中根据用户真实 IP 进行限制
在 NGINX 中根据用户真实 IP 进行限制
|
3月前
|
负载均衡 Ubuntu 应用服务中间件
如何在Nginx上阻止特定IP地址的访问,以增强服务器的安全性
如何在Nginx上阻止特定IP地址的访问,以增强服务器的安全性
37 0
如何在Nginx上阻止特定IP地址的访问,以增强服务器的安全性
|
4月前
|
人工智能 应用服务中间件 nginx
树莓派上使用Nginx通过内网穿透实现无公网IP访问内网本地站点
树莓派上使用Nginx通过内网穿透实现无公网IP访问内网本地站点
|
5月前
|
负载均衡 应用服务中间件 nginx
nginx+tocmat ip_hash做负载均衡时,一台tomcat宕机时没有转发问题
nginx+tocmat ip_hash做负载均衡时,一台tomcat宕机时没有转发问题
|
6月前
|
移动开发 应用服务中间件 nginx
统计请求nginx最多次数的IP地址
统计请求nginx最多次数的IP地址
|
7月前
|
应用服务中间件 Linux Shell
CentOS7下利用自带防火墙+Nginx封堵高频访问的恶意IP
CentOS7下利用自带防火墙+Nginx封堵高频访问的恶意IP
145 0