いままで 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 を設定しろだのあってめんどくさくなるのであった。