nginxのリバースプロキシの設定例

はじめに
dockerなんかでいろいろ建てるのはいいけど、それらの振り分けってめんどいですよね。
ということで、テンプレ的なのを書きつけて、あとからてきとうにコピペで時短できるようにしておく作戦。
書いてる人は、フロントエンドの人間なので、ツメが甘いところがあるかもしれないけれど、そのあたりはご容赦を。
また、あんまりわかってない人に対しての記事なので、「とりあえずなんとなくわかった」程度の理解度の内容でいいと思ってるので、ちょくちょく「正確ではない」表現が含まれます。
概要
能書き
docker-composeするのは、別にどこで動かしてもいいんだろうけれど、古き良き?風習を尊重して、/var/www
にバーチャルホスト的に終結してるような構成を想定してます。
別にどんな構成でもいいとは思うけど。
nginx側は、最近はやり?のsites-available
とsites-enabled
の存在する構成になってます。
これも技術的には、どんな構成でも関係のない話ですが。
また、SSL証明書はcertbotで取得してる想定をしています。
certbotに関してはそのうちまた書くつもりです。
構成図
/var/
www/
ghost.example.com/
docker-compose.yml
...
wordpress.example.com/
docker-compose.yml
...
/etc/
nginx/
sites-available/
...
sites-enabled/
...
下準備
/etc/nginx/sites-available/ghost.example.com
特に語ることはないのですが、ipv6対応してみたり、SSL対応してみたりです。
このブログのおはなしの都合上、localhost:8888
にサービスがいる想定になっています。
想定されているサービスは、docker-composeによる、Ghost CMSのセットアップ例に書かれていますが、別にこのサービスじゃなくてもなんでもいいです。
$ sudo vim /etc/nginx/sites-available/ghost.example.com
vimじゃなくてもviでもnanoでもなんでもいいです。
使い慣れたものを使いましょう。
server {
listen 80;
listen [::]:80;
server_name ghost.example.com; # <- ここに待ち受けるURL
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/ghost.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ghost.example.com/privkey.pem;
ssl_session_timeout 5m;
# ssl_protocols ; # <- ssl_protocolsはデフォルトでいいと思う。
# ssl_ciphers ; # <- ssl_ciphersもデフォルトでいいと思う。
ssl_prefer_server_ciphers on;
location / {
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-User $remote_user;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8888;
}
}
その辺のネット記事を眺めてるとssl on
という書き方をしてるのを見かけたりしますが、ワーニングが出たりするので、listen <ポート番号> ssl
とするほうがいいみたいですね。
ssl_certificate
については、certbotが作ってくれるものを使う想定です。
要するに、docker-compose.yml
の中のports
の中の8888:2368
みたいなところの前部分が入ると思えばよいと思います。

(再)起動またはリロード
nginxが起動していない場合や、再起動しちゃっていい場合はこちら。
nginx -t
で文法チェックしてから(再)起動しましょう。
$ sudo nginx -t && systemctl restart nginx
nginxが起動してる場合には、リロードでもよいと思います。
$ sudo nginx -t && systemctl reload nginx
文法がミスってたりしたら、再起動やリロードが走らないので、エラーを見ながらちまちま直しましょう。