Passenger/Nginx/Ubuntu/MySQL详尽部署Rails 4.2.1/Ruby2.2.2
关于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"