У меня есть Nginx сервер Ubuntu (https), на котором установлена программа NodeJS, работающая на http-сервере. Http-сервер Nodejs прослушивает подключения socketIO через порт 4001. Я направил / проксировал входящие запросы с Nginx, чтобы указать на этот NodeJS сервер.
При использовании socketio-client с React, Я могу соединиться с localhost: 4001 в качестве URL-адреса соединения на моем компьютере, но когда я устанавливаю NodeJS и React-клиент на Nginx, я не могу правильно подключиться.
Я пытался настроить многие вещи, но сейчас я получаю сообщение об ошибке «Недопустимое пространство имен» на консоли React при попытке подключения. Я вижу начальное соединение на моей консоли NodeJS.
Мой вопрос: где я ошибаюсь при настройке? Я выложу ниже соответствующие блоки кода:
Ngnix:
server {
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
location /socket.io {
proxy_pass http://localhost:4001;
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;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
Реакция:
componentDidMount() {
const url = `https://example.com/socket.io`;
this.socket = io.connect(url, {
transports: ['websocket'],
rejectUnauthorized: false,
secure: true
});
this.socket.on("connecting", (data) => {
console.log(data)
});
this.socket.on("connect", (data) => {
console.log('connected')
});
this.socket.on("disconnect", (data) => {
console.log("disconnect", data)
});
this.socket.on("message", (payload) => {
//...
});
this.socket.on("data", (payload) => { ... }
//...
});
this.socket.on("error", (data) => console.log("error", data));
}
NodeJS:
var httpServer = require("http").createServer()
var ioServer = require("socket.io")
var options = {
pingTimeout: 1000000,
pingInterval: 1000
};
var io = new ioServer()
io.attach(httpServer, options)
httpServer.listen(4001)
console.log(`Websocket server started on port: ${4001}...`);
io.on("connection", function connection(client) {
// ...
}