記事ページを表示中

webサーバー(nginx)のスケールアウト|webサーバーを増設してロードバランサからのリクエストを複数台のサーバーで処理する

記事No.58

更新日時2023年02月21日

nginxのロードバランサを使用して、クライアントからのリクエストを複数のサーバーに振り分ける事で、ウェブサーバーをスケールアウトできます。

スケールアウトの一番のメリットは、公開したWEBアプリのユーザー増加に柔軟に対応できる事です。ユーザーが増えた分、サーバーを増設すれば良いのです。

ただ、サーバーを増設する度に各設定をするのが大変です。この記事は私自身の備忘録として、webサーバーの設定手順をまとめます。

使用サービス

vps:さくらのvps

os:ubuntu

webサーバー:nginx

アプリサーバー:gunicorn

フレームワーク:Django

ステップ1.ssh公開キーをサーバーに設置する

VPSサーバー側が設置手段を用意していると思います。さくらVPSの場合、初期設定時に公開キーをサーバーに送る事ができます。

コメントフォーム

ステップ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技術を一緒に勉強していけたらと思います。

関連記事