Помещение socket.io за обратный прокси? - PullRequest
0 голосов
/ 03 октября 2018

Я недавно решил изучить socket.io, чтобы сделать что-то в режиме реального времени.Я написал что-то, следуя странице «Начало работы» на сайте, и проверял это локально, пока не заработал.

Я загрузил его на свой сервер, используя тот же процесс, что и все остальное.Я запустил его на порту 8002 и добавил его в свой обратный прокси-сервер (используя http-proxy-middleware ) под /pong/*.Затем я прокси /socket.io/* на порт 8002, прежде чем он работалОднако после проверки с помощью Firefox я заметил, что socket.io использовал только опрос в качестве метода передачи, а не websockets, и после некоторой дальнейшей мысли я решил, что отправка /socket.io/* на 8002 не будет хорошей при использовании socket.io на другомпроекты в будущем.

Поэтому я спрашиваю, как я могу получить несколько программ socket.io, работающих за обратным прокси-сервером, используя веб-сокеты в качестве транспорта?


proxy.js

const express = require("express")
const fs = require('fs');
const http = require('http');
const https = require('https');
const proxy = require('http-proxy-middleware');

const privateKey  = fs.readFileSync('/etc/[path-to- letsencrypt]/privkey.pem', 'utf8');
const certificate = fs.readFileSync('/etc/[path-to-letsencrypt]/cert.pem', 'utf8');
const ca = fs.readFileSync('/[path-to-letsencrypt]/chain.pem', 'utf8');

var credentials = {key: privateKey, cert: certificate, ca: ca};
var app = express();

app.use(function (req, res, next) {
        console.log(req.url)
        next()
})

app.use("/pong/*", proxy({ target: "http://localhost:8002", pathRewrite: {"^/pong": ""},  ws:true, changeOrigin: true }))
app.use("/pnw/war/*", proxy({ target: "http://localhost:8000" }))
app.use("/pnw/nation/*", proxy({ target: "http://localhost:8001" }))
app.use(express.static("./static"))

https.createServer(credentials, app).listen(443);

// Redirect all HTTP traffic to HTTPS
http.createServer(function (req, res) {
    res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
    res.end();
}).listen(80);

pong.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http, {
    path: "/pong/"
});

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

http.listen(8002, function(){
  console.log('listening on *:8002');
});

index.html

<script src="/pong/socket.io.js"></script>
<script>
    var socket = io({
        // transports: ['websocket'], upgrade: false, (using for testing)
        path:"/pong"
    }) 

    // ...
</script>

То, что у меня есть в настоящее время, исходит из ответана этот вопрос: Настройка нескольких приложений socket.io/node.js на сервере Apache?

Однако в консоли Firefox появляется предупреждение: Loading failed for the <script> with source “https://curlip.xyz/pong/socket.io.js”, за которым следуетошибка io is not defined.На вкладке сети в файле socket.io.js показано значение 404.

Так что я считаю, что из-за того, что express захватывает запросы для /, socket.io не может (по какой-то причине) серверный сокет.io.js.Однако, когда я изменил / на /index.html и загрузил, что не было никаких изменений.

1 Ответ

0 голосов
/ 03 октября 2018

Итак, я провел еще какое-то исследование и нашел решение.Я открыл порт 8002 на своем EC2, чтобы я мог поискать socket.io.js.

По сути, я обнаружил, что socket.io.js был расположен в /pong/pong/socket.io.js, потому что я установил путь в pong.js в "pong ", который, оглядываясь назад, имеет смысл, прокси добавляет один" pong ", в то время как socket.io сам захватывает" / pong ".

Зная это, я удалил опцию path в pong.js, так что socket.io.js можно найти в /pong/socket.io/socket.io.js.Затем я указал клиенту на это, изменив тег сценария и параметр пути в index.html.


pong.js

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

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

http.listen(8002, function(){
  console.log('listening on *:8002');
});

index.html

<script src="/pong/socket.io/socket.io.js"></script>

var socket = io({
    path:"/pong/socket.io/"
})
...