使用tomcat發布3dtiles或terrain數據遇到的gzip問題
問題一
對大於1KB小於48KB的json請求進行gzip壓縮,json為原文件(對於大於48KB使用sendfile)
1.創建原始文件
2.設置
在apache-tomcat-8.5.9/conf/server.xml文件中,修改節點如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="200000" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="application/json"
/>
3.參數說明
compression="on" 開啟壓縮
compressionMinSize="1024"大於1KB的文件才進行壓縮
compressableMimeType="application/json",多個類型用","分隔,MIME類型(Content-Type)列表,例如:application/json。
useSendfile屬性默認為true,當數據大小達到48kb時,將啟用文件傳輸(sendfile),所以我們想要壓縮超過48kb的數據時必須將useSendfile設置為false。(有同學按照我的博客設置,是因為文件大於48KB並且沒有關閉sendfile)
4.確定MIME類型
方法一:MIM在apache-tomcat-8.5.9/conf/web.xml有一個設置列表,可以將對應文件后綴名添加MIME類型,
例如:下面配置將請求json后綴名文件的url都添加Content-Type=application/json
<mime-mapping> <extension>json</extension> <mime-type>application/json</mime-type> </mime-mapping>
方法二:
若是不想找文件后綴名與MIME類型的對應關系,直接查看請求即可
5.確定是否gzip壓縮
在瀏覽器輸入http://localhost:8080/test-gzip/tileset.json
5.1在response headers里有Content-Encoding:gzip(告訴瀏覽器需要gzip解壓),只要有這個head就意味着tomcat設置的gzip壓縮生效了
5.2查看文件內容,用於判斷是否gzip壓縮是錯誤的,例如下圖
上圖數據和原始數據一樣,可能會誤以為獲取到的json沒有用gzip壓縮,其實是瀏覽器已經解壓過數據,所以你看到的數據與原始數據是一樣的。
可以通過比較文件大小判斷是否gzip壓縮
問題二
對大於1KB小於48KB的.terrain后綴文件請求,進行gzip壓縮。
1.設置
1.1在apache-tomcat-8.5.9/conf/web.xml,增加映射關系
<mime-mapping> <extension>terrain</extension> <mime-type>application/octet-stream</mime-type> </mime-mapping>
1.2在apache-tomcat-8.5.9/conf/server.xml文件中,修改節點如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="200000" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="application/octet-stream"/>
2.測試
在瀏覽器輸入http://localhost:8080/test-gzip/0.terrain
延申:
使用cesiumlab生成已經經過gzip壓縮過的地形,就沒辦法通過設置tomcat的gzip了,因為tomcat會再次壓縮一次(相當於壓縮兩次)。只能設置response headers標識
例如java代碼里加入
response.setHeader("Content-Encoding", "gzip");
例如加過濾器(已經驗證過)