我在AWS中拥有N层架构的web应用程序。HTTP请求流顺序如下:
- Nginx ELB(公共ELB,代理到Nginx)
- Nginx(公用子网中的EC2实例,侦听端口80,代理AP-ELB)
- AP-ELB(内部ELB,代理到AP服务器)
- AP服务器(专用子网中的EC2实例,侦听端口80)
我想将WebSocket特性应用到这个体系结构中。如何配置两层ELB和后面的Nginx?
为ws://协议使用另一个端口,因为ELB不允许在不同模式(HTTP/TCP)下侦听同一端口。例如:ws://Nginx ELB:8081/ws端点
这分为两部分来解释。
Nginx段
- 在端口80上侦听HTTP,然后代理到AP-ELB端口80
- 监听WebSocket的端口8081,然后代理到AP-ELB端口8081
关于WebSocket代理,您可以参考此配置。
配置示例如下:
# 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。