我的代码:https://github.com/nullset2/smbdxfortunes
嗨。我的设置如下:
我最初让这个应用程序在我的服务器的根目录上运行良好:
nullset2.zapto.org
(通过 DDNS 解析到我的路由器的 IP),现在我希望移动这个应用程序以便它从 nullset2.zapto.org/smbdxfortunes
.
我的 sinatra 应用程序使用资产和静态文件应该位于
./public
子目录中的约定,从那里它读取一个小的登陆页面并监听对另一个路由的请求,进行一个小的查询并返回一个 erb 文件。
我已经配置了 Ingress,因此它根据路由解析为正确的应用程序,并重写了应用程序代码,以便它监听
/smbdxfortunes
路由。出于某种原因,该应用程序将在本地完美运行,并从 public/index.html
呈现包含所有资产的页面——但是当我将其容器化并将其部署在我的 kubernetes 集群上时,该应用程序将运行但 public/index.html
中引用的所有静态文件将返回 HTTP 400。网站本身将被呈现,但所有损坏的图像和没有样式。
我试过无济于事的事情:
set :base_path, '/smbdxfortunes'
set :static, true
在我的fortune.rb.config.ru
并更改我的dockerfile中的CMD
语句以使用rackup:require './fortune'
use Rack::Static, :urls => ['/css', '/js', '/img', '/wav'], :root => 'public'
run Sinatra::Application
任何帮助表示赞赏。
本身不是答案,而是解决方法:我设法通过将入口上的 / 和 /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}