Я недавно решил изучить 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
и загрузил, что не было никаких изменений.