關於Rails部署在Ubuntu下,網上有很多相應的方法。剛開始學習時,部署成了最大的難題。相對於Java的部署,要更復雜些,更重要Rails對Windows的支持不好,所以建議使用Linux進行部署。
我的VPS為Linode的Ubuntu14.04 LTS,總結一下網上所學到的知識和自己的部署過程,以方便初學者可以更容易的部署環境。因為我剛開始部署時,遇到了非常多的問題,而且Rails更新快,中文資料跟不上Rails的發展,每個Rails版本的更新都有不少的區別。昨天重新部署了一下VPS,過程很順利,下面跟大家分享一下部署的過程和一些注意懂問題。
更新源
$sudo apt-get update
$sudo apt-get upgrade
校正時區
$sudo dpkg-reconfigure tzdata
選擇Asia,然后再選擇自己所在的時區【shanghai】。
安裝所需的linux包
$sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libxml2-dev libxslt-dev autoconf libc6-dev zlib1g-dev libssl-dev build-essential curl git-core libc6-dev g++ gcc
添加一個rails用戶和一個passenger用戶組
$sudo addgroup server
$sudo adduser deploy
$sudo usermod -G server,www-data,sudo deploy
$su - deploy
Ruby安裝(開發環境RVM安裝)
安裝 rvm(可以進行ruby版本控制)
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
安裝過程命令行有詳細的提示。
加載rvm (只需第一次安裝時加載)
$source .bashrc
安裝完畢后,重啟終端,可以根據以下這個命令看一下是否安裝成功:
$rvm –v
打開bashrc文件
$sudo vim ~/.bashrc
#添加以下代碼:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
#然后終端運行
$source .bashrc
如果有類似與版本提示相關而非報錯,說明安裝成功。如果這里說RVM不是一個命令,最簡單的辦法是關閉命令行重新打開一個再試。
安裝Ruby
$rvm install 2.2.2 #2.2.2為ruby的版本
這里假設安裝的版本是2.2.2,安裝命令非常簡單,安裝完成后,需要設置默認的Ruby版本如下:
$rvm 2.2.2 --default #設置2.2.2為默認的版本
$ruby –v #查看當前ruby的版本
查看當前Ruby的版本,方法同上,碰到檢測不到的時候先關閉命令窗口再重新打開。(注意:每次關閉命令窗口后,登錄的用戶名均使用剛剛添加的帳號進行登錄)
Ruby安裝(服務器Rbenv)
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv # 用來編譯安裝 ruby git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build # 用來管理 gemset, 可選, 因為有 bundler 也沒什么必要 git clone git://github.com/jamis/rbenv-gemset.git ~/.rbenv/plugins/rbenv-gemset # 通過 gem 命令安裝完 gem 后無需手動輸入 rbenv rehash 命令, 推薦 git clone git://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash # 通過 rbenv update 命令來更新 rbenv 以及所有插件, 推薦 git clone https://github.com/rkh/rbenv-update.git ~/.rbenv/plugins/rbenv-update
然后把下面的代碼放到 ~/.bashrc 里:
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
安裝 ruby
rbenv install --list # 列出所有 ruby 版本 rbenv install 2.2.2 # 安裝 2.2.2
列出版本
rbenv versions # 列出安裝的版本 rbenv version # 列出正在使用的版本
設置版本
rbenv global 2.2.2 # 默認使用 2.2.2
參考:https://ruby-china.org/wiki/rbenv-guide
Rails的安裝
安裝Rails
$gem install rails #我安裝時候的rails版本為4.2.1
這里是不需要獲取管理員權限再執行的,因為據說如果加了sudo的話那么以后這個只能給管理員本人用了。直接由rvm進行rails版本的控制,gem安裝可以更加方便的進行有效的版本控制。安裝成功后可以通過以下命令查看使用的版本:
$rails -v
$gem –v
這里可以分別看到Rails和負責安裝的Gem的版本,如果讀取異常,可以關閉命令行重新打開。操作方式完全同上面的查看版本驗證方式。
因為Rails的默認數據庫是sqlite,因此需要安裝相關的支持:
$sudo apt-get install sqlite3
$sudo apt-get install libsqlite3-dev
$gem install sqlite3-ruby
Rails里面自帶着一個服務器,方便使用的時候進行測試,開啟的命令是rails server。現在我們安裝相關的支持:
$sudo apt-get install openssl libssl-dev
$sudo apt-get install libopenssl-ruby1.9.1
安裝 Nginx/Puma
在使用puma后,我已經把服務器和開發環境都使用了Nginx和puma的配置,已經不在使用Passenger了。
安裝Nginx:
sudo apt-get install nginx
啟動Nginx:
$sudo /etc/init.d/nginx start
然后只需要在每個服務中,裝上Puma,就可以非常方便的使用了。
配置Nginx方式如下:
到 /etc/nginx/sites-enabled 目錄下,添加一個example.conf文件:
upstream example {
server unix:///tmp/example.sock;
}
server {
listen 80;
server_name www.example.com;
root /home/deploy/www/example/current/public;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://example;
break;
}
}
}
安裝 passenger/nginx(選)
passenger/nginx安裝命令
$gem install passenger
$sudo apt-get install libcurl4-openssl-dev #安裝SSL gem
#遵從passenger官方安裝指南(http://www.modrails.com/install.html)的提示,開始安裝:
$rvmsudo passenger-install-nginx-module #都是默認選擇,選擇1,安裝目錄也選擇默認 /opt/nginx/
passenger 會自動修改config, 添加passenger所在的rvm的ruby和gem環境地址。
安裝nginx啟動腳本
$wget https://raw.github.com/gist/1548664/53f6d7ccb9dfc82a50c95e9f6e2e60dc59e4c2fb/nginx
$sudo cp nginx /etc/init.d/
$sudo chmod +x /etc/init.d/nginx
$sudo update-rc.d nginx defaults
nginx啟動和停止命令
$sudo /etc/init.d/nginx start #nginx啟動
$sudo /etc/init.d/nginx stop #nginx停止(我在用這個命令之后無法完全把nginx停止,再次開啟的時候會出現端口占用情況,如果有誰可以知道問題所在可以給我留言)
#目前使用該命令停止nginx $sudo /opt/nginx/sbin/nginx -s stop
$sudo /etc/init.d/nginx restart #重啟nginx
簡易配置nginx
配置文件在 /opt/nginx/config/nginx.conf
參考: http://wiki.nginx.org/NginxFullExample
參考: http://wiki.nginx.org/NginxChsFullExample
參考: http://modrails.com/documentation/Users%20guide%20Nginx.html
因為我對nginx不太熟悉,對配置文件只是做簡單的配置。
gzip on; #去除gzin on的注釋,此行作用是對訪問網站進行代碼的壓縮,加快訪問速度
原本server的配置對對應的站點地址進行修改。
#原來的配置
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
....
}
#修改
server {
listen 80;
server_name www.XX.net;
root /home/railsu/***/public; #你項目中的public目錄
passenger_enabled on;
rails_env development; #此處可以設置,rails的模式
#charset koi8-r;
#access_log logs/host.access.log main;
#注釋下面的配置
# location / {
# root html;
# index index.html index.htm;
# }
....
}
現在啟動nginx還會報nobody無法取得某些目錄的寫入權限。因為nginx默認為nobody啟動的。可以有兩個方法:
1、 將應用和應用目錄下所有文件夾和文件都置為權限777。執行 chmod 777 –R 應用目錄
2、 將nginx的啟動用戶設置為具有操作應用目錄的用戶。如root(不建議)或者用戶本身。具體做法是更改/opt/nginx/conf/nginx.conf第一行。user 用戶名 組名
而我進行如下的設置,例如我這里設置的是railsu用戶,站點文件夾的名字為website。
chown jesktop -R website
特別提示,在對文件夾進行權限設置時,不要設置為777。可以通過:
chmod -R 755 website #確保文件夾是755
find mysite -type f -exec chmod 644 {} \; #文件是644權限
安裝node.js
因為rails3.1版本以上,需要對asset等的支持,可以需要安裝上node.js(Installing Node.js via package manager),安裝方法如下:
$sudo apt-get install python-software-properties
$sudo add-apt-repository ppa:chris-lea/node.js
$sudo apt-get update
$sudo apt-get install nodejs
#It installs current stable Node on the current stable ubuntu.
#If you want to compile Node C++ modules:
$sudo apt-get install nodejs-dev
#Or configure shell script for install node.js using http://apptob.org
安裝PostgreSQL
參考: http://technobytz.com/install-postgresql-9-3-ubuntu.html
安裝MySQL
安裝MySQL命令
$sudo apt-get install mysql-server mysql-client #請牢記安裝過程中輸入的密碼
$sudo apt-get install libmysql-ruby libmysqlclient-dev
$gem install mysql2
修改MySQL配置,以便可以進行外部訪問和支持UTF-8,中國市區,紅色為需要添加地方
$sudo vim /etc/mysql/my.cnf #運行配置文件
#修改配置文件
[client]
default-character-set = utf8
port = 3306
socket = /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init_connect = 'SET NAMES utf8'
default-time-zone = '+8:00'
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
重啟mysql服務
$sudo service mysql restart
登錄mysql
$mysql –u root –p “密碼”
登錄mysql
update mysql.user set password=PASSWORD("你的密碼") where User="root"
