Ruby on Rails 是一种流行的 Ruby 网络框架,旨在提高程序员的工作效率。 然而,让各种 gem 和依赖项一起工作有时会变得棘手。 本指南将帮助您设置一个完整的生产就绪 Rails 环境,包括常用的 gems 和依赖项。
要求
- Vultr 实例至少具有 512 MB 的 RAM(首选 1024 MB)。
- 运行 Ubuntu 17.04 的 Vultr 实例。
本指南中使用的堆栈
- nginx: 一个快速而强大的网络服务器。 (版本 1.10.3)
- 乘客:一个应用服务器,将帮助 Nginx 为您的 Ruby 应用提供服务。 (版本 1.5.1.8)
- 贝恩夫: Ruby 版本管理器。 (版本 1.1.1-2)
- 红宝石:(见2.4.1)
- 玛丽亚数据库: MySQL 服务器的一个开源分支 (ver 10.2)
- 安全证书 来自 Let’s Encrypt 的证书
安装
添加须藤用户
笔记:强烈建议不要以 root 身份安装任何这些服务,因为您可能会受到攻击。 设置一个 deploy
或者 app
user 是一个常见的约定:
sudo adduser deploy
sudo adduser deploy sudo
su deploy
更新和升级系统
确保您在 Ubuntu VM 上运行所有最新的软件包:
sudo apt-get update && sudo apt-get upgrade -y
安装构建系统
为了能够使用编译Ruby 环境 和其他 gems 一样,需要安装各种包。 根据您需要的 Ruby 版本,可能不需要某些软件包。
编译
sudo apt-get install -y curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev
sudo apt-get install -y libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev
sudo apt-get install -y python-software-properties libffi-dev
sudo apt-get install -y build-essential openssl libreadline6 libreadline6-dev libreadline-dev
sudo apt-get install -y automake libtool bison pkg-config bison autoconf libc6-dev ncurses-dev
sudo apt-get install -y libapr1-dev libaprutil1-dev libx11-dev libffi-dev tcl-dev tk-dev
SSL 支持包
这些是编译几个 gem 所必需的,例如Passenger:
sudo apt-get install -y zlib1g zlib1g-dev libssl-dev libyaml-dev libcurl4-openssl-dev libruby
版本控制
Ruby 社区正在使用 Git 作为首选的 SCM; 但是其他的,比如 Mercurial 或 Subversion,也可以安装:
sudo apt-get install -y git git-core
MySQL / MariaDB 的数据库驱动程序
sudo apt-get install -y libmysqld-dev mysql-client libmysqlclient-dev
能切里
几个需要原生 XML 库的流行 gem 需要:
sudo apt-get install -y libxml2-dev libxslt-dev
节点.js
使用最新版本从 Node 添加官方存储库,因为默认的 Ubuntu 存储库往往落后于几个主要版本:
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
可选套餐
这些包不是系统运行所必需的,但如果您需要使用某些 gem,则可以使用这些包。
图形和图像
这些库不是必需的,可以跳过,除非您计划使用图像处理 gem; 例如 Rmagick:
sudo apt-get install -y imagemagick libmagickwand-dev libvips-dev
SQLite 和 PostgreSQL 的数据库驱动程序
如果您需要连接到其他数据库或更喜欢简单的本地数据库,请安装 SQLite 或 PostgreSQL 的驱动程序:
sudo apt-get install -y libsqlite3-dev sqlite3 libpq-dev postgresql postgresql-contrib
工具
通常不会在全新 Ubuntu 安装中预安装的实用程序。 随意安装您选择的文本编辑器:
sudo apt-get install -y iotop htop nano vim
安装 MariaDB 服务器
MariaDB 是一个强大的关系型 SQL 服务器,与 MySQL 完全兼容。 安装最新版本 MariaDB 的最简单方法是使用官方存储库:
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386] https://ftp.utexas.edu/mariadb/repo/10.2/ubuntu zesty main'
sudo apt update
sudo apt install -y mariadb-server
按照提示设置 root 密码。 之后,验证您是否可以访问全新安装:
mysql -V
它将显示类似于此的行:
mysql Ver 15.1 Distrib 10.2.8-MariaDB, for debian-linux-gnu (x86_64) using readline 5
登录到 MySQL shell:
mysql -h localhost -u root -p
笔记: 利用 q
退出。
安装 Rbenv 和 Ruby
贝恩夫
使用 git 安装 Rbenv。 这是最简单的安装方法,它允许以后轻松更新。 还要安装 ruby-build
,它负责实际编译不同版本的Ruby:
cd
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
笔记: 当您需要简单地更新时 cd ~/.rbenv
和 git pull
.
使 Rbenv 和 Ruby-build 在 shell 中可用。 确保插入导出行 一开始 的 .bashrc
文件,这对于非交互式很重要 bash 命令,使用这些行:
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.temp_bashrc
echo 'eval "$(rbenv init -)"' >> ~/.temp_bashrc
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.temp_bashrc
cat ~/.temp_bashrc ~/.bashrc > ~/.combined_bashrc && mv ~/.combined_bashrc ~/.bashrc && rm ~/.temp_bashrc
exec $SHELL
检查 Rbenv 和 Ruby-build 是否已安装并且在 shell 中可用:
rbenv install --list
如果 rbenv
无法识别,请注销并重新登录到 shell。
创建一个 ~/.bash_profile
文件并将其指向您的源 ~/.bashrc
文件。 如果您需要从 Rails 应用程序运行任何非交互式 shell 命令,例如由 whenever
gem,它将使用与您的交互式 shell 相同的 Ruby 版本。 这可以帮助防止奇怪的错误。 将此行添加到 ~/.bash_profile
文件:
if [ -f $HOME/.bashrc ]; then
source $HOME/.bashrc
fi
红宝石
安装 Ruby 2.4.1:
rbenv install 2.4.1
笔记:此过程可能需要 5-15 分钟,具体取决于 VM 上的资源,并且没有进度条。
使 Rbenv 随处可用。
rbenv global 2.4.1
乘客和 Nginx
为 apt 添加 PGP 密钥和 HTTPS 支持:
sudo apt-get install -y dirmngr gnupg
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo apt-get install -y apt-transport-https ca-certificates
添加乘客存储库:
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger zesty main > /etc/apt/sources.list.d/passenger.list'
sudo apt-get update
安装Passenger + Nginx 模块:
sudo apt-get install -y nginx
sudo apt-get install -y libnginx-mod-http-passenger
此时使用域名或 IP 访问您的 Vultr 实例以测试这些。 如果它们正常工作,您的页面将显示默认的 Nginx 欢迎页面。
设置 Rails、应用程序和配置乘客
安装 Bundler 和 Rails:
gem install bundler rails --no-ri --no-rdoc
Ubuntu/Debian 惯例是在 /var/www
. 默认情况下,它只能由 root 写入。 要使设置正常工作,请将所有权授予 sudo 用户 deploy
:
sudo chown deploy:deploy /var/www -R
生成 rails 应用程序 /var/www/
. 如果您已经有要部署的应用程序, git clone
它在这里然后运行 bundle
:
cd /var/www
rails new example --database=mysql
将Passenger 配置为指向应用程序。
准备 Nginx。
sudo nano /etc/nginx/nginx.conf
将用户更改为
deploy
.user deploy;
在里面
http
在配置的部分,应该有一行告诉 Nginx 加载模块,包括乘客。 如果缺少,您可以在之后立即添加Virtual Host Configs
标题,但之前sites-enabled
.include /etc/nginx/conf.d/*.conf;
编辑/创建
passenger.conf
文件。sudo nano /etc/nginx/conf.d/mod-http-passenger.conf
告诉乘客使用我们的 Rbenv 设置。 它可能包含一行指向包含在Passenger 中的Ruby 版本,只需将其删除或注释掉即可。
passenger_ruby /home/deploy/.rbenv/shims/ruby; passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
设置虚拟主机以指向应用程序
/var/www/example/
.sudo nano /etc/nginx/sites-enabled/example.conf server { listen 80; server_name example.com www.example.com; root /var/www/example/public; passenger_enabled on; # When you are ready to switch to production mode - change this to `production` passenger_app_env development; # <-- !important }
重启 Nginx。
sudo service nginx restart
此时,您的应用程序已准备好在开发模式下使用。 要切换到生产模式,您需要返回到 Nginx 配置并更改 rails_env
设置为 production
.
在切换到生产模式之前,您仍然需要设置生产数据库 example_production
, database.yml
, 和密钥。 查看 Capistrano 或 Mina 之类的工具来加快您的应用程序部署过程。 将 ENV 变量与 gem 一样使用是一个好习惯 dotenv
,并且不要将您的密码、密钥等提交到您的 git 存储库。
设置 SSL
有多种服务可以为您的域提供 SSL 证书,其中许多是付费的,有一些是免费的。 无论您使用什么服务,都要设置 SSL。 让我们加密 使用起来非常简单且免费。 Let’s Encrypt 是一个由许多科技巨头支持的非营利组织。
安装
运行以下命令,并按照提示进行操作。
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
sudo certbot --nginx
sudo certbot renew --dry-run
如果你现在使用你的 Vultr 实例 HTTPS
,您将看到一个安全的网站。
续订
您新颁发的证书将过期,需要定期更新。 最简单的方法是设置一个 cron 作业。
sudo crontab -e
30 2 * * 1 /usr/bin/certbot renew
作为最后但可选的步骤,重新启动您的虚拟机并确保所有服务按预期重新启动。
注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com