2016-12-14 106 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应用程序中。理想情况下,我希望有更多的模块化解决方案。