您的位置:首页 > 理论基础 > 计算机网络

Nginx+tomcat配置https后出现400 Bad Request问题

2017-11-29 17:48 721 查看
因为任职公司的软件产品都是基于二维码的,必须使用微信扫码获取OPENID的形式展开业务,然后坑爹的TX发布通知12月底之前所有http协议的页面将无法访问,所以一狠心购买了一个通配符的SSL证书,在此简述下nginx+tomcat配置https的流程和我遇到的问题:

系统环境:Centos6.8

软件版本:nginx(1.12.1)   tomcat(7.0.78)

nginx和tomcat的安装这里就不再赘述了,直接进入主题!

由于本人算个三流的运维,也是第一次配置https,遇到很多坑,自己查资料弄了好几天才弄生产环境的项目


不说废话了,公司项目一般由后台和wap端组成,一般情况下我会使用两个tomcat分开部署,但是一些用户量不大的项目会放在一个tomcat 里面进行部署;

nginx的SSL配置如下:

##项目主配置

server {

    listen 443;

    ssl on;

    server_name test-2.***.com;

    root /www/html;

    index index.html index.htm;

    ssl_certificate   /etc/nginx/cert/214334620590810.pem;

    ssl_certificate_key  /etc/nginx/cert/214334620590810.key;

    ssl_session_timeout 5m;

    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_prefer_server_ciphers on;

    include /etc/nginx/default.d/*.conf;

    location / {

    proxy_pass        http://127.0.0.1:8083;

            proxy_redirect off;

            proxy_set_header  Host  $host;

            proxy_set_header  X-Real-IP  $remote_addr;

            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_set_header  X-Forwarded-Proto https;

            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}

}

##http强制跳转https

server {

      listen      80;

      server_name    test-2.***.com;

      return      301 https://$server_name$request_uri;
}

这部分配置基本就这样了,ssl部分直接参照阿里云的配置文档(因为证书直接在阿里云购买,服务器什么的都是阿里云的),后面做了强制跳转;

tomcat的配置就很坑爹了!!

我们有很多老项目使用的tomcat6部署的,以前的开发人员大多都离职了,换成tomcat7或者更高的版本部署会报错!!   

当然https配置也没有成功,所以这里主要说下tomcat7的配置:

(注意!次配置方式不适用于tomcat6版本!!)

在网上查了下资料,说是要修改tomcat配置文件server.conf,然后听了开发人员的建议进行修改,修改后内容如下:

……

    <Connector port="8095" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="443"

               proxyPort="443"

               URIEncoding="UTF-8" />

……

            <Valve className="org.apache.catalina.valves.RemoteIpValve"  

                   remoteIpHeader="x-forwarded-for"  

                   remoteIpProxiesHeader="x-forwarded-by"  

                   protocolHeader="x-forwarded-proto"    />

……

修改后重启tomcat和nginx并没有什么问题,单独部署项目的tomcat访问原来的域名也会正常跳转到https,问题是当tomcat部署了两个项目的时候访问就会报错400 Bad Request !    

比如原来访问test.***.com/manage可以正常访问,配置https后浏览器直接输入test.***.com/manage 域名会自动变成http://test.haha.com:443/manage/  然后页面提示400 Bad Request,更神奇的是如果浏览器输入test.***.com/manage/   (结尾带斜杠!)却可以正常跳转到https,这我就蒙逼了~

由于本人新手,一直怀疑是nginx配置的问题,所以绕了很多弯路,研究了一天的nginx配置后无意中看到别的项目的tomcat里面的server.conf原配置并没有               proxyPort="443"这一行,抱着尝试下的心理去掉了这一行后重启了tomcat,问题解决~


具体原因我也不知道是为什么,tomcat的配置我也是参考别人的,并且找开发人员确认过没有问题,但是还是被现实给了一耳光,原因以后慢慢摸索吧~   先记录下问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息