系统相关
首页 > 系统相关> > amazon-web-services – 如何为WebSocket协议配置AWS ELB和Nginx?

amazon-web-services – 如何为WebSocket协议配置AWS ELB和Nginx?

作者:互联网

我在AWS中有N层架构Web应用程序. HTTP请求流顺序由此:

> Nginx-ELB(公共ELB,代理Nginx)
> Nginx(公共子网中的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.
>在端口8081上侦听WebSocket,然后代理到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.

标签:nginx,amazon-web-services,websocket,amazon-elb
来源: https://codeday.me/bug/20190528/1168694.html