nginx →Apacheでhttps のプロキシ設定をしていて、動かないので、ちょっと頭を抱えた。
次のようにプロ棋士していたが
ブラウザ--<ssl/http>--nginx(ssl/h2)--<http>-- apache
ある日の更新で次のように変わった。
ブラウザ--<ssl/h2>--nginx(ssl/h2)--<http>--apache
すると、curl などブラウザで閲覧するとエラーになった。
ところが、Windowsではエラーにならずに、そのまま見えていたので気づかなかった。 Windowsで見れて、iOSから閲覧できないというミスが発生した。
curl で見ると、次のようにエラーになる
http2 error: Invalid HTTP header field was received:
iOS を見ると、次のようにエラーになる。
エラー
応答を解析できません。
通信状況がおかしくなる。
次のように通信しているが、nginxがうまくさばいてくれなかったみたい
ブラウザ--<ssl/h2>--nginx(ssl/h2)--<http>--apache
実際には、このように通信しようとしておかしくなったみたい
# リクエスト時 ブラウザ--<ssl/h2>--nginx(ssl/h2)--<http>--apache # レスポンス時 apache--<http/1.1>--nginx(ht2?)---<https/1.1>--ブラウザ
エラーが出なかったときは、キャッシュ見てたり状況次第だったようだ。
apacheにh2を喋らせる。
Apache 側でこれを入れて解決。
Protocols http/1.1 h2c h2
設定を書き換えた。
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet <VirtualHost *:443 > # 80ではなく、h2のために443へ LogLevel warn ServerName example.com Protocols http/1.1 h2c h2 # 追加 SSLEngine on SSLCertificateFile 自己署名など適当な.cert.pem # 追加 SSLCertificateKeyFile 適当な.private.key.pem # 追加 UseCanonicalName Off VirtualDocumentRoot /var/www//html <Directory /var/www/html > Options All AllowOverride All AddHandler cgi-script .cgi </Directory> <Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy All </Files> </VirtualHost>
その他の考えられる解決策
nginx.conf と nginxのサイト設定で、ちゃんとプロキシ処理とプロトコル設定を記述すればいいと思うのだが。
nginx 側で proxy_set_header X-Forwarded-Proto https;
や proxy_set_header X-Forwarded-Proto http;
を加えてやれば、うまく動作するはずである。
nginx で よくある設定 proxy_set_header X-Forwarded-Proto $scheme;
でh2のまま送信されちゃう
apache2 側で Protocols http/1.1
にして h2 を完全に無効にしてあげてもいいかもしれない。
ちょっとnginx の設定を触りづらい環境にあったのでnginxは無視した対応を考えた。