如何在 nginx、passenger 和 redmine 中使用不同的 rails_env
Posted
技术标签:
【中文标题】如何在 nginx、passenger 和 redmine 中使用不同的 rails_env【英文标题】:How to use different rails_env with nginx, passenger and redmine 【发布时间】:2011-07-02 19:25:55 【问题描述】:我需要让 redmine 与 nginx、phusion 乘客和 mysql 结合运行。由于项目需要redmine的多个实例,应该使用不同的rails_env来实现,所以我尝试用nginx将它们设置在不同的服务器vhosts中。
一个虚拟主机的示例:
server
listen xxxx;
server_name redmine.xxxxx;
root /xxxxx/redmine/public;
passenger_enabled on;
rails_env production;
其他服务器虚拟主机也是如此,但 server_name 与其他域匹配,并且 rails_env 设置为 internal。
问题是,nginx 只对两个 redmine 实例使用两个 rails_env 之一,而不是每个实例一个。有什么建议如何在相同的应用程序、nginx 和 phusion 乘客中使用不同的 rails_env?
谢谢
【问题讨论】:
两个实例是否使用相同的 redmine 根目录? 好像是nginx vhost机制+passenger的bug…… 【参考方案1】:我认为您遇到了与我相同的问题。您想使用相同的物理目录来托管应用程序实例,但您想通过使用不同的 DNS 条目(redmine.development / redmine.production)与不同环境(开发/生产)下的应用程序交互???
问题在于乘客将传入请求识别为使用根目录上方目录中的 rails 应用程序。如果您在多个 nginx 配置中对 root 使用相同的文字引用,则乘客会将请求转发到在 root 中找到的单个运行实例。即,如果您先启动开发应用程序,然后尝试通过 redmine.production 访问生产环境,您最终将与开发环境进行交互。但是,如果您先启动生产应用程序,然后尝试访问 redmine.development,您最终会与生产环境进行交互。
答案是为您要运行的每个环境符号链接您的应用程序目录。乘客只查看到 root 的文字路径 - 如果它与当前正在运行的实例不匹配,它将生成一个新实例。
例如)
物理根为~/rails_apps/myserver
(其中myserver包含app、public等)
创建一个名为~/rails_apps/dev.myserver
到~/rails_apps/myserver
的符号链接,以及另一个名为~/rails_apps/pro.myserver
到~/rails_apps/myserver
的符号链接。
现在在您的 nginx 配置中,以 root 身份使用指向公共文件夹的符号链接位置。
例如,如果符号链接 /home/user/rails_apps/[dev|pro].redmine 指向 /home/user/rails_apps/redmine)
server
listen xxxx;
server_name redmine.development;
root /home/user/rails_apps/dev.redmine/public;
passenger_enabled on;
rails_env development;
server
listen xxxx;
server_name redmine.production;
root /home/user/rails_apps/pro.redmine/public;
passenger_enabled on;
rails_env production;
【讨论】:
对于查看此答案的任何人,您最终会遇到由于使用多个环境而发生冲突的资产问题。最好学习使用 Capistrano 进行部署。然而,这确实“解决了问题”关于 OP 的询问。【参考方案2】:nginx 乘客多次不遵循 .../app/public 目录的符号链接 因为它希望它是一个目录而不是文件 但是,您可以使用 PASSENGER_APP_GROUP_NAME 指令。 像这样:-
server
listen xxxx;
server_name redmine.xxxxx;
root /xxxxx/redmine/public;
passenger_enabled on;
rails_env production;
passenger_app_group_name devlopment;
server
listen xxxx;
server_name redmine.xxxxx;
root /xxxxx/redmine/public;
passenger_enabled on;
rails_env production;
passenger_app_group_name production
【讨论】:
以上是关于如何在 nginx、passenger 和 redmine 中使用不同的 rails_env的主要内容,如果未能解决你的问题,请参考以下文章
Rails + (Phusion Passenger|Puma|Unicorn|Thin) + (Nginx|Apache) 如何协同工作?
Rails 4 + Websocket-rails + Passenger + Nginx + 负载均衡器
在 Ubuntu 上使用 nginx 和Passenger 时在哪里放置环境变量
Rails,Passenger,Nginx,我得到“403 Forbidden”,但为啥呢?