Multitenancy Passenger Rails 多个应用程序不同版本同一域

Multitenancy Passenger Rails Multiple Apps Different Versions Same Domain

我已经在 Rails 上学习 Ruby 一个多月了。我已经将一个应用程序部署到生产 VPS 并且总体上对 Ruby/Rails 感到满意。我现在正在尝试学习和构建最新 Rails 版本之一的应用程序。由于 Ruby/Rails 的多个版本在 Rails 开发人员中是一个普遍的概念,我想我应该尝试使用不同版本的代码并在生产环境中维护这些应用程序。

从我的谷歌搜索和 Whosebug 搜索看来,我尝试做的事情并不常见。但是,它构成了我想要在我的服务器上 do/learn 关于 Rails 和 Passenger/Apache 的所有内容的基础(基于上述目标)。也就是说,在同一个域名下托管多个 Rails 应用程序,一些是相同的 ruby/rails 版本,而另一些是不同的版本。所以:

mywebsite.com <--- Ruby 2.3.4 / Rails 4.2.5

我的网站。com/profile <--- 一个单独的应用程序:Ruby 2.3.4 / Rails 4.2.5

mywebsite.com/cool-app <--- 使用最新最强大功能的独立应用程序:Ruby 2.5.0 / Rails 5.1.4

当我在 Whosebug 中搜索 "multitenancy rails passenger" 时,恰好有 0 个结果。还有这个link: https://www.phusionpassenger.com/library/deploy/apache/

其中有一篇名为 "Deploying multiple apps on a single server (multitenancy)" 的文章,但它还不存在并说:"to-do"!我一直试图通过它跌跌撞撞,但似乎有太多我不明白只是复制和粘贴别人的代码并让它工作。

似乎让这些东西工作的部分技巧是使用不同的 VirtualHost 设置。

以下是我对上述应用程序的尝试:

mywebsite.com(主站点):

<VirtualHost *:80>
  ServerName mywebsite.com

  # Tell Apache and Passenger where your app's 'public' directory is
  DocumentRoot /var/www/login_app/code/public

  PassengerRuby /usr/local/rvm/gems/ruby-2.3.4/wrappers/ruby

  # Relax Apache security settings
  <Directory /var/www/login_app/code/public>
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
  </Directory>

  <Directory /var/www/login_app/code/public/profile>
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
  </Directory>

  PassengerBaseURI /profile

</VirtualHost>

mywebsite.com/profile(与主站点相同的 Ruby/Rails 版本)

<VirtualHost *:80>
  ServerName mywebsite.com

  # Tell Apache and Passenger where your app's 'public' directory is
  DocumentRoot /var/www/test_app/code/public

  PassengerAppRoot /var/www/test_app/code
  PassengerRuby /usr/local/rvm/gems/ruby-2.3.4/wrappers/ruby
  # PassengerBaseURI /profile

  # Relax Apache security settings
  <Directory /var/www/test_app/code/public>
    PassengerEnabled on
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
  </Directory>
</VirtualHost>

还没有尝试为第三个应用程序创建 VirtualHost 文件。我假设 PassengerRuby 字段会告诉 Passenger 使用 correct/different Ruby 解释器。但同样,我找不到任何人做这件事,尤其是我找不到对正在做的事情的任何解释。当我发现一些非常接近的东西时,它是 6 年前的,代码已经过时,因为据说 Passenger 现在可以很容易地处理这个问题(但是例子在哪里?!)。

当我访问 mywebsite.com/profile 时,主站点应用程序似乎仍在处理路由,因为它记录到 main_site_path/log/production.log(不是第二个应用程序的日志)。

如有任何帮助,我们将不胜感激,但由于我知道我应该具体一些,所以这里有一些可能对我有所帮助的具体信息?: 当我做 passenger-memory-stats 时,每个应用程序应该有一个 Passenger 进程 运行,还是只有主要的一个?
我如何正确定义我的主域之外的 /profile 应该由不同的 Rails 应用程序(不同的 VirtualHost,如果适用)处理?

谢谢。

ZOMG 成功了!非常感谢 tadman 建议我使用 Nginx 作为反向代理服务器。也就是说,一个 Nginx 为每个应用程序提供单独的 Apache 进程。我可以转到 mywebsite.com 并获取主应用程序。我转到 mywebsite.com/subapp 并获取我的第二个应用程序(与主应用程序相同的 Ruby/Rails 版本)。我可以转到 mywebsite.com/mea 并获得第三个应用程序(与前两个应用程序具有不同的 Ruby 和 Rails 版本!)。

