SinatraベースのRubyWebアプリケーションをUbuntu13にデプロイする方法
序章
Sinatraは、誇示するのが好きではない簡潔なフレームワークです。 開発者に何も強制することなく、仕事を終わらせます。 この素晴らしい小さなツールを使用して開発されたアプリケーションを使用する場合、同じロジックが適用され、複数の選択肢があります。 それぞれがほぼ同じように機能します。不必要な複雑さを伴わずにジョブを実行します。
このDigitalOceanの記事では、最初の記事に続いて Ubuntu13のRuby2.1とSinatra チュートリアルでは、Sinatraアプリケーションを隠しボックスから取り出し、さまざまな(そして興味深い)テクノロジーと方法を使用して[Ubuntuで]世界と共有するためのいくつかの異なる方法を学びます。
用語集
1. アプリケーションの展開
2. アプリケーションサーバー
- ラックミドルウェア
- Phusion Passenger Application Server
- Unicornアプリケーションサーバー
3. HTTP/WWWサーバー
- ApacheHTTPサーバー
- フロントエンドリバースプロキシとして実行されているNginxHTTPサーバー
4. インストール
- アパッチと乗客の組み合わせ
- Nginxとユニコーンの組み合わせ
ノート: この記事の例は、慣例により、Ubuntu 13での最初のSinatra&Ruby2.1.0の記事に基づいています。 フレームワークの使用を開始する方法や、Ruby 2.1.0とSinatraを使用してオペレーティングシステムを準備する方法について詳しく知りたい場合は、この記事を続ける前に、フレームワークを確認することを検討してください。
アプリケーションの展開
アプリケーションのデプロイ(Webサイト、API、サーバーに関係なく)は通常、システムを最初から(または時間内に取得したスナップショットから)セットアップし、すべてを更新して準備し、依存関係をダウンロードし、ファイル構造をセットアップすることを意味します最後にコードベースをアップロードするか、 Git などのソース管理マネージャー(SCM)を使用してコードベースをダウンロードします。
Sinatraの設計インセンティブに従って、物事を可能な限りシンプルかつ可能な限り維持し、ここでの展開例では、試行錯誤された、使いやすい方法を使用します。 私たちは、信頼できる信頼できるツールを使用して、仕事を処理し、それらの違いについて学びます。
アプリケーションサーバー
「アプリケーションサーバー」という用語は、アプリケーション(つまり、 サーバー)、(通常)別のアプリケーションが含まれています(例: あなたのウェブアプリケーション)そして特定の仕様とインターフェースに従う(すなわち 共通言語)、含まれているアプリケーションが外界と通信できるようにします。
これらのツールは、通常、ビジネスロジック(手順の実行)のみを処理することを目的としており、静的ファイルアセットの送受信、複数のクライアントの処理、長時間の競合など、他のHTTP/WWW操作を対象としていません。永続的な接続–ただし、すぐに利用できる多くのライブラリのおかげで、そのようなアプリケーションサーバーも利用できます。
ほとんどのセットアップでは、1つ以上のアプリケーションサーバー(例: Passenger、Unicorn、Puma、Thinなど)は、適切なHTTP / WWWサーバーの背後に配置されます(例: Nginx、Apacheなど)、次のレベルに渡す前に、最初にすべての着信接続を処理および処理するタスクを実行します。 これにより、アセットの提供が可能になります(例: javascriptファイル、画像など)は非常に効率的であると同時に、両方のアプリケーションの機能を最大限に活用し、クライアントをオンラインに保ちます(つまり、 接続をドロップしない)およびアプリケーション層内の要求の処理。
注:さまざまなRuby Webアプリケーションサーバーについて学び、 Rack とは何かを理解するには、記事 Ruby Webアプリケーション用の(Rack)Webサーバーの比較を確認してください。 ]。
ラックミドルウェア
ラックミドルウェアは、ラック仕様を実装し、着信HTTPリクエストをさまざまなパイプラインステージに分割して機能し、Webアプリケーション(コントローラー)からの応答を返すまでそれらを分割して処理します。 ハンドラーとアダプターの2つの異なるコンポーネントがあり、それぞれWebサーバーおよびアプリケーション(フレームワーク)との通信に使用されます。
Rubyベースのフレームワークに関しては、Webアプリケーションサーバーは、Rack仕様/インターフェイスを実装し、config.ru
ファイルを介してアプリケーションに接続し、アプリケーションをオブジェクトとして呼び出し(およびインポート)することで機能します。
Phusion Passenger Application Server
Passengerは、セットアップと開始手順を大幅に簡素化しながら、必要なニーズとアプリケーション展開の領域をカバーすることを目的とした、成熟した機能豊富な製品です。 Nginx(およびApache)リバースプロキシと直接統合することにより、従来のミドルマンアーキテクチャを排除します。
この非常に人気のあるツールは、多くの実稼働シナリオで広く使用できます。 オープンソースバージョンのPassenger(これから使用するもの)には、マルチプロセスのシングルスレッド操作モードがあります。 そのエンタープライズバージョンは、ニーズに応じて、シングルスレッドまたはマルチスレッドのいずれかで動作するように構成できます。
Passengerの詳細については、https://www.phusionpassenger.com/にある公式Webサイトにアクセスしてください。
Unicornアプリケーションサーバー
Unicornは、Ruby/RackベースのWebアプリケーション用の非常に成熟したWebアプリケーションサーバーです。 それは完全な機能を備えています。 ただし、設計上、すべてを実行しようとすることは拒否されます。Unicornのプリンシパルは、Webアプリケーションサーバーが実行する必要のあることを実行し、残りの責任を委任することです(例: オペレーティングシステム)。
Unicornのマスタープロセスは、要件に従って、リクエストを処理するためにワーカーを生成します。 このプロセスでは、メモリとプロセスに関連するよろめきの問題を防ぐために、ワーカーも監視します。 これがシステム管理者にとって意味することは、(たとえば)タスクの完了に時間がかかりすぎたり、メモリの問題が発生したりすると、プロセスが強制終了されるということです。
前述のように、Unicornがタスクを委任する領域の1つは、負荷分散にオペレーティングシステムを使用することです。 これにより、ではなくの要求が、生成されたビジーなワーカーに対して積み重なることができます。
HTTP/WWWサーバー
ApacheHTTPサーバー
ApacheはHTTPサーバーであり、現時点では実際に導入する必要はありません。 これは世界で最も人気のあるHTTPサーバーであり、非常に成熟した、機能が豊富で、高度に構成可能な製品であり、非常にうまく動作します。 この記事では、使用する前面サーバーの1つがApacheであり、PhusionPassengerアプリケーションサーバーとどのように統合されるかを確認します。
フロントエンドリバースプロキシとして実行されているNginxHTTPサーバー
Nginxは、多目的HTTPサーバーとして機能するようにゼロから設計されています。 静的ファイルを提供できます(例: 画像、テキストファイルなど)非常にうまく接続のバランスを取り、特定のエクスプロイトの試みに対処します。 これは、すべての要求の最初のエントリポイントとして機能し、Webアプリケーションが応答を処理して返すためにそれらをPassengerに渡します。
これは非常に高性能なWebサーバー/(リバース)-プロキシであり、比較的操作が簡単で、拡張も簡単です(アドオンとプラグインを使用)。 そのアーキテクチャのおかげで、Nginxは多くのリクエスト(実質的に無制限)を処理できます。これは、アプリケーションやWebサイトの負荷によっては、他の古い代替手段を使用して対処するのが非常に難しい場合があります。
覚えておいてください:接続を「処理する」とは、技術的には、接続を削除せず、何かを提供できることを意味します。 Nginxにエラーメッセージではないクライアントの応答を提供させるには、アプリケーション[サーバー]とデータベースが正常に機能している必要があります。
Nginxの詳細については、nginx.comにある公式Webサイトにアクセスしてください。
インストール
使用するサーバーの組み合わせを決定したら、次のステップでは、実際にサーバーをインストールして、アプリケーションで実行するドロップレットに準備します。
アパッチと乗客の組み合わせ
注: ApacheとPassengerをインストールする前に、Nginxがインストールされている場合は、必ず無効化(または削除)してください。 または、Apacheの方法をブロックしないように構成します(つまり、 ポート/ソケットの衝突)。
注:ドロップレットの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開発ヘッダー
-
Apache 2
-
Apache2開発ヘッダー
-
Apache Portable Runtime(APR)開発ヘッダー
-
Apache Portable Runtime Utility(APU)開発ヘッダー
公式の乗客用ドキュメントの提案された方法に従って、それらを1つずつ取得しましょう。
# 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アプリケーションの展開に最適な組み合わせになります。 ユニコーンは、前に説明したように、スマートな方法で動作し、利用可能なすべてのシステムツールのユーザーがジョブを処理できるようにする素晴らしいサーバーです– そしてそれはうまくいきます!
最初にNginxを入手して、インストールプロセスを開始します。 デフォルトのシステムパッケージマネージャーaptitude
(またはapt-get
)は、Nginxをダウンロードしてインストールできるようになります。
次のコマンドを実行して、aptitude
を使用してNginxをダウンロードしてインストールします。
aptitude install nginx
Nginxの準備ができたら、次のステップはUnicorn Webアプリケーションサーバーを取得することです。これは、RubyGemsパッケージマネージャーによって簡単に実行できます。
次のコマンドを実行して、gem
を使用してUnicornをダウンロードしてインストールします。
gem install unicorn
構成
このセクションでは、両方のサーバーの組み合わせを構成してアプリケーションをオンラインにする方法を説明します。 マーケティング活動にもかかわらず、適切に構成し、それらをサポートするのに十分なシステムリソースがあれば、任意の数のWebアプリケーションを展開できることを覚えておく必要があります。
注:以下の設定を続行(および適用)する前に、上記のWebアプリケーション/HTTPサーバーの組み合わせからいずれかを選択する必要があることに注意してください。
Apacheと乗客の組み合わせ
Apache、Passenger、およびPassengerのApacheモジュールのインストールが完了すると、「Almost there!」というタイトルのメッセージが表示されます。
Apache構成ファイルを編集して、次の行を追加してください。
LoadModulepassenger_module/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をオフにする必要があります。 オプション-MultiViews
好きな場所にデプロイできます。 ただし、良い例と見なすことができるのは、次のいずれかを使用することです。
-
ユーザーのサブディレクトリ、展開用に設定、または;
-
過去に行ったように、一般的な
/var/www
の場所を使用します。
注:構成のこの次のステップでは、前のSinatra /Ruby2.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アプリケーションが有効でオンラインになっているはずです。 ドロップレットの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.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でNginxWebサーバーを構成する方法を参照してください。
Unicornを起動し、構成ファイルを使用してデーモンとして実行してみましょう。
# Make sure that you are inside the application directory
# i.e. /my_app
unicorn -c unicorn.rb -D
次に、Nginxをリロードして再起動する準備ができました。
service nginx restart
以上です! これで、ドロップレットのIPアドレス(またはそれに関連付けられたドメイン名)に移動して、デプロイメントをチェックアウトできます。
http://162.243.74.190/
# Hello world!
参考文献
ファイアウォール:
SSHの保護:
Ubuntuでfail2banを使用してSSHを保護する方法
CentOS6でfail2banを使用してSSHを保護する方法
アラートの作成:
システム監視のためにCentOSVPSで電子メールアラートを送信する方法
サーバーアクセスログを毎日監視および監視します。
LogwatchLogAnalyzerおよびReporterをインストールして使用する方法