2017-09-27 110 views
0

我在AWS EC2實例上爲我的node.js應用程序運行nginx。我想使用websockets(socket.io)和普通的http請求/響應。我的問題是,每當我從移動設備到服務器有一個活動套接字連接並嘗試發出一個普通的http請求時,就會通過消息「502 Bad Gateway」調用移動設備的socket.io錯誤函數。Socket.io斷開http請求

只有插座有效。只有普通的http請求也適用。

我想通了,這個問題發生在我將nginx設置爲僅使用https之後。

這裏是我的nginx的配置在/啓用站點-/站點可用:

server { 
    listen 80; 
    listen 443 ssl; 

    server_name example.com www.example.com; 

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf; 

    if ($scheme != "https") { 
     rewrite^https://$host$request_uri? permanent; 
    } 

    location/{ 
     proxy_pass http://127.0.0.1:3000; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_http_version 1.1; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $host; 
    } 
} 

Nginx的錯誤日誌:

[error] 14117#14117: *50 upstream prematurely closed connection while reading response header from upstream, client: 78.94.9.226, server: example.com, request: "GET /socket.io/?transport=polling&b64=1&sid=rgXMQhL6mbSET8ktAAAA HTTP/1.1", upstream: "http://127.0.0.1:3000/socket.io/?transport=polling&b64=1&sid=rgXMQhL6mbSET8ktAAAA", host: "example.com" 

iOS的錯誤日誌:

LOG SocketIOClient: Handling event: error with data: ["Got unknown error from server <html>\r\n<head><title>502 Bad Gateway</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>502 Bad Gateway</h1></center>\r\n<hr><center>nginx/1.10.3 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"] 

如果您需要更多的信息,讓我知道!

回答

0

連接我自己解決了這一問題。這真是一個愚蠢的問題。我在名爲access.log的node.js服務器文件夾內創建了一個文件,並告訴摩根記錄器寫入文件。我忘記的是,當服務器文件夾內的代碼發生變化時,我正在使用PM2重新啓動服務器。因此,每次發出http請求並且套接字斷開時,PM2都會重新啓動服務器。

+0

感謝您分享解決方案。我想PM2會帶參數來觀察.js,.css等的變化。如果是這樣,你應該使用 –

+0

我注意到PM2自己記錄http請求+ stdout/stderr,所以我禁用摩根寫入文件。 PM2日誌足以滿足我的需求。 –

1

改變你的nginx的配置兩大塊

server { 
    listen 80; 
    listen 443 ssl; 

    server_name example.com www.example.com; 

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf; 

    if ($scheme != "https") { 
     rewrite^https://$host$request_uri? permanent; 
    } 

    location /socket.io { 
     proxy_pass http://127.0.0.1:3000; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_http_version 1.1; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $host; 
    } 

    location/{ 
     proxy_pass http://127.0.0.1:3000; 
     proxy_http_version 1.1; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $host; 
    } 
} 

你只想升級socket.io而不是其他網址

+0

謝謝你的幫助!我自己解決了這個問題。 –

+0

請分享解決方案作爲回答 –

+0

我在幾秒前分享瞭解決方案 –

相關問題