2013-05-09 36 views
15

Tôi đang cố gắng proxy proxy WebSocket + HTTP với nginx.nginx và proxy WebSockets

Tôi đã đọc này: http://nginx.org/en/docs/http/websocket.html

cấu hình của tôi trông giống như:

http { 
    include  mime.types; 
    default_type application/octet-stream; 

    sendfile  on; 
    keepalive_timeout 65; 

    gzip on; 

    map $http_upgrade $connection_upgrade { 
     default upgrade; 
     ''  close; 
    } 

    server { 
     listen 80; 
     server_name ourapp.com; 

     location/{ 
     proxy_pass http://127.0.0.1:100; 
     proxy_http_version 1.1; 
     proxy_redirect off; 
     proxy_set_header Host    $host; 
     proxy_set_header X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Upgrade   $http_upgrade; 
     proxy_set_header Connection  $connection_upgrade; 
     } 
    } 
} 

tôi có 2 vấn đề:

1) Kết nối đóng một lần một phút.

2) Tôi muốn chạy cả HTTP và WS trên cùng một cổng. Các ứng dụng hoạt động tốt tại địa phương, nhưng nếu tôi cố gắng đặt HTTP và WS trên cùng một cổng và thiết lập proxy nginx này, tôi nhận được điều này:

Kết nối WebSocket với 'ws: //ourapp.com/ws' không thành công : Mã phản hồi không mong muốn: 200

Tải ứng dụng (HTTP) có vẻ hoạt động tốt nhưng kết nối WebSocket không thành công.

Trả lời

12

Sự cố 1: Đối với kết nối chết mỗi phút một lần, tôi nhận ra rằng đó là biến thời gian chờ nginx. Tôi có thể làm cho ứng dụng của chúng tôi ping một lần trong một thời gian hoặc tăng thời gian chờ. Tôi không chắc chắn nếu tôi nên đặt nó là 0, tôi quyết định chỉ ping một lần một phút và thiết lập thời gian chờ đến 90 giây. (keepalive_timeout)

Bài toán 2: Sự cố kết nối phát sinh khi tôi sử dụng CloudFlare CDN. Tắt tính năng tăng tốc CloudFlare đã giải quyết được sự cố.

Hoặc tôi có thể tạo tên miền phụ và đặt tên miền đó là "không được đánh dấu" và sử dụng nó cho WS.

Các vấn đề liên quan