2016-12-14 110 views
0

我在端口3002上運行的Ubuntu服務器上設置了node/express.js/socket.io應用程序設置。我打開了機器上的所有端口。NGINX無法獲得

當我去11.111.111.1:3002/一切正常(兩個socket.io & express.js)。應用程序我想代理傳遞給/mediaDev/這似乎工作中,我得到express.js或節點它說的錯誤消息:

「不能GET/mediaDev」

如果找不到節點應用程序返回502錯誤的網關。

但直接進入我的IP地址加端口的應用程序,該應用程序完美工作就像預期的一樣。

簡體NGINX:

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    server_name _; 

    location ~ ^/mediaDev { 
    proxy_pass http://localhost:3002; 
    } 
} 

node.js的相關服務內容:

var app = express() 
app.user(bodyParser.urlencoded({ extended:false})) 
app.use(bodyParser.json()) 

app.set('views', path.join(__dirname, 'views')) 
app.set('view engine', 'ejs') 

app.get('/', function (req, res) { 
    res.render('index') 
}) 

var server = app.listen(PORT, function() { 
    console.log("listening on port 3002") 
}) 

var io = require('socket.io')(server, { 
    path: '/mediaDev/socket.io' 
}) 

注:在兩個express.js和socket.io正在使用的IP地址。在實際的域名快遞返回錯誤,但我的socket.io路徑/mediaDev/socket.io仍然有效。

我認爲上面有點奇怪。如果我代理通過/mediaDev並使我的socket.io路徑/mediaDev/socket.io不應該我期望一個錯誤,並且實際上在/mediaDev/mediaDev/socket.io

+0

你想proxy_pass整個連接到端口3002或只是代理socket.io? – jAndy

+0

整個連接 –

回答

3

對於NGINX,如果向URI添加尾部斜槓(在locationproxy_pass中都有),這很重要。如果設置正確,可以從請求路徑剝離前綴。

試試這個:

location /mediaDev/ { 
    proxy_pass http://localhost:3002/; 
} 

有了這一點,NGINX的請求/mediaDev/將被「翻譯」的請求「/」爲快。並且它作爲前綴,因此NGINX方面的/mediaDev/socket.io將在Express側請求/socket.io

+0

當我使用'http:// localhost:3002 /;'跟着斜線我得到一個nginx錯誤。 「proxy_pass」不能在由正則表達式給出的位置中,或者在指定的locatoin中,或者在指定的locatoin中,或者......「 –

+0

@PhilipKirkbride中,並且您也更改了」位置「?如果繼續使用'〜^/mediaDev' – robertklep

+0

@rabertklep解決我的問題,謝謝 –

0

發現執行以下操作會給我想要的行爲,但如果有人想給出更好的答案,我覺得這個解決方案並不理想。

app.get('/mediaDev', function (req, res) { 
    res.render('index') 
}) 

這種方法似乎要求我硬編碼我想在nginx中使用的位置到我的node.js應用程序中。理想情況下,我希望有更多的模塊化解決方案。