实际上, 大规模的网站都有很多台Web服务器和应用服务器组成,用户的请求可能是经由 Varnish、HAProxy、Nginx之后才到应用服务器,中间有好几层。而中小规模的典型部署常见的是 Nginx+Tomcat 这种两层配置,而Tomcat 会多于一台,Nginx 作为静态文件处理和负载均衡。

如果Nginx作为前端代理的话,则Tomcat根本不需要自己处理 https,全是Nginx处理的。用户首先和Nginx建立连接,完成SSL握手,而后Nginx 作为代理以 http 协议将请求转给 tomcat 处理,Nginx再把 tomcat 的输出通过SSL 加密发回给用户,这中间是透明的,Tomcat只是在处理 http 请求而已。因此,这种情况下不需要配置 Tomcat 的SSL,只需要配置 Nginx 的SSL 和 Proxy。

在代理模式下,Tomcat 如何识别用户的直接请求(URL、IP、https还是http )?

在透明代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果:

  • request.getScheme() //总是 http,而不是实际的http或https
  • request.isSecure() //总是false(因为总是http)
  • request.getRemoteAddr() //总是 nginx 请求的 IP,而不是用户的IP
  • request.getRequestURL() //总是 nginx 请求的URL 而不是用户实际请求的 URL
  • response.sendRedirect( 相对url ) //总是重定向到 http 上 (因为认为当前是 http 请求)

如果程序中把这些当实际用户请求做处理就有问题了。解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,而不用改程序。

配置 Nginx 的转发选项:

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  $scheme;

配置Tomcat server.xml 的 Engine 模块下配置一个 Value:

<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For"protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。X-Forwarded-For 是为了获得实际用户的 IP。

这样以上5项测试就都变为正确的结果了,就像用户在直接访问 Tomcat 一样。

文章参考:负载均衡配置

        # nginx 部分配置参考server {server_name www.zhangblog.com;listen 443;index index.jsp;ssl on;ssl_certificate /mnt/releaseCert/serverbundle.crt;ssl_certificate_key /mnt/releaseCert/serverbundle.key;if ($request_uri ~* "\.html$"){rewrite ^/(.*)$ http://$host/$1 redirect;}location / {proxy_pass http://10.171.27.25:9002;  # 内网IPproxy_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 $scheme;}}server{server_name www.zhangblog.com;listen 80;index index.jsp;if ($request_uri ~* "/pmcs/$"){rewrite ^/(.*)$ https://$host/$1 redirect;}if ($request_uri ~* "/pmcs/login.jsp$"){rewrite ^/(.*)$ https://$host/$1 redirect;}location / {proxy_pass http://10.171.27.25:9002;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 $scheme;}}

Nginx+Tomcat+SSL 识别 https还是http相关推荐

  1. Nginx:Nginx添加SSL实现HTTPS访问

    上一篇博文给大家介绍了Nginx的安装与运行: Nginx:Nginx安装与运行 今天博主给大家分享如何给Nginx添加SSL,实现HTTPS访问Nginx服务,但前提条件是你的服务器有SSL,博主是 ...

  2. nginx配置ssl实现https访问 亲测有效

    nginx配置ssl实现https访问 亲测有效 申请证书 运行用户,默认即是nginx,可以不进行设置 停止nginx 启动 nginx日常操作命令 申请证书 在这里,我直接申请腾讯云的免费证书.这 ...

  3. Nginx 配置 SSL 及 HTTPS 协议通信过程

    一.前言 基础知识 1.1 公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分,公钥.私钥.加密解密算法,它的加密解密过程如下: 加密:通过加密算法和公钥对内容( ...

  4. Nginx 配置 SSL 证书 + HTTPS 站点小记

    今天给几个站点配置了认证的 ssl 证书,但是苦于自己技术不过关,或是知识不足,导致还有那么一小点 Bug 的出现,这里就我配置 HTTPS 站点的经验来总结一下吧. 一.什么是 SSL 证书,什么是 ...

  5. Nginx配置ssl证书(https证书)

    https协议是由SSL+http协议构建的安全协议,支持加密传输和身份认证, 安全性比http要更好,因为数据的加密传输,更能保证数据的安全性和完整性. 安装nginx 1.启动容器: 拉取镜像 d ...

  6. 解决Nginx+Tomcat下客户端https请求跳转成http的问题

    Nginx上开启https,  后端使用Tomcat,  两者间走http协议, 但发现如果tomcat应用存在跳转时, 则客户端浏览器会出现400 Bad Request的错误, 通过抓包发现原因是 ...

  7. nginx部署ssl转发https协议请求

    在小程序上线的时候需要服务器为https请求,那么就需要ssl证书,SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能.但后 ...

  8. Nginx使用SSL配置HTTPS

    创建服务器私钥 openssl genrsa -des3 -out server.key 1024 创建签名请求的证书(CSR) openssl req -new -key server.key -o ...

  9. Django云服务器配置Nginx站点SSL证书HTTPS协议

    如果自己已经能独立使用 Python 的 Django 框架完成一个项目了,现在需要进行部署服务以及相关项目分发的二级域名了.不过至于什么是 http 和 https 这里不做科普,不懂的请找度娘. ...

  10. Nginx + Tomcat + HTTPS 配置不需要在 Tomcat 上启用 SSL 支持

    2019独角兽企业重金招聘Python工程师标准>>> Nginx SSL+tomcat集群 Nginx tomcat no 不用https 最近做了个Web项目, 架构上使用了 N ...

最新文章

  1. kubeadmin 安装 k8s集群
  2. mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型
  3. 14个JavaScript代码优化技巧
  4. jsonrpc aria2_抛弃迅雷,Aria2 新手入门
  5. GB28181系统设计(四)-横向扩展和纵向扩展
  6. ECS之System系统
  7. 驱动兼容_【重磅】上海数明发布国内首款兼容光耦隔离式单通道栅极驱动器系列产品SLM34x...
  8. vue 判断权限过期_vue 路由权限
  9. hiho一下 第五十周 (求欧拉路径)
  10. 【noip2013】d2解题报告
  11. 翼虎AE教程 Max贴图教程 地址备份。。。。
  12. Java中定时任务的6种实现方式,你知道几种?
  13. 我的iPad/iPhone App推荐列表
  14. ad采样正弦电压计算c语言程序,TMS320F2812 DSP编程之AD采样精度的校准算法(转)...
  15. Java SE 集合:Map接口
  16. minikube start命令的国内使用方法
  17. 微信小游戏制作大厅里的排行榜(跟游戏内的排行榜有区别)
  18. 贼有趣:朱茵变杨幂,人工智能换脸让明星不再担心自己演技?
  19. 慧据价值 链接未来丨第八届数据技术嘉年华大会全议程呈现
  20. Java:MouseListener、MouseMotionListener监听器与MouseEvent事件

热门文章

  1. Android 引导页
  2. Lustre 文件系统安装
  3. 常用指令备忘录----持续更新
  4. svn up 更新与回退
  5. WebForms简介
  6. Unity3d--第三人称摄像机常用控制
  7. 修改Flume-NG的hdfs sink解析时间戳源码大幅提高写入性能
  8. Visual Studio设置代码注释(包括作者版本信息)
  9. Android ViewPager多页面滑动切换以及动画效果
  10. discuz x2.5 广告位开发学习(第一步:摸索)