読者です 読者をやめる 読者になる 読者になる

Apache SSL だったものを Nginx をフロントにおいてリバースプロキシ化したときの設定

さくらの VPS (Ubuntu) で Apache に 80 (http), 443 (https) で Listen させていました。バーチャルホストでいくつかのドメインをこれで処理していましたが、フロントに Nginx を置いて必要な処理だけ Apache にすることにしました。
そこで SSL を Nginx で動かすにあたって、リバースプロキシ下でも Redmine など https 設定で動くように設定したときのメモです。

SSL証明書、秘密鍵の設定

Apache の /etc/apache2/ssl.crt/server.crt と ca-bundle.crt を Nginx の /etc/nginx/ssl/cert.pem に移す

$ cd /etc/apache2/ssl.crt
# cat server.crt ca-bundle.crt > /etc/nginx/ssl/cert.pem

※CA証明書を別にできないのでサーバ証明書に追記する。

Apache の /etc/apache2/ssl.key/server.key を Nginx の /etc/nginx/ssl/server.key にコピー

$ cp /etc/apache2/ssl.key/server.key /etc/nginx/ssl/cert.key

Nginx の設定

Apache は 8080 (http) ポートで動かす。Nginx の 443 (https) をそこにリバースプロキシする。

# HTTPS server
#
server {
    listen 443;
    server_name www.example.com;
    access_log off;

    ssl on;
    ssl_certificate ssl/cert.pem;
    ssl_certificate_key ssl/cert.key;
    ssl_session_timeout 5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_redirect                          off;
        proxy_set_header Host                   $host;
        proxy_set_header X-Real-IP              $remote_addr;
        proxy_set_header X-Forwarded-Proto      https;
        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;
        proxy_pass  http://127.0.0.1:8080/;
    }
}

proxy_set_header でいくつかのヘッダを Apache に渡すことで https 設定の Redmine などが動くようになる。