Rails 应用程序中的自定义域

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

我希望我的服务的用户能够添加自己的自定义域。例如,

www.[their domain].com
应该能够访问其应用程序的索引和显示页面。我的服务是在 Rails 3 中实现的。

我见过像 Tumblr 这样的应用程序为其前端博客提供此功能。虽然我见过 Rails 应用程序以 Basecamp 的方式实现子域,但我还没有找到完全自定义域的资源。

ruby-on-rails ruby web-applications domain-name
2个回答
8
投票

他们需要在其 DNS 中创建 A 记录以指向您的应用服务器 IP。您需要知道他们指向您的服务器的域并将其记录到他们的帐户中,还需要设置您的 Web 服务器配置,以便将来自其他域的请求引导到您的应用程序。然后,您可以使用请求对象在您的 application_controller 中查找他们的帐户。


2
投票

我刚刚回答了类似的问题,所以我也决定在这里插话。 @Codebeef 给出了一个很好的答案,但在大多数现代浏览器必须使用 HTTPS 的世界中,这将不再有效。

这是如何处理应用程序的自定义域的完整图片。

如果您的客户只是对您的域进行 CNAME 或为您的 IP 创建 A 记录,并且您不处理这些自定义域的 TLS 终止,则您的应用程序将不支持 HTTPS,如果没有它,您的应用程序将无法在现代浏览器中运行在这些自定义域上。

您需要在网络服务器前面设置 TLS 终止反向代理。该代理可以在单独的计算机上运行,但您可以在与网络服务器相同的计算机上运行它。

CNAME 与 A 记录

如果您的客户希望将您的应用程序放在他们的子域上,例如

app.customer.com
他们可以创建一个 CNAME
app.customer.com
指向您的代理。

如果他们希望将您的应用程序放在他们的根域上,例如

customer.com
那么他们必须在
customer.com
上创建一条指向您代理 IP 的 A 记录。确保此 IP 永远不会改变!

如何处理 TLS 终止?

要使 TLS 终止发挥作用,您必须为这些自定义域颁发 TLS 证书。您可以使用 Let's Encrypt 来实现这一点。您的代理将看到传入请求的

Host
标头,例如
app.customer1.com
customer2.com
等,然后它会通过检查SNI来决定使用哪个TLS证书。

代理可以设置为自动为这些自定义域颁发和续订证书。在来自新自定义域的第一个请求时,代理将发现它没有适当的证书。它会要求 Let's Encrypt 提供新证书。 Let's Encrypt 首先会发出一个质询,看看您是否管理该域,并且由于客户已经创建了指向您的代理的 CNAME 或 A 记录,这告诉 Let's Encrypt 您确实管理该域,并且它会让您为它。

要自动颁发和续订证书,我建议使用 Caddyserver、greenlock.js、OpenResty (Nginx)。

tl;博士关于这里发生的事情; Caddyserver 侦听 443 和 80,它自动接收请求、颁发和续订证书,将流量代理到您的后端。

如何在我的后端处理它

您的代理正在终止 TLS 并代理对后端的请求。但是,您的后端不知道请求背后的原始客户是谁。这就是为什么您需要告诉代理在代理请求中包含附加标头以识别客户。只需添加

X-Serve-For: app.customer.com
X-Serve-For: customer2.com
或原始请求的
Host
标头即可。

现在,当您在后端收到代理请求时,您可以读取此自定义标头,并且知道谁是请求背后的客户。您可以基于此实现您的逻辑,显示属于该客户的数据等。

更多

将负载均衡器放在代理队列前面,以获得更高的可用性。您还必须使用分布式存储来存储证书和 Let's Encrypt 挑战。如果发生故障,请使用 AWS ECS 或 EBS 进行自动恢复,否则,您可能会在半夜醒来手动重新启动机器或代理。

还有像this这样的服务可以为您处理证书管理基础设施。

如果您需要更多详细信息,可以在 Twitter 上私信我@dragocrnjac

© www.soinside.com 2019 - 2024. All rights reserved.