gpt4 book ai didi

ruby-on-rails - 在单个服务器上托管多个 Rails 服务 + "api enabled"网站的架构

转载 作者:行者123 更新时间:2023-12-04 15:47:25 25 4
gpt4 key购买 nike

我刚刚读完 Paul Dix 的《Service-Oriented Design with RoR》一书,我想根据我刚刚学到的知识创建一个 Rails 3 Web 应用程序。

我想我的基本架构是正确的,但一个简单的问题有点阻碍了我:我应该如何在同一台服务器上托管多个 REST 服务?

以下是我目前的看法:

  • 创建基于 Sinatra(我猜)的 *Service 应用程序(UserService、XYZFeatureService 等),提供 REST 端点来访问资源
  • 有一个带有 Controller / View /...的前端 Rails 应用程序,它使用来自不同服务的数据。最终用户将通过 http://www.myapp.com 访问它例如。
  • 最后有一个独立的“API”应用程序来处理对 https://api.myapp.com/* 的调用或 https://www.myapp.com/api/*发布一个外部 API,该 API 将使用相同的服务,并在其上进行可能的身份验证、限制等。

  • 这对你来说是一个好的开始吗?

    就实现而言,根据我在书中读到的内容,我计划创建 gems 来处理 Rails 应用程序和服务之间的通信(我可能会加入一些 RabbitMQ,但那是另一回事了)。

    但是,由于我只有一台物理服务器,我想知道如何让所有这些应用程序/服务一起运行?
    我的第一个猜测是在 localhost:xxxx 上启动每个服务应用程序,其中 xxxx 是每个服务的不同非特权端口。我可以在 Rails 应用程序中配置每个客户端 gem 以使用这些端口。

    除此之外,我可能会运行 Apache 2 +Passenger 来为我的 Rails 前端和 API 服务提供服务,使用 Rack::URLMap 之类的东西(或虚拟主机,如果使用子域)将请求定向到正确的应用程序。
    那么我是否也应该使用Passenger 在生产环境中运行我的服务?

    这是正确的方法吗?!感觉与我阅读和学习的内容一致,如果需要,也可以轻松拆分为多个物理服务器,但我想确保我没有遗漏任何东西。你会以不同的方式 build 东西吗?

    非常感谢您的意见!

    更新

    我希望看到回答的主要问题是:
  • 所描述的架构是否适合构建具有外部 API 端点的 Web 应用程序?
  • 在不同端口的单个服务器上运行服务是否可以?

  • 谢谢!

    最佳答案

    我使用 Apache-Passenger 组合和脚本(见下文),但我阅读了很多关于在 Nginx 负载平衡器后面插入 Node.JS 的基准测试——至少在提供 web 服务 API 方面,这可能是有意义的。

    我的脚本是:

    def build_a_new_oxenserver()
    site = siteurl.gsub(/\./,"_")
    system( "rake add_site['#{siteurl}','#{site}','#{id}']") if Rails.env.production?
    default_tmpl = open(File.expand_path(Rails.root + "public/default_template.html")).read
    tmpl = Template.create(:ox_id=>id, :name=>"first template", :content=>default_tmpl)
    pg=Page.create( :ox_id=>id, :language_id=>1, :template_id=>tmpl.id, :title=>"Home", :menu_label=>"Zu Hause", :ancestry=>nil, :root=>true)

    # add the Paragraph element to this ox's toolbox
    self.elements << Element.find(1)

    # add an Article, a Paragraph, and a Post
    pe = PageElement.create( :element_id => Element.find(1) )
    pe.elementable = Paragraph.create(:content=>"This is written *in bold* -")
    pe.save
    pg.page_elements << pe


    end

    add_site rake 在生产服务器上执行远程工作 - 创建必要的文件夹、配置文件和链接脚本以运行新的“实例”。通过这种方式,我可以扩展我的服务,并且只需付出一点努力,我还可以扩展负载平衡功能。

    请注意此解决方案是“共享源”版本

    rake 脚本如下所示:
    #
    # rake add_site["www.domain.tld", "www_domain_tld", 131]
    desc "Task for adding new oxenserver site"
    task :add_site, :domain, :site, :ox_id do |t, args|
    service_path = /data/www/html/app_service
    site_string = %{
    <VirtualHost *:80>
    ServerName #{args[:domain]}
    DocumentRoot #{service_path}/sites/#{args[:site]}/public
    PassengerAppRoot #{service_path}/sites/#{args[:site]}
    SetEnv OX_ID #{args[:ox_id]}
    <Directory #{service_path}/sites/#{args[:site]}/public>
    AllowOverride all
    Options -MultiViews
    </Directory>
    </VirtualHost>
    }
    File.open("tmp/#{args[:site]}.conf", "w") do |f|
    f.write site_string
    end

    site_start = %{
    mv #{service_path}/current/tmp/#{args[:site]}.conf /data/apache/conf.d/#{args[:site]}.conf
    service httpd restart
    }

    File.open("tmp/#{args[:site]}.sh", "w") do |f|
    f.write site_start
    end

    #
    sites_dir = "#{service_path}/sites/#{args[:site]}"
    shared_sites_dir = "#{service_path}/shared/sites/#{args[:site]}"
    shared_oxen_dir = "#{service_path}/shared/sites/oxen"
    current = "#{service_path}/current"


    # prepare system files/directories
    system "mkdir #{sites_dir} #{shared_sites_dir} #{shared_sites_dir}/public"
    system "cd #{sites_dir} && cp -rus #{current}/* ."
    system "cd #{shared_sites_dir}/public && cp -r #{shared_oxen_dir}/public/* ."
    system "cd #{shared_sites_dir} && mkdir log tmp && cd #{sites_dir} && rm -rf public log tmp && ln -s #{shared_sites_dir}/public public && ln -s #{shared_sites_dir}/log log && ln -s #{shared_sites_dir}/tmp tmp"
    system "cd #{sites_dir} && touch tmp/restart.txt log/production.log"
    system "mv tmp/#{args[:site]}.sh public/system/job_queue/#{args[:site]}.sh"
    end

    关于ruby-on-rails - 在单个服务器上托管多个 Rails 服务 + "api enabled"网站的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8606342/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com