SSL在NGINX的配置方法实践(无需修改tomcat和程序配置)

本文介绍如何利用NGINX实现SSL握手并转发HTTP请求至TOMCAT,同时确保请求的安全性和正确性。内容涵盖NGINX配置细节、优化方案及TOMCAT集成注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSL方案:
1、NGINX做ssl握手,其与TOMCAT之间仍旧HTTP协议(当NGINX和TOMCAT在同一相对安全的内网时这样做可以减少SSL握手次数)。NGINX的代理转发(proxy_redirect:反向替换proxy_pass或上游,如TOMCAT返回的URL),从HTTP的替换成HTTPS。可包括多条proxy_redirect配置。注意端口号如需要替换也要写入。 
2、NGINX强制将接收到的HTTP请求rewrite为HTTPS 
3、NGINX做优化方案,包括keepalive_timeout,开启ssl的session缓存。 
4、TOMCAT和项目代码及配置文件(目前)不需要变更。 
5、需要注意的是,程序从HTTP头部获取的信息,包括HTTPS协议,端口号,客户IP等,数据是正确的。但,若用request.getScheme();(HTTP or HTTPS)request.isSecure();(是否安全,boolean)request.getRequestURL().toString();(URL,带协议名)request.getRemoteAddr();(客户IP地址)等,获取则是错误的,request的信息有nginx转发到tomcat,并未做替换处理,因此获取到的都是nginx的信息,如有需要,在tomcat的server.xml设置一个valve。


-------------------------
nginx配置:
(1)、自定义配置文件,放置于/etc/nginx/conf.d文件夹下,xxx.conf
(2)、引入该文件nginx/nginx.conf文件的http模块最后加入include /etc/nginx/conf.d/*.conf
(3)、nginx.conf文件中做ssl优化配置,http模块最后加入
ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 10m;
(4)、自定义配置文件xxx.conf中做如下配置:
#HTTP server
server {
		#监听端口
        listen       80;
		#监听域名/IP
        server_name abc.mydomain.com;
		#请求的重定向,该功能的含义及用法请搜索rewrite,该命令可添加在server、location、if模块下。
		#本例由于要求转发所有80的http请求,因此rewrite放置于server模块下,且location已注销。
        rewrite ^(.*) https://$host$1 permanent;
        #location / {
              # proxy_pass http://192.168.1.111:8080;
              # proxy_set_header Host $host;
              # proxy_redirect  http://192.168.1.111:8080 http://abc.mydomain.com:59998;
              # 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;
              # proxy_set_header Upgrade $http_upgrade;
              # proxy_set_header Connection "upgrade";
       #}
}
#HTTPS server
server {
		#监听HTTPS默认端口443
        listen       443;
		#开启SSL
        ssl on;
		#监听域名/IP
        server_name abc.mydomain.com;
		#HTTPS(若不在SSL的模块内,该命令默认为HTTP保持连接的时长)保持连接的时长,单位秒。具体用法自行搜索。
        keepalive_timeout   70;
		#SSL证书(公钥),证书生成方法参考购买证书的网站说明,本例中的证书来自于Godaddy,该证书包括中间证书和发给自己的证书。
        ssl_certificate     /etc/ssl/private/mydomain.crt;
		#SSL私钥,该私钥通常在申请证书前生成。记得备份文件。需要注意的是,私钥非常重要,不可泄露,需要存放在访问受限的文件中,当然,nginx主进程必须有读取密钥的权限。私钥和证书可以存放在同一个文件中。
        ssl_certificate_key /etc/ssl/private/mydomain.key;


        location / {
				proxy_pass http://192.168.1.111:8080;
				#代理重定向,作用是将上游服务器返回链接中的第一个参数替换为第二个参数。
				#此处比较重要,tomcat和程序不做任何特定配置的话(如tomcat新加valve将http头信息赋到request中),上游服务器(如tomcat)将返回http协议及其链接,用此处重定向为https和指定的服务器域名返回给客户端。
				proxy_redirect  http://abc.mydomain.com https://abc.mydomain.com;
				proxy_redirect  https://192.168.1.111:8443 https://abc.mydomain.com;
				proxy_redirect  http://192.168.1.111:8080 https://abc.mydomain.com;
				#以下为nginx转发给tomcat的时候,将数据加到http头信息中。具体参数含义和变量的用法请搜索。
				proxy_set_header Host $host:$server_port;
				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;
				#proxy_set_header Upgrade $http_upgrade;
				#proxy_set_header Connection "upgrade";
       }

  
-----------------------------------------
资料链接及其说明:
nginx的一些配置,需要注意,有错误的地方。
http://blog.youkuaiyun.com/na_tion/article/details/17334669


nginx与tomcat之间传递http,使用request.getScheme()取到的仍为http,需要注意,个人建议程序里别用request.getScheme,而是取http头部信息,用该文章提供的方案需要侵入tomcat做配置。
http://feitianbenyue.iteye.com/blog/2056357


与第二条资料配合,tomcat官网关于valve参数的API。告诉你配置的这几项作用是什么。
http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html


与第二条资料配合,第二条资料的灵感出处。需要注意的地方同第二条。
http://han.guokai.blog.163.com/blog/static/136718271201211631456811/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值