2017-11-17 6 views
0

이것은 나를 미친 듯이 실망시킵니다! 내가 myURL이 갈 어떤 요청/APP /는 myURL이에서 Node.js를 응답되도록 프록시 사용하고node.js를 사용하여 HTTPS를 통해 소켓 IO를 작동시키는 방법

: 8001

는 지금 HTTPS를 통해 작업이 필요합니다. 쉬운 .... 나는 생각했다.

공용 폴더에서 이전 버전을 제공하는 Apache가 있습니다. 그것은 혼자 서 있고, 내가 이것을 끝내면, 그냥 제거 될 것입니다. 그러나 당분간은 재치있게 접근 할 수 있어야합니다. 이것에 암호화가 설정되도록합니다. https://myurl은 잘 작동하여 물론 공용 폴더의 콘텐츠를 보여줍니다.

내가 https://myurl:8001으로 이동하면 크롬에 '사이트에 연결할 수 없음'이라고 표시됩니다. 내가 http://myurl:8001에 가면 잘 동작합니다. 나는 이것이 https의 기본 포트가 443이기 때문에라고 생각한다. VPS를 전용으로 사용하지 않기 때문에 변경할 수 있다고 생각하지 않는다. 그리고 확실하게 내가 SSL 포트를 변경했다면 공용 폴더에서 작동하지 않을 것입니다. ??

나는 당신에게 무슨 일이 진행되고 있는지 보여 줄 것이다.

app.js;

var express = require('express'); 
var app = express(); 
var serv = require('http').Server(app); 

app.get('/',function(req, res) { 
    res.sendFile(__dirname + '/client/index.html'); 
}); 
app.use('/client',express.static(__dirname + '/client')); 

serv.listen(8001); 
console.log("Server started."); 

var SOCKET_LIST = {}; 

var io = require('socket.io')(serv,{}); 
io.sockets.on('connection', function(socket){ 
    socket.id = Math.random(); 
    socket.x = 0; 
    socket.y = 0; 
    socket.number = "" + Math.floor(10 * Math.random()); 
    SOCKET_LIST[socket.id] = socket; 

    socket.on('disconnect',function(){ 
     delete SOCKET_LIST[socket.id]; 
    }); 

}); 

setInterval(function(){ 
    var pack = []; 
    for(var i in SOCKET_LIST){ 
     var socket = SOCKET_LIST[i]; 
     socket.x++; 
     socket.y++; 
     pack.push({ 
      x:socket.x, 
      y:socket.y, 
      number:socket.number 
     });  
    } 
    for(var i in SOCKET_LIST){ 
     var socket = SOCKET_LIST[i]; 
     socket.emit('newPositions',pack); 
    } 




},1000/25); 

클라이언트/index.html;

<canvas id="ctx" width="500" height="500" style="border:1px solid #000000;"></canvas> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> 

<script> 
    var ctx = document.getElementById("ctx").getContext("2d"); 
    ctx.font = '30px Arial'; 

    var socket = io.connect('http://www.myurl:8001', {path: "/socket.io"}); 

    socket.on('newPositions',function(data){ 
     ctx.clearRect(0,0,500,500); 
     for(var i = 0 ; i < data.length; i++) 
      ctx.fillText(data[i].number,data[i].x,data[i].y);  
    }); 
</script> 

코드가 http 이상인 경우에만 정상적으로 작동합니다. SSL을 통해 작동해야합니다.

https가 작동하려면이 행이 필요합니다.

var socket = io.connect('https://www.myurl:8001', {path: "/socket.io"}); 

어떻게 가능합니까?

모든 도움을 주시면 대단히 감사하겠습니다.

+0

라우팅을 단일 슬래시에서 이중으로 변경 한 후. 나는 더 이상 포트를 사용할 필요가 없으므로 대신 URL 경로를 사용할 수 있습니다. var socket = io.connect ('https : //www.myurl : 8001', {path : "/socket.io"}); 된되었다 var socket = io.connect ('https : //www.myurl/theappfolder/', {path : "/socket.io"}); –

답변

1

서버 코드는 https 서버가 아닌 http 서버 만 만들고 socket.io는 http 서버를 사용하기 때문에 http에서만 실행됩니다. http와 https 서버가 다릅니다 (https 서버는 http 서버에없는 인증서 확인 및 데이터 암호화를 구현합니다). 당신이 options 데이터 구조의 해당 certificateinfo를 입력해야합니다,

const express = require('express'); 
const app = express(); 
const options = {...}; // fill in relevant certificate info here 
const serv = require('https').createServer(options, app); 

을 그리고이에

var express = require('express'); 
var app = express(); 
var serv = require('http').Server(app); 

을 :

가 HTTPS 서버를 확인하려면 다음을 변경합니다.

https.createServer() 코드 예는 here입니다.

