2

我有一个网站:

xyz.com -> 独立 Angular4 APP(容器)

xyz.com/api/ -> 独立 Rails API APP(容器 - ruby​​-2.4.0)

xyz.com/api/sidekiq -> 安装到 Rails api 路由。

当我尝试访问 /api/sidekiq 时,它会加载数据,但资产仍指向 xyz.com/sidekiq 而不是 xyz.com/api/sidekiq。当我点击重试时,它会尝试提交到 xyz.com/sidekiq 而不是 xyz.com/api/sidekiq。有没有办法强制 sidekiq 使用不同的资产路径和基本 url 路径?

有没有办法将 sidekiq Web 视图作为单独的独立应用程序容器?

我使用 Kubernetes 作为我的编排工具。我正在使用 Nginx Ingress 进行基于路径的路由。当我转到 xyz.com/api/sidekiq 时,它会加载数据,但 url 和资产指向 xyz.com/sidekiq,这就是为什么我无法重试 sidekiq 工作,因为 sidekiq 网络不起作用。

4

1 回答 1

1

您可以查看我与 sidekiq 团队提出的主题“ Sidekiq Route Mount 不会在 Rails API 中重写 URL ”,这有助于我了解 sidekiq 的mount "/sidekiq"工作原理。

我对这个问题有一个简单的解决方法,发现它是解决基于路径的路由问题的最佳方法。您可以nginx.ingress.kubernetes.io/rewrite-target通过编写 2 个 Ingress 规则来使用 Ingress 配置中的注释来执行此操作,如下所示:

  1. 将“ /xyz.com/* -> rails-app-service/* ”路径路由到 rails-app-service ( )的根路径

  2. 将“ /sidekiq ”路径路由到 rails-app-service ( xyz.com/sidekiq/* -> rails-app-service/sidekiq/*)的 sidekiq Web 安装路径

要了解有关 Nginx Ingress Controller 重写目标注释的更多信息,请查看官方存储库以获取详细信息:https ://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/rewrite#rewrite-target

这是我的最终代码片段和解决方案:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "rails-app-ingress"
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: xyz.com
    http:
      paths:
      - path: /
        backend:
          serviceName: "rails-app-service"
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "rails-sidekiq-ingress"
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /sidekiq
spec:
  rules:
  - host: xyz.com
    http:
      paths: 
      - path: /sidekiq
        backend:
          serviceName: "rails-app-service"
          servicePort: 80
于 2019-03-05T14:21:25.693 回答