公司業務需要,需要另外一個相似版本的web應用,項目部署的時候工程檔案都是一樣的(只是配置不一樣),部署到新的地方時,比如tomcat伺服器的時候,報了如下錯誤:
java.net.SocketException: Unexpected end of file from serverat sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:806)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:665)at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:803)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:665)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1230)................at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)at java.lang.Thread.run(Thread.java:761)
為瞭解決該問題,折騰了好幾個小時,總感覺是工程之間互訪出了問題,由於整個工程有六七個工程,工程之間存在互訪,查看後台日誌確實是互訪的問題。一開始還以為是工程代碼問題,六七個工程部署在同一台機器的3個tomcat中,項目互訪直接走內網即可。但是拋出上面錯誤,一下子懵了,外網訪問都可以,為啥內網之間互訪卻不行了呢。
為瞭解決這個問題,重新檢查了下配置,沒有錯,最終發現是因為tomcat環境配置的問題,之前部署走的是http協議,現在部署的tomcat是https協議,tomcat裡的http和https協議有不一樣的連接埠,
如下,我的tomcat https連接埠是8083
<Connector port="8083" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/u01/ssl/server.jks" keystorePass="password" truststoreFile="/u01/ssl/server.jks" truststorePass="password" />
http連接埠是8030
<Connector port="8030" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
一定要注意這個問題,然後在工程的web.xml檔案中加入https的支援
<security-constraint> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
如果存在通過擷取資料庫表中的地址來動態訪問工程的話,使用https://ip:port這種方式,在我測試的時候會報連線逾時的問題。
最終改用了https://localhost:port的訪問方式成功把工程代碼跑起來了。記錄下心得,方便遇到同樣問題的碼農,提供一種解決方案或思路。