2016-12-14 7 views
0

ポート3002で動作しているUbuntu Serverにnode/express.js/socket.ioアプリをセットアップしました。マシン上のすべてのポートを開いています。Express.jsとsocket.ioを持つNGINX | Can not GET

11.111.111.1:3002/に行くと、すべてが完全に機能します(どちらもsocket.io & express.js)。私がしようとしている私が言うexpress.jsまたはノードからのエラーメッセージを取得することで動作するように思われる/mediaDev/にアプリをプロキシパス:

「/ MEDIADEVを得ることができません」ノードのアプリが見つからないと、502 Bad Gatewayが返されます。

しかし、私の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

接続全体をポート3002またはプロキシsocket.ioに接続しようとしていますか? – jAndy

+0

接続全体 –

答えて

3

NGINXの場合、URIに末尾にスラッシュ(locationproxy_passの両方)を追加すると重要です。正しく設定した場合は、要求パスから接頭辞を取り除くことができます。

これを試してみてください。これにより

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

/mediaDev/ためnginxのへの要求は「/」Expressのための要求に「翻訳」されます。接頭辞として機能するので、NGINX側の/mediaDev/socket.ioはExpress側で/socket.ioを要求します。

+0

「http:// localhost:3002 /;」を使用すると、後続のスラッシュでnginxエラーが発生します。 "proxy_pass"は正規表現で指定された場所、または名前付きロケートインの中にURI部分を持つことはできません... " –

+0

@PhilipKirkbrideあなたは' location'も変更しましたか? '〜^/mediaDev' – robertklep

+0

@rabertklepさんが私の問題を解決しました。ありがとう –

0

次のことを実行すると、私には望ましい動作が得られることがわかりますが、誰かがより良い回答をしたい場合、この解決法は理想的ではないと感じています。

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

この方法では、nginxで使用したい場所をnode.jsアプリケーションにハードコードする必要があります。理想的には、よりモジュラーなソリューションを望んでいます。