我在端口3002上运行的Ubuntu服务器上设置了node/express.js/socket.io
应用程序。我已打开机器上的所有端口。
当我去11.111.111.1:3002/
时,一切都很完美(socket.io和express.js)。我试图将应用程序代理传递给/mediaDev/
,这似乎有效,因为我收到了来自express.js或节点的错误消息:
"不能GET / mediaDev"
如果找不到节点应用,则返回502 Bad Gateway。
但是直接通过我的IP地址和端口直接进入应用程序,应用程序可以正常运行。
Simplified 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'
})
注意:在IP地址上,express.js和socket.io都正常工作。在实际域express上返回错误,但我的socket.io路径/mediaDev/socket.io
仍然有效。
/mediaDev
传递代理并使我的socket.io路径/mediaDev/socket.io
不应该出现错误而且实际上是/mediaDev/mediaDev/socket.io
?
答案 0 :(得分:4)
对于NGINX,如果您向URI添加尾部斜杠(location
和proxy_pass
中)都很重要。如果正确设置,可以让它从请求路径中删除前缀。
试试这个:
location /mediaDev/ {
proxy_pass http://localhost:3002/;
}
这样,对/mediaDev/
的NGINX请求将被“翻译”为Express的“/”请求。它用作前缀,因此NGINX端的/mediaDev/socket.io
将在Express端请求/socket.io
。
答案 1 :(得分:0)
发现执行以下操作可以为我提供所需的行为,但如果有人想要给出更好的答案,我觉得这个解决方案并不理想。
app.get('/mediaDev', function (req, res) {
res.render('index')
})
这个方法似乎要求我将我想在nginx中使用的位置硬编码到我的node.js应用程序中。理想情况下,我希望有一个更模块化的解决方案。