今まで個人利用のnginxでバーチャルホストを設定する際はめんどくさいので全てnginx.confに記述していたのですが、一時の手間を惜しむと逆に後で手間がかかることを身をもって経験したのでsites-availableとsites-enabledを用いてバーチャルホストの設定をやりました。

環境


  • Ubuntu 16.04
  • nginx 1.12.2

上記でやってますが、環境とかバージョンは今のところあんまり関係ないと思います。

バーチャルホストとは


一つのサーバで複数ドメインを運用するための技術です。nginxに限った話ではないです。

なぜnginx.confに書かない方が良いのか…


前述の通り、全てのドメインの設定をnginx.confに記述したとしても問題ないのですがnginx.confが長くなったり、特定のドメインだけ削除したいとなった場合に面倒です。そこでsites-availableとsites-enabledというものを用いることで管理を容易にします。

「ドメインが不要になることなんてそうそうないでしょ?そんなめんどくさいことやってられないよ。」などと思ってnginx.confに全て書いたりした時に限って不要になったりします。私はなりました。後は単純に設定が長くなって読み辛いです。別に難しくないので分けることをお勧めします。

sites-available と sites-enabled


考え方としては…

  • sites-availableにドメイン別のファイルを作成し各々のファイルに設定を記述します
  • sites-enabledはsites-availableのシンボリックリンクを張ります

シンボリックリンクを張ることで特定のドメインが不要になった場合でもunlinkするだけで対応することができます。

設定方法


/etc/nginx配下に設定を追加していきますが、デフォルトのディレクトリ構成だと下記のような感じになっていると思います。(今回の内容に関係ない部分は削除してます。)

1
2
3
4
5
6
7
├── conf.d
│   └── default.conf
├── nginx.conf
├── sites-available
│   └── default
└── sites-enabled
└── default -> /etc/nginx/sites-available/default

nginx.conf

まずはnginx.confについてです。httpディレクティブ内に下記のような記述があると思います。これは設定にconf.d内の拡張子が.confのものも含めるということです。まあ、見たまんまですね。

1
include /etc/nginx/conf.d/*.conf;

sites-availableに記述した設定をsites-enabledにシンボリックリンクを張ってそれを読み込むことになるので下記のように書き換えます。conf.d内の設定も必要な場合は書き換えるのではなくて追記します。

1
include /etc/nginx/sites-enabled/*;

sites-available

今回は例としてaaa.example.combbb.example.comというドメインで記述します。

sites-availableに各ドメイン別のファイルを作成し設定を記述します。まあ、SSLの設定込みだとだいたい下記のような感じになると思います。あくまでサンプルということで細かいところは調整してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
server_name aaa.example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name aaa.example.com;
ssl_certificate ${ssl.pem};
ssl_certificate_key ${ssl.key};
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
ssl_prefer_server_ciphers on;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

access_log /var/log/nginx/aaa_example_access.log;
error_log /var/log/nginx/aaa_example_error.log;

location / {
//ここはアプリケーションのポートなりドキュメントルートなりを記述する
proxy_pass http://localhost:8080;
}
}

これと同じようにbbb.example.comの設定も作成します。

sites-enabled

先ほど作成した2ドメイン分の設定ファイルのシンボリックリンクをsites-enabledディレクトリに張ります。

1
2
ln -s /etc/nginx/sites-available/aaa.example.com /etc/nginx/sites-enabled/aaa.example.com
ln -s /etc/nginx/sites-available/aaa.example.com /etc/nginx/sites-enabled/bbb.example.com

nginx再起動


これまでの作業で/etc/nginx以下は下記のようになっていると思います。

1
2
3
4
5
6
7
8
9
10
11
├── conf.d
│   └── default.conf
├── nginx.conf
├── sites-available
│   ├── default
│   ├── aaa.example.com
│   └── bbb.example.com
└── sites-enabled
├── default -> /etc/nginx/sites-available/default
├── aaa.example.com -> /etc/nginx/sites-available/aaa.example.com
└── bbb.example.com -> /etc/nginx/sites-available/bbb.example.com

後はsudo service nginx restartでnginxを再起動して各ドメインにアクセスできれば完了です。