Nginx 1.15.9 から可能になったので ssl_certificate で変数を使ってみたけど使い物にならなかった

スポンサーリンク

このブログとか動いてるサーバーで ssl_certificate に変数を使ってみたけど辞めた理由です。そんな大して書くこともないのでチラシの裏みたいな自分のブログで書いておく

使おうと思ったきっかけ

仮想ホストにドメイン複数みたいなことしてると

  • ワイルドカード証明書使っていてもそれぞれのドメインの分だけ書くのもめんどくさい
  • $host とかの変数で書く量減らせないかな

みたいなこと思ってしまった
→Nginx 1.15.9 へアップデートした(このバージョンから変数をサポートしてる)

実際に使う

自分で設定した変数を使えないので letsencrypt の pem ファイルへの symlink を使って、ドメイン部分を $host 変数を利用してみたが、アクセスされるたびに証明書とか秘密鍵とか読み込んでるっぽくてエラーを吐いてた
→systemd での起動時はともかく動いている時は root ユーザーではないので /etc/letsencrypt/{archive,live} のディレクトリのパーミッションを 700 から 755 にするとかが必要だった

ちなみにこんな感じ

server {
    listen          433 ssl http2;
    server_name     example.com www.example.com;

    include         ssl_certificate.conf;

    # ...
}
ssl_certificate     /etc/nginx/certlinks/$host/fullchain.pem;
ssl_certificate_key /etc/nginx/certlinks/$host/privkey.pem;

ssl_trusted_certificate には変数が使えない。これは同じ認証局なら同一のものなので複数の認証局を使っているのでなければ同一のものを指定できる

弊害

変更してしばらくの間はおそらく問題はなかった。しかし「mastodon を動かして Nginx で繋いでみる」みたいなことをした時に Nginx が落ちるようになってしまった(そもそもサーバーのマシンスペックもギリギリだが)
→アクセスされるたびに読み込んでいる証明書がネックになってるのでは
→元に戻す
→ちゃんと動く
→\(^o^)/

オチ

結局元のように変数を使わずに読み込むように。かなりの高性能なサーバーでも I/O ボトルネックが無視できなくなるだろう問題っぽいので使うのは見送り

使うなら

  • 自分で設定した変数の利用
  • 起動時に想定できる名前であらかじめ読み込むなどしてアクセスのたびに I/O が発生しない

って感じに Nginx の更新が入らないことにはみたいな感じだった

さらにオチ

ドキュメントにも
Module ngx_http_ssl_module

Note that using variables implies that a certificate will be loaded for each SSL handshake, and this may have a negative impact on performance.

と書かれているのを見逃していた。Nginx に Swift の switch みたいな網羅性を期待するのはおかしい気もしてきた。まぁ使い物にならないって結論は変わらない

Uncategorize / Blog
kPherox

普段は艦これとかデレステとか遊んでます。Twitterアカウントの年齢制限に引っかかって@kPheroxはロック中です(´・ω・`)

触ったことのある言語: Java, Scala, Node.js/JavaScript, CoffeeScript, PHP, Python, Swift, C#

利用経験のあるフレームワーク: Laravel(PHP), Play Framework(Scala), Cocoa(Swift), Perfect(Swift)

kPheroxをフォローする
kPherox Blog

コメント