ArchiveBoxをNginxリバースプロキシでhttpsにする

:::note alert
アーカイブサーバーを公開するためにこの記事の設定を使用するのは絶対にやめてください。

[公式Docs](https://docs.archivebox.io/en/dev/index.html)では、他人と共有している(する)ドメインでのhttps化は他サイトのJSやCSSをそのまま持ってくる仕様上、CSRF攻撃などのセキュリティの観点から推奨されていません。

もしサイトを公開したい場合は、アーカイブされたサイトの静的HTMLを生成し、nginxなどでホストして共有する方法が推奨されています。
https://github.com/ArchiveBox/ArchiveBox/wiki/Security-Overview#publishing
:::

# ArchiveBoxとは
セルフホストできるウェブアーカイブです。
全文検索できたり外部サービスと連携して自動アーカイブとかできます。

構築記事はこちらがおすすめ。

https://qiita.com/a0x41/items/89301e4cbe2d9946a953

[公式ページ](https://archivebox.io/)

# 現状
公式Docsでは、リバースプロキシによるhttps化は調べれば出てくるから勝手にやれ、と書いてあったのでまとめることにしました。

前回に記事とやってることは同じですが、archiveboxの仕様上サブディレクトリによるリバースプロキシができません。
そこで、今回はサブドメインでリバースプロキシをかけることにしました。

ついでにproxyオプションもメモしておきます。

# 設定

``` nginx.conf
server {
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   server_name example.com;
   add_header Strict-Transport-Security 'max-age=15552000';

   ssl_certificate /etc/letsencrypt/live/example.com/cert.pem;
   ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
   
   ------------------------------------------------------------------
   他サービスの設定etc......
   ------------------------------------------------------------------
}

#追記

server {
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   server_name archive.example.com;
   add_header Strict-Transport-Security 'max-age=15552000';

   ssl_certificate /etc/letsencrypt/live/archive.example.com/cert.pem;
   ssl_certificate_key /etc/letsencrypt/live/archive.example.com/privkey.pem;

   location / {
      proxy_set_header Host $host:$server_port; 
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_redirect  http://  $scheme://;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_cache_bypass $cookie_session;
      proxy_no_cache $cookie_session;
      proxy_buffers 32 4k;
      proxy_pass http://ARCHIVEBOX_URL:8000/;
   }
}
```

## メモ　proxy_set_headerやらなんやらについて

### proxy_set_header Host $host:$server_port;
リクエスト転送時に、`Host`ヘッダーを付加する。
これによって、リクエストを受け取ったサーバーがクライアントの`Host`情報を正しく受け取れる。

### proxy_set_header X-Real-IP $remote_addr;
リクエスト転送時に、`Real IP`ヘッダーを付加する。
これによって、リクエストを受け取ったサーバーがクライアントの実際のIPアドレスを正しく受け取れる。

### proxy_set_header X-Forwarded-Host $server_name;
リクエスト転送時に、`X-Forwarded-Host`ヘッダーを付加する。
サーバーに`$server_name`を通知する。
どのホストに対してリクエストが行われたか、サーバーが判断できるようになる。

例:
http://example.com にリクエストされた処理は弾き、http://hoge.example.com にリクエストされた処理は許可、などができる。

### proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
`proxy_set_header X-Real-IP $remote_addr`と同じ？
よくわかっていません。コメントください。

### proxy_set_header X-Forwarded-Proto https;
リクエスト転送時に、`X-Forwarded-Proto`ヘッダーを付加する。
オリジナルのリクエスト(クライアント -> プロキシ)がhttpsであることを示す。

### proxy_redirect http:// $scheme://;
リダイレクト時に、`http://`から`$scheme://`(この場合は`https://`)にスキーマを変更する。

### proxy_http_version 1.1;
リバースプロキシ <-> バックエンドサーバーの通信で使用するHTTPバージョンを指定する。

### `proxy_set_header Upgrade $http_upgrade;` , `proxy_set_header Connection "upgrade";`
プロトコルスイッチを利用して、HTTP/1.1からWebSocketに通信プロトコルを変更する。
これにより、バックエンドサーバーはクライアントとの通信をWebSocketに変更しようとする。

### proxy_cache_bypass $cookie_session;
セッションクッキー(`cookie_session`)がある場合、キャッシュを使用せず常にバックエンドに転送する。

### proxy_no_cache $cookie_session;
セッションクッキー(`cookie_session`)をキャッシュしない。

### proxy_buffers 32 4k;
プロキシが使用するバッファ設定。
大きいファイルの転送が予想される場合のパフォーマンス用設定。

### おわり
間違っていたらマサカリください。