2012-04-25 3 views
0

Мой чат socket.io доступен через URL-адрес http://example.com:8080/. Dreamhost не позволяет нам связывать 80, поэтому я привязываю его на 8080.Socket.io Чат на Dreamhost: Скрытие URL-адреса

Я хотел избавиться от номера порта в URL. Итак, я использовал прокси-сервер Dreamhost (http://wiki.dreamhost.com/Proxy_Server), который является mod_proxy от Apache.

Я проксировал номер порта 8080 по адресу http://example.com/socketchat. Когда я перехожу к этому URL-адресу, чат не работает. Я получаю эту ошибку:

«Proxy Error прокси-сервер получил недопустимый ответ от вышестоящего сервера Прокси-сервер не смог обработать запрос GET/гнездо/ Причина:. Ошибка чтения с удаленного сервера»

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

ответ

0

Независимо от того, быстро ли Apache становится узким местом или нет, зависит от того, как вы его используете. Это очень зрелый веб-сервер, и он прекрасно организовал массовые веб-сайты по всему миру. Независимо от того, ваше приложение socket.io не обязательно должно использовать тот же порт, что и ваше веб-приложение. Вы могли бы подключить socket.io к порту 8081 и иметь свои обычные HTTP-запросы на порту 8080. Тогда вы должны настроить свой прокси-сервер на 8080, как сейчас, и просто подключите соединение socket.io к 8081.

Порт в этом случае не должен быть проблемой, поскольку это не то, что пользователь увидит в своем URL-адресе, а связь socket.io не должна проходить через прокси-сервер. Если вы подаете достаточное количество запросов на Apache, чтобы быть законным образом узким местом, вы все равно сможете весить для лучшей среды хостинга!

Пример

Сервер

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(8081) 
    , fs = require('fs') 

app.listen(8080); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

Обратите внимание, что веб-сервер прослушивает на отдельном порту, чем соединение Socket.io. Это означает, что вы можете безопасно проксировать обычные HTTP-запросы от 80 до 8080 с помощью mod_proxy, а socket.io может довольно хорошо общаться с портом 8081, минуя прокси. Вашим пользователям не нужно будет вводить порт, чтобы попасть на сайт.

Client

<script src="http://domain.com:8081/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://domain.com:8081'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 
+0

Извините, что я очень новичок в работе на стороне сервера и node.js/socket.io, все еще изучая канаты, изучая примеры/демонстрации. Сейчас я могу получить доступ к чату, перейдя на example.com : 8080 в моем браузере. Как мне сделать это, чтобы я мог просто перейти на example.com/chat, чтобы попасть в чат? Без необходимости связывать порт 80 (потому что Dreamhost не разрешает его). Я пробовал использовать mod_proxy (при условии от Dreamhost), но это не работает. Есть ли другой прокси-сервер, который работает с websockets, которые я могу использовать? Бесконечно благодарен. – Legendre

+0

Как настроен ваш сервер? Как вы обслуживаете веб-файлы? Я предлагаю, чтобы ваше приложение-узел создало HTTP-сервер, прослушивающий порт 8080, и вы сопоставляете его с 80, используя mod_proxy. Затем у вас есть приложение socket.io на 8081, и вы просто укажете свой javascript на эту услугу. Я обновил свой ответ, чтобы включить пример того, что я имею в виду. –

+0

Я думаю, что я еще слишком неопытен, чтобы адекватно ответить на ваши вопросы. (возможно, не знаю, о чем я говорю) Однако я прочитал ваше предложение, пример кода и объяснения, и я думаю, что понимаю общее решение. Я собираюсь изучить еще несколько учебников, а затем ваш пример. Спасибо, что указали мне в правильном направлении! :) – Legendre

0

Я предполагаю, что mod_proxy не очень хорошо разбирается в веб-сайтах, что неудивительно. Тем не менее, вы действительно не должны ставить node.js за Apache, поскольку это сильно нарушает цель node.js. Apache быстро станет вашим узким местом.

И, наконец, нет угрозы безопасности при наличии socket.io на другом порту - любой риск безопасности будет присутствовать независимо от того, в каком порту его запускать. Вы можете столкнуться с проблемами с другими брандмауэрами, если они блокируют подключения к портам, отличным от порта 80 (что неслыханно), но опять же, такие брандмауэры могут в любом случае представлять проблемы с веб-окнами.

+0

У меня нет выбора, потому что Dreamhost не позволяет связать 80. , что я хотел спросить: если я выдавать ссылку на мой сайт, как «HTTP: //пример.com: 8080/", с номером порта в URL-адресе, будут ли проблемы с безопасностью? Люди будут знать, что я использую порт 8080, это было бы опасно? Извините, если я не очень ясен, я новичок на сервере – Legendre

+0

Извините, если я не был ясен: нет, нет риска для безопасности при экспонировании того порта, в котором вы запускаете socket.io. –

+0

Ой, извините, я не могу отметить два ответа. Но я очень ценю ваш вход. Спасибо! – Legendre

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