Ошибка конфигурации Nginx + ExpressGateway + Express API + Socket.io

У меня очень трудные времена, пытаясь выполнить эту работу, у меня есть микросервисная архитектура, которая поддерживает несколько областей бизнеса, теперь я хотел бы добавить новый микросервис, который будет предоставлять соединение сокета для предоставления некоторой информации в реальном времени для Программы. Проверьте изображение ниже:

архитектура приложения

Я расскажу о некоторых аспектах здесь, чтобы узнать, можете ли вы помочь мне решить эту проблему с конфигурацией.

Я провел несколько тестов, чтобы определить причину проблемы, я провел тест, подключившись напрямую к Node API (работающему на сервере) без использования Nginx и ExpressGateway, проверьте Gif ниже, все работает, как ожидалось:

Посмотрите, как это работало

Он устанавливает соединение «опрос», а затем обновляется до Websocket, что мы и хотим, получает сообщения и не создает никаких новых подключений.

Это конфигурация сервера API:

constructor() {
        this.app = express();
        this.initExpress();
        this.initExpressMiddleWare();
        this.dvConn = new DAO();
        this.server = this.start();
        this.io = io().attach(this.server, {
            path: `${config.BASE_PATH}`,
            origins: '*:*',
            transports:['polling', 'websocket'],
            serveClient: false
        });
        this.newSocketUsers = [];
        this.io.on('connection', (socket) => {
            console.log(`a user connected ${socket.id}`);
            const user_id = this.decode_id(socket.handshake.query.user_id).toString();
            const socket_id = socket.id;
            this.registerConnection(socket_id, user_id);
            socket.on('disconnect', () => {
                console.log(`a user disconnected ${socket.id}`);
                const socket_id = socket.id;
                this.unRegisteredConnection(socket_id);
            });
        });

И это часть клиентского приложения Angular для проверки:

constructor(private http: HttpClient) {
    this.httpClient = http;
    this.socket = io('http://dev.server.com:3033', {
      query: {
        user_id: '988379518723645912'
      },
      transports: ['polling', 'websocket']
    });
    this.socket.on('reconnect_attempt', () => {
      this.socket.io.opts.transports = ['polling', 'websocket'];
    });
  }

  connect(): void {
    this.socket.on('connect', () => {
      console.log('Opening Connection');
    });
  }

Теперь проблема возникает, когда это запускается через Nginx и ExpressGateway, см. Gif ниже, чтобы увидеть, как приложение сначала регистрирует ошибку 502, а затем продолжает опрос и никогда не обновляется до WebSocket, делая это с каждым новым отправленным сообщением, которое регистрируется как новый запрос на опрос:

Посмотрите, как это не сработало

Я сделал домашнее задание и знаю, что для Nginx требуется некоторая конфигурация, это моя конфигурация Nginx.conf:

server {
        listen 443 ssl;
        client_max_body_size 12m;
        client_body_buffer_size 16k;
        server_name dv3.synth5.orcasnet.com api.orcasnet.com;
        ssl_certificate /etc/nginx/ssl/certificate.crt;
        ssl_certificate_key /etc/nginx/ssl/key.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCMsssssss';
        location /  {
                proxy_temp_file_write_size 64k;
                proxy_connect_timeout 10080s;
                proxy_send_timeout 10080;
                proxy_read_timeout 10080;
                proxy_buffer_size 64k;
                proxy_buffers 16 32k;
                proxy_busy_buffers_size 64k;
                proxy_redirect off;
                proxy_request_buffering off;
                proxy_buffering off;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_pass    http://gateway.domain.net:3020;
        }
}

И последнее - это конфигурация политики ExpressGateway:

socStg:
    apiEndpoints:
      - socStg
    policies:
      - cors:
      - log:
        - action:
            message: ${req.method} ${req.originalUrl} ${req.headers}
      - proxy:
          - action:
              serviceEndpoint: socStg
              changeOrigin: true
              ws: true
              timeout: 120000

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


person Jose Raul Perera    schedule 07.05.2020    source источник


Ответы (2)


Простой ответ Express-Gateway не поддерживает подключения к сокетам, мне нужно было развернуть API напрямую с Nginx. Сейчас работает.

person Jose Raul Perera    schedule 14.05.2020

следующий документ содержит событие как сокет ..

https://www.express-gateway.io/docs/plugins/plugin-development/

module.exports = {
  version: '1.2.0',
  init: function (pluginContext) {
    pluginContext.eventBus.on('hot-reload', function ({ type, newConfig }) {
      // "type" is gateway or system
      // depends on what file was changed
      // newConfig - is newly loaded configuration of ExpressGateway
      console.log('hot-reload', type, newConfig);
    });

    pluginContext.eventBus.on('http-ready', function ({ httpServer }) {
      console.log('http server is ready', httpServer.address());

      // Proxy websockets to localhost:9015
      const httpProxy = require('http-proxy')
      var proxy = new httpProxy.createProxyServer({
        target: {
          host: 'localhost',
          port: 9015
        }
      });

      httpServer.on('upgrade', (req, socket, head) => {
        proxy.ws(req, socket, head);
      });
    });

    pluginContext.eventBus.on('https-ready', function ({ httpsServer }) {
      console.log('https server is ready', httpsServer.address());
    });

    pluginContext.eventBus.on('admin-ready', function ({ adminServer }) {
      console.log('admin server is ready', adminServer.address());
    });
  }
}
person sudeep_dk    schedule 24.06.2020