2016-12-14 4 views
0

У меня есть установка приложения node/express.js/socket.io на сервере Ubuntu, работающем на порту 3002. Я открыл все порты на машине.NGINX с Express.js & socket.io | Не удается GET

Когда я иду на 11.111.111.1:3002/, все работает отлично (оба socket.io & express.js). Я пытаюсь прокси обойти приложение /mediaDev/, который, кажется, работает в том, что я получаю сообщение об ошибке от express.js или узла, который говорит:

«не может получить/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' 
}) 

Примечания: по IP-адресу оба express.js и socket.io работают. На фактическом домене экспресс вернула ошибку, но мой путь socket.io /mediaDev/socket.io все еще работает.

Я думал, что это было немного странно. Если я прокси-сервер, передающий /mediaDev и создающий мой путь socket.io /mediaDev/socket.io, не должен ли я ожидать ошибку, а на самом деле - /mediaDev/mediaDev/socket.io?

+0

Вы пытаетесь проксировать все подключение к порту 3002 или просто прокси socket.io? – jAndy

+0

Все соединение –

ответ

3

Для NGINX важно, если вы добавите косую черту в URI (как в location, так и в proxy_pass). Если вы правильно настроили его, вы можете удалить префикс из пути запроса.

Попробуйте это:

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

При этом запрос на NGINX для /mediaDev/ будут «переведены» на просьбу «/» для Express. И он служит префиксом, поэтому /mediaDev/socket.io со стороны NGINX запросит /socket.io на стороне Express.

+0

Когда я использую 'http: // localhost: 3002 /;' с завершающей косой чертой я получаю ошибку nginx. «proxy_pass» не может иметь URI-часть в местоположении, заданном регулярным выражением, или внутри named locatoin или ... » –

+0

@PhilipKirkbride, и вы также изменили« местоположение »? Вы получите эту ошибку, если будете продолжать использовать' ~ ^/mediaDev' – robertklep

+0

@rabertklep, который исправил мою проблему благодаря –

0

Нахождение того, что выполнение следующего дает мне желаемое поведение, но если кто-то хочет дать лучший ответ, я считаю, что это решение не идеально.

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

Этот метод, кажется, требует, чтобы я жестко закодировать расположение я хочу использовать в Nginx в моем Node.js приложения. В идеале я надеюсь на более модульное решение.

Смежные вопросы