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"

 

 

posted on 2012-02-23 17:04 jesktop 阅读(...) 评论(...) 编辑 收藏

导航

统计

公告