我需要让redmine与nginx,phusion passenger和mysql一起运行。由于该项目需要多个redmine实例,应该使用不同的rails_env来实现,我尝试使用nginx在不同的服务器vhosts中设置它们。
一个vhost的示例:
server {
listen xxxx;
server_name redmine.xxxxx;
root /xxxxx/redmine/public;
passenger_enabled on;
rails_env production;
}
其他服务器vhost也是如此,但server_name与其他域匹配,rails_env设置为internal。
问题是,nginx只为两个redmine实例使用了两个rails_env,而不是每个实例都有一个。有任何建议如何使用不同的rails_env与相同的应用程序,nginx和phusion乘客?
由于
答案 0 :(得分:1)
我认为你遇到了同样的问题。您希望使用相同的物理目录来托管应用程序实例,但是您希望通过使用不同的DNS条目(redmine.development / redmine.production)在不同环境(开发/生产)下与应用程序进行交互???
问题在于乘客将传入的请求识别为使用root上方目录中的rails app。如果您在多个nginx配置中对root使用相同的文字引用,则乘客会将请求转发到root中找到的单个运行实例。即,如果您首先启动开发应用程序,然后尝试通过redmine.production访问生产,那么您最终将与开发环境进行交互。但是,如果您首先启动生产应用程序,然后尝试访问redmine.development,您将最终与生产进行交互。
答案是为您要运行的每个环境对应用程序的目录进行符号链接。 Passenger只查看root的文字路径 - 如果它与当前正在运行的实例不匹配,它会生成一个新的。
例)
物理根是~/rails_apps/myserver
(myserver包含app,public等)
创建一个名为~/rails_apps/dev.myserver
的符号链接到~/rails_apps/myserver
,另一个名为~/rails_apps/pro.myserver
到~/rails_apps/myserver
。
现在在你的nginx配置中,将符号链接位置以root身份用于公用文件夹。
例如,如果symlink /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;
}
答案 1 :(得分:0)
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
}