Развертывание NextJS с помощью приложения Socket.IO в IIS 10

Я уже развернул свое приложение в 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"
      }

Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Этот пост - краткая презентация netty-websocket-http1 - альтернативной netty/java реализации RFC6455 - протокола WebSocket.
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Здесь мы рассмотрим, как можно использовать Websocket в Deno и развернуть его в Deno deploy. Мы будем слушать Websocket, а также отправлять сообщения.
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы допустили типичную ошибку, подключив свой сервер к выделенному номеру порта (3001).

Как я показывал во всех похожих постах, таких как этот, вы должны позволить IIS решить, какой порт использовать.

        const port = process.env.PORT || 3001;
        server.listen(port, (err) => {
            if (err) throw err;
            console.info(`> Ready on http://ipaddress:${port}`);
        });

Обратите внимание, что вам придется редактировать другие места, где вы жестко запрограммировали номер порта.

@pryxen - Local: http://localhost:28864 Порт, который вы указали в привязке IIS, не соответствует запрошенному вами порту 3001. Попробуйте сопоставить их.

alwa shuang 08.08.2024 10:27

Наконец я получил это, используя ответ сэра @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" />, чтобы он запускал производственный режим.

Тогда вам следует принять свой ответ, а не мой.

Lex Li 12.08.2024 02:36

Другие вопросы по теме