本教程将会涉及以下工具:
- Ubuntu 16.04 LTS
- RVM
- Ruby
- Rails
- Passenger
- Nginx(由 Passenger 编译)
创建帐号
假设你已经用 root 帐号通过 SSH 登陆服务器。
ssh root@[ip address] #腾讯云用户名使用ubuntu
出于安全考虑,不要使用 root 帐号运行 web 应用。这里新建一个专门用于部署的用户,例如 deploy 或者其它你喜欢的名字。运行以下命令创建用户:
# useradd -m -s /bin/bash deploy #腾讯云需要添加sudo
将用户加入 sudo 群组,以便使用 sudo 命令:
# adduser deploy sudo #腾讯云需要添加sudo
为 deploy 用户设置密码:
# passwd deploy #腾讯云需要添加sudo
退出当前 SSH 链接,用 deploy 帐号重新登陆。
ssh deploy@[ip address]
安装 RVM 和 Ruby
更新 apt,并安装 curl:
$ sudo apt-get update
$ sudo apt-get install curl
然后安装 RVM:
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ \curl -sSL https://get.rvm.io | bash
RVM 安装完毕后,重新登陆 SSH,让 RVM 配置生效。
修改 RVM 的 Ruby 安装源到 Ruby China 的 Ruby 镜像服务器,这样能提高安装速度
$ echo "ruby_url=https://cache.ruby-china.com/pub/ruby" > ~/.rvm/user/db
为了能正常工作,RMV必须安装一些依赖。你可以让RVM自动安装它们:
$ rvm requirements
Ruby-China的指导里有关于Readline和OpenSSL的rvm的安装,虽然感觉可以不装,但是装一下也无妨。
$ rvm pkg install readline
$ rvm pkg install openssl
然后安装 Ruby 2.5.1:
$ rvm install 2.5.1
$ rvm use 2.5.1 --default
Ruby 安装过程会请求 apt-get update 的权限,并自动安装系统依赖。安装完毕后,确认目前的 Ruby 版本:
$ ruby -v
应该看到 ruby 2.5.1 字样。
安装Rails:
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com
$ gem install rails
$ rails -v
Rails 4.0.3
安装数据库
添加阿里云镜像
编辑/etc/apt/sources.list文件,腾讯云不需要修改,已默认添加腾讯云镜像
#sudo vim /etc/apt/sources.list
在文件最前面添加以下条目,操作前请做好相应备份。
deb http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
安装MySQL:
$ sudo apt-get install mysql-server
或者PostgreSQL:
$ sudo apt-get install postgresql postgresql-client libpq-dev
安装 Passenger
如果安装失败,提示缺少依赖,则把对应的依赖单独安装即可。
# Install our PGP key and add HTTPS support for APT
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
$ sudo apt-get install -y apt-transport-https ca-certificates
# Add our APT repository
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
$ sudo apt-get update
# Install Passenger + Nginx
$ sudo apt-get install -y nginx-extras passenger
使用which ruby
命令,找到ruby所在路径
# which ruby
/home/deploy/.rvm/rubies/ruby-2.5.1/bin/ruby
根据此路径修改 nginx 配置,编辑 /etc/nginx/nginx.conf
#sudo vim /etc/nginx/nginx.conf
添加以下两行至http块
...
http {
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /home/deploy/.rvm/rubies/ruby-2.5.1/bin/ruby;
...
这会打开 Passenger 支持,并且指定使用之前用 rvm 安装的 ruby 版本。
Git Server
RoR比较流行的是使用git,我们来配置一下Git Server,首先我们需要新建一个名为git的用户并且为它添加公钥。
$ sudo adduser git
配置ssh-keygen,并生成公钥
输入以下命令:
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "[[email protected]]"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/deploy/.ssh/id_rsa): [Press enter]
$ ssh-add id_rsa
Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]
Your identification has been saved in /Users/you/.ssh/id_rsa.
Your public key has been saved in /Users/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db [email protected]
$ pbcopy < ~/.ssh/id_rsa.pub
如果遇到-bash: cd: ~/.ssh: No such file or directory的错误,新建一个.ssh的文件夹即可。
# mkdir ~/.ssh
这时候我们切换到ssh的Profile,输入以下的命令:
# vi ~/.ssh/authorized_keys
通过vi把刚刚复制到剪贴板的内容粘贴到authorized_keys里,然后保存退出。
我这里假设你的项目名称是project和准备把git仓库的目录设定为/opt/git,如果你没有一个/opt/git目录,需要切换到root新建并且把这个目录的所有者改为git:
$ su - root #ubuntu需要初始root密码
# cd /opt
# mkdir git
# chown git git
切换到git
用户操作:
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init
如果你之前已经有一个Rails项目,那么可以跳过以下步骤。
在本地计算机
上,新建一个Rails项目,并且把它纳入git版本管理中:
$ rails new project --skip-bundle
$ cd project
$ git init
$ git add .
$ git commit -m 'initial commit'
我们需要添加git remote连接服务器,并且把这个项目push到服务器上去。
$ git remote add origin git@[ipaddress]:/opt/git/project.git
$ git push origin master
Counting objects: 59, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (48/48), done.
Writing objects: 100% (59/59), 13.41 KiB | 0 bytes/s, done.
Total 59 (delta 2), reused 0 (delta 0)
To git@[ipaddress]:/opt/git/project.git
* [new branch] master -> master
如果你的系统没有报错的话,这个时候我们已经完成了Git Server的部署。
部署站点
检查一下swap的大小:
$ free -m
total used free shared buffers cached
Mem: 490 405 84 0 12 311
-/+ buffers/cache: 80 409
Swap: 0 0 0
如果没有swap,手动创建swap文件:
$ sudo mkdir /swap
$ cd /swap
$ sudo dd if=/dev/zero of=swapfile bs=1024 count=500000
$ sudo mkswap -f swapfile
$ sudo swapon swapfile
设置开机自动挂载, 编辑 /etc/fstab
#sudo vim /etc/fstab
在最后追加一行
/swap/swapfile swap swap defaults 0 0
切换到deploy
用户,创建站点文件夹:
$ sudo mkdir -p /var/www/example
$ sudo chown deploy:deploy /var/www/example
clone 项目文件:
$ cd /var/www/example
/var/www/example $ git clone /opt/git/project.git
取决于你的应用,这里需要安装数据库等其他系统组件,例如 PostgreSQL:
$ sudo apt-get install postgresql libpq-dev
执行 bundle 和 migrate:
/var/www/example $ cd current
/var/www/example/current $ bundle install
/var/www/example/current $ RAILS_ENV=production rake db:create db:migrate
执行 assets precompile:
/var/www/example/current $ rake assets:precompile
修改 Nginx 配置
删除原有的默认网站配置:
$ sudo rm /etc/nginx/sites-enabled/default
新建网站配置:
$ touch /etc/nginx/sites-enabled/example.conf
编辑 sudo vim /etc/nginx/sites-enabled/example.conf
,写入以下内容:
server {
listen 80 default;
server_name example.com; # 这里填写你真实域名
root /var/www/example/project/public;
passenger_enabled on;
}
重启 nginx:
$ sudo service nginx restart
完成
在浏览器打开服务器的 IP 地址或域名,应该看到你的网站在运行。
优化
- 编辑
sudo vim /etc/nginx/sites-enabled/example.conf
,写入以下内容:
server {
...
passenger_min_instances 6;
...
}
2.编辑 #sudo vim /etc/nginx/nginx.conf
添加以下至http块
...
http {
...
passenger_max_pool_size 30;
passenger_pool_idle_time 90;
passenger_max_requests 500;
...
}
问题
解决git Unable to create temporary file ...
搞计算机的总会莫名奇妙的遇到一些问题,之前做了那么多的项目,突然就出现了,在push 时候抛出这样的错误
fatal: Unable to create temporary file: Permission denied
error: pack-objects died of signal 13
搜索后,发现也挺频繁的。大致就是这样:
// 登录git服务器,进入你的项目
cd your_rep.git
chmod -R g+ws *
chgrp -R git *
git config core.sharedRepository true
然后再回到你本地目录,输入 git repack master