Sinatra On Kubernetes - 将应用程序移动到子目录,应用程序资产无法在生产中呈现 (404) 但在本地工作

问题描述 投票:0回答:1

我的代码:https://github.com/nullset2/smbdxfortunes

嗨。我的设置如下:

  1. Sinatra 应用程序
  2. 红宝石 2.7
  3. Kubernetes 1.17
  4. Traefik Ingress 作为“反向代理”

我最初让这个应用程序在我的服务器的根目录上运行良好:

nullset2.zapto.org
(通过 DDNS 解析到我的路由器的 IP),现在我希望移动这个应用程序以便它从
nullset2.zapto.org/smbdxfortunes
.

我的 sinatra 应用程序使用资产和静态文件应该位于

./public
子目录中的约定,从那里它读取一个小的登陆页面并监听对另一个路由的请求,进行一个小的查询并返回一个 erb 文件。

我已经配置了 Ingress,因此它根据路由解析为正确的应用程序,并重写了应用程序代码,以便它监听

/smbdxfortunes
路由。出于某种原因,该应用程序将在本地完美运行,并从
public/index.html
呈现包含所有资产的页面——但是当我将其容器化并将其部署在我的 kubernetes 集群上时,该应用程序将运行但
public/index.html
中引用的所有静态文件将返回 HTTP 400。网站本身将被呈现,但所有损坏的图像和没有样式。

我试过无济于事的事情:

  1. 在我的fortune.rb sinatra模块中设置
    set :base_path, '/smbdxfortunes'
  2. 设置
    set :static, true
    在我的fortune.rb.
  3. 修改在我的 index.html 中读取资产的实际路径以说明子目录(例如 img/vine.png 变为 /smbdxfortunes/img/vine.png)
  4. 像这样设置
    config.ru
    并更改我的dockerfile中的
    CMD
    语句以使用rackup:
require './fortune'
use Rack::Static, :urls => ['/css', '/js', '/img', '/wav'], :root => 'public'
run Sinatra::Application

任何帮助表示赞赏。

ruby kubernetes sinatra rack
1个回答
0
投票

本身不是答案,而是解决方法:我设法通过将入口上的 / 和 /smbdxfortunes 路由指向同一个服务来解决这个问题,因此对静态资产的所有请求都转到 sinatra 公共子目录,并且向根请求否则返回 404.

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nullset2-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
    cert-manager.io/cluster-issuer: letsencrypt-prod
    traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
    traefik.frontend.rule.type: PathPrefix
spec:
  rules:
  - http:
      paths:
        - path: /
        backend:
          serviceName: smbdxfortunes
          servicePort: 80
      - path: /smbdxfortunes
        backend:
          serviceName: smbdxfortunes
          servicePort: 80
      - path: /pixy
        backend:
          serviceName: pixy
          servicePort: 80
  tls:
    - secretName: nullset2-tls
      hosts:
        - ${DOMAIN}
© www.soinside.com 2019 - 2024. All rights reserved.