Mac上のnginx設定ファイルをドメイン毎に分ける

Mac上のnginx設定ファイルをドメイン毎に分ける

Table of Contents

MacでWebサーバnginxを立ち上げるための入門記事シリーズ4回目です。 今回はnginx.confの設定内容をドメイン毎、つまりアプリ毎に分けます。 分かれてることで複数のアプリ開発を1つのnginx.cnfに集約されなくなり管理しやすくなります。

▼前回記事はこちらになります。
Mac1台にnginxでWebサーバとPumaでアプリサーバを立てる

ドメイン毎に設定を分ける理由

nginx.cnfに直接記述せず、ドメイン毎に設定ファイルを用意する理由とは何でしょうか? Macでnginxを使うケースは分けたほうが恩恵をえられます。 その理由について簡単に説明します。

Macのnginxは開発用途がメイン

Macを本番サーバとして使うことはありませんが、開発PCはMacかWindowsが主なOSだと思います。 そのため1つのMacに複数のアプリが含まれやすいです。 開発では複数アプリが同時に扱うこともあります。

1Macに複数ドメインを立ち上げることはよくある

例えばMac1台で開発してると下記のように複数アプリが含まれることはよくあります。

  • アプリA(Web)
  • アプリB(Web)
  • アプリB(Backend)

しかもアプリBだと、WebとBackend両方を立ち上げが必要なケースもあると思います。 これら各nginx設定は、特に工夫しなければすべてnginx.confに書かれるかと思います。

nginx.confに全ドメイン設定を記述できる

実はnginx.confは複数ドメインの設定をnginx.confにまとめて全部記述することは可能です。 しかしそれによりなにかと長期的に面倒なことが続きます。 それは可読性と他ドメイン影響範囲に悪影響することです。

長い設定ファイルはメンテナンスしにくい

前述はドメイン3つですが、人によっては5~10個ドメインが入っているかと思います。 そうなってくると、nginx.confには10個の設定が全部記述されるためファイルがとても長くなります。 その長くて読みにくい設定ファイルから不要な項目を削除する必要があります。

開発不要になればそのドメイン設定は不要になる

ドメイン開発が終了すればそのドメインの設定は不要となるため、削除すると思います。 それも放置するとnginx.confがとんでも長い行となるためです。

削除するときにどの項目を削除するべきなのか一つ一つ読み解いて行く必要があります。 これは変更により他ドメインへの影響範囲内になりますし、誤って消してしまうと動かなくなります。 本番サーバはチューリング用途ですが、Macだと開発環境つど変更必要です。

Macのnginx.confは本番サーバと異なり変更頻度が高い

本番サーバのnginx.confは一度組み込んでしまえばパフォーマンス・チューニング用途以外で変えることは少ないです。 しかしMac上のnginxは開発用途がメインで、開発不要になれば削除作業が起きますし、新しくアプリ開発すれば追加作業が起きます。 本番サーバと異なり設定の大きく異なる複数のアプリを何度も消したり追加したりすることとなり、よりミスの可能性が上がります。 これらはドメインごとに設定ファイルとして分かれてることで望ましいです。

ドメイン毎に設定ファイルが分かれていれば他のドメイン設定を消すリスクを回避できる

これらの問題を回避するためにドメイン毎に設定ファイルが用意されていれば解決できます。 新しくアプリが追加になればファイルごと追加で、アプリが不要になればドメイン設定ファイルを削除するだけで、 他ドメインの設定に影響を抑えられます。

これはドメインごとの設定ファイルとシンボリックリンクで実現します。

includeディレクティブでアプリ別設定ファイル構築する

では実際の構築方法について説明します。

仕組みは単純で、ドメイン別の設定ファイルをincludeディレクティブでロードしているだけです。 includeディレクティブには*でまとめてファイル指定もできるので、これを使います。

流れは次の通りです。

  1. ドメイン別設定ファイル置き場を用意する
  2. nginx.confincludeでドメイン別設定ファイルをロードする
  3. ドメイン別設定ファイルを用意する

ドメイン別設定ファイル置き場を用意する

まずは設定ファイルを置く場所を用意します。場所といってもフォルダです。 フォルダの中に入れておくことでinclude*でまとめてロードできて便利だからです。

置き場となるフォルダ名はserversとします。これはnginx.conf.defaultで既にそういう記述があるためです。

$ mkdir /usr/local/etc/nginx/servers

nginx.confincludeでドメイン別設定ファイルをロードする

次はnginx.confに先程用意したフォルダ内の設定ファイルを全てロードする処理を記述します。

nginx.conf

http {
  # 全サーバ共通設定はここ

  # 各個別設定はここ
  include servers/*;
}

これによりserversフォルダ内のファイルを全てロードするようになります。

ドメイン別設定ファイルを用意する

最後はそれぞれドメイン毎の設定ファイルを用意します。 ファイル名はドメイン名と同じ方がわかりやすいです。 今回はローカルなのでapi.localhostというファイル名を用意します。

内容は動作確認できればいいので適当に用意しました。

server {
  listen 80;
  server_name api.localhost;
  root /usr/local/var/www;
}

以上で設定は完了です、nginxを再起動するば反映されます。 この設定ファイルであれば、http://api.localhost にアクセスすると、/usr/local/var/wwwフォルダのindex.htmlのレスポンスを返すようになります。

慣習に倣ったバーチャルホスト構築

今回紹介したドメイン毎に設定ファイルを分ける方法はnginxではバーチャルホスト構築時は少し慣習から外れた方法なので、Apacheなどからしたら少し分かりにくいかもしれません。目的はローカル上で複数ドメインをMacなど開発用とで立ち上げることなので、問題はないのですが、これが本番サーバの場合はこの方法ではなく次の方法で構築をしてください。

大きく次のフローとなります。

  1. sites-available フォルダ作成と個別設定ファイル配置
  2. sites-enabled フォルダの作成とsites-availableフォルダ内の個別設定ファイルへのシンボリックリンク作成
  3. nginx.conf に include ディレクティブで sites-enabled内ファイルをロード
  4. nginx 再起動

sites-availableフォルダが、先程のserversフォルダとなります。 nginx.confで読み込む先はsites-availableではなくsites-enabledフォルダにしてください。 直接実ファイルをロードするのではなく、sites-enabledに用意されたシンボリックリンクをロードします。

sites-enabledが間に一つ入る形になっています。 これはunlinkすること簡単にバーチャルホストを閉じることが可能となっています。 設定ファイルの削除や移動などは必要ありません。

Mac上のnginx設定ファイルをドメイン毎に分ける

今回は設定ファイルを別ファイルからロードすることでnginx.confをボリュームを抑え、変更影響を受けにくい仕組みの紹介でした。 直接書くより少し手間だったり慣れていないと確認が面倒だったりはしますが、目の前の手間から逃げ続けると将来一気に避けられない手間を対応するはめに会います。 可読性やメンテナンス性はエンジニアには重要指標なので、目の前の面倒から逃げずに将来のもっと大きな面倒をなくしていくことは大事ですね。

次の記事は「Mac上でnginxのセキュリティ最低限を確認する 」について説明します。

このエントリーをはてなブックマークに追加