Проблемы с socket.io - Angular - Express - Nginx - PullRequest
0 голосов
/ 24 сентября 2019

У меня приложение стека 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;
    }
}

Я пытаюсь найти решение уже несколько дней, но я все еще с этой проблемой.

1 Ответ

0 голосов
/ 25 сентября 2019

Проблема была в моем конфигурационном файле nginx.Я опубликую решение для будущих пользователей:

location ~* \.io {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy false;

      proxy_pass http://localhost:3000;
      proxy_redirect off;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...