CentOS6.5でUnicornとNginxを使用してRailsアプリをデプロイする方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンのCentOSについて説明します。 現在CentOS6を実行しているサーバーを運用している場合は、サポートされているバージョンのCentOSにアップグレードまたは移行することを強くお勧めします。
理由:
代わりに参照:このガイドは参照として役立つ場合がありますが、他のCentOSリリースでは機能しない場合があります。 可能な場合は、使用しているCentOSのバージョン用に作成されたガイドを使用することを強くお勧めします。
序章
シンプルに設計されたアプリケーションサーバーを使用すると、RailsベースのWebアプリケーションをデプロイするときに、わずか数分で稼働させることができます。 ただし、サーバーセットアップをより詳細に制御したい場合、またはより柔軟な新しいものを試したい場合は、コンポーネントの階層化されたセットを使用すると、将来性のある展開であるかどうかにかかわらず、目標を達成するのに役立ちます。キャッシングサーバーなどのサードパーティ要素を導入する必要があります。
このDigitalOceanの記事では、RailsベースのRubyWebアプリケーションをホストするためのマルチレイヤーデプロイメントインストールの組み立てについて見ていきます。 この配置では、Nginxの背後で実行されている非常に強力で柔軟性があり非常に成功しているUnicornアプリケーションサーバーを使用します。 デモンストレーションの目的でこの構造を単一のサーバー上に構築しますが、複数の液滴を簡単に使用して、物を広げたり、水平方向と垂直方向の両方で簡単にスケールアウトしたりできます。
用語集
1. Webアプリケーションの展開、サーバーとその役割
- Unicornアプリケーションサーバー
- フロントエンドリバースプロキシとして実行されているNginxHTTPサーバー
2. デプロイメントサーバーの準備
- オペレーティングシステムの更新と準備
- Ruby環境とRailsのセットアップ
- Nginxのインストール
- Unicornのインストール
3. デプロイメント用のRailsアプリケーションの準備
- サンプルアプリケーションの作成
- ソースコードのアップロード
4. サーバーの構成
- ユニコーン
- Nginx
- サーバーの管理
5. 参考文献
Webアプリケーションの展開、サーバーとその役割
Webアプリケーションのデプロイに関しては、通常、多数のアプリケーションが関係し、レイヤーにセットアップされ、相互に連携します。 この種の実際の展開設定は、機能や機能が不足しているために実際のWebサイトのトラフィックの負荷の下では機能しないため、テスト目的でのみ使用するように設計された単一の開発サーバーを使用する場合とは大きく異なります。
機能について言えば、それぞれが異なる機能を提供する人気のあるサーバーがいくつかあることに注意してください。単純さ、速度、そして複雑な本番環境のニーズに合わせてオプションを構成する可能性のあるすべてのものに焦点を当てています。
この記事では、アプリケーションサーバーの選択肢はUnicornです。 Unicornは、受信リクエストを処理するためのRailsアプリを含む、注目に値するアプリケーションサーバーです。できれば、NginxなどのフロントエンドHTTPサーバーでフィルタリングして送信した後です。
一方、Nginx HTTPサーバーは、多目的の前面Webサーバーとして機能するようにゼロから設計されています。 静的ファイルを提供できます(例: 画像、テキストファイルなど)非常にうまく接続のバランスを取り、特定のエクスプロイトの試みに対処します。 これは、すべての要求の最初のエントリポイントとして機能し、Webアプリケーションが応答を処理して返すためにそれらをUnicornに渡します。
注:さまざまなRuby Webアプリケーションサーバーについて学び、「ラック」とは何かを理解するには、記事 Ruby Webアプリケーション用の(ラック)Webサーバーの比較を確認してください。
Unicornアプリケーションサーバー
Unicornは、Ruby/RackベースのWebアプリケーション用の非常に成熟したWebアプリケーションサーバーです。 それは完全な機能を備えていますが、すべてを実行しようとする設計によって拒否されます。 Unicornのプリンシパルは、Webアプリケーションサーバーが実行する必要のあることを実行し、残りの責任を委任することです。
Unicornのmasterプロセスは、要件に応じて worker を生成し、リクエストを処理します。 このプロセスでは、メモリとプロセスに関連するよろめきの問題を防ぐために、ワーカーも監視します。 これがシステム管理者にとって意味することは、たとえば、タスクの完了に時間がかかりすぎたり、メモリの問題が発生したりすると、プロセスが強制終了されることです。
前述のように、Unicornがタスクを委任する領域の1つは、負荷分散にオペレーティングシステムを使用することです。 これにより、ではなくの要求が、生成されたビジーなワーカーに対して積み重なることができます。
フロントエンドリバースプロキシとして実行されているNginxHTTPサーバー
Nginxは、非常に高性能なWebサーバー/(リバース)プロキシです。 軽量で、操作が比較的簡単で、拡張も簡単なため(アドオン/プラグインを使用)、人気を博しています。 そのアーキテクチャのおかげで、多くのリクエスト(実質的に無制限)を処理できます。これは、アプリケーションやWebサイトの負荷によっては、他の古い代替手段を使用して対処するのが非常に難しい場合があります。
覚えておいてください:接続を「処理する」とは、技術的には接続を削除せず、何かでサービスを提供できることを意味します。 Nginxがエラーメッセージではないクライアント応答にサービスを提供するには、アプリケーションとデータベースが正常に機能している必要があります。
Nginxの詳細については、nginx.comにある公式Webサイトにアクセスしてください。
デプロイメントサーバーの準備
このセクションでは、次の手順を実行します。
-
オペレーティングシステムを更新する
-
展開に必要な基本ツールを入手する
-
Ruby、Rails、ライブラリをインストールする
-
アプリケーションをインストールします(つまり Unicorn)およびHTTPサーバー(Nginx)
オペレーティングシステムの更新と準備
Rubyやその他の必要なアプリケーションをインストールするため(例: 私たちのサーバー)、最初に最小限に出荷されたCentOSドロップレットを準備し、途中で必要ないくつかの開発ツールを装備する必要があります。
次のコマンドを実行して、CentOSVPSのデフォルトツールを更新します。
yum -y update
# This command will update all the base applications
# that come with CentOS by default. Which are mostly
# reserved for use by the operating system.
次のコマンドを実行して、開発ツールを含むバンドルをインストールします。
yum groupinstall -y 'development tools'
# With more recent versions of CentOS, such as 6.5 in our case,
# you can simply run:
# yum groupinstall -y development
# instead.
# This bundle of applications contains various tools
# Such as: gcc, make, automake, binutils, git etc.
このチュートリアルに必要なパッケージの一部(例: 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
Ruby環境とRailsのセットアップ
注:このセクションは、専用の記事 CentOS6.5にRuby2.1.0をインストールする方法の要約です。
Rubyバージョンマネージャー(RVM)を使用して、Rubyインタープリターをダウンロードしてインストールします。
次の2つのコマンドを実行して、RVMをインストールし、Rubyのシステム環境を作成します。
gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
\curl -sSL https://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
Nginxのインストール
EPELリポジトリが有効になっているため、yumを使用してNginxを取得できます。
次のコマンドを実行して、yum
を使用してNginxをダウンロードしてインストールします。
yum install -y nginx
注:このツールは次のセクションで構成します。
Unicornのインストール
Unicornを簡単にダウンロードする方法はいくつかあります。 これはアプリケーション関連の依存関係であるため、最も論理的な方法はRubyGemsを使用することです。
次のコマンドを実行して、gem
を使用してUnicornをダウンロードしてインストールします。
gem install unicorn
注:このツールの操作方法については、次のセクションで説明します。
デプロイメント用のRailsアプリケーションの準備
注:このセクションでは、例として非常に単純なRubyOnRailsアプリケーションを使用します。 アプリケーションを実際にデプロイするには、コードベースをアップロードし、その依存関係をすべてインストールする必要があります(つまり、 bundle
)。
サンプルアプリケーションの作成
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
ソースコードのアップロード
もちろん、実際の展開では、コードベースをサーバーにアップロードする必要があります。 この目的のために、SFTPまたはFileZillaなどのグラフィカルツールを使用して、リモートファイルを安全に転送および管理できます。 同様に、GitとGithubなどの中央リポジトリを使用して、コードをダウンロードして設定できます。
サーバーの構成
ユニコーン
ユニコーンはさまざまな方法で構成できます。 このチュートリアルでは、主要な要素に焦点を当てて、アプリケーションサーバーデーモンプロセスを開始するときにUnicornが使用するファイルを最初から作成します。
空白のunicorn.rb
ドキュメントを開きます。このドキュメントは、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"
# 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_rails
を実行できます。
Nginx
次に、NginxにUnicornとの通信方法を指示する必要があります。 この目的のために、このレベルでは、デフォルトの構成ファイルdefault.conf
を編集し、nginx.conf
を提供されたままにするだけで十分です。これはすでにデフォルト構成を含むように設定されています。
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;
server_name localhost;
# Application root, as defined previously
root /root/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_rails -c config/unicorn.rb -D
# You can set the environment by chaining -E flag
# i.e. unicorn_rails .. .. .. -E [env. name]
次に、Nginxをリロードして再起動する準備ができました。
service nginx restart
以上です! これで、ドロップレットのIPアドレス(またはそれに関連付けられたドメイン名)に移動して、デプロイメントをチェックアウトできます。
http://[Your droplet's IP addr]/tasks
# Listing tasks
# Title Note
# New Task
参考文献
ファイアウォール:
SSHの保護:
Ubuntuでfail2banを使用してSSHを保護する方法
CentOS6でfail2banを使用してSSHを保護する方法
アラートの作成:
システム監視のためにCentOSVPSで電子メールアラートを送信する方法
サーバーアクセスログを毎日監視および監視します。
LogwatchLogAnalyzerおよびReporterをインストールして使用する方法