2012-04-25 6 views
0

내 socket.io 채팅은 http://example.com:8080/을 통해 액세스 할 수 있습니다. Dreamhost는 80을 바인딩 할 수 없으므로 8080에 바인딩합니다.Socket.io Dreamhost에서 채팅 : URL 숨기기

URL에서 포트 번호를 제거하고 싶습니다. 그래서 Dreamhost의 Proxy Server 기능 (http://wiki.dreamhost.com/Proxy_Server)을 사용했습니다.이 기능은 Apache의 mod_proxy입니다.

포트 번호 8080을 URL http://example.com/socketchat으로 프 록시했습니다. 해당 URL로 이동하면 채팅이 작동하지 않습니다. 이 오류 얻을 :

:

".. 오류 원격 서버에서 읽기 프록시 서버가 업스트림 서버에서 잘못된 응답을 받았습니다 프록시 오류 요청 GET/소켓/ 이유를 처리 할 수있는 프록시 서버"

socket.io에서 작동하는 URL에서 포트 번호를 제거 할 수있는 방법이 있습니까? 아무 것도 작동하지 않는다면 웹 사이트를 공개 할 때 URL에 포트 번호를 남겨두면 보안 상 위험할까요? 감사.

답변

0

아파치가 곧 병목 현상이되는지 아닌지는 정확히 어떻게 사용하고 있는지에 달려 있습니다. 그것은 매우 성숙한 웹 서버로 세계 전역의 방대한 웹 사이트를 잘 호스팅하고 있습니다. 그럼에도 불구하고 socket.io 응용 프로그램이 웹 응용 프로그램과 동일한 포트를 공유 할 필요는 없습니다. socket.io를 포트 8081에서 청취하고 포트 8080에서 일반적인 http 요청을 할 수 있습니다. 그러면 지금 가지고있는대로 프록시가 8080을 가리 키도록 설정하고 socket.io 연결을 8081로 이동하십시오.

이 경우 포트는 사용자가 URL에서 볼 수있는 것이 아니며 socket.io 통신은 프록시를 거칠 필요가 없으므로 문제가되지 않아야합니다. 아파치가 합법적으로 병목 현상을 일으키기에 충분한 요청을하는 경우, 더 나은 호스팅 환경을 원할하게 될 것입니다!

서버 웹 서버가 socket.io 연결보다 별도의 포트에서 수신 대기

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); 
    }); 
}); 

알 수 있습니다. 즉, mod_proxy를 사용하여 80에서 8080 사이의 일반 HTTP 요청을 안전하게 프록시 할 수 있으며 socket.io는 프록시를 거치지 않고 포트 8081에서 직접 매우 행복하게 통신 할 수 있습니다. 사용자는 사이트에 접속하기 위해 포트를 입력 할 필요가 없습니다.

클라이언트

<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 in my browser. chat/chat에 접속하려면 어떻게해야합니까? (Dreamhost가 허용하지 않기 때문에) 포트 80을 바인드하지 않아도됩니다. 제공된 mod_proxy를 사용했습니다. Dreamhost)하지만 작동하지 않는 다른 프록시가 작동합니까 내가 사용할 수있는 웹 소켓이 있습니까? 대단히 감사합니다. – Legendre

+0

서버는 어떻게 설정합니까? 어떻게 웹 파일을 제공하고 있습니까? 내가 말하고 싶은 것은 노드 애플리케이션이 포트 8080에서 수신하는 http 서버를 생성하고 mod_proxy를 사용하여 80에 매핑하는 것입니다. 그런 다음 socket.io 응용 프로그램을 8081에서 수신 대기하게되면 자바 스크립트를 해당 서비스로 지정합니다. 내 대답을 업데이트하여 내 뜻을 예로 들어 설명했습니다. –

+0

나는 아직도 너의 질문에 적절히 대답하기에는 너무 경험이 없다고 생각한다. (아마도 내가 무슨 말을하는지 모른다) 그러나, 나는 당신의 제안, 예제 코드와 설명을 읽었고 나는 일반적인 해결책을 이해한다고 생각한다. 나는 더 많은 튜토리얼을 공부하고, 당신의 예를 공부할 것이다. 나를 올바른 방향으로 향하게 해주셔서 감사합니다! :) – Legendre

0

제 생각에 mod_proxy는 websockets을 잘 다루지 못합니다. 이것은 거의 놀라운 일이 아닙니다. 즉, node.js를 Apache 뒤에 두어서는 안되며, node.js를 node.js의 많은 용도로 사용하지 않아야합니다. 아파치가 곧 병목 현상이 될 것입니다.

마지막으로, 아니요, 다른 포트에서 socket.io를 사용하면 보안 위험이 없습니다. 포트를 실행하는 포트와 관계없이 보안상의 위험이 있습니다. 다른 방화벽이 포트 80이 아닌 다른 포트로의 연결을 차단하는 경우 (예기치 않은) 다른 방화벽과 문제가 발생할 수 있지만, 그런 경우 방화벽은 어떤 경우에도 웹 소켓에 문제가 발생할 수 있습니다.

+0

DreamHost는 우리가 내가 물어 무엇을 의미하는지 80 에 결합하는 것을 허용하지 않습니다 때문에 선택의 여지가 : 나는 "HTTP와 같은 내 웹 사이트에 대한 링크를 제공하는 경우 : //예.com : 8080/"과 URL의 포트 번호가 일치하면 보안 문제가 발생합니까? 사람들이 포트 8080을 사용하고 있음을 알면 위험 할 수 있습니까? 죄송 합니다만 명확하지 않으면 죄송합니다. – Legendre

+0

죄송합니다. 명확하지 않은 경우 : 아니오, socket.io를 실행하는 포트가 노출 되어도 보안 위험이 없습니다. –

+0

오, 괜찮습니다. 두 가지 답변을 적어 두지 못해 죄송합니다.하지만 정말 고맙습니다. 감사합니다! – Legendre