如何为WebSocket协议配置AWS ELB和Nginx



我在AWS中拥有N层架构的web应用程序。HTTP请求流顺序如下:

  1. Nginx ELB(公共ELB,代理到Nginx
  2. Nginx(公用子网中的EC2实例,侦听端口80,代理AP-ELB
  3. AP-ELB(内部ELB,代理到AP服务器
  4. 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)转发到80TCP

请勿对此ELB应用任何负载平衡器策略

这部分让我头疼了好几天。若对两个ELB应用相同的策略,则永远不会得到正确的结果。

现在,使用AWS ELB和Nginx享受您的WebSocket。

相关内容

  • 没有找到相关文章

最新更新