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

jq6vz3qz  于 2023-04-29  发布在  Kubernetes
关注(0)|答案(1)|浏览(159)

我的代码:https://github.com/nullset2/smbdxfortunes
嗨。我的设置如下:

  1. Sinatra应用程序
  2. Ruby 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.设置set :base_path, '/smbdxfortunes'在我的财富。rb sinatra模块。
    1.在我的财富中设置set :static, true。卢布
    1.修改从索引中读取资产的实际路径。html来说明子目录(e.g. img/vine.png变为/smbdxfortunes/img/vine。png)
    1.像这样设置config.ru,并将我的dockerfile中的CMD语句更改为使用rackup:
require './fortune'
use Rack::Static, :urls => ['/css', '/js', '/img', '/wav'], :root => 'public'
run Sinatra::Application

任何帮助都很感激。

hjzp0vay

hjzp0vay1#

这不是一个答案,而是一个解决方案:我设法解决了这个问题,方法是将我的/和/smbdxfortunes路由指向同一个服务,所以所有对静态资产的请求都转到sinatra public子目录,否则对根目录的请求返回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}

相关问题