webサーバー(nginx)のスケールアウト|webサーバーを増設してロードバランサからのリクエストを複数台のサーバーで処理する
nginxのロードバランサを使用して、クライアントからのリクエストを複数のサーバーに振り分ける事で、ウェブサーバーをスケールアウトできます。
スケールアウトの一番のメリットは、公開したWEBアプリのユーザー増加に柔軟に対応できる事です。ユーザーが増えた分、サーバーを増設すれば良いのです。
ただ、サーバーを増設する度に各設定をするのが大変です。この記事は私自身の備忘録として、webサーバーの設定手順をまとめます。
使用サービス
vps:さくらのvps
os:ubuntu
webサーバー:nginx
アプリサーバー:gunicorn
フレームワーク:Django
ステップ1.ssh公開キーをサーバーに設置する
VPSサーバー側が設置手段を用意していると思います。さくらVPSの場合、初期設定時に公開キーをサーバーに送る事ができます。
参考になった
[[ one[1] ]]
もっと詳しく知りたい
[[ one[2] ]]
ステップ2.実行したいファイルをサーバーに設置する
FTPソフトを使用するとラクです。homeディレクトリが空なので、homeディレクトリにファイルを配置します。
ステップ3.各言語(python,php,ruby,etc)をインストールする
ubuntuには最初からpythonが入っていますが、pyenvなどの仮想環境下でpythonを使用したい場合はインストールします。
ステップ4.pip(pythonソフトウェアの管理システム)をインストールする
#pipはubuntuに標準で搭載されているので以下のコマンドでインストールできます。
sudo apt install python3-pip
ステップ5.各種フレームワークやライブラリをインストールする
pipの公式サイトに各種ソフトウェアが登録されているか確認します。
#pipを使用してインストールします。
#Djangoをインストールする場合は以下のように入力します。
pip install Django
#その他ライブラリをインストールしていきます。
ステップ5.アプリサーバー(gunicorn)をインストールする
#ubuntuに標準搭載されているgunicornをインストールします。
sudo apt install gunicorn
ステップ6.webサーバーソフトウェア(nginx,apache,etc)をインストールする
私はnginxを使用しています。
#ubuntuが標準で用意しているnginxを使用します。
sudo apt install nginx
ステップ7.パケットフィルター(ファイアフォール)を設定する
VPSサーバーによっては、ファイアウォールとして、パケットフィルターが設定されている可能性があります。パケットフィルターを設定する事で、使用可能なポート番号を指定する事ができます。
今回の場合、ロードバランサからhttp通信でリクエストが送られてきます。その為、http通信に使用されるポート番号、80ポートを開放します。
ステップ8.nginxを設定する
#設定ファイルを配置するディレクトリに移動
$ cd /etc/nginx/sites-available
#設定ファイルを新規作成
$ vi example
設定ファイルを記述する
#設定ファイル名:example
server {
listen 80; #ポート番号を指定
server_name example.com; #VPSサーバーのドメインを指定
location / {
proxy_set_header Host $http_host; #クライアントが要求したホストをアプリサーバーに渡す
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #クライアントのIPアドレスをアプリサーバーに渡す
proxy_set_header X-Forwarded-Proto $scheme; #クライアントのプロトコルをアプリサーバーに渡す
proxy_pass http://127.0.0.1:8000; #8000ポートでアプリサーバーに接続する
}
}
シンボリックリンクの作成
/etc/nginx/sites-available/example
が設定ファイルですが、実際に使用可能にするには、以下のディレクトリにシンボリックリンクを作成します。
/etc/nginx/sites-enabled/example
#シンボリックリンクを作成
$ sudo ln -s /etc/nginx/sites-available/server0 /etc/nginx/sites-enabled/server0
設定したファイルを無効化する場合は、シンボリックリンクを削除します。
#シンボリックリンクの削除
$ sudo unlink example
ステップ9.アプリサーバーでファイルを実行する
実行したいファイルを動かすアプリサーバーには、gunicornを使用しますが、その前に、Djangoサーバーを利用します。
#manage.pyのあるディレクトリに移動後
python3 manage.py runserver
エラーがある場合は、コンソールにそのエラーが表示されます。エラーが出ない事を確認したら、Djangoサーバーを終了して、gunicornで動かします。
#Djangoサーバーはデフォルトで8000ポートを使用しています。確実に終了させる為に、以下のコマンドでゾンビプロセスを終了させます。
#8000ポートを使用しているプロセスのPID番号を確認
$ lsof -i :8000
#対象のPID番号を終了
$ kill -9 PID番号
#8000ポートで動作しているプロセスが無い事を確認して、8000ポートでgunicornを動かす
$ gunicorn --bind localhost:8000 プロジェクト名.wsgi -D
これで8000ポートでアプリサーバーが動きました。
ステップ10.nginxをリロードする
#nginxをリロード
$ sudo systemctl reload nginx.service
#その他のコマンド
#ステータスの確認
#$ sudo systemctl status nginx.service
#起動
#$ sudo systemctl start nginx.service
#停止
#$ sudo systemctl stop nginx.service
これで、ロードバランサからのリクエストがウェブサーバーを経由してアプリサーバーに届きます。
まとめ
意外とやる事が多くて大変です。ただ、こうやって備忘録を残しておくと、再度、サーバーを増設するのがラクになります。
著者情報
名前:スカーレット
2010年からWEBサイトやWEBアプリを作成しています。最初は趣味でブログを書いていましたがSEOを勉強するのが楽しくなり、そのままブロガーとして独立しました。その後、記事を書くだけでは物足りなくなり自分でWEBアプリの作成をスタート。現在はブロガー兼プログラマーとして活動しています。このWEBアプリ(ブロトーク)もDjangoで自作しました。ブロトークはブログとSNSを合体させたようなWEBアプリです。ブログを読んで気づいた事や感想などあれば、気軽にメッセージを送って頂ければと思います。WEB技術を一緒に勉強していけたらと思います。
関連記事
コメントフォーム