Nginx反向代理tomcat返回400 bad requesthtml
nginx 版本1.12, tomcat版本 9.06nginx
最近用Nginx作反向代理tomcat,實現先後端分離,nginx 將請求代理到tomcat服務始終返回400 bad request,若是直接訪問tomcat服務則一點問題沒有(測試中,tomcat自己端口對外開放).後端
配置以下:tomcat
nginx.conf服務器
#配置一個代理即tomcat1服務器 upstream tomcat_server1{ server localhost:8080; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/MyXzmBlog; charset utf-8; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ^~ /app/ { #端口80的請求所有轉發到tomcat_server1即tomcat1服務上 proxy_pass http://tomcat_server1; proxy_http_version 1.1; proxy_set_header Connection ""; # } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
查看了tomcat訪問日誌:app
1. 127.0.0.1 - - [15/Mar/2018:09:33:57 +0800] "GET /app/headlines HTTP/1.1" 400 1126
2. 221.232.135.233 - - [15/Mar/2018:09:34:16 +0800] "GET /app/homeCategory?id=4 HTTP/1.1" 200 10910前後端分離
其中第一條是nginx反向代理的返回400,第二條是直接訪問tomcat服務則正常.測試
一開始是懷疑tomcat配置引擎不支持本機地址訪問,在服務器端用http命令行訪問也無問題。命令行
後來分析了tomcat錯誤緣由:代理
The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
貌似nginx是訪問請求格式問題。
嘗試在代理請求頭上加入該配置:
proxy_set_header Host $host; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
location / { #端口80的請求所有轉發到tomcat_server1即tomcat1服務上 proxy_pass http://tomcat_server1; proxy_http_version 1.1; proxy_set_header Host $host; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP }
訪問ok,可是仍是沒弄清楚具體緣由。