いままで L7 リバースプロキシとか SSL アクセラレーターを用意する場合、個人的に Pound を愛用していたのだけれど、 certbot による Let's Encrypt 発行証明書で便利にやりたくて Nginx に移行した。 大体の場合、ウェブサーバーがアプリケーションサーバーも兼ねているので、このあたりも解決できるんだけど、そうじゃないパターンを引いたので備考的に書いておく。
Nginx で実現
ほとんどのディストリで /etc/nginx/nginx.conf
内に Include ./conf.d/*
とか書かれていると思われる。
で、この ./conf.d/
の中には default.conf とか初期配置のコンフィグがあると思うので、これを書き換えるか、削除して別途ファイルを用意すると良い。
今回は、削除して別途 001_reverseproxy.conf
という名前のファイルを新しく設置することにした。
001_reverseproxy.conf
適当なエディタで www.example.com
を目的のホスト名に置き換えて下さい。
server{ # HTTP -> HTTPS listen 80; server_name www.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name www.example.com; # Cert ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # Log access_log /var/log/nginx/www.example.com.access.log main; # Set http header proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; 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; # Static error pages error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # Proxy to APP location / { proxy_pass http://localhost:8080/; } }
http アクセスしてきたときについて
目的のホスト名に http (80) でアクセスしてきた場合は https (443) へリダイレクトします。
太古のバージョンの Nginx の民だったので rewrite
を使って正規表現いっぱい書かないとだめだと思ってたけど、ググったらそうじゃないらしい事が書いてあって公式もそう言っていた。
This is a wrong, cumbersome, and ineffective way. The right way is to define a separate server for example.org:
ちなみになぜこんなことを
moodle を立てようと思って bitnami のイメージから起動したんだけど /opt/bitnami/bncert-tool
がなくて詰んだので、とりあえずの処置でコンテナの外で SSL アクセラレーターをやらせるようにしたので。
いうてこの後、 moodle は config.php
でプロトコルを https
にしたり、 proxy 環境では setproxy
を設定しろだのあってめんどくさくなるのであった。