项目

常规

个人资料

操作

如何在子URI中安装Redmine

本页解释了如何在您的站点子目录中运行Redmine,例如 http://www.mysite.com/redmine/;在这种情况下,您可能会感到困惑,因为经典的Redmine安装不能直接工作,并且指向CSS或javascript文件的链接似乎已损坏。在本页中,我们假设您想在您的站点“/redmine/”子目录下运行Redmine。

工作版本(2016年6月26日星期日 13:48:50 MSK)

在config/environment.rb文件底部更改以下行


# Initialize the Rails application
Rails.application.initialize!


RedmineApp::Application.routes.default_scope = "/redmine" 
# Initialize the Rails application
Rails.application.initialize!

使用Redmine::Utils(首选解决方案)

在config/environment.rb文件底部添加以下行

Redmine::Utils::relative_url_root = "/redmine" 

然后重新启动您的应用程序。

使用Rails功能

在config/environment.rb文件末尾添加以下行

ActionController::AbstractRequest.relative_url_root = "/redmine" 
Rails将自动为所有链接添加前缀“/redmine”。这可以被认为是简单、干净且最灵活的解决方案。然后重新启动您的应用程序。在Rails的较新版本中,类层次结构略有变化,您需要使用
ActionController::Base.relative_url_root = "/redmine" 
作为类名。

使用Mongrel功能

如果您在Mongrel服务器下运行Redmine,您还可以使用Mongrel的“--prefix”选项

mongrel_rails start --prefix=/redmine

Mongrel_rails服务“--prefix”指令与Rails 2.3.x版本不兼容
要解决这个问题,请创建一个文件config/initializers/patch_for_mongrel.rb [文件名可以是任何名称]

# Fix for mongrel which still doesn't know about Rails 2.2's changes, 
# We provide a backwards compatible wrapper around the new
# ActionController::base.relative_url_root,
# so it can still be called off of the actually non-existing
# AbstractRequest class.

module ActionController
  class AbstractRequest < ActionController::Request
    def self.relative_url_root=(path)
      ActionController::Base.relative_url_root=(path)
    end
    def self.relative_url_root
      ActionController::Base.relative_url_root
    end
  end
end
#
# Thanks to http://www.ruby-forum.com/topic/190287

您可能无法在端口80上运行Mongrel:如果您在同一主机上有Apache服务器,并且您在端口8000上运行Mongrel,您可以使用以下Apache配置进行重定向(假设已启用Apache的mod_proxy)

ProxyPass /redmine https://127.0.0.1:8000/redmine
ProxyPassReverse /redmine https://127.0.0.1:8000/redmine

使用Passenger(又名mod_rails)功能

如果您在Apache web服务器下使用Phusion Passenger模块运行Redmine,请遵循此指南;请注意,在某些Passenger版本或某些Linux发行版上可能无法正确工作。

使用Passenger+Nginx功能

请参阅官方指南(这是我唯一成功的方法 - 2012年10月30日)

使用Unicorn+Nginx

nginx配置

location /redmine {
        alias   <PATH_TO>/redmine/public;

        try_files $uri/index.html $uri.html $uri @app;
     }

config/routes.rb

Redmine::Utils::relative_url_root = "/redmine" 

RedmineApp::Application.routes.draw do
scope Redmine::Utils::relative_url_root do
  root :to => 'welcome#index', :as => 'home'
.....
end
end

使用反向代理

如果您前面有Apache web服务器(已启用mod_proxy)或另一台机器上的Apache反向代理,您可以在特定端口上运行Redmine,并使用此类配置,使其看起来像在子目录中运行

ProxyPass /redmine http://real-redmine-server.localdomain:3000/
ProxyPassReverse /redmine http://real-redmine-server.localdomain:3000/
参阅Apache官方文档以进行适配。

使用puma

  1. 定义RAILS_RELATIVE_URL_ROOT环境变量
    
    export RAILS_RELATIVE_URL_ROOT=/redmine
    
    或使用RedmineUtils方法
    这允许rails生成以RAILS_RELATIVE_URL_ROOT为前缀的URL。
  2. 然后更新您的config.ru
    # This file is used by Rack-based servers to start the application.
    
    require ::File.expand_path('../config/environment',  __FILE__)
    map ENV['RAILS_RELATIVE_URL_ROOT'] || '/' do
      run RedmineApp::Application
    end
    
    这允许rack处理以RAILS_RELATIVE_URL_ROOT为前缀的URL。

这两点都是必要的。

如果您使用的是Docker官方镜像的passenger版本

在一个空目录中创建一个Dockerfile,内容如下,调整标签为要使用的版本

FROM redmine:2.6.10-passenger
COPY assets/passenger-nginx-config-template.erb /passenger-nginx-config-template.erb
CMD ["passenger", "start", "--nginx-config-template", "/passenger-nginx-config-template.erb"]

在同一个目录中创建一个passenger-nginx-config-template.erb文件,内容如下,调整您要使用的子URI

<%= include_passenger_internal_template('global.erb') %>

worker_processes 1;
events {
    worker_connections 4096;
}

http {
    <%= include_passenger_internal_template('http.erb', 4) %>

    default_type application/octet-stream;
    types_hash_max_size 2048;
    server_names_hash_bucket_size 64;
    client_max_body_size 1024m;
    access_log off;
    keepalive_timeout 60;
    underscores_in_headers on;
    gzip on;
    gzip_comp_level 3;
    gzip_min_length 150;
    gzip_proxied any;
    gzip_types text/plain text/css text/json text/javascript
        application/javascript application/x-javascript application/json
        application/rss+xml application/vnd.ms-fontobject application/x-font-ttf
        application/xml font/opentype image/svg+xml text/xml;

    server {
        server_name _;
        listen 0.0.0.0:3000;
        root '/usr/src/redmine/public';
        passenger_app_env 'production';
        passenger_spawn_method 'smart';
        passenger_load_shell_envvars off;

        location ~ ^/suburi(/.*|$) {
            alias /usr/src/redmine/public$1;
            passenger_base_uri /suburi;
            passenger_app_root /usr/src/redmine;
            passenger_document_root /usr/src/redmine/public;
            passenger_enabled on;
        }
    }

    passenger_pre_start http://0.0.0.0:3000/;
}

构建Docker镜像并启动容器

docker build -t redmine-in-a-sub-uri:2.6.10-passenger .
docker run -d --name redmine-in-a-sub-uri -p 3000:3000 redmine-in-a-sub-uri:2.6.10-passenger

结果Redmine可以通过https://127.0.0.1:3000/suburi访问

旧版本的Redmine和Rails

如果您运行的是非常旧的Redmine版本(不知道具体是哪些),那么您可能使用的Rails' ActionController版本不支持上面提到的"relative_url_root"。然后您可以去这个页面来重现相同的行为,但这在大多数情况下并不是一个好主意,您应该考虑升级Redmine。

参考

如果这个页面没有解决您的问题,您可以查看#2508这个线程

Windows:在Apache子目录下配置Ruby On Rails应用程序 - http://stackoverflow.com/a/470973/663172

配置ruby on rails Action Controller - https://guides.rubyonrails.net.cn/configuring.html#configuring-action-controller

David Navarro Solans更新,超过5年前· 18次修订