最近接手了一個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 ~/.rbenvecho 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrcecho 'eval "$(rbenv init -)"' >> ~/.bashrcexec $SHELL
添加ruby-build組件
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-buildecho 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrcexec $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.gzenv 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.gz
RUBY_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/projectA
b.安裝依賴的gems
在項目的根目錄執行:
bundle install
此處需要注意,根據不同的情況執行的命令可能略有差異。例如在生產環境部署時,可能需要執行
bundle install --deployment --without development test
這樣部署時,相關的依賴gems被安裝到 projectA/vendor/bundle下面。尤其適合不同的項目依賴同一個gem的不同版本的時候使用。
c.資料庫相關遷移
由於本項目是基於padrino所以需要執行:
padrino rake --envir db:migrate
需要注意的是,此處視情況可能需要使用bundle來執行該命令:
bundle exec padrino rake --envir db:migrate
資料庫遷移成功後,需要建立amdin賬戶。padrino預設在db/seeds.rb當中完成admin賬戶的建立。所以此處執行:
bundle exec padrino rake --envir 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)來做反向 Proxy。
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的部署方式,其他的可以參照相關架構的文檔還是比較容易部署的。
以上就介紹了nginx+unicorn部署ruby web環境,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。