Сокеты не работают на производстве с nginx

#node.js #angular #express #sockets #nginx

#node.js #angular #экспресс #сокеты #nginx

Вопрос:

Я пытаюсь поместить свой проект angular в prod, но сокеты не работают. На локальном хосте все в порядке, но когда я запускаю его на своем сервере (Ubuntu 20.04), запускается веб-сайт, но в консоли Chrome у меня есть ОШИБКА_CONNECTION_TIMED_OUT о сокетах. Я не знаю, откуда проблема. Возможно, nginx conf или ссылки, которые мне нужно отредактировать с локального хоста на IP-адрес моего сервера.

[КЛИЕНТ]

module.ts

 import { SocketIoModule, SocketIoConfig } from 'ngx-socket-io';

const socketConfig: SocketIoConfig = { url: 'http://<server_ip>:3000', options: {} };

@NgModule({
    declarations: [...],
    imports: [
        ...
        SocketIoModule.forRoot(socketConfig),
        ...
    ],
    providers: [...],
    bootstrap: [AppComponent]
})
export class AppModule {}
 

[СЕРВЕР]

app.ts

 const expressPort = 8080;
const _app = express();

_app.use(json({limit: '5mb'}));
_app.use(urlencoded({extended: true}));

_app.use(cors());
_app.use(function(request, result, next) {
    result.setHeader('Access-Control-Allow-Origin', '*');
    next();
});

this._app.listen(expressPort, () => {
    console.info(`App listening on port ${expressPort} !`);
});
 

socket.ts

 const socketPort = 3000;
const server = http.createServer(_app);
const io = socketIo(server);

server.listen(socketPort, undefined, undefined, () => {
    console.info(`Sockets are listening on port ${socketPort} !`);

    io.on('connection', (socket: Socket) => {
        console.log("User connected");
    });
});
 

nginx conf

 server {
    listen 80;
    listen [::]:80;

    server_name _;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

 

Я попытался добавить это в свой nginx conf, но ничего не изменилось

 
location /socket.io {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:3000/;
}
 

Комментарии:

1. Попробуйте proxy_pass http://localhost:3000; без конечной косой черты.

2. @IvanShatsky не работает, та же проблема

3. Есть ли брандмауэр на сервере? Это может блокировать соединения.

Ответ №1:

Это был брандмауэр. Порт 3000 не был открыт.

Спасибо @ZabojCampula