一个用于多个域名的rails应用程序【JAVA教程】

!
也想出现在这里? 联系我们
信息

一个用于多个域名的rails应用程序,第1张

概述一个用于多个域名的rails应用程序

我有一个需要由乘客模块Nginx部署的rails应用程序。 这个应用程序需要为上百个域名服务。 我没有足够的内存来启动一百个rails实例。 我不确定在less数情况下启动rails的正确方法。 这是不同的域名下的同一个应用程序。

server { Listen 80; server_name www.a_domain.com; root /webapps/mycook/public; passenger_enabled on; } server { Listen 80; server_name www.b_domain.com; root /webapps/mycook/public; passenger_enabled on; } server { Listen 80; server_name www.c_domain.com; root /webapps/mycook/public; passenger_enabled on; }

就像上面的代码一样,它会启动三个rails实例。 只有在这三个域下才能启动实例才可以。 任何人有一些build议?

如何使用rails,Nginx和passengerconfiguration`Access-Control-Allow-Origin`?

乘客列出所有文件,而不是运行我的Rails应用程序

我怎样才能强制redirecthttp请求到https与客运独立与awsd性负载平衡器?

检测Rails是否正在运行一个站点

Nginx:欢迎来到Nginx! 页面不断显示

只需为该服务器条目设置多个域别名即可。

server { Listen 80; server_name www.a_domain.com www.b_domain.com www.c_domain.com; root /webapps/mycook/public; passenger_enabled on; }

这将服务于每个这些域的请求,并且全部都在相同的应用程序池中。

我在Chris的回答中提到你可以在server_name中使用通配符和正则表达式,这些将会传递给你的rails实例。

server_name *; # handle requests from all domains

有四种方法可以在Rails应用程序中使用(我知道)。

“大包装”的方法

没做什么

如果你让Nginx把所有的域发送到同一个Rails应用程序,它们都会得到相同的内容。 在这种情况下,www.abc.com和www.xyz.com可以访问相同的数据。 这是最容易做的,因为你什么都不做。

这个解决方案的局限性是当你想让域名有不同的内容。 例如,如果www.abc.com/about和www.xyz.com/about被认为是不同的页面,那就变得棘手。

“窗帘后面的人”的方法

使用Nginx的“重写”

在某些情况下,你可以让Nginx把域名重写成一个子域名,并把它传递给你的Rails应用程序。 例如:

server_name *; # handle requests from all domains rewrite ^(?:www.)?([^.]*)..*$ $1.yourdomain.com last;

那个正则表达式需要一点解释。 它只是说,只要从这些xyz:www.xyz.com,xyz.com,xzy.co.uk,www.xyz.co.uk. 重写将这些请求中的任何一个更改为xyz.yourdomain.com。

这样做的好处是Nginx很快就做到了这一点,Rails应用程序直到后来才涉及到,并且请求的内容可以限制在子域。 Page.where(subdomain: request.subdomain,permalink: params[:permalink]) 。

不过,这是相当严格的,因为这意味着子域和域名必须是相同的。 也许这是你的应用程序的问题,也许不是。 但是,尽管我在子域中使用$1 ,但您可以轻松地将其作为参数插入到url中。 例如, yourdomain.com/$1会将来自www.xyz.com的请求重写到yourdomain.com/xyz。

另一个问题是“幕后的男人”。 虽然用户访问www.xyz.com重写意味着他们会在地址栏中看到xyz.yourdomain.com。

“Rails方法”

在ApplicationController中使用Rails请求对象

您可以使用您的应用程序控制器来使用Rails的request对象来限定与域名关联的内容。

在这个例子中,我们将使用ApplicationController来查找与域名关联的用户帐户。 假设您有一个具有domain_name属性的用户模型:

def domain_user @domain_user ||= User.where(domain_name: request.domain()).take end

如果额外的命中数据库创建了性能障碍,Redis可以用来缓存这些查找。 到目前为止,我的应用还没有达到这个水平。

这个解决方案的弱点是,虽然查找可能会发现www.xyz.com,它会错过xyz.com。 为了适应这个,我们可以使用一些正则表达式:

def domain_user request.domain.match /(?:www.)?(.*)/ @domain_user ||= User.where(domain_name: $1).take end

这个正则表达式去掉www。 如果它存在。 剩下的就成了域名(红宝石为我们存入$1 )。

与Nginx的重写解决方案不同,如果用户访问www.xyz.com,那么他们仍然在地址栏中看到。

使用路由约束

“不适合我”的方法

或者,Rails 3及以上版本有约束,你的路由文件中存在的功能半动态生成路由表。 我说“半动态”,因为路由表是在应用程序启动时生成的。 如果用户模型(在我们的例子中)发生变化,则需要特别注意重建路由表。 对于分布在多个服务器上的应用程序,虽然人们已经做到了 ,但这可能会变得很难管理。

到目前为止,我的所有应用程序最终(如果不是最初的话)都使用了ApplicationController解决方案,因为它实际上是最干净和最容易实现的。 从MCV的角度来看,这也很有意义。

总结

以上是内存溢出为你收集整理的一个用于多个域名的rails应用程序全部内容,希望文章能够帮你解决一个用于多个域名的rails应用程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞121 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容