それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nginx → apache のhttp2 プロキシ設定

nginx →Apachehttps のプロキシ設定をしていて、動かないので、ちょっと頭を抱えた。

次のようにプロ棋士していたが

ブラウザ--<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 を見ると、次のようにエラーになる。

エラー

応答を解析できません。

f:id:takuya_1st:20211106180201p:plain

通信状況がおかしくなる。

次のように通信しているが、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は無視した対応を考えた。