技育CAMPアカデミア -Vol.06 登壇レポート

11月15日(水)に開催された「技育CAMPアカデミア -Vol.06」においてデベロッパーエキスパートの小島 慶一が登壇し「マルチテナントwebサーバの作り方」というタイトルで勉強会を開催しました。

サーバ構築の機会

昨今ではVPSやクラウドの普及により、個別のサーバを持つことのハードルはとても下がりました。とはいえ一つのサーバを複数人で共有するという需要が全く無いかというとそんなことは無く、ちょっとしたサイトを作るのに既存のサーバに同居させたいという場面は身近にあると思います。

今回のセッションではnginxを用いてwebサーバを構築していく手順を、運用上のポイントも踏まえつつ紹介しました。

登壇者

GMOインターネットグループ デベロッパーエキスパート
(領域:ホスティング/Linux)
小島 慶一

セッション「マルチテナントwebサーバの作り方」

環境の確認、初期設定

最初は構築する環境の確認と初期設定についてです。

Webサーバを立てるといっても、利用するクラウドやVPSサービスによってsshの初期設定やポート開放に必要な手順が異なります。またOSやディストリビューションによって、パッケージインストールの手順やディレクトリ構成が異なります。

セッションではディストリビューションとしてubuntu、webサーバとしてnginxを選択し、サービス固有のセキュリティグループ設定ではなく、OS側のファイアウォールで制御する環境を前提としました。そして事前準備としてsshのポート変更やhttp,httpsアクセスのためのポート開放について説明しました。

nginxのインストールとvirtualhostの設定

最近のディストリビューションでは主要なアプリケーションはパッケージとして提供されています。今回のubuntu22.04でも標準パッケージとしてnginxが提供されています。しかしディストリビューション提供のパッケージは、長くサポートされる利点がある反面新しいバージョンに追随されないデメリットもあります。

実際ubuntu22.04で提供されるnginxはバージョン1.18であり、セッション時点の最新stableである1.24とはかなりの開きがあります。そこでセッションではnginxの開発元が提供しているリポジトリから最新版をインストールする手順を紹介しました。

virtualhost設定については設定ファイルの書き方はもちろんですが、設定ファイルやディレクトリ配置の運用上の理由、ユーザディレクトリとnginxプロセスの権限の関係についてお伝えしました。

nginxのプロセスと権限

SSLの設定

次にSSLの設定について説明しました。

まずSSL証明書の取得ですが、今はレンタルサーバサービス等だと契約者には無料で付与されることも多いと思います。そのようなサービスが無い場合はlet’s encryptで取得することが多いと思いますので、その手順を紹介しました。

SSL証明書をnginxに読み込ませる部分については、今回は複数ドメイン複数ユーザの共存を前提としているため証明書もlet’s encryptだけとは限らず後々他の証明書も同居することを想定した設定方法を紹介しています。

またSSLの安全性については日々情報が更新されています。SSLプロトコルをバージョン1.2、1.3に限定するのは多くのケースで対応されていると思いますが、cipherについては特に意識していない方も多いと思います。多くの種類がある中から自身で取捨選択するのも現実的ではありませんので、IPAの公開している暗号スイートの設定例に従った設定例を示しました。

PHPの設定

nginxからPHPを利用する方法としては、今ではphp-fpmが主流かと思いますのでその設定方法を紹介しました。

静的コンテンツの読み込みはnginxユーザ権限で行われますが、PHPの実行、特に複数人が共存する環境では各ユーザの権限でPHPが実行される必要があります。php-fpm自体の設定ファイル、php-fpmを呼び出すためのソケット、virtualhost側の設定と複数の設定箇所があるため、安易なネーミングで設定してしまうと複数のユーザ・ドメインが共存する状態になったときに設定ミスの原因となるため、php-fpmソケットはphp8.1-fpm-user1-.sockのように誰の権限でどのバージョンが動くソケットなのか一目でわかるネーミングが良いということを説明しました。

設定ミスでphpが他ユーザの権限で動いてしまう例

応用編

応用編としては二通り、nginxの組み込み変数を利用してapacheのVirtualDocumentRootのような仕組みを実現する方法と、nginxの設定をjavascriptで動的に変更できるnjsを用いた方法を紹介しました。

nginx変数を用いたVirtualDocumentRootライクな設定例

このようにプロセスの再起動を伴わずに設定変更が反映される仕組みは、一方でアクセスを受けるたびに毎回ファイルを読みに行くことになるため高負荷に弱い欠点もありますが、通常であればmasterプロセスが情報を読み取ってworkerプロセスに引き継いでいたものもworkerプロセスが直接読みに行くようになるため、必要な権限設定が変ってくることに注意が必要です。

証明書、秘密鍵を読み行くプロセスと権限の変化

njs、javascriptを用いた設定の動的変更についても、権限廻りは同様です。また少なくともvirtualhost関連の設定で使用する変数の大半はnginxの組み込み変数としても値がセットされるものです。ではどんな点が異なるかと言いますと、値のセットを自身のスクリプトから行うため組み込み変数では行えないような判定や加工を伴う処理ができます。

例えばHTTP Hostとして渡された値は組み込み変数ですとどんな虚偽の値でも$http_hostに格納されますが、スクリプト側でHTTP HostとSSLハンドシェイクで渡されたServer Nameを比較し一致したときのみ有効と判断する、内部に持っているドメイン一覧にマッチしたときのみ有効と判断する、といった処理をnginx内部で行えるようになります。

njsを用いて変数をセットする例
njsを用いてセットした変数を利用したvirtualhost設定例(抜粋)

振り返り

私自身は長年apacheを主体としたvirtualhost webサーバを扱っておりnginxはプロキシ用途での利用が多かったのですが、純粋にnginxのみで構築するとしたらどうなるだろうという興味から今回の内容をまとめてみました。

序盤から中盤は入門編として一般的なサーバ構築を紹介、終盤には応用編としてこんなやりかたもあるんだということを見てもらいたかったのですが、説明の時間が足りず駆け足での紹介となってしまったことは心残りです。

セッションの際にお話しさせていただいたように、設定ファイルやスクリプトを参照できるようブログ記事としてまとめました。ぜひこちらもご参照ください。

ブログの著者欄

小島 慶一

GMOインターネットグループ株式会社

デベロッパーエキスパート 2002年GMOインターネットグループ株式会社入社。 interQ、bekkoame等のホスティング商材の運用から、お名前.comレンタルサーバSDの開発、z.com webhostingを開発を担当。 最近はConoHa WING,お名前RSの開発運用の傍ら、グループのホスティング商材全般と関わりを深めたいと思っている。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック