Nginx反向代理tomcat返回400 bad request

Nginx反向代理tomcat返回400 bad request

nginx 版本1.12, tomcat版本 9.06

最近用Nginx做反向代理tomcat,实现前后端分离,nginx 将请求代理到tomcat服务始终返回400 bad request,如果直接访问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访问日志:

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? 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,但是还是没弄清楚具体原因。