用 apache + mongrel cluster + relative url 跑 Redmine

由於公司防火牆設定問題, 想想還是把 Redmine 跑在 apache 裡共用 port 80, 對大家比較方便。今晚就試了一會兒, 沒想到意外設成功了, 真開心啊!!

我大致上是參考這篇。執行方式是 mongrel 自己跑 web server 聽幾個 port, 再用 apache 跑 proxy, 將特定路徑轉交給 mongrel server。摘要做法如下:
  1. 參考隨便一篇文章在 Ubuntu 上裝好 Redmine, 能用單機 mongrel_rails 執行。
  2. 安裝 mongrel_cluster:
    sudo gem install mongrel_cluster
  3. 設 REDMINE_HOME/config/mongrel_cluster.yml:
    user: www-data
    cwd: REDMINE_HOME
    port: "3000"
    environment: production
    group: www-data
    address: 0.0.0.0
    pid_file: log/mongrel.pid
    servers: 2
  4. 設 Redmine 的相對網址, 在 REDMINE_HOME/config/environments/production.rb 檔案最後加上
    config.action_controller.relative_url_root = '/redmine'
    比起 Django 真是簡單百倍。
  5. 執行 mongrel cluster:
    cd REDMINE_HOME
    mongrel_rails cluster::start
    成功的話會跑在 port 3000 和 3001。沒成功的話可以讀 REDMINE_HOME/log/mongrel.3000.log 了解原因。 REDMINE_HOME 內所有檔案擁有者和群組記得設成 www-data。
  6. 安裝和啟動 apache 需要的 modules
    a2enmod proxy
    a2enmod proxy_http
    a2enmod proxy_balancer
    a2enmod rewrite
    
  7. 設定 apache conf, 我是寫在 /etc/apache2/conf.d/011_redmine.conf 裡:
    <Proxy *>
    Order deny,allow
    Allow from all
    </Proxy>
    
    <Proxy balancer://redmine_cluster>
    BalancerMember http://YOUR_IP:3000
    BalancerMember http://YOUR_IP:3001
    </Proxy>
    
    ProxyPreserveHost On
    
    <Location "/redmine">
        ProxyPass balancer://redmine_cluster
    
        RewriteEngine On
        # Redirect all non-static requests to cluster
        RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
        RewriteRule ^/(.*)$ balancer://redmine_cluster%{REQUEST_URI} [P,QSA,L]
    </Location>
    
    注意預設 apache proxy 是 deny all, 沒打開 apache error log 會出現 "client denied by server configuration ..."
  8. 執行
    /etc/init.d/apache2 reload

目前沒設 /etc/init.d/mongrel_cluster, 以後有機會再來研究。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置