#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