如何在Ubuntu13上部署基于Sinatra的RubyWeb应用程序
介绍
Sinatra 是一个简洁的框架,不喜欢炫耀。 它可以完成工作,而不会对开发人员施加任何压力。 当涉及到使用这个奇妙的小工具开发的应用程序时,同样的逻辑适用,欢迎您有多种选择。 每个工作方式几乎相同:完成工作 没有不必要的复杂性 。
在这篇 DigitalOcean 文章中,继我们的第一篇 Ubuntu 13 上的 Ruby 2.1 和 Sinatra 在教程中,我们将学习几种不同的方法来将您的 Sinatra 应用程序从隐藏的盒子中取出,并使用不同的(和有趣的)技术和方法与世界 [在 Ubuntu 上] 分享它。
词汇表
1. 应用部署
2. 应用服务器
- 机架中间件
- Phusion 乘客应用服务器
- 独角兽应用服务器
3. HTTP / WWW 服务器
- Apache HTTP 服务器
- 作为前端反向代理运行的 Nginx HTTP 服务器
4. 安装
- 阿帕奇和乘客组合
- Nginx 与独角兽的结合
笔记: 本文的示例按照惯例基于我们在 Ubuntu 13 上的第一篇 Sinatra 和 Ruby 2.1.0 文章构建。 如果您想了解有关开始使用该框架或如何使用 Ruby 2.1.0 和 Sinatra 准备操作系统的更多信息,请考虑在继续阅读本文之前先查看它。
应用部署
部署应用程序(无论是网站、API 还是服务器)通常意味着从头开始(或从及时拍摄的快照)设置系统,通过更新所有内容、下载依赖项、设置文件结构来准备系统和权限,然后最终上传您的代码库或使用源代码控制管理器 (SCM) 下载它,例如 Git。
遵循 Sinatra 的设计激励措施,我们将尝试使事情尽可能简单,并在此处为我们的部署示例采用经过尝试、测试和易于使用的方法。 我们将使用信誉良好且值得信赖的工具来处理这项工作并了解它们之间的差异。
应用服务器
术语“应用程序服务器”适用于应用程序(即 服务器),它(通常)包含另一个应用程序(例如 您的网络应用程序)并遵循某些规范和接口(即 一种通用语言),允许包含的应用程序与外部世界进行通信。
同样,这些工具通常用于单独处理 业务逻辑 (执行过程),而不是用于其他 HTTP / WWW 操作,例如发送或接收静态文件资产、处理多个客户端或与长固定连接——尽管由于有许多现成的库,也有这样的应用程序服务器可用。
在大多数设置中,一个或多个应用程序服务器(例如 Passenger、Unicorn、Puma、Thin 等)被放置在适当的 HTTP / WWW 服务器后面(例如 Nginx、Apache 等),首先负责处理和处理所有传入连接,然后再将其传递到下一个级别。 这允许服务资产(例如 javascript 文件、图像等)非常高效,同时最大限度地利用两个应用程序的功能并保持客户端在线(即 不丢弃连接)和处理应用层内的请求。
注意: 要了解不同的 Ruby Web 应用程序服务器并了解 Rack 是什么,请查看我们的文章 A Comparison of (Rack) Web Servers for Ruby Web Applications ]。
机架中间件
机架 中间件 实现了 机架规范 ,它通过将传入的 HTTP 请求分成不同的流水线阶段并分块处理它们,直到它发回来自您的 Web 应用程序(控制器)的响应。 它有两个不同的组件,一个 Handler 和一个 Adapter,分别用于与 Web 服务器和应用程序(框架)进行通信。
关于基于 Ruby 的框架,Web 应用程序服务器通过实现 Rack 规范/接口并通过 config.ru
文件连接到您的应用程序,将您的应用程序作为对象调用(和导入)来完成他们的工作。
Phusion 乘客应用服务器
Passenger 是一款成熟、功能丰富的产品,旨在满足应用部署的必要需求和领域,同时大大简化设置和启动程序。 它通过直接与 Nginx(和 Apache)反向代理集成,消除了传统的 middleman 架构。
这个非常流行的工具可以广泛用于许多生产场景。 乘客的开源版本(我们将使用的)具有多进程单线程操作模式。 它的企业版可以根据您的需要配置为单线程或多线程工作。
如需了解Passenger的更多信息,您可以访问其官网https://www.phusionpassenger.com/。
独角兽应用服务器
Unicorn 是一个非常成熟的基于 Ruby/Rack 的 Web 应用程序的 Web 应用程序服务器。 它功能齐全; 但是,它拒绝通过设计尝试做所有事情:Unicorn 的负责人正在做需要由 Web 应用程序服务器完成的事情并委派其余的职责(例如 操作系统)。
Unicorn 的主进程会根据您的要求生成工作人员来服务请求。 此过程还监视工作人员,以防止与内存和进程相关的惊人问题。 对于系统管理员来说,这意味着如果(例如)完成任务需要太多时间或发生内存问题,它将终止进程。
如上所述,Unicorn 委派任务的领域之一是使用操作系统进行负载平衡。 这允许请求 not 堆积起来对抗产生的繁忙工作人员。
HTTP / WWW 服务器
Apache HTTP 服务器
Apache 是一个 HTTP 服务器,此时不需要任何介绍。 它一直是世界上最流行的 HTTP 服务器,它是一个非常成熟、功能丰富且高度可配置的产品,运行和运行都非常好。 在本文中,我们将使用和使用的前端服务器之一是 Apache,我们将了解它如何与 Phusion Passenger 应用程序服务器集成。
作为前端反向代理运行的 Nginx HTTP 服务器
Nginx 被设计成一个多用途的 HTTP 服务器。 它能够提供静态文件(例如 图片,文本文件等)非常好,平衡连接并处理某些漏洞尝试。 它充当所有请求的第一个入口点,并将它们传递给Passenger,以便Web 应用程序处理并返回响应。
它是一个非常高性能的 web 服务器 / (reverse)-proxy,相对容易使用和扩展(带有附加组件和插件)。 由于其架构,Nginx 能够处理 很多 的请求(实际上是无限的),这取决于您的应用程序或网站负载 - 使用其他一些较旧的替代方案可能真的很难解决。
记住:“处理”连接在技术上意味着不丢弃它们并能够为它们提供服务。 您仍然需要您的应用程序 [服务器] 和数据库运行良好,以便让 Nginx 为客户端的响应提供非错误消息。
要了解更多关于 Nginx 的信息,您可以访问位于 nginx.com 的官方网站。
安装
在决定了您希望使用哪种服务器组合之后,下一步就是在您希望应用程序运行的 Droplet 上实际安装并准备好它们。
阿帕奇和乘客组合
注意:在安装Apache和Passenger之前,如果你安装了Nginx,请确保禁用(或删除)它; 或将其配置为不阻止 Apache 的方式(即 端口/套接字冲突)。
注意: 如果你的 Droplet 的 RAM 小于 1 GB,你需要执行以下简单的过程来准备一个 SWAP 磁盘空间用作临时数据持有者(即 RAM 替代品) 用于乘客 。 由于 DigitalOcean 虚拟服务器带有快速 SSD 磁盘,因此在执行服务器应用程序安装任务时这并不真正构成问题。
# Create a 1024 MB SWAP space # The process should complete within less than a minute sudo dd if=/dev/zero of=/swap bs=1M count=1024 sudo mkswap /swap sudo swapon /swap
我们将首先使用Passenger 所需的工具准备系统,从而开始获得Apache 和Passenger 的组合。
这些工具包括以下内容:
- 支持 SSL 的 Curl 开发标头
- 阿帕奇 2
- Apache 2 开发头文件
- Apache Portable Runtime (APR) 开发标头
- Apache Portable Runtime Utility (APU) 开发头文件
让我们按照乘客官方文档的建议方法,一一获取它们:
# Install cURL development headers with SSL support: apt-get install libcurl4-openssl-dev # Apache 2: apt-get install apache2-mpm-worker # Apache 2 development headers: apt-get install apache2-threaded-dev # And finally, Apache PRU (APU) development headers: apt-get install libapr1-dev
接下来,让我们使用 RubyGems 的 gem
下载并安装Passenger:
gem install passenger # This method of installing Passenger will use # the available and activated Ruby interpreter. # However, the installation will be available for # all Ruby versions' use.
一旦我们准备好所有必要的元素,我们就可以得到胶水层(即 模块),这将允许 Apache 和Passenger 耦合并一起工作。
通过运行以下命令开始安装过程:
passenger-install-apache2-module # Here's what you can expect from the installation process: # 1. The Apache 2 module will be installed for you. # 2. You'll learn how to configure Apache. # 3. You'll learn how to deploy a Ruby on Rails application. # ..
按 Enter 继续。
现在安装程序将要求您选择要使用的编程语言。 使用箭头键向下滚动并使用空格键选择适合您使用的内容。 由于我们的目标是部署 Sinatra,因此我们的选择将仅涵盖 Ruby。
Which languages are you interested in? Use <space> to select. If the menu doesn't display correctly, ensure that your terminal supports UTF-8. ‣ ⬢ Ruby ⬡ Python ⬡ Node.js ⬡ Meteor
做出选择后,按 Enter 进入下一步。
现在安装程序将开始编译 Apache 模块。
注意: 这一点可能需要一小会儿——通常是几分钟。
Nginx 与独角兽的结合
注意: 在使用 Unicorn 安装 Nginx 之前,请确保禁用(或删除)Apache,或者将其配置为不阻塞 Nginx(即 端口/套接字冲突)。
注意: 如果您受到系统资源的限制(例如 您可用的 RAM 量),您可能希望选择此组合来部署您的应用程序。
Nginx 和 Unicorn 一起为 Web 应用程序部署提供了很好的组合。 正如我们之前所讨论的,Unicorn 是一个了不起的服务器,它以智能的方式工作,并让用户使用所有可用的系统工具来处理这项工作 - ,它做得很好!
我们将通过首先获取 Nginx 来开始安装过程。 默认系统包管理器 aptitude
(或 apt-get
)将能够为我们下载和安装 Nginx。
运行以下命令以使用 aptitude
下载并安装 Nginx:
aptitude install nginx
一旦我们准备好 Nginx,下一步就是获取 Unicorn Web 应用程序服务器,RubyGems 包管理器使这很容易。
运行以下命令以使用 gem
下载并安装 Unicorn:
gem install unicorn
配置
在本节中,我们将了解如何配置 和 服务器组合以使我们的应用程序联机。 您应该记住,尽管进行了营销努力,但只要您正确配置它们并拥有足够的系统资源来支持它们,您就能够部署任意数量的 Web 应用程序。
注意: 请记住,在继续(并应用)以下设置之前,您应该从上面的 Web 应用程序/HTTP 服务器组合中选择一个或另一个。
阿帕奇和乘客组合
安装完 Apache、Passenger 和 Passenger 的 Apache 模块后,您将看到一条标题为差不多就在那里的消息!
请编辑您的 Apache 配置文件并添加以下行:
LoadModule 乘客模块 /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so PassengerRoot /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37 PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby
重新启动 Apache 后,您就可以在 Apache 上部署任意数量的 Web 应用程序了,而且配置最少!
因此,按照建议和建议,让我们将配置块添加到我们的 Apache 配置文件中。
运行以下命令以使用 nano 文本编辑器编辑 Apache 配置文件:
nano /etc/apache2/apache2.conf
将以下文本块添加到您认为合适的位置,而不影响其他配置:
LoadModule passenger_module /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so <IfModule mod_passenger.c> PassengerRoot /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37 PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby </IfModule>
按 CTRL+X 并用 Y 确认保存并退出。
注意:以上配置必须保持原样。 它的参数以在相关位置 (/usr/local/rvm/gems/ruby-2.1.0/..
) 使用相关 Ruby 版本(在第一个 Sinatra 教程中安装的 2.1.0
)的方式定义。
接下来,我们需要按照安装程序的建议定义 应用程序 :
部署 Web 应用程序:示例
假设您在 /somewhere 中有一个 Web 应用程序。 将虚拟主机添加到 Apache 配置文件并将其 DocumentRoot 设置为 /somewhere/public:
服务器名称 www.yourhost.com #!!! 请务必将 DocumentRoot 指向“public”! DocumentRoot /somewhere/public
- 这放宽了 Apache 的安全设置。 AllowOverride all #MultiViews 必须关闭。 选项 - 多视图
你可以在任何你喜欢的地方部署你的; 但是,可以认为是一个很好的例子是使用:
- 用户的子目录,用于部署,或者;
- 使用一般的
/var/www
位置,就像我们过去所做的那样。
注意: 对于下一步的配置,我们将使用上一个 Sinatra/Ruby 2.1.0 教程中的示例应用程序。
为了让 Apache 知道我们的应用程序并让Passenger 运行它,我们需要定义一个虚拟主机。 为此,我们将在 /etc/apache2/sites-available
目录中创建一个文件。
让我们使用 nano 创建一个名为 my_app
的空配置文件:
注意: 您可以根据自己的需要命名此文件以匹配您的应用程序设置。
nano /etc/apache2/sites-available/my_app.conf
将内容放在下面,修改它们以适合您的应用程序部署目录:
<VirtualHost *:80> # ServerName [!! Your domain OR droplet's IP] ServerName 162.243.74.190 # !!! Be sure to point DocumentRoot to 'public'! # DocumentRoot [root to your app./public] DocumentRoot /var/www/my_app/public # Directory [root to your app./public] <Directory /var/www/my_app/public> # This relaxes Apache security settings. AllowOverride all # MultiViews must be turned off. Options -MultiViews </Directory> </VirtualHost>
按 CTRL+X 并用 Y 确认保存并退出。
现在我们可以将新站点配置添加到 Apache:
# Usage sudo a2ensite [configuration name without .conf extension] sudo a2ensite my_app
并重新加载:
service apache2 reload service apache2 restart
您的 Web 应用程序现在应该是活跃的并且在线的。 访问你的Droplet的IP地址或你在ServerName
配置下重定向和定义的域:
http://162.243.74.190/ # Hello world!
注意: 如果您选择使用域名,您应该使用以下命令将其添加到您的 /etc/hosts
文件中:
nano /etc/hosts
并将您的域附加到列表中:
# 127.0.0.1 [domain.tld] # 127.0.0.1 [www.domain.tld] 127.0.0.1 example.com 127.0.0.1 www.example.com
Nginx 与独角兽的结合
Unicorn 可以通过多种方式进行配置。 对于本教程,重点关注关键元素,我们将从头开始创建一个文件,Unicorn 在启动应用程序服务器守护程序时将使用该文件。
打开一个空白的 unicorn.rb
文档,该文档将保存在应用程序目录(/var/www/my_app
)目录中:
nano unicorn.rb
放置以下代码块,根据需要进行修改:
# Set the working application directory # working_directory "/path/to/your/app" working_directory "/var/www/my_app" # Unicorn PID file location # pid "/path/to/pids/unicorn.pid" pid "/var/www/my_app/pids/unicorn.pid" # Path to logs # stderr_path "/path/to/logs/unicorn.log" # stdout_path "/path/to/logs/unicorn.log" stderr_path "/var/www/my_app/logs/unicorn.log" stdout_path "/var/www/my_app/logs/unicorn.log" # Unicorn socket # listen "/tmp/unicorn.[app name].sock" listen "/tmp/unicorn.myapp.sock" # Number of processes # worker_processes 4 worker_processes 2 # Time-out timeout 30
按 CTRL+X 并用 Y 确认保存并退出。
注意: 要简单地使用 Unicorn 测试您的应用程序,您可以在应用程序目录中运行 unicorn
。
接下来,我们需要告诉 Nginx 如何与 Unicorn 对话。 为此,在此级别编辑默认配置文件就足够了:default.conf
并将 nginx.conf
保留为提供状态 - 已设置为包含默认配置。
# Remove the default configuration file rm -v /etc/nginx/sites-available/default # Create a new, blank configuration nano /etc/nginx/conf.d/default.conf
用下面的内容替换文件内容,再次修改必要的位以满足您的需要:
upstream app { # Path to Unicorn SOCK file, as defined previously server unix:/tmp/unicorn.myapp.sock fail_timeout=0; } server { listen 80; # Set the server name, similar to Apache's settings server_name localhost; # Application root, as defined previously root /var/www/my_app/public; try_files $uri/index.html $uri @app; location @app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app; } error_page 500 502 503 504 /500.html; client_max_body_size 4G; keepalive_timeout 10; }
按 CTRL+X 并用 Y 确认保存并退出。
注意:想了解更多关于Nginx的知识,可以参考如何在VPS上配置Nginx Web服务器。
让我们启动 Unicorn 并使用配置文件将其作为守护进程运行:
# Make sure that you are inside the application directory # i.e. /my_app unicorn -c unicorn.rb -D
接下来,我们准备重新加载并重启 Nginx:
service nginx restart
就是这样! 您现在可以通过转到您的 Droplet 的 IP 地址(或与之关联的域名)来检查您的部署。
http://162.243.74.190/ # Hello world!
延伸阅读
防火墙:
保护 SSH:
如何在 Ubuntu 上使用 fail2ban 保护 SSH 如何在 CentOS 6 上使用 fail2ban 保护 SSH
创建警报:
如何在 CentOS VPS 上发送电子邮件警报以进行系统监控
每天监控和观察服务器访问日志: