複数のドロップレット間でRubyonRailsアプリケーションをスケーリングする方法(パート1)
序章
おめでとうございます。 あなたのウェブサイトは勢いを増していて、あなたは急速に成長しています。 Rubyはあなたが選んだプログラミング言語であり、Railsですか? あなたの頼りになるフレームワーク。今、あなたはあなたの努力の恩恵を享受し、あなたの素晴らしいアプリのおかげであなたの幸せなクライアントの喜びを分かち合っています。
しかし、あなたは新しい挑戦に直面して心配し始めています:あなたの増え続けるゲストの数に対応すること(すなわち スケーリング)。
この件に関する論争にもかかわらず、非常に忙しいWebサイト(RubyとRailsを利用)を運営している場合でも、タイムリーにクライアントにサービスを提供し続けることができます。 これを達成するための鍵は、アプリケーションをスケーリングすること、つまり、この正確なタスクだけを処理するように調整された複数の液滴に負荷を分散することです。
このDigitalOceanの記事では、Ruby on Railsアプリケーションを水平方向に単純にスケーリングし、Unicornで実行されている複数のマシンに負荷を分散し、NginxHTTPサーバーを実行しているマスターロードバランサーの背後に慎重にセットアップし、着信リクエストを歓迎して処理する方法を説明します。負荷分散。
このチュートリアルでは、アプリを複数のサーバーに配布する方法について説明します。 ただし、アプリを完全にデプロイするには、データベースを使用してアプリを設定する必要があります。 これらのシリーズの次の記事では、サーバーをMySQLまたはPostgreSQLデータベースに接続する方法について説明します。
用語集
1. スケーラブルなアプリケーション展開
- Unicornアプリケーションサーバー
- NginxHTTPサーバー/リバースプロキシ/ロードバランサー
- 導入準備プロセス
- 最終的なアーキテクチャ
2. サーバーとオペレーティングシステムの準備
3. アプリケーションサーバーのセットアップ
- Ruby環境のセットアップ
- レールの設定
- Unicornのインストール
- サンプルRailsアプリケーションの作成
- Unicornの構成
- ユニコーンの実行
- Nginxを構成するためのサーバーのIPアドレスの検索
4. Nginxをリバースプロキシおよびロードバランサーとして設定する
- Nginxのセットアップ
- Nginxの構成
スケーラブルなアプリケーション展開
アプリケーションを展開したり、オンラインで公開したりすると、技術的にはさまざまなことを意味し、プロセス自体はさまざまなレベルで実行される可能性があります。 これまで、さまざまなサーバーを使用してRailsアプリケーションをデプロイする複数の方法について説明してきました(つまり、 Unicorn and Passenger)、そして仕事のためにさまざまなツールを使用してプロセスを自動化する方法を見ました(例: キャピストラーノとミナ)。
[単純に]スケーラブルなアーキテクチャを実現するために、デプロイメント構造を2つの主要な要素に分割します。
- アプリケーションサーバー(ユニコーン/レール)
- 前面のHTTPサーバー/ロードバランサー(Nginx)
Unicornアプリケーションサーバーを優先する主な理由は、その高度な機能と、実装および保守が簡単な方法であるためです。
非常に人気のあるNginxHTTPサーバーとリバースプロキシがロードバランサーとなり、Unicornベースのアプリケーションサーバー間で負荷を分散します。
したがって、2つの異なる領域を別々にカバーします。
- Unicornを実行するRailsアプリケーションサーバーの準備(およびデプロイ)。
- Nginxベースの前面、負荷分散リバースプロキシを準備して、Unicorn全体に負荷を分散します。
以前のマニュアルや記事と同様に、CentOSオペレーティングシステムの最新バージョンを引き続き使用して、シンプルさと安定性の目標に完全に一致する設計を選択します。
注:この記事を読み進めると、特定の主題についてさらに深く議論している他の人へのリンクが表示されます。 それらについてもっと知りたい場合は、それらをチェックすることを検討してください。
Unicornアプリケーションサーバー
Unicornは、着信要求を処理するためのRailsアプリケーションを含む注目に値するアプリケーションサーバーです。 これらのアプリケーションサーバーは、ロードバランサーとして機能する前面のNginxサーバーによってフィルタリングおよび前処理された後、処理が必要なリクエストのみを処理します。
非常に成熟したWebアプリケーションサーバーとして、Unicornは完全な機能を備えています。 設計上、すべてを実行しようとすることを拒否し、Webアプリケーションで実行する必要があることだけを処理し、残りの責任をオペレーティングシステムに委任します(つまり、 ジャグリングプロセス)。
Unicornのmasterプロセスは、workerを生成してリクエストを処理します。 このプロセスは、メモリとプロセスに関連するよろめきの問題を防ぐために、ワーカーも監視します。 これがシステム管理者にとって意味することは、たとえば、タスクの完了に時間がかかりすぎたり、メモリの問題が発生したりした場合に、プロセスを強制終了することです。
注:さまざまなRuby Webアプリケーションサーバーについて学び、 Rack とは何かを理解するには、記事 Ruby Webアプリケーション用の(Rack)Webサーバーの比較を確認してください。 ]。
NginxHTTPサーバー/リバースプロキシ/ロードバランサー
Nginx HTTPサーバーは、多目的の前面Webサーバーとして機能するようにゼロから設計されています。 静的ファイルを提供できます(例: 画像、テキストファイルなど)非常にうまく接続のバランスを取り、特定のエクスプロイトの試みに対処します。 これは、すべてのリクエストの最初のエントリポイントとして機能し、Unicornを実行しているWebアプリケーションサーバーを処理するためにそれらを配布します。
導入準備プロセス
次のセクションから始めて、次の手順を実行して、分散型の負荷分散されたアプリケーション展開のセットアップを準備します。
- オペレーティングシステムを更新する[*]
- 展開に必要な基本ツールを入手する[*]
- Ruby、Rails、ライブラリをインストールする
- アプリケーションをインストールします(つまり Unicorn)およびHTTPサーバー(Nginx)
- TCPの負荷を分散するようにNginxを構成する
注:リストのマークされた項目は、アプリケーションサーバーまたはロードバランサーとして指定された役割に関係なく、プロビジョニングされたすべてのサーバーで実行する必要がある手順です。
最終的なアーキテクチャ
以下は、液滴全体に負荷を分散し、水平方向にスケーリングするための最終的なアーキテクチャの例です。
Client Request ----> Nginx (Reverse-Proxy / Load-Balancer) | /|\ | | `-> App. Server I. 10.128.xxx.yy1:8080 # Our example | `--> App. Server II. 10.128.xxx.yy2:8080 `----> ..
サーバーとオペレーティングシステムの準備
UnicornまたはNginxを実行するすべてのサーバーを準備することからセットアップの作成を開始します。
Rubyやその他の必要なアプリケーションをインストールするため(例: 私たちのサーバー)、最初に最小限に出荷されたCentOSドロップレットを準備し、必要になるいくつかの開発ツールを装備する必要があります。
次のコマンドを実行して、CentOSベースのドロップレットのデフォルトツールを更新します。
yum -y update
次のコマンドを実行して、いくつかの開発ツールを含むアプリケーションバンドルをインストールします。
yum groupinstall -y 'development tools'
このチュートリアルに必要なパッケージの一部(例: libyaml-devel、nginxなど)は、公式のCentOSリポジトリ内に見つかりません。 物事を単純化し、手動でインストールする必要がないように、YUMパッケージマネージャーが使用するEPELソフトウェアリポジトリを追加します。
# Enable EPEL Repository sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm' # Update everything, once more. yum -y update
最後に、このチュートリアル用にcurl-devel
と他のいくつかのツールとライブラリを入手する必要があります(例: Railsにはsqlite-develが必要です)。
それらをインストールするには、以下を実行します。
yum install -y curl-devel nano sqlite-devel libyaml-devel
アプリケーションサーバーのセットアップ
このステップでは、UnicornアプリケーションサーバーでRailsを実行するサーバーを準備します。
RubyとRailsの準備から始めましょう。
Ruby環境のセットアップ
注:このセクションは、専用の記事 CentOS6.5にRuby2.1.0をインストールする方法の要約です。
注:すべてのアプリケーションサーバーで、前のセクションの手順と以下の手順を実行する必要があります。 最低限、アプリをデプロイするにはoneアプリケーションサーバーが必要です。 負荷のバランスをとるために、より多くの液滴をプロビジョニングし、これらの手順を繰り返します。
Rubyバージョンマネージャー(RVM)を使用して、Rubyインタープリターをダウンロードしてインストールします。
次の2つのコマンドを実行して、RVMをインストールし、Rubyのシステム環境を作成します。
curl -L get.rvm.io | bash -s stable source /etc/profile.d/rvm.sh
最後に、システムへのRubyのインストールを完了するために、RVMにRubyバージョン2.1.0をダウンロードしてインストールさせましょう。
rvm reload rvm install 2.1.0
レールの設定
Railsが機能するには、何よりもまずJavaScriptインタープリターが必要なので、Node.js
も設定する必要があります。 この目的のために、デフォルトのシステムパッケージマネージャーYUMを使用します。
以下を実行して、yumを使用してnodejs
をダウンロードしてインストールします。
yum install -y nodejs
次のコマンドを実行して、gemを使用してrails
をダウンロードしてインストールします。
gem install bundler rails
Unicornのインストール
Unicornを簡単にダウンロードする方法はいくつかあります。 これはアプリケーション関連の依存関係であるため、最も論理的な方法はRubyGemsを使用することです。
次のコマンドを実行して、gem
を使用してUnicornをダウンロードしてインストールします。
gem install unicorn
注:このツールの操作方法については、次のセクションで説明します。
サンプルRailsアプリケーションの作成
注:この例を機能させるために、基本的なRailsアプリケーションを作成します。 を実行するには、代わりにアプリケーションソースをアップロードする必要があります。
ソースコードのアップロード
もちろん、実際の展開では、コードベースをサーバーにアップロードする必要があります。 この目的のために、SFTPまたはFileZillaなどのグラフィカルツールを使用して、リモートファイルを安全に転送および管理できます。 同様に、GitとGithubなどの中央リポジトリを使用して、コードをダウンロードして設定できます。
- SFTPの操作については、SFTPの使用方法の記事を参照してください。
* FileZillaについて学ぶには、このテーマに関する記事FileZillaの使用方法を確認してください。
Unicornで使用するために、ホームディレクトリ内に非常に基本的なRailsアプリケーションを作成することから始めましょう。
次のコマンドを実行して、Railsにmy_appという新しいアプリケーションを作成させます。
# Create a sample Rails application cd /var mkdir www cd www rails new my_app # Enter the application directory cd my_app # Create a sample resource rails generate scaffold Task title:string note:text # Create a sample database RAILS_ENV=development rake db:migrate RAILS_ENV=production rake db:migrate # Create a directory to hold the PID files mkdir pids
アプリケーションが正しく設定され、すべてが正常に機能していることをテストするには、appディレクトリに入り、rails s
を使用して単純なサーバーを実行します。
# Enter the application directory cd /var/www/my_app # Run a simple server rails s # You should now be able to access it by # visiting: http://[your droplet's IP]:3000/tasks # In order to terminate the server process, # Press CTRL+C
Unicornの構成
ユニコーンはさまざまな方法で構成できます。 このチュートリアルでは、主要な要素に焦点を当てて、アプリケーションサーバーデーモンプロセスを開始するときにUnicornが使用するファイルを最初から作成します。
空白のunicorn.rb
ドキュメントを開きます。このドキュメントは、nano
テキストエディタを使用してconfig/
ディレクトリ内に保存されます。
nano config/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/log/unicorn.log" # stdout_path "/path/to/log/unicorn.log" stderr_path "/var/www/my_app/log/unicorn.log" stdout_path "/var/www/my_app/log/unicorn.log" # Number of processes # Rule of thumb: 2x per CPU core available # worker_processes 4 worker_processes 2 # Time-out timeout 30
CTRL + Xを押し、Yで確定して、保存して終了します。
注: Unicornを使用してアプリケーションをテストするだけで、アプリケーションディレクトリ内でunicorn_rails
を実行できます。
注: Unicornの構成の詳細については、公式ドキュメントページこちらをご覧ください。
ユニコーンの実行
Unicornを使用してアプリケーションを実行する準備が整いました。
以下を実行して、構成ファイル(config/unicorn.rb
)を使用してデーモンモードでUnicornを起動します。
unicorn_rails -c config/unicorn.rb -D
Nginxを構成するためのサーバーのIPアドレスの検索
仮想サーバーのプライベートネットワーク/プライベートIPアドレスを見つけましょう。
次のコマンドを実行して、サーバーのプライベートIPアドレスを表示します。
ifconfig
サンプル出力:
eth0 Link encap:Ethernet HWaddr 04:01:10:4B:B8:01 inet addr:107.170.13.134 Bcast:107.170.13.255 Mask:255.255.255.0 inet6 addr: fe80::601:10ff:fe4b:b801/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:164298 errors:0 dropped:0 overruns:0 frame:0 TX packets:46316 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:230223345 (219.5 MiB) TX bytes:4969058 (4.7 MiB) eth1 Link encap:Ethernet HWaddr 04:01:10:4B:B8:02 inet addr:10.128.241.135 Bcast:10.128.255.255 Mask:255.255.0.0 inet6 addr: fe80::601:10ff:fe4b:b802/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:120 errors:0 dropped:0 overruns:0 frame:0 TX packets:13 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6810 (6.6 KiB) TX bytes:874 (874.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
ここでの2番目の情報は、eth1
で始まり、inet adde:
で続き、サーバーに割り当てられた private IPアドレス(この場合は10.128.241.135
)を示しています。 。
このIPアドレスを使用して、Nginxがアプリケーションサーバーと通信できるようにします。
このアドレスをメモし、次の手順に進んでNginxをセットアップして構成します。
注: DigitalOceanでのプライベートネットワーキングの詳細については、コミュニティ記事セクションのDigitalOceanプライベートネットワーキングのセットアップと使用方法チュートリアルをご覧ください。
Nginxをリバースプロキシおよびロードバランサーとして設定する
このセクションでは、前面サーバーで作業し、着信要求を歓迎し、アプリケーションサーバー間で負荷を分散するようにNginxを設定します。
Nginxのセットアップ
EPELリポジトリが有効になっているため、yumを使用してNginxを取得できます。
以下を実行して、yumを使用してNginxをダウンロードしてインストールします。
yum install -y nginx
Nginxの構成
Nginxをインストールしたら、次のステップは、デフォルトで/etc/nginx
にある構成ファイルnginx.conf
を使用することです。
以下のコマンドを実行して、nano
テキストエディタを使用してこのファイルの編集を開始します。
nano /etc/nginx/nginx.conf
ファイルの下を下にスクロールして、次の行をコメントアウトします。
# Before: include /etc/nginx/conf.d/*.conf; # After: # include /etc/nginx/conf.d/*.conf;
http {
ノード内に、次の構成を追加し、独自のセットアップに合わせて変更します。
# Set your server # server_name www.example.com; upstream unicorn_servers { # Add a list of your application servers # Each server defined on its own line # Example: # server IP.ADDR:PORT fail_timeout=0; server 10.128.241.135:8080 fail_timeout=0; # server 10.128.241.136:8080 fail_timeout=0; # server 10.128.241.137:8080 fail_timeout=0; } server { # Port to listen on listen 80; location / { # Set proxy headers proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://unicorn_servers; } }
CTRL + Xを押し、Yで確定して、保存して終了します。
開始するには、次のコマンドを使用してNginxデーモンを実行します。
service nginx start
構成ファイルを変更した後、次の方法でサーバーを再起動できます。
service nginx restart
注:静的ファイルを提供するための詳細な構成とディレクティブの設定については、公式のUnicornnginx.confの例をご覧ください。