???? SSI ????????

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nginx
???? SSI ????????
首頁 > 網(wǎng)站技巧 > 服務(wù)器 > nginx > AWS ELB下為Nginx啟用代理協(xié)議

使用AWS的ELB服務(wù)時(shí)為Nginx啟用代理協(xié)議的步驟講解

投稿:goldensun

這篇文章主要介紹了使用AWS的ELB服務(wù)時(shí)為Nginx啟用代理協(xié)議的步驟講解,ELB服務(wù)是亞馬遜服務(wù)器提供的常用的負(fù)載均衡方案,需要的朋友可以參考下

在使用aws云服務(wù)的時(shí)候,90%要使用ELB服務(wù)作為負(fù)載均衡的解決方案,使用ELB要比自己搭建負(fù)載均衡要方便得多。
  主要好處有:
  1.可以隨時(shí)監(jiān)控實(shí)例的健康狀態(tài);
  2.當(dāng)服務(wù)器不正常時(shí),ELB的報(bào)警策略將自動(dòng)發(fā)送郵件通知運(yùn)維人員
  3.當(dāng)服務(wù)器負(fù)載到達(dá)閾值時(shí),通過auto scanning將自動(dòng)加入新的服務(wù)器到集群中,同時(shí)負(fù)載降下去后將自動(dòng)關(guān)閉多余的實(shí)例
  4.ELB的各項(xiàng)監(jiān)控指標(biāo)較好地幫助判斷服務(wù)器性能

AWS ELB nginx 啟用代理協(xié)議
要使用aws elb服務(wù)器來做websocket負(fù)載均衡時(shí),只能使用tcp模式。
代理協(xié)議是一種 Internet 協(xié)議,用于將連接信息從請(qǐng)求連接的源傳遞到請(qǐng)求連接到的目標(biāo)。Elastic Load Balancing 使用代理協(xié)議版本 1,該版本使用用戶可讀的標(biāo)頭格式。
默認(rèn)情況下,當(dāng)對(duì)前端和后端連接使用傳輸控制協(xié)議 (TCP) 或安全套接字層 (SSL) 時(shí),您的負(fù)載均衡器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到后端實(shí)例,而不修改請(qǐng)求標(biāo)頭。如果您啟用代理協(xié)議,則會(huì)向請(qǐng)求標(biāo)頭添加一個(gè)用戶可讀的標(biāo)頭,其中包含連接信息(如源 IP 地址、目標(biāo) IP 地址和端口號(hào))。該標(biāo)頭隨后作為請(qǐng)求的一部分發(fā)送到后端實(shí)例。
您可以在使用 SSL 和 TCP 協(xié)議的端口上啟用代理協(xié)議。當(dāng)使用非 HTTP 協(xié)議時(shí),或者當(dāng)使用 HTTPS 并且未在負(fù)載均衡器上終止 SSL 連接時(shí),您可以使用代理協(xié)議捕獲客戶端的源 IP。
代理協(xié)議頭
在您使用為 TCP/SSL 連接配置的負(fù)載均衡器時(shí),代理協(xié)議標(biāo)頭有助于識(shí)別客戶端的 IP 地址。因?yàn)樨?fù)載均衡器會(huì)攔截客戶端與您的后端實(shí)例之間的流量,因此您的后端實(shí)例的訪問日志中將包含負(fù)載均衡器的 IP 地址而不是原始客戶端的 IP 地址。您可以分析該請(qǐng)求的第一行,以檢索該客戶端的 IP 地址和端口號(hào)。
IPv6 標(biāo)頭中的代理地址是負(fù)載均衡器的公有 IPv6 地址。此 IPv6 地址與從該負(fù)載均衡器以 ipv6 或 dualstack 開頭的 DNS 名稱解析而來的 IP 地址相匹配。如果客戶端使用 IPv4 進(jìn)行連接,則代理標(biāo)頭中的地址是該負(fù)載均衡器的私有 IPv4 地址,不能在 EC2-Classic 網(wǎng)絡(luò)外部通過 DNS 查找進(jìn)行解析。
該代理協(xié)議行以回車符和換行符 ("\r\n") 結(jié)束,且具有以下形式:

PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"

實(shí)例:

PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n

安裝AWS CLI工具
AWS 管理控制臺(tái)是不支持啟用代理協(xié)議的,因此需要通過命令行來啟用。

# sudo apt-get install python-pip
# sudo pip install awscli

配置授權(quán)連接參數(shù)文件。

# 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根據(jù)你的aws實(shí)例填寫。
AWS ELB啟用代理協(xié)議
查看ELB支持的策略。響應(yīng)包含支持的策略類型的名稱和描述。

# 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"
    },
    ...
  ]
}

創(chuàng)建啟用代理協(xié)議的策略

# 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

該命令創(chuàng)建了一個(gè)名稱為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

此命令將替代當(dāng)前已啟用的策略組。因此,--policy-names 選項(xiàng)必須同時(shí)指定您正在添加到列表中的策略和任何當(dāng)前已啟用的策略。
查看是否啟用

# 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
 }
]

如果要禁用代理協(xié)議可以這么做,同時(shí),可通過第4步查看是否禁用了。

# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 80 --policy-names "[]"

配置nginx接受代理協(xié)議頭
nginx啟用這個(gè)主要的目的是為了獲取到真實(shí)的客戶端IP地址。否則,都是ELB的內(nèi)網(wǎng)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;
...
}

當(dāng)nginx啟用了代理協(xié)議,$proxy_protocol_addr變量將是真實(shí)的客戶端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;

您可能感興趣的文章:
閱讀全文
???? SSI ????????
???? SSI ????????