我能够成功配置 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 应用程序提供服务。
答案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
参考:文章