2022年10月11日火曜日

GCP と nginx を利用して無料のロードバランサーを作ってみる(SSL対応)

只今、とてもよわよわしいサーバー(VPS)上で動いている自作の Web API やアプリケーションですが、なんとアクセスが薄っすらと増えてきました。

しかしながらというか、何というか、予算はないので(笑)、サーバーの増強はできません。

そこで、極力コストをかけずに安定運用をする方法をあれこれ思案しまして、結果、Google Cloud (GCP) で提供されている Google Compute Engine (GCE) の無料枠内で nginx 製ロードバランサー兼バックアップサーバーを作って動かしておき、VPS が落ちた際には GCE の方のサーバーにアクセスを振るという形にしてみました。

ざっくりロードバランサー図
ざっくりロードバランサー図


これなら平常時のコストを増やさず、かつ多少なりとも安定的な運用が可能なはず…です、たぶん。

ただ、ネットワークの知識に疎くてよく分かっていなかったのですが、サーバーから外部へのリクエストもロードバランサーの IP アドレスからアクセスしているように振る舞うようで、そうなると市況等 Web API は動かないため、結局 Web API についてはロードバランサーの利用は断念しました。(追記:勘違いでした)

まぁ、Web API については万が一大量のアクセスがあった時にクラウドで律儀に動かれても困るので落ちてくれた方がいいですね(予算的に)。

現状、Web アプリ(最寄りのアメダス)に対してのみロードバランサーが動いています。


***

以下、備忘録がてら簡単なロードバランサーの作成方法です。


GCE を利用して、無料枠内でインスタンスを作成。インスタンスに外部静的アドレスを割り当てます。今回 OS は慣れている Ubuntu を使いました。

合わせてポートの変更やファイアーウォールの設定、必要パッケージのインストール等の下準備もします。この辺のやり方は検索するとたくさん出てくると思いますので割愛。

(このブログですと「Flask + uWSGI + Nginx を使って Web アプリを作る」の【前編】【後編】がある程度参考になるかと思います)

また、ドメインのDNSレコード設定でロードバランサーの外部静的アドレスを A レコードとして登録しておきます。


nginx をインストール。
$ sudo apt update
$ sudo apt install nginx


サーバーブロック構成ファイル apps.conf (ファイル名は任意)を /etc/nginx/sites-available ディレクトリに作成。「SSL証明書」と「秘密鍵」は、あらかじめ /home/ユーザー名/lb/ssl/ ディレクトリに配置しておきます。ディレクトリは適宜作成。
upstream load-balancer {
    server IP アドレス1 max_fails=5 fail_timeout=30s;
    server IP アドレス2 backup;
}

server {
    listen 80 default_server;
    server_name サーバー名(ドメイン名);
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    ssl on;
    server_name サーバー名(ドメイン名);
    ssl_certificate /home/ユーザー名/lb/ssl/letsencrypt12345678.crt;
    ssl_certificate_key  /home/ユーザー名/lb/ssl/letsencrypt12345678.key;

    location / {
        proxy_pass http://load-balancer;
        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_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}

HTTP (80番ポート) へのアクセスは HTTPS (443番ポート) にリダイレクトされます。




apps.conf を /etc/nginx/sites-enabled ディレクトリにリンク。デフォルトの構成ファイルのリンクを削除。(sites-enabled ディレクトリ内のファイルが nginx.conf から読み込まれます)
$ sudo ln -s /etc/nginx/sites-available/apps.conf /etc/nginx/sites-enabled
$ sudo unlink /etc/nginx/sites-enabled/default


nginx を起動。自動起動を有効化。
$ sudo systemctl start nginx
$ sudo systemctl enable nginx


ちなみに、ロードバランサーとサーバー間は 80番ポートでつなぐようにしたので、サーバーの方の nginx の conf ファイルはこんな感じになっています。(Flask + uWSGI + Nginx で Web アプリが動いている想定)
server {
    listen 80;
    server_name サーバー名(ドメイン名);

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/app.sock;
    }
}


ということで、完成です。

ロードバランスの方式にもいろいろあるようですが、今回はサーバー1(VPS)がダメな時にバックアップとしてサーバー2 (GCE) に送信するという形にしました。

まだ作ったばかりなので、ミスの発覚や、どこかで何か問題が発生した場合は追記します。


今回は非常に勉強になりました。やはり、ネットワーク関係はもう少ししっかり知識つけたいですねー。


・広告
Xserver SSL


Twitter (@nkkmd) 日々更新中です。