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
ディレクティブには*
でまとめてファイル指定もできるので、これを使います。
流れは次の通りです。
- ドメイン別設定ファイル置き場を用意する
nginx.conf
にinclude
でドメイン別設定ファイルをロードする- ドメイン別設定ファイルを用意する
ドメイン別設定ファイル置き場を用意する
まずは設定ファイルを置く場所を用意します。場所といってもフォルダです。
フォルダの中に入れておくことでinclude
と*
でまとめてロードできて便利だからです。
置き場となるフォルダ名はservers
とします。これはnginx.conf.default
で既にそういう記述があるためです。
$ mkdir /usr/local/etc/nginx/servers
nginx.conf
にinclude
でドメイン別設定ファイルをロードする
次は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など開発用とで立ち上げることなので、問題はないのですが、これが本番サーバの場合はこの方法ではなく次の方法で構築をしてください。
大きく次のフローとなります。
- sites-available フォルダ作成と個別設定ファイル配置
- sites-enabled フォルダの作成と
sites-available
フォルダ内の個別設定ファイルへのシンボリックリンク作成 - nginx.conf に include ディレクティブで sites-enabled内ファイルをロード
- nginx 再起動
sites-available
フォルダが、先程のservers
フォルダとなります。
nginx.conf
で読み込む先はsites-available
ではなくsites-enabled
フォルダにしてください。
直接実ファイルをロードするのではなく、sites-enabled
に用意されたシンボリックリンクをロードします。
sites-enabled
が間に一つ入る形になっています。
これはunlink
すること簡単にバーチャルホストを閉じることが可能となっています。
設定ファイルの削除や移動などは必要ありません。
Mac上のnginx設定ファイルをドメイン毎に分ける
今回は設定ファイルを別ファイルからロードすることでnginx.conf
をボリュームを抑え、変更影響を受けにくい仕組みの紹介でした。
直接書くより少し手間だったり慣れていないと確認が面倒だったりはしますが、目の前の手間から逃げ続けると将来一気に避けられない手間を対応するはめに会います。
可読性やメンテナンス性はエンジニアには重要指標なので、目の前の面倒から逃げずに将来のもっと大きな面倒をなくしていくことは大事ですね。
次の記事は「Mac上でnginxのセキュリティ最低限を確認する 」について説明します。