Я уже развернул свое приложение в IIS, используя руководство Halfblood Programmer. Я использую HttpPlatformHandler v1.2, приложение уже запущено, но проблема в веб-сокете. Пул Socket.io не найден, возвращается 404. Я уже включил и установил поддержку протокола IIS WebSocket, добавил <webSocket enabled = "true" />
в свой web.config
, но ничего не работает. Пожалуйста, помогите мне. Кстати, мое приложение работает на Windows Server 2022 и iis 10.
//server.js
const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const { Server } = require('socket.io');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
app.prepare().then(() => {
const server = createServer((req, res) => {
const parsedUrl = parse(req.url, true);
handle(req, res, parsedUrl);
});
const io = new Server(server, {
cors: {
origin: 'http://ipaddress:3001', // Update this to the origin you want to allow
methods: ['GET', 'POST']
}
});
io.on('connection', (socket) => {
console.info('Client connected:', socket.id);
socket.on('register', (userId) => {
// Handle user registration
});
socket.on('send_message', ({ itemId, message, senderId, origin }) => {
io.emit('new_message', { itemId, message, senderId, origin });
});
socket.on('disconnect', () => {
console.info('Client disconnected:', socket.id);
// Handle user disconnection
});
});
server.listen(3001, (err) => {
if (err) throw err;
console.info('> Ready on http://ipaddress:3001');
});
});
---package.json
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "NODE_ENV=production node server.js",
"lint": "next lint"
}
Вы допустили типичную ошибку, подключив свой сервер к выделенному номеру порта (3001).
Как я показывал во всех похожих постах, таких как этот, вы должны позволить IIS решить, какой порт использовать.
const port = process.env.PORT || 3001;
server.listen(port, (err) => {
if (err) throw err;
console.info(`> Ready on http://ipaddress:${port}`);
});
Обратите внимание, что вам придется редактировать другие места, где вы жестко запрограммировали номер порта.
Наконец я получил это, используя ответ сэра @Lex Li, я настраиваю свой server.js и делаю свой web.config
, как показано ниже.
---server.js
const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const { Server } = require('socket.io');
const dev = process.env.NODE_ENV !== 'production'
const hostname = process.env.HOSTNAME || 'ip address'
const port = process.env.PORT || 8888;
const app = next({ dev });
const handle = app.getRequestHandler();
app.prepare().then(() => {
const server = createServer((req, res) => {
const parsedUrl = parse(req.url, true);
handle(req, res, parsedUrl);
});
const io = new Server(server, {
cors: {
origin: `http://${hostname}:${port}`, // Update this to the origin you want to allow
methods: ['GET', 'POST']
}
});
io.on('connection', (socket) => {
console.info('Client connected:', socket.id);
socket.on('register', (userId) => {
// Handle user registration
});
socket.on('send_message', ({ itemId, message, senderId, origin }) => {
io.emit('new_message', { itemId, message, senderId, origin });
});
socket.on('disconnect', () => {
console.info('Client disconnected:', socket.id);
// Handle user disconnection
});
});
server.listen(port, (err) => {
if (err) throw err;
console.info(`> Ready on http://${hostname}:${port}`);
});
});
---web.config
<configuration>
<system.webServer>
<handlers>
<add name = "httpPlatformHandler" path = "*" verb = "*" modules = "httpPlatformHandler" resourceType = "Unspecified" requireAccess = "Script" />
</handlers>
<webSocket enabled = "false" />
<httpPlatform stdoutLogEnabled = "true" stdoutLogFile = ".\logs\node.log" startupTimeLimit = "20" processPath = "C:\Users\user\AppData\Roaming\nvm\v20.10.0\node.exe" arguments = ".\server.js">
<environmentVariables>
<environmentVariable name = "PORT" value = "%HTTP_PLATFORM_PORT%" />
<environmentVariable name = "NODE_ENV" value = "production" />
</environmentVariables>
</httpPlatform>
</system.webServer>
</configuration>
Поскольку IIS теперь берет на себя управление портом. Я обновляю свой web.config
с этого arguments = ".\node_modules\next\dist\bin\next start"
на этот arguments = ".\server.js"
, чтобы он мог выполнить server.js
. Если я использую это arguments = ".\node_modules\next\dist\bin\next start"
, оно тоже запустит приложение, но сервер Socket.io не запустится. Я также добавил это <environmentVariable name = "NODE_ENV" value = "production" />
, чтобы он запускал производственный режим.
Тогда вам следует принять свой ответ, а не мой.
@pryxen
- Local: http://localhost:28864
Порт, который вы указали в привязке IIS, не соответствует запрошенному вами порту 3001. Попробуйте сопоставить их.