【问题标题】:Single server instance for multiple Ruby (rails/sinatra) applications多个 Ruby (rails/sinatra) 应用程序的单个服务器实例
【发布时间】:2013-08-20 14:02:47
【问题描述】:

PHP 中,我可以有一个 php-fpm 实例来服务多个站点。我的 nginx 配置看起来像这样:

upstream backend 
{
  server 127.0.0.1:9000;
}

# site 1
server 
{
  server_name www.site1.com;
  root /var/www/site1;

  location ~ \.php$ 
  {
    include fastcgi_params;
    fastcgi_pass backend;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}


# site 2
server 
{
  server_name www.site2.com;
  root /var/www/site2;

  location ~ \.php$ 
  {
    include fastcgi_params;
    fastcgi_pass backend;     # still the same backend
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

我在 Ruby 世界中看到的是,对于每个应用程序,都会启动一个单独的独立服务器,该服务器侦听特定端口,并且只能处理对该应用程序的请求。所以我想知道,是否有可能对 Ruby 应用程序采用与上述 PHP 相同的方法。

我知道这对于高流量网站可能不是一个好主意,但我实际上是在处理流量非常低的网站,而且我的 VPS 有有限的 RAM.

【问题讨论】:

    标签: ruby-on-rails ruby nginx rack


    【解决方案1】:

    恐怕不会。 Rails 的运行时模型与 php 有点不同。使用 php,一切都被加载并执行,然后再次被删除。每个请求之间没有共享任何内容。这意味着同一个进程可以为来自完全不同的应用程序的请求提供服务。在 Rails(或 Sinatra)设置中,有一个应用程序进程正在运行,它响应请求。这个过程启动起来比较繁重,因此为每个请求设置和拆除是不可行的。结果是您需要接受这些进程即使在它们不工作时也会挂在系统资源上。

    【讨论】:

      【解决方案2】:

      是的,可以使用 fpm,转到 /etc/php5/fpm/pool.d,您会找到 www.conf,将其复制到一个新文件,例如 site2.conf,然后您需要更改两件事,首先是池名称,您会在[name]之间找到它,然后是listen命令,你会在9000上找到它,比如把它改成9001,或者你可以做一个sock文件,我通常更喜欢这种方法,然后保存文件并重启服务,就这样了,我也建议你看看文件的其余部分,它有一些很有趣的功能。

      我个人在我的 VPS 上使用了这个配置一段时间,多个池没有什么好处,我为每个域/子域/网站配置了一个池,每个都可以有它的配置,比如 runner 用户名(免去了我的权限问题对于由 www 或 php 或其他东西拥有的日志和缓存文件),还可以根据流量配置每个有多少等待服务的孩子,初始数量的孩子和最大数量,对我来说也很容易看到哪个网站正在吃top 中的资源,因为我会查看该进程的所有者用户。

      【讨论】:

      • 其实问题是关于 Ruby 而不是 PHP
      • 好吧,我当时误会了,我以为你想要多个服务器用于 php,所以你想要一个 ruby​​ 服务器实例用于多个 ruby​​ 网站?
      • 是的,这就是我想要的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2023-03-07
      相关资源
      最近更新 更多