
Tomcatの背後にあるNGINXを実行するCentOSシステムがあります。 NGINX では SSL が有効になっており、Tomcat に接続をプッシュするためにのみ使用されます。一部のリクエストヘッダがTomcatに到達できないことを除いて、ほとんどすべてがうまく機能します。
Java開発者はリクエストヘッダを印刷するためのテストページを作成しました。結果は次のとおりです。私が言う内容を確認することができます。
curl -H 'auth_token: some value' -H 'Host: demo-test.domain.com' http://127.0.0.1:8080/sjl.jsp
header.user-agent=curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
header.accept=*/*
header.auth_token=some value
header.host=demo-test.domain.com
上記からリクエストがTomcatに直接送信されることがわかり、「auth_token」ヘッダーが受信されることに注意してください。
以下は、TomcatではなくNGINXに送信された2番目の要求です。 「auth_token」ヘッダーがないことに注意してください。
curl -H 'auth_token: some value' -H 'Host: demo-test.domain.com' -k https://127.0.0.1/sjl.jsp
header.host=demo-test.domain.com
header.connection=close
header.user-agent=curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
header.accept=*/*
"proxy_pass_request_headers"をオンにするようにnginx.confを更新しようとしましたが、何もしないようです。以下はNGINXのサイト構成です。
upstream demo-test.domain.com {
ip_hash;
server demo-test.domain.com:8080;
}
server {
listen 80;
listen [::]:80;
server_name demo-test.domain.com www.demo-test.domain.com;
return 301 https://demo-test.domain.com$request_uri;
}
server {
listen 443;
server_name demo-test.domain.com;
location / {
proxy_pass http://demo-test.domain.com;
proxy_pass_request_headers on;
}
location /WebSocketServlet {
proxy_pass http://demo-test.domain.com;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
どこに間違っているかを知っているか、正しい方向を教えてください。正常に動作するのに問題があります。ありがとうございます!
答え1
下線付きのヘッダーは無効と見なされるため、デフォルトnginx
では渡されません。この動作はunderscores_in_headers
ディレクティブでオーバーライドできます。たとえば、
underscores_in_headers on;
バラよりこのファイルもっと学ぶ。