这部分是可能的,因为两者 Nginx and Apache 都有一个可以安装的 Passenger 组件,为您提供各种指令,您可以使用它们来指定每个 url 应该提供哪种应用程序(passenger_ruby 让你告诉 Nginx 使用哪个 ruby 解释器)。我从未见过像 Phusion 网站上那样全面和精美的文档。

解决这个问题很有趣。这是我的设置,以便您可以看到我做了什么。如果有任何我可以做得更好的地方,请告诉我。

Nginx 配置: /etc/nginx/sites-enabled/apache

server {
    listen 80;
    server_name mywebsite.com www.mywebsite.com;

    passenger_enabled on;

    location / {
        passenger_ruby /usr/local/rvm/gems/ruby-2.3.4/wrappers/ruby;
        proxy_pass http://my_website_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /subapp {
        passenger_ruby /usr/local/rvm/gems/ruby-2.3.4/wrappers/ruby;
        proxy_pass http://my_website_ip:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /mea {
        passenger_ruby /usr/local/rvm/gems/ruby-2.5.0/wrappers/ruby;
        proxy_pass http://my_website_ip:8082;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

我的 Ports 文件侦听 Nginx 服务的端口:

/etc/apache2/ports.conf

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 8080
Listen 8081
Listen 8082

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

我的 Apache VirtualHost 定义。

/etc/apache2/sites-enabled/login_app.conf

<VirtualHost *:8080>
  ServerName mywebsite.com

  # Tell Apache and Passenger where your app's 'public' directory is
  DocumentRoot /var/www/login_app/code/public

  PassengerRuby /usr/local/rvm/gems/ruby-2.3.4/wrappers/ruby

  # Relax Apache security settings
  <Directory /var/www/login_app/code/public>
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
  </Directory>

</VirtualHost>

<VirtualHost *:8081>
  ServerName mywebsite.com

  # Tell Apache and Passenger where your app's 'public' directory is
  DocumentRoot /var/www/second_app/code/public

  PassengerRuby /usr/local/rvm/gems/ruby-2.3.4/wrappers/ruby

  # Adding a subapp to the base url
  Alias /subapp /var/www/second_app/code/public
  <Location /subapp>
      PassengerBaseURI /subapp
      PassengerAppRoot /var/www/second_app/code
  </Location>

  # Relax Apache security settings
  <Directory /var/www/second_app/code/public>
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:8082>
  ServerName mywebsite.com

  # Tell Apache and Passenger where your app's 'public' directory is
  DocumentRoot /var/www/third_app/code/public

  PassengerRuby /usr/local/rvm/gems/ruby-2.5.0/wrappers/ruby

  # Adding a subapp to the base url
  Alias /mea /var/www/third_app/code/public
  <Location /mea>
      PassengerBaseURI /mea
      PassengerAppRoot /var/www/third_app/code
  </Location>

  # Relax Apache security settings
  <Directory /var/www/third_app/code/public>
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
  </Directory>
</VirtualHost>

以及从命令行生成的进程:passenger-memory-stats

Version: 5.2.0
Date   : 2018-02-09 03:22:39 +0000

--------- Apache processes ----------
PID    PPID  VMSize    Private  Name
-------------------------------------
             148.9 MB  0.4 MB   /usr/sbin/apache2 -k start
             813.3 MB  3.1 MB   /usr/sbin/apache2 -k start
             557.3 MB  3.2 MB   /usr/sbin/apache2 -k start
### Processes: 3
### Total private dirty RSS: 6.74 MB


---------- Nginx processes -----------
PID    PPID   VMSize    Private  Name
--------------------------------------
              174.8 MB  0.7 MB   nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
              174.8 MB  0.8 MB   nginx: worker process
### Processes: 2
### Total private dirty RSS: 1.57 MB


----- Passenger processes -----
PID    VMSize    Private  Name
-------------------------------
       379.5 MB  4.7 MB   Passenger watchdog
       666.2 MB  7.1 MB   Passenger core
       378.9 MB  4.2 MB   Passenger watchdog
       662.5 MB  5.5 MB   Passenger core
       318.0 MB  63.0 MB  Passenger RubyApp: /var/www/login_app/code (production)
       314.5 MB  60.3 MB  Passenger RubyApp: /var/www/third_app/code (production)
       315.7 MB  61.4 MB  Passenger RubyApp: /var/www/second_app/code (production)
### Processes: 7
### Total private dirty RSS: 206.14 MB