如何为 WebSocket 协议配置 AWS ELB 和 Nginx?
How to configure AWS ELB and Nginx for WebSocket protocol?
我在 AWS 中有 N 层架构 Web 应用程序。 HTTP 请求流顺序:
- Nginx-ELB(public ELB,代理到Nginx)
- Nginx(public 子网中的 EC2 实例,侦听端口 80,代理到 AP -ELB)
- AP-ELB(内部 ELB,AP-Server 的代理)
- AP-Server(私有子网中的 EC2 实例,侦听端口 80)
我想将 WebSocket 特性应用到这个架构中。
二层ELB和Nginx后面如何配置?
为 ws:// 协议使用另一个端口,因为 ELB 不允许在不同模式下侦听相同端口 (HTTP/TCP)。例如:ws://Nginx-ELB:8081/ws-endpoint
这分为两部分解释。
Nginx 部分
- 在端口 80 上侦听 HTTP,然后代理到 AP-ELB 端口 80。
- 监听 WebSocket 的 8081 端口,然后代理到 AP-ELB 8081 端口。
关于WebSocket代理,可以参考这个configuration。
配置示例如下:
# Web
server {
listen 80;
server_name localhost;
charset utf-8;
error_log /var/log/nginx/lnmnt/error.log error;
access_log off;
set $upstream_endpoint <ap_elb_domain_name>;
more_set_headers 'Cache-Control: max-age=0, no-cache, no-store';
location / {
proxy_connect_timeout 75;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass $upstream_adm_endpoint;
}
}
# WebSocket
server {
listen 8081 proxy_protocol;
server_name localhost;
error_log /var/log/nginx/lnmnt/websocket.error.log error;
access_log off;
real_ip_header proxy_protocol;
set $upstream_ws_endpoint <ap_elb_domain_name>:8081;
location / {
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass $upstream_ws_endpoint;
}
}
ELB 部分
Nginx-ELB
按照以下步骤创建端口转发:
- 80 (HTTP) 转发到 80 (HTTP)
- 8081 (TCP) 转发到 8081 (TCP)
然后使用您的 AWS CLI 执行:
aws elb create-load-balancer-policy \
--load-balancer-name Nginx-ELB \
--policy-name EnableProxyProtocol \
--policy-type-name ProxyProtocolPolicyType \
--policy-attributes AttributeName=ProxyProtocol,AttributeValue=True
aws elb set-load-balancer-policies-for-backend-server \
--load-balancer-name Nginx-ELB \
--instance-port 8081 \
--policy-names EnableProxyProtocol
AP-ELB
按照以下步骤创建端口转发:
- 80 (HTTP) 转发到 80 (HTTP)
- 8081 (TCP) 转发到 80 (TCP)
不要为此 ELB 应用任何负载均衡器策略!
这一段让我头疼了好几天。如果对两个 ELB 应用相同的策略,你永远不会得到正确的结果。
现在,使用 AWS ELB 和 Nginx 享受您的 WebSocket。
我在 AWS 中有 N 层架构 Web 应用程序。 HTTP 请求流顺序:
- Nginx-ELB(public ELB,代理到Nginx)
- Nginx(public 子网中的 EC2 实例,侦听端口 80,代理到 AP -ELB)
- AP-ELB(内部 ELB,AP-Server 的代理)
- AP-Server(私有子网中的 EC2 实例,侦听端口 80)
我想将 WebSocket 特性应用到这个架构中。 二层ELB和Nginx后面如何配置?
为 ws:// 协议使用另一个端口,因为 ELB 不允许在不同模式下侦听相同端口 (HTTP/TCP)。例如:ws://Nginx-ELB:8081/ws-endpoint
这分为两部分解释。
Nginx 部分
- 在端口 80 上侦听 HTTP,然后代理到 AP-ELB 端口 80。
- 监听 WebSocket 的 8081 端口,然后代理到 AP-ELB 8081 端口。
关于WebSocket代理,可以参考这个configuration。
配置示例如下:
# Web
server {
listen 80;
server_name localhost;
charset utf-8;
error_log /var/log/nginx/lnmnt/error.log error;
access_log off;
set $upstream_endpoint <ap_elb_domain_name>;
more_set_headers 'Cache-Control: max-age=0, no-cache, no-store';
location / {
proxy_connect_timeout 75;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass $upstream_adm_endpoint;
}
}
# WebSocket
server {
listen 8081 proxy_protocol;
server_name localhost;
error_log /var/log/nginx/lnmnt/websocket.error.log error;
access_log off;
real_ip_header proxy_protocol;
set $upstream_ws_endpoint <ap_elb_domain_name>:8081;
location / {
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass $upstream_ws_endpoint;
}
}
ELB 部分
Nginx-ELB
按照以下步骤创建端口转发:
- 80 (HTTP) 转发到 80 (HTTP)
- 8081 (TCP) 转发到 8081 (TCP)
然后使用您的 AWS CLI 执行:
aws elb create-load-balancer-policy \
--load-balancer-name Nginx-ELB \
--policy-name EnableProxyProtocol \
--policy-type-name ProxyProtocolPolicyType \
--policy-attributes AttributeName=ProxyProtocol,AttributeValue=True
aws elb set-load-balancer-policies-for-backend-server \
--load-balancer-name Nginx-ELB \
--instance-port 8081 \
--policy-names EnableProxyProtocol
AP-ELB
按照以下步骤创建端口转发:
- 80 (HTTP) 转发到 80 (HTTP)
- 8081 (TCP) 转发到 80 (TCP)
不要为此 ELB 应用任何负载均衡器策略!
这一段让我头疼了好几天。如果对两个 ELB 应用相同的策略,你永远不会得到正确的结果。
现在,使用 AWS ELB 和 Nginx 享受您的 WebSocket。