使用 nginx 在同一域的不同子 URI 下运行多个 Rails 应用程序

使用 nginx 在同一域的不同子 URI 下运行多个 Rails 应用程序

我能够成功配置 nginx 和 Passenger Phusion。我现在有以下配置

server {listen 80  server_name **sub1.example.com** root /home/user/app1/public }    
server {listen 80  server_name **sub2.example.com** root /home/user/app2/public }

现在,我想将其更改为以下配置

server {listen 80  server_name **dev.example.com/example1** root /home/user/app1/public }
server {listen 80  server_name **dev.example.com/example2** root /home/user/app2/public }

我尝试使用 location 指令,但没有成功。我甚至不确定这是否可行。任何帮助都将不胜感激。谢谢。

以下是我的 nginx.conf 设置

server {
   listen 80;
   server_name dev.example.com;

location = /app1/ {
   root /home/rails/app1/public/; 

   passenger_enabled on;
   rails_env development;
}
location /app2/ {
   root /home/rails/app2/public/; 
   passenger_enabled on;
   rails_env development;
}
}

答案1

上一个答案:

 server_name dev.example.com/example1 

是错误的。我理解您希望 dev.example.com 转到 dev.example.com/example1。对于这种情况,您需要像下面这样进行 URL 重写

location = / { rewrite ^ http://dev.example.com/example1 ; }

评论后回答:

从您的评论中我了解到您想要在同一个 URI/域中提供多个 rails 应用程序。

server {
    listen 80;
    server_name dev.example.com;
    root /home/user/app1/public;
    passenger_enabled on;
    passenger_base_uri /app2;
    passenger_base_uri /app3;
    ....truncated...
    rails_spawn_method smart;
    rails_env production;
}

答案2

这可以通过使用 Passenger Phusion 的passenger_base_uri指令来实现。假设我的域名是www.example.com

现在我想为以下 URI 运行多个 rails 应用程序

www.example.com - 加载 Rails App1

www.example.com/app2- 加载 Rails App2

这就是我的 nginx.conf 中的服务器块的样子:

server {
      listen 80;
      server_name  www.example.com;
      root /var/www/app1/public;   
      passenger_enabled on;
      passenger_base_uri /app2;
}

查看根目录如何指向 app1 的公共文件夹。并查看指令passenger_base_uri

现在我们需要执行最后一步 - 将 app2 的公共文件夹符号链接到/var/www/app1/public/app2,这是通过运行以下命令完成的:

ln -s /var/www/app2/public /var/www/app1/public/app2

创建此链接后,重新启动 nginx,即可在同一个域上为不同的 Rails 应用程序提供服务。

参考: 将 Passenger Phusion 部署到子 URI

答案3

这里有比接受的答案更好的方法。无需对文件夹进行符号链接。

将应用程序部署到子 URI 或子目录

您还可以将应用部署到子 URI,而不是根 URI。例如,假设您已经为应用程序 /websites/phusion 建立了一个虚拟主机:

http {
    ...

    server {
        listen 80;
        server_name www.phusion.nl;
        root /websites/phusion/public;
        passenger_enabled on;
    }
}

您希望位于 /websites/secondapp 的应用程序可以通过以下 URL 访问http://www.phusion.nl/subpath。为此,您需要执行以下操作:

  • 创建一个带参数的位置~ ^/<SUBURI>(/.*|$)。这是一个正则表达式,表示:“匹配所有内容,包括完全匹配的内容,或以 / 开头的内容”。
  • 在位置块内,设置别名<PATH TO YOUR APPLICATION PUBLIC SUBDIRECTORY>$1
  • 在位置块内,设置passenger_base_uri <SUBURI>
  • 在位置块内,设置passenger_app_root <PATH TO YOUR APPLICATION ROOT>
  • 在 location 块中,设置 passage_document_root <PATH TO YOUR APPLICATIOS PUBLIC SUBDIRECTORY>。在 location 块中,相应地设置 app_type 和 startup_file 。以下是示例:

    http {
    ...
    
    server {
        listen 80;
        server_name www.phusion.nl;
        root /websites/phusion/public;
        passenger_enabled on;
    
        # This block has been added.
            location ~ ^/subpath(/.*|$) {
                alias /websites/secondapp/public$1;  # <-- be sure to point to 'public'!
                passenger_base_uri /subpath;
                passenger_app_root /websites/secondapp;
                passenger_document_root /websites/secondapp/public;
                passenger_enabled on;
    
            }
        }
    }
    

完成后,重新启动 Nginx。如果您通过我们的 Debian 或 RPM 包安装了 Nginx:

sudo service nginx restart

参考:文章

相关内容