解决undertow多个https证书的web项目部署问题

运行环境:

服务器:windows server2008 r2服务器

项目:三个阿里云https证书和一个http项目

jdk:1.8

tomcat:9.0

问题:

tomcat启动一次费时费力,随便修改一个项目都要面临重启tomat的可能,实在是不胜其烦。

解决之道:

使用jfianl undertow使用不同端口管理各个项目,实在各个项目独立运行。

把大象装冰箱只需三步

  1. 首先三个https域名分别使用8443、7443、6443端口,http使用8093端口,启动项目,确保可以通过https://项目名称:端口号访问 

  2. 安装nginx 并配置nginx.conf



    1.   #A项目 config start	
      		server {
      		listen       443 ssl;
      			server_name  www.A.com;
      
      			ssl_certificate      rs\A.pem;
      			ssl_certificate_key  rs\A.key;
      
      		   # ssl验证相关配置
      			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;   #使用服务器端的首选算法
      			location / {
      				 proxy_pass https://www.A.com:7443;
      				}
      		}	
      		#实现http自动跳转到https
      		server {  
      			listen  80;  
      			server_name www.A.com;      
      			rewrite ^(.*)$  https://$host$1 permanent;  
      		}  	
      	
      	#A 项目 config end	
      
      	#B项目 config start	
      	server {
      		listen       443 ssl;
      		server_name  www.B.com;
      
              ssl_certificate      pl\B.pem;
      		ssl_certificate_key  pl\B.key;
      
             # ssl验证相关配置
      		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;   #使用服务器端的首选算法
              location / {
                   proxy_pass https://www.B.com:6443;
      			}
      		}	
      	
      	server {  
      		listen  80;  
      		server_name www.B.com;      
      		rewrite ^(.*)$  https://$host$1 permanent;  
      	}  	
      	
      	#B项目 config end	



    2. #http项目 config start 
      	 server {
             listen   80;
      	 
              server_name  www.D.com;
      
              
              location / {
                   proxy_pass http://www.D.com:8093;
      			}	
      		
      		}	
      	#http项目 config end
      	

      注意:证书文件要放到nginx的conf文件夹下面使用相对路径访问,使用绝对路径可能会提示找不到的提示

      打完收工!

评论区

码通科技

2018-12-15 09:13

@JFinal 原来是想这么弄来着:https在项目中都配置好,使用nginx只转发443端口,然后通过域名访问不同项目,结果发现访问不到,使用其它端口可以,怀疑是443端口必须配置ssl。由于项目都是已上线项目急着切换undertow,时间仓促,回头再研究一下,有结果了继续分享!

简单代码

2019-01-18 20:25

@JFinal 疑问:多个undertow服务器在跑,会不会比tomcat多个项目布置更占内存?懒得测试了。:)

码通科技

2019-01-20 21:44

@简单代码 你说的这个问题必须不存在,本人亲测,我的服务器上面用undertow弄了至少8个项目,比原来tomcat省内存太多了

简单代码

2019-01-22 09:27

dolphin93

2019-02-03 10:43

多谢,按照您的方式配置成功,我试过nginx只转发443,ssl配置在undertow上,确实不成功,可能是nginx希望所有流量都是加密,所以在443端口要求做ssl配置。 另外,您的 listen 443 ssl 后面再 加上一个 http2 可以开启新的http2。 我还有个疑问,看您的 proxy_pass https://www.A.com:7443; 这里不是应该http就可以了吗,难道在undertow上也配置了ssl? 应该只nginx配置就够了吧

JFinal

2019-02-15 21:41

@dolphin93 如果 nginx 配置了 ssl,那么 proxy_pass 后面只需要 https 就可以了,除非 jfinal undertow 项目也配置了 ssl,这种用法感觉上会拉低性能

nommpop

2019-03-01 17:05

谢谢楼主的分享,对我很有帮助,谢谢

fmpoffice

2019-11-06 17:41

@JFinal ssl只需要在undertow配置的情况下,nginx绑定对应的域名,监听443应该是转发:https://www.A.com:7443

fmpoffice

2019-11-06 18:56

@JFinal 他这个配置是把证书配置倒nginx,并不是配置倒undertow,请问有哪里有相关案例呢?

JFinal

2019-12-13 15:13

@fmpoffice SSL 建议配置在 nginx 上, 一来是配置方便,二来是性能最好,下面给出 jfinal.com 的 ssl 配置:
server {
listen 80;
listen 443 ssl http2;
keepalive_timeout 70;

server_name jfinal.com www.jfinal.com;
root /app/jfinal-com/webapp;

ssl_certificate cert/20200618_www.jfinal.com.pem;
ssl_certificate_key cert/20200618_www.jfinal.com.key;
ssl_session_cache shared:SSL:10m;
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;

location 配置省略
}

简单来说就是添加一个 server 配置,其中放上监听的端口号,已经对应的域名
有关 ssl 的配置,开启就是一个 listen 443 ssl http2; 搞定,后面的 ssl_ 打头的是一些证书、算法、cache 等等配置,这些在 nginx 官网都有详细的文档

如果你要配置多个 SSL 对应多个网站的话,继承添加 server ,改改 server_name、root、location 配置即可

liugz

2020-03-24 14:37

请问下单个项目停止的脚本有没?
测试了如果一个服务器上多个项目,点击stop.bat后,所有的项目都会停止。这感觉不太合适。

JFinal

2020-03-24 15:04

@liugz 使用新版本的脚本,下载首页的 jfinal_demo_for_maven.zip ,从里面拿到最新版本

liugz

2020-03-24 15:38

试过了:
set "PATH=%JAVA_HOME%\bin;%PATH%"
echo stopping jfinal undertow
for /f "tokens=1" %%i in ('jps -l ^| find "%MAIN_CLASS%"') do ( taskkill /F /PID %%i )

这个停止的脚本实现不了单个停止项目的效果的。 我是在1台服务器上同一份代码复制两份。

热门分享

扫码入社