omnidb за прокси посланника

Я пытаюсь настроить сервер omnidb за прокси-сервер посланника

Он отлично работал с Nginx, но мне по какой-то причине пришлось перейти на посланника ...

Я использую omnidb v2.17

Проблема связана с websocket omnidb. Я могу нормально подключиться к omnidb, я могу войти в систему, но когда я запускаю SQL-запрос, я получаю следующую ошибку:

не удается подключиться к серверу websocket с портами 443 (внешний) и 26000 (внутренний)

Когда я смотрю в браузере, я вижу в консоли следующую ошибку:
WebSocket connection to 'wss://my-domain.com/wss' failed: Error during WebSocket handshake: Unexpected response code: 404

Через несколько секунд в консоли появляется эта ошибка:
WebSocket connection to 'wss://my-domain.com:26000/wss' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

РЕДАКТИРОВАТЬ: В журнале посланника у меня есть это:
[2021-02-16T18:52:19.016Z] "GET /wss HTTP/1.1" 404 - 0 77 63 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "0d9be0f1-9517-43e0-8a66-355804dd23c7" "my-domain.com" "10.0.0.1:8080"
Таким образом, кажется, что он пытается перенаправить на 10.0.0.1:8080 вместо порта 26000. Это префикс / совпадение перед / wss, поэтому все идет в порт 8080?

Вот мой envoy.yaml файл:

static_resources:

  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 443
    filter_chains:
    - filter_chain_match:
        server_names:
        - my-domain.com
      filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http_and_wss
          upgrade_configs:
          - upgrade_type: websocket
          access_log:
          - name: envoy.access_loggers.file
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
              path: /dev/stdout
          http_filters:
          - name: envoy.filters.http.router
          route_config:
            name: omnidb
            virtual_hosts:
            - name: local_service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/wss/"
                route:
                  prefix_rewrite: "/"
                  cluster: omnidb_ws
              - match:
                  prefix: "/ws/"
                route:
                  prefix_rewrite: "/"
                  cluster: omnidb_ws
              - match:
                  prefix: "/"
                route:
                  cluster: omnidb
      transport_socket:
        name: envoy.transport_sockets.tls
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
          common_tls_context:
            tls_certificates:
              certificate_chain:
                filename: /etc/letsencrypt/live/my-domain.com/cert.pem
              private_key:
                filename: /etc/letsencrypt/live/my-domain.com/privkey.pem


  clusters:
  - name: omnidb
    connect_timeout: 30s
    dns_lookup_family: V4_ONLY
    load_assignment:
      cluster_name: omnidb
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.1
                port_value: 8080
  - name: omnidb_ws
    connect_timeout: 0.25s
    dns_lookup_family: V4_ONLY
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
    load_assignment:
      cluster_name: omnidb_ws
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.1
                port_value: 26000

PS: я не могу создать тег omnidb, поэтому я поставил вместо него SQL, было бы неплохо иметь тег omnidb


person cylon86    schedule 16.02.2021    source источник
comment
да, попробуйте просто изменить порядок совпадений двух маршрутов. Если вы сделаете это с префиксными путями, / должен идти самым последним, иначе он будет соответствовать всем. Envoy пытается сопоставить маршрут сверху вниз и использует первый из подходящих.   -  person justincely    schedule 17.02.2021
comment
Я пробовал, но все то же самое. В своем сообщении я обновил файл envoy.yaml. Все еще та же ошибка. Я не понимаю, почему он пытается подключиться к 'wss: //my-domain.com: 26000 / wss' вместо 'wss: //10.0.0.1: 26000'   -  person cylon86    schedule 20.02.2021


Ответы (1)


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

Главное здесь:

  • У вас есть совпадения маршрутов для /wss/ и /ws/, оба с косой чертой в конце
  • Вы отправляете запрос с /wss с NO в конце косой чертой.
  • Этот запрос не соответствует ни одному из двух первых маршрутов, поэтому он снова попадает на маршрут /.

Вы можете отправить свой запрос, используя /wss/ (обратите внимание на косую черту в конце), или вы можете добавить / изменить свои маршруты. Это можно сделать несколькими способами, самым простым, вероятно, будет просто сопоставить /wss и /ws. однако, если завершающая косая черта важна для конечного приложения (что может быть в пользовательском интерфейсе), вы можете /wss перенаправить на /wss/

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

static_resources:

  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8443
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http_and_wss
          access_log:
          - name: envoy.access_loggers.file
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
              path: /dev/stdout
          http_filters:
          - name: envoy.filters.http.router
          route_config:
            name: omnidb
            virtual_hosts:
            - name: local_service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/wss"
                route:
                  prefix_rewrite: "/"
                  cluster: omnidb_ws
              - match:
                  prefix: "/ws"
                route:
                  prefix_rewrite: "/"
                  cluster: omnidb_ws
              - match:
                  prefix: "/"
                route:
                  cluster: omnidb


  clusters:
  - name: omnidb
    connect_timeout: 30s
    dns_lookup_family: V4_ONLY
    load_assignment:
      cluster_name: omnidb
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.1
                port_value: 8080
  - name: omnidb_ws
    connect_timeout: 0.25s
    dns_lookup_family: V4_ONLY
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
    load_assignment:
      cluster_name: omnidb_ws
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.1
                port_value: 26000

Затем curl localhost:8443/wss или curl localhost:8443/wss/ показывают, что они попадают на ваш адрес 26000.

[2021-02-22T15:57:22.818Z] "GET /wss/ HTTP/1.1" 503 UF 0 91 3 - "-" "curl/7.68.0" "806c2c28-4ab4-4069-acf1-15b75405d390" "localhost:8443" "10.0.0.1:26000"
[2021-02-22T15:57:27.287Z] "GET /wss HTTP/1.1" 503 UF 0 91 3 - "-" "curl/7.68.0" "55d32a64-c9f7-46cc-8f5e-4a024c0de00d" "localhost:8443" "10.0.0.1:26000"
person justincely    schedule 22.02.2021
comment
Спасибо за вашу помощь! /wss вместо /wss/ имеет смысл :) Я пробовал, но все равно не работает. Однако перенаправление, похоже, работает, как в журнале посланников, который я видел 10.0.0.1:26000, так что это может быть что-то еще ... В любом случае я, вероятно, перейду на omnidb v3, который из того, что я видел, больше не веб-сокет - person cylon86; 23.02.2021
comment
нет проблем, рад, что смог помочь. Просто чтобы подтвердить, что вы использовали правила маршрутизации сверху, а не всю конфигурацию, верно? Я изменил некоторые другие вещи для моей локальной настройки, что сломало бы то, что вам нужно. - person justincely; 23.02.2021
comment
Да, я проехал только по маршруту, попробую еще раз, когда у меня будет время - person cylon86; 23.02.2021
comment
а, ну ладно. удачи! - person justincely; 24.02.2021