使用AWS的ELB服务时为Nginx启用代理协议的步骤讲解
在使用aws云服务的时候,90%要使用ELB服务作为负载均衡的解决方案,使用ELB要比自己搭建负载均衡要方便得多。
主要好处有:
1.可以随时监控实例的健康状态;
2.当服务器不正常时,ELB的报警策略将自动发送邮件通知运维人员
3.当服务器负载到达阈值时,通过auto scanning将自动加入新的服务器到集群中,同时负载降下去后将自动关闭多余的实例
4.ELB的各项监控指标较好地帮助判断服务器性能
AWS ELB nginx 启用代理协议
要使用aws elb服务器来做websocket负载均衡时,只能使用tcp模式。
代理协议是一种 Internet 协议,用于将连接信息从请求连接的源传递到请求连接到的目标。Elastic Load Balancing 使用代理协议版本 1,该版本使用用户可读的标头格式。
默认情况下,当对前端和后端连接使用传输控制协议 (TCP) 或安全套接字层 (SSL) 时,您的负载均衡器会将请求转发到后端实例,而不修改请求标头。如果您启用代理协议,则会向请求标头添加一个用户可读的标头,其中包含连接信息(如源 IP 地址、目标 IP 地址和端口号)。该标头随后作为请求的一部分发送到后端实例。
您可以在使用 SSL 和 TCP 协议的端口上启用代理协议。当使用非 HTTP 协议时,或者当使用 HTTPS 并且未在负载均衡器上终止 SSL 连接时,您可以使用代理协议捕获客户端的源 IP。
代理协议头
在您使用为 TCP/SSL 连接配置的负载均衡器时,代理协议标头有助于识别客户端的 IP 地址。因为负载均衡器会拦截客户端与您的后端实例之间的流量,因此您的后端实例的访问日志中将包含负载均衡器的 IP 地址而不是原始客户端的 IP 地址。您可以分析该请求的第一行,以检索该客户端的 IP 地址和端口号。
IPv6 标头中的代理地址是负载均衡器的公有 IPv6 地址。此 IPv6 地址与从该负载均衡器以 ipv6 或 dualstack 开头的 DNS 名称解析而来的 IP 地址相匹配。如果客户端使用 IPv4 进行连接,则代理标头中的地址是该负载均衡器的私有 IPv4 地址,不能在 EC2-Classic 网络外部通过 DNS 查找进行解析。
该代理协议行以回车符和换行符 ("\r\n") 结束,且具有以下形式:
PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"
实例:
PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n
安装AWS CLI工具
AWS 管理控制台是不支持启用代理协议的,因此需要通过命令行来启用。
# sudo apt-get install python-pip # sudo pip install awscli
配置授权连接参数文件。
# sudo vi ~/.aws/config
[default] aws_access_key_id = YOU_ACCESS_ID aws_secret_access_key = YOU_SECRET_ID output = json OR bson OR text region = PREFERRED_AWS_REGION
类似这样的,aws_access_key_id、aws_secret_access_key、region根据你的aws实例填写。
AWS ELB启用代理协议
查看ELB支持的策略。响应包含支持的策略类型的名称和描述。
# aws elb describe-load-balancer-policy-types { "PolicyTypeDescriptions": [ ... { "PolicyAttributeTypeDescriptions": [ { "Cardinality": "ONE", "AttributeName": "ProxyProtocol", "AttributeType": "Boolean" } ], "PolicyTypeName": "ProxyProtocolPolicyType", "Description": "Policy that controls whether to include the IP address and port of the originating request for TCP messages. This policy operates on TCP/SSL listeners only" }, ... ] }
创建启用代理协议的策略
# aws elb create-load-balancer-policy --load-balancer-name YOU_ELB_NAME --policy-name EnableProxyProtocol --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=True
该命令创建了一个名称为EnableProxyProtocol的策略,并分配下列ELB属性"AttributeName=ProxyProtocol & AttributeValue=True"。
在指定端口上启用上述的策略
# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 80 --policy-names EnableProxyProtocol # aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 81 --policy-names EnableProxyProtocol # aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 443 --policy-names EnableProxyProtocol
此命令将替代当前已启用的策略组。因此,--policy-names 选项必须同时指定您正在添加到列表中的策略和任何当前已启用的策略。
查看是否启用
# aws elb describe-load-balancers --load-balancer-name YOU_ELB_NAME | jq '.LoadBalancerDescriptions[].BackendServerDescriptions' [ { "PolicyNames": [ "EnableProxyProtocol" ], "InstancePort": 80 }, { "PolicyNames": [ "EnableProxyProtocol" ], "InstancePort": 81 }, { "PolicyNames": [ "EnableProxyProtocol" ], "InstancePort": 443 } ]
如果要禁用代理协议可以这么做,同时,可通过第4步查看是否禁用了。
# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 80 --policy-names "[]"
配置nginx接受代理协议头
nginx启用这个主要的目的是为了获取到真实的客户端IP地址。否则,都是ELB的内网IP地址。
set_real_ip_from 127.0.0.1; set_real_ip_from 10.0.0.0/8; real_ip_header proxy_protocol; real_ip_recursive on; server { listen 80 proxy_protocol; listen 443 proxy_protocol ssl; ... location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto tcp; proxy_set_header X-NginX-Proxy true; ... } set_real_ip_from 127.0.0.1; set_real_ip_from 10.0.0.0/8; real_ip_header proxy_protocol; real_ip_recursive on; server { listen 80 proxy_protocol; listen 443 proxy_protocol ssl; ... location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto tcp; proxy_set_header X-NginX-Proxy true; ... }
当nginx启用了代理协议,$proxy_protocol_addr变量将是真实的客户端IP。
如果没有反代,nginx这么配置即可:
log_format elb_log '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; set_real_ip_from 172.31.0.0/20; set_real_ip_from 10.0.0.0/8; real_ip_header proxy_protocol;
相关文章
详解nginx同一端口监听多个域名和同时监听http与https
这篇文章主要介绍了详解nginx同一端口监听多个域名和同时监听http与https的相关资料,需要的朋友可以参考下...2017-07-06- 这篇文章主要介绍了Nginx根据不同浏览器语言配置页面跳转的方法,包括一个简体繁体的基本判断方法及实际根据中英文跳转的例子,需要的朋友可以参考下...2016-05-22
- 周一今天给大家分享shell脚本多实例部署nginx的详细教程,文章通过实例代码脚本给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-10-26
- 这篇文章主要介绍了Nginx中配置过滤爬虫的User-Agent的简单方法,文中罗列了一些常用搜索引擎的爬虫名称以免造成不必要的过滤,需要的朋友可以参考下...2016-01-27
- 这篇文章主要介绍了nginx配置引发的403问题解决办法的相关资料,需要的朋友可以参考下...2017-07-06
- 这篇文章主要介绍了Linux环境下nginx搭建简易图片服务器,需要的朋友可以参考下...2016-01-27
- 这篇文章主要介绍了Nginx访问日志及错误日志参数说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-14
- 这篇文章主要介绍了使用nginx方式实现http转换为https的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-06
Nginx反向代理proxy_cache_path directive is not allowed错误解决方法
这篇文章主要介绍了Nginx反向代理proxy_cache_path directive is not allowed错误解决方法,需要的朋友可以参考下...2016-01-27nginx+apache+mysql+php+memcached+squid搭建集群web环境
当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。...2016-01-27- Nginx日志主要分为两种:访问日志和错误日志。访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。下面这篇文章主要给大家介绍了Nginx自定义访问日志的配置方式,需要的朋友可以参考学习,下面来一起看看吧。...2017-07-06
- 这篇文章主要介绍了nginx使用IPV6的相关配置项介绍,首先查看编译参数是否编译了IPV6模块,然后介绍了监听IPV6的配置语法,需要的朋友可以参考下...2016-01-27
解决使用了nginx获取IP地址都是127.0.0.1 的问题
这篇文章主要介绍了解决使用了nginx获取IP地址都是127.0.0.1 的问题,获取i工具的完整代码文中给大家提到,具体实例代码跟随小编一起看看吧...2021-09-18- 本篇文章主要介绍了nginx修改上传文件大小限制的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。 ...2017-01-22
- 这篇文章主要介绍了Debian7编译安装nginx简明教程,本文直接给出操作命令和步骤,需要的朋友可以参考下...2016-01-27
- 这篇文章主要介绍了隐藏Nginx或Apache以及PHP的版本号的方法,主要用来防止针对性的漏洞攻击,需要的朋友可以参考下...2016-01-05
- 这篇文章主要介绍了Nginx DNS resolver配置实例,本文讲解在proxy_pass 和 upstream server 通信的时候需要手动指定 resolver,本文就给出了配置实例,需要的朋友可以参考下...2016-01-27
- 这篇文章主要介绍了关于Nginx中if语句的判断条件与多条件判断的相关资料,文中给出了详细的示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。...2017-07-06
详解Nginx服务器中配置Sysguard模块预防高负载的方案
这篇文章主要介绍了详解Nginx服务器中配置Sysguard模块预防高负载的方案,该模块由阿里巴巴的团队开发,能够设置负载阀值,比较强大,需要的朋友可以参考下...2016-02-02- 本篇文章主要介绍了nginx实现ssl反向代理实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-01-22