그러면 https URL 및 올바른 포트 번호로 연결하는 동안 원하는 모든 포트에서 https 서버를 실행할 수 있습니다. https URL의 기본 포트가 443이므로 포트 번호를 지정하지 않으면 브라우저에서 사용하려고 시도합니다.

+0

답장을 보내 주셔서 감사합니다 Jfriend00 -이 문제를 해결했습니다. 내가 어떻게 해결했는지에 대한 자세한 버전을 작성하는 시간이 없다. 그렇지만 네가 맞다. 나는 https 서버를 만들어야 만했다. 내가 실제로해야했던 것은 socket.io를위한 별도의 포트에서 수신하는 것이었다. 나는 실제로 나 자신과 같은 인형에게 설명하는 비디오를 만들 것입니다. 왜냐하면 이것에 관한 많은 정보가 있더라도 ... 제가 말할 때, 정보는 인형에 좋지 않기 때문입니다. 그러나 나는 그것이 일하고 시간이 다가 오면 곧 지식을 전달할 것입니다 :-) –

+0

@FeelsUnique - 웹 서버가 https가되고 socket.io가 https가되기를 원하지 않는 한, 기술적 인 이유는 없습니다. 웹 서버와 socket.io는 같은 포트에있을 수 없습니다. 지금까지는 별도의 포트가 실제로 필요한 제품 요구 사항을 설명하지 않았습니다. – jfriend00

+0

@FeelsUnique -이 답변에 대한 질문이 있습니까? 그렇다면 답장 옆에있는 체크 표시를 클릭하여 커뮤니티에 표시하고 stackoverflow에서 적절한 절차를 수행 한 데 대한 평판 포인트를 얻을 수도 있습니다. – jfriend00

0

이것은 약간 당황 스러웠습니다 ... 실제 문제는 다음과 같았습니다.

당신이이 롤을 따라갈 수 있다면 ...

그래서 dreamhost에서는 일반적인 방법으로 아파치를 실행하고 콘텐츠를 제공 할 수 있습니다. 이에 대한/공용 폴더가 있습니다. 상당히 표준적인 것들. 나는 (내가 PHP를 사용하여 소켓을 사용하여 나를 강의하지 말아주세요.) 그래서 나는 사람이 node.js를 프록시 할 수있게 해주는 dreamhost를 사용하고있었습니다. 응용 프로그램을 포트를 통해 예. 포트 xxxx는 thewebsiteurl/whateverfolderyouchoose에서 끝납니다/

ok 그래서 내 node.js에서 express를 사용하고있었습니다. 이제 표현에서 정말 쉽게 라우팅을 지정할 수 있습니다. 어떤 bizzare 이유에 대해, 나는 왜 실제로 당신이 나에게 계몽을 알고 있는지 알아 내기 위해 귀찮게하지 않을 것이다. 나는 "/ whateverroute /"와 같이 라우팅에 두 개의 슬래시를 넣어야 만했다. 내가 배운 모든 예제는 단일 슬래시를 사용합니다. 예를 들어 "/ whateverroute /"하지만 작동하지 않습니다. 이유를 아는 경우 알려주십시오. 그래서 이것을 알아 내기 전에, 실제로 아무 것도 올바르게 라우팅 할 수 없었고, 결국 포트 번호가있는 URL을 사용해야했습니다. 물론 그것은 https를 엉망으로 만든다. 예를 들어 https://www.theurl.com:xxxx은 node.js 앱이 https res req 서버를 실행하지 않아 안전하지 못했습니다. 사실 나는 https 노드 서버를 설정했고 그 문제에 대한 해결책이라고 생각했습니다.

그래서이 이상한 문제에 대한 해결책은 node.js 라우팅입니다. 그 바보처럼 복잡하기 때문에, 어이 인생은 당신이 실제로 당신의 정확한 설정을 아는 사람이 아니라 구글로부터 배우는 것과 같습니다.

재미있는 점은 node.js가 없습니다. 나는 그것을 사용하는 이점을 볼 수있다. 그러나 그것은 내가하고있는 것만 큼 단순한 무언가에 대한 공허증처럼 보입니다. 또한 내가 지금 전화/격차를 발견 했으므로 PHP는 실제로 내가하고 싶은 일에 대해 괜찮습니다. 좋아, 그래서 AJAX 요청과 함께 여러 번 서버 방법을 때리는거야하지만 지금은 몇 백 사용자와 대처의 사이트가 아마 잘 작동하지 않을 때 10'000 마크를 때, 나는 충분히 얻을 수 있어야합니다 ~에서 배울 진짜 node.js 프로그래머 .... 잘하면.

나는 tho 녀석을 도와 주셔서 감사합니다.

+0

app.get ('/', function (req, res)) app.get ('//', function (req, res))로 바꿔야했습니다. –