2017-09-04 124 views
0

我想通過nginx與ssl設置socketio。問題是我可以讓客戶端連接,但是我沒有看到我期望通過套接字發送的其他事件。 (注意:這不會工作在當地只是不是我的生產服務器上)通過Nginx與SSL的SocketIO

客戶端代碼是在這裏:

import openSocket from "socket.io-client"; 
const socket = openSocket(`${SOCKET}`); 

function subscribeToTimer(callBack) { 
    socket.on("timer", timestamp => callBack(null, timestamp)); 
    socket.emit("subscribeToTimer", 1000); 
} 

export class App extends Component { 
    constructor(props) { 
    super(props); 
    this.store = this.configureStore(); 
    subscribeToTimer((err, action) => this.store.dispatch(action)); 
    } 

和服務器:

const port = 8000 
const io = require('socket.io')() 

io.on("connection", (client) => { 
    console.log("a user connected") 
    client.on("subscribeToTimer", (interval) => { 
    console.log("a user is subscribing to timer with interval: ", interval) 
    setInterval(() => { 
     timestamp = new Date() 
     client.emit('timer', { type: 'SET_TIME', payload: timestamp }); 
    }, interval); 
    }); 
}) 

io.listen(port) 
console.log('listening on port ', port) 

這是由nginx的/etc/nginx/sites-enabled/default管理:

server { 
    <snip> 
    location /socket.io { 
    proxy_pass http://localhost:8000; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection 'upgrade'; 
    proxy_set_header Host $host; 
    proxy_cache_bypass $http_upgrade; 
    } 
} 

當我啓動服務器時,我得到:

listening on port 8000 
a user connected 

所以,客戶端連接到服務器,但我沒有看到subscribeToTImer事件。

這裏的任何見解?

+1

開發者控制檯中的任何內容? –

+0

@TarunLalwani客戶端控制檯中沒有任何東西。我其實已經想通了,所以我會更新一個答案:) – user341493

回答

1

的問題是,可能是因爲兩個原因。一種是使用主機頭和一個使用本地主機而不是127.0.0.1

server { 
    <snip> 
    location /socket.io { 
    proxy_pass http://127.0.0.1:8000; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection 'upgrade'; 
    proxy_cache_bypass $http_upgrade; 
    } 
} 

我不是100%肯定的根本原因,但我已經看到了去除Host和使用127.0.0.1代替localhost與插座等問題,幫助.io在過去

0

問題原來是在配置的proxy_pass行。您需要創建一個帶有指定服務器組的upstream部分,然後在proxy_pass(而不是http://localhost...)中引用該部分。

工作配置/etc/nginx/sites-enabled/default

upstream socket_nodes { 
    ip_hash; 
    server 127.0.0.1:8000; 
} 

server { 

    <-- snip --> 

    location /socket.io { 
    proxy_pass http://socket_nodes; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection 'upgrade'; 
    proxy_set_header Host $host; 
    } 
} 
+0

不知道這是否與單個上游服務器有所不同。你可以嘗試'proxy_pass http://127.0.0.1:8000;'而不是?直接在'location/socket.io' –

+0

@TarunLalwani不同於'localhost',nginx會不會處理'127.0.0.1'?它與本地主機是最合作的,所以...無論如何,我應該可以在今晚進行測試。 – user341493

+0

@TarunLalwani你是對的。 127.0.0.1:8000確實有效。謝謝! – user341493