さくらの 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 に移す

1
2
$ 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) をそこにリバースプロキシする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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 などが動くようになる。