最近接手了一個ruby的web項目,由於之前沒有接觸過ruby以及相關的web開發,而且項目當中文檔缺失,所以在部署該項目的時候很是走了一些彎路。最後參照多篇ruby on rails的開發環境部署,以及學習了下ruby當中的gem/bundler等的關係,成功部署項目。在這兒記一下,算是一個小的總結,也可以對ruby web開發剛入門部署環境時提供一個參照。
我們的項目是基於padrino,如果是基於rails的項目,部署應該也是差不多的。
1.安裝ruby
由於系統中可能有多個ruby相關的項目,而不同的項目可能需要針對不同的ruby版本進行開發或者測試,所以系統當中可能需要安裝多個ruby的版本。而這就需要相應的工具來管理已有版本和安裝新版本。我這兒選用的是rbenv,也可以使用老牌的rvm。安裝rbenv
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
添加ruby-build組件git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
添加gem-rehash組件git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
安裝ruby(以ruby2.1.5爲例)由於默認安裝ruby會比較慢,所以此處先從ruby.taobao.org下載相應的文件,然後使用本地安裝的方式來安裝
wget -O ~/.rbenv/versions/ruby-2.1.5.tar.gz http://ruby.taobao.org/mirrors/ruby/2.1/ruby-2.1.5.tar.gz
env RUBY_BUILD_MIRROR_URL=file:///home/ziven/.rbenv/versions/ruby-2.1.5.tar.gz# ~/.rbenv/bin/rbenv install 2.1.5
其中wget是下載相應的ruby文件,這裏是ruby-2.1.5.tar.gzRUBY_BUILD_MIRROR_URL
用來指定安裝的ruby鏡像路徑,這裏直接使用本地路徑。注意本地路徑後面應該加上#來結尾rbenv install命令後面的版本應該跟要安裝的ruby版本對應,例如可能安裝的版本是帶有相應的補丁編號的(例如: 1.9.3-p223),此處也應該寫上。
2. 安裝必要組件
因爲我們一般採用bundler來管理項目需要的gems,所以此處是需要安裝bundler的。考慮到國內連接ruby鏡像的速度,我們更換gem源爲taobao源。
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
之後執行gem sources -l應該只有https://ruby.taobao.org/這一個源安裝bundler
gem install bundler
3.應用部署
a. clone web源碼到合適位置
這裏假設clone之後的源碼放置到/opt/projectAb.安裝依賴的gems
在項目的根目錄執行:bundle install
此處需要注意,根據不同的情況執行的命令可能略有差異。例如在生產環境部署時,可能需要執行bundle install --deployment --without development test
這樣部署時,相關的依賴gems被安裝到 projectA/vendor/bundle下面。尤其適合不同的項目依賴同一個gem的不同版本的時候使用。c.數據庫相關遷移
由於本項目是基於padrino所以需要執行:padrino rake --environment=production db:migrate
需要注意的是,此處視情況可能需要使用bundle來執行該命令:bundle exec padrino rake --environment=production db:migrate
數據庫遷移成功後,需要創建amdin賬戶。padrino默認在db/seeds.rb當中完成admin賬戶的創建。所以此處執行:bundle exec padrino rake --environment=production seed
執行過程當中會提示輸入admin賬戶的郵箱跟密碼d.unicorn部署
此處可能需要相應的unicorn啓動腳本,可以參照ruby-china的unicorn.rb來寫。此處從略。啓動unicorn server:
bundle exec unicorn -E production -c unicorn.rb -D
這樣padrino server就已經正常啓動了。如果unicorn.rb當中監聽的是tcp端口,那麼此時訪問相應的url應該可以打開了。如果是採用的監聽unix socket的方式,那麼還應該使用nginx(或者apache)來做反向代理。4. nginx的安裝配置
a. nginx的安裝
nginx就是可以安裝linux一般軟件的安裝方式來安裝。推薦使用源碼安裝方式。此處簡略起見,暫以包管理器的安裝方式進行安裝:sudo apt-get install nginx-full
b. nginx的配置
upstream myserver {
server unix:/tmp/projectA.sock fail_timeout=0;
}
server {
listen 7788;
server_name localhost;
client_max_body_size 10M;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
root /opt/projectA/web/public;
try_files $uri $uri.html @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://myserver;
}
}
此處將7788端口的請求轉發到
unix:/tmp/projectA.sock
進行處理。也即轉發到剛剛我們的web服務器處理。至此,server已經可以正常運行。其他的一些輔助功能可以根據需要進行添加。例如nginx可能需要ssl證書來認證。
ruby on rails項目的部署大同小異,其部署過程當中可能在執行相應的命令時需要根據情況做相應的調整。不過只要熟悉了ruby web的部署方式,其他的可以參照相關框架的文檔還是比較容易部署的。