2017-03-21 55 views
0

編輯:我繼續四處搜尋,並且進一步了一點。現在,打電話給我的端點時,我得到以下錯誤:如何設置端點以處理nginx後面的快速表單網址

GET /?EIO=3&transport=polling&t=LhnJ9p5 404 

所以,現在它在正確的地方結束了,但它執行輪詢請求,而不是WS連接。儘管如此,直接調用後端仍然可以正常工作,但是通過Nginx來解決我的請求。

客戶

import io from 'socket.io-client'; 

... 

//Does work 
io.connect('localhost:10007'); 
// Does not work 
io.connect('http://localhost', {path:'/my/path'}); 

socket.on('connect', function(){console.log('Connected!');}); 
socket.on('event', function(data){console.log('Data: ', data);}); 
socket.on('disconnect', function(){console.log('Disconnected!');}); 

服務器

// Lots of initiation, middleware, routing etc. 
let app = express.init('src/'); 

let server = http.createServer(app); 
var io = require("socket.io")(server); 

server.listen(10007,'127.0.0.1'); 

io.on('connection', function(socket){ 
    console.log("User Connected"); 
}); 

nginx.conf

location /my/path/ { 
    proxy_pass http://127.0.0.1:10007/; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header Host $host; 
} 

翻翻互聯網nd所以我偶然發現了類似的問題,並且似乎都指向了nginx.conf中的配置。雖然它似乎適用於其他人,但我錯過了其他的東西。


我有一個後端設置在Nginx代理後面。後端基於express並且像API一樣處理對GET/POST/DELETE等的不同調用.Nginx設置代理以將調用轉發到後端服務器,並且一切都很好。

現在我需要實現一個websocket連接到後端,我似乎沒有把它做對。電話永遠不會通過後端,我不知道爲什麼。這裏是我的服務器代碼:

function setRoutes(app) { 

... 

    /** 
    * Set up socket.io to the endpoint 
    */ 
    let server = require('http').Server(app); 
    let io = require('socket.io')(server); 
    io.on('connection', (socket) => { 
    console.log('Client is connected: ', socket); 
    }); 
    // If I uncomment this, I am able to connect to localhost:80 on the client 
    //server.listen(80); 
} 

如上評論指出,如果我忽略服務器後端設置,並繞過它直接聽取他們對本地主機端口80,WebSocket的連接工作。但所有其他端點都從Nginx的代理地址中刪除。我希望websocket連接到服務器其餘部分使用的相同端點地址。

讀了這條一點,我注意到這個here散步低谷,但這似乎設整端點WebSocket的,而我想確定我的路由我的快件的代碼,而不是在我的Nginx的設置。例如,如果我想將幾個不同的websocket端點設置爲同一個代理,我將不得不在兩個不同的地方管理路由。如果可能,我想遠離這一點。

回答

1

我偶然發現了你的問題,同時試圖調試我的socket.io問題......我使用nginx在AWS上設置,所以希望這些都會有所幫助。

我相信敲門磚的WebSocket在nginx的工作是上游配置:

upstream ws_NodeAppName { 
    ip_hash; 
    server 127.0.0.1:3000; 
} 


    location ~ ^/(NodeAppName|NodeAppName\/socket.io) { 
    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; 
    proxy_pass http://ws_NodeAppName; 
} 

我的做法的一個需要注意的是,該網頁客戶端接收未從節點的應用投放,因此節點應用程序只是設置套接字。

如果按照這種方式設置,則需要明確指定套接字的路徑。

客戶:

var socket = io.connect(window.location.origin, 
{ 
    path: '/NodeAppName/socket.io' 
}); 

SERVER:

var io = require('socket.io')(http, { 
    path: '/NodeAppName/socket.io' 
}); 

我希望幫助!它可能是混蛋試圖得到這個正確的配置..我摔倒兔子洞試圖確定是什麼原因導致我的零星504錯誤。

+0

對不起,遲到的迴應,但我在這段時間沒有分配任務,所以我剛回來處理這個問題。你的解釋確實解決了我的問題,但我不能把我的手指放在與我的測試不同的地方並嘗試。但是現在我的問題是,當在我們的測試平臺上嘗試相同的設置時,這種情況會以相同的反應失敗......但是,由於這個問題已經增加並超出了可讀性,我將用新信息回答一個新問題。 –