怎样在 Ubuntu 17.04 上使用 Rbenv、Rails、MariaDB、Nginx、SSL 和 Passenger 安装和配置 Ruby

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 ~/.rbenvgit 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 配置为指向应用程序。

  1. 准备 Nginx。

    sudo nano /etc/nginx/nginx.conf
    
  2. 将用户更改为 deploy.

    user deploy;
    
  3. 在里面 http 在配置的部分,应该有一行告诉 Nginx 加载模块,包括乘客。 如果缺少,您可以在之后立即添加 Virtual Host Configs 标题,但之前 sites-enabled.

    include /etc/nginx/conf.d/*.conf;
    
  4. 编辑/创建 passenger.conf 文件。

    sudo nano /etc/nginx/conf.d/mod-http-passenger.conf
    
  5. 告诉乘客使用我们的 Rbenv 设置。 它可能包含一行指向包含在Passenger 中的Ruby 版本,只需将其删除或注释掉即可。

    passenger_ruby /home/deploy/.rbenv/shims/ruby;
    passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
    
  6. 设置虚拟主机以指向应用程序 /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      
    }
    
  7. 重启 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