У меня приложение стека MEAN, развернутое в AWS EC2 с использованием nginx в качестве обратного прокси-сервера.Все работает нормально, кроме сокета IO.Когда я запускаю свое приложение в localhost (без nginx), сокет io работает как я ожидаю.Проблема возникает, когда я разверну свое приложение.Я получаю эту ошибку на стороне клиента:
Доступ к XMLHttpRequest по адресу http://ec2Url.com/socket.io/?EIO=3&transport=polling&t=MrZ4rVk' из источника http://www.mydomain.com.ar' заблокирован политикой CORS: Нет 'Access-Заголовок Control-Allow-Origin 'присутствует в запрошенном ресурсе.
, и это предупреждение:
Блокировка перекрестного чтения (CORB) заблокированный ответ перекрестного источника http://ec2Url.com/socket.io/?EIO=3&transport=polling&t=MrZ4rVk с текстом MIME типа / html.См. https://www.chromestatus.com/feature/5629709824032768 для получения более подробной информации.
В моем угловом приложении я использую эту конфигурацию в модуле:
const socketConfig: SocketIoConfig = { url: 'ec2Url.com/sockets/socket.io', options: {} };
И в моем экспресс-app.js:
var app = express();
app.use(cors());
const http = require('http').Server(app);
const io = require('socket.io')(http, {
path: '/sockets/socket.io'
});
io.origins((origin, callback) => {
if (origin !== 'http://www.mydomain.com.ar') {
console.log('Blocked origin: ', origin);
return callback('origin not allowed', false);
}
callback(null, true);
});
io.on('connection', socket => {
socket.on('waitingQrPayment', storeId => {
socket.join(storeId);
console.log('joined room %s', storeId);
});
socket.on('waitingEmailResult', storeId => {
socket.join('email'+storeId);
console.log('joined room %s', storeId);
});
});
app.io = io;
....
...
http.listen(3000, function () {
console.log('Listening on port 3000. Env:', global.process.env.NODE_ENV);
});
Наконец, моя конфигурация nginx выглядит следующим образом:
server {
listen 80;
sendfile on;
default_type application/octet-stream;
gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 1100;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascri$
gzip_comp_level 9;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.html =404;
}
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
location /sockets/ {
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;
}
}
Я пытаюсь найти решение уже несколько дней, но я все еще с этой проблемой.