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

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

はじめに

dockerなんかでいろいろ建てるのはいいけど、それらの振り分けってめんどいですよね。
ということで、テンプレ的なのを書きつけて、あとからてきとうにコピペで時短できるようにしておく作戦。

書いてる人は、フロントエンドの人間なので、ツメが甘いところがあるかもしれないけれど、そのあたりはご容赦を。
また、あんまりわかってない人に対しての記事なので、「とりあえずなんとなくわかった」程度の理解度の内容でいいと思ってるので、ちょくちょく「正確ではない」表現が含まれます。


概要

能書き

docker-composeするのは、別にどこで動かしてもいいんだろうけれど、古き良き?風習を尊重して、/var/wwwにバーチャルホスト的に終結してるような構成を想定してます。
別にどんな構成でもいいとは思うけど。

nginx側は、最近はやり?のsites-availablesites-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みたいなところの前部分が入ると思えばよいと思います。

certbotでLet’s EncryptなSSL証明書を取得する例
ちょくちょく使うんだけど、いつもよく何をしたらいいんだっけってな感じに、忘れるので、certbotでLet’s EncryptなSSL証明書を取得するときのためのおぼえがき。

(再)起動またはリロード

nginxが起動していない場合や、再起動しちゃっていい場合はこちら。
nginx -tで文法チェックしてから(再)起動しましょう。

$ sudo nginx -t && systemctl restart nginx

nginxが起動してる場合には、リロードでもよいと思います。

$ sudo nginx -t && systemctl reload nginx

文法がミスってたりしたら、再起動やリロードが走らないので、エラーを見ながらちまちま直しましょう。