部署离线数据包

离线数据包是一组静态资源文件,并不需要特定的云端程序提供运行时环境,因此可以像部署网页的css、js、image一样部署在静态Web服务器上。 注意:在部署前,必须把压缩文件解压。

支持的Web服务器

包括但不限于以下几种:

  • Nginx
  • Apache
  • Tomcat
  • IIS
  • NodeJS

实现步骤

以Nginx为例,三个步骤完成部署:

  1. 把解压后的文件夹拷贝到Nginx默认站点目录html下(如:D:\nginx-1.5.0\html);
  2. 在nginx.conf文件中,针对离线数据包访问路径设置Http响应头(下文详述);
  3. 在浏览器中输入“http://ip:port/{离线数据包文件夹名称}”即可(如:http://localhost/a686c361e0bb07d66685d83fd18a881d)。

HTTP响应头设置

为了加速访问,离线数据包中的很多文件都进行了gzip压缩。在离线数据包部署到Web服务器之后,必须对.gz文件设置http响应头,否则将产生错误。 1)由于仅需要针对BIMFACE离线数据包中的.gz文件设置响应头,建议开发人员最好把BIMFACE的离线数据包放置在统一的路径下,然后再针对这个统一的路径,设置匹配后缀为.gz的路径。 2)针对以上路径设置:Content-Encoding: gzip 由于不用的Web服务设置Http响应头的方式不一,下面介绍了几种常见服务器的设置方式:

1. Nginx

在nginx.conf文件中相应的Server节点添加

location ~* .*\.gz$ {
    add_header Content-Encoding gzip;
}

例如:

server {
    listen 80;
    server_name localhost;

    location ~* .*\.gz$ {
        add_header Content-Encoding gzip;
    }
}

2. Apache

1)Apache未启用gzip特性时,httpd.conf文件末尾添加

Header set Content-Encoding "gzip" "expr=%{REQUEST_URI} =~ m#.*.gz$#"

2)Apache启用gzip特性时,需要对gz请求禁用gzip功能,httpd.conf文件在对应的gzip配置处添加

DeflateCompressionLevel 6
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
Header set Content-Encoding "gzip"

3. Tomcat

Tomcat不支持在配置文件中设置,因此只能通过代码在拦截器中设置头信息 1)编写Filter类,对gz请求响应添加“Content-Encoding”头属性,类似

package com.bimface.offline.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class GzFilter implements Filter {

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
          throws IOException, ServletException {
      HttpServletResponse response = (HttpServletResponse) servletResponse;
      
      //告诉响应头以gzip格式解码,启用浏览器gzip解压
      response.setCharacterEncoding("UTF-8");
      response.setHeader("Content-Encoding", "gzip");
      response.setContentType("application/json;charset=utf-8");
      try {
          filterChain.doFilter(servletRequest, servletResponse);
      } catch (ServletException e) {
          e.printStackTrace();
      }
  }

  @Override
  public void destroy() {
  }
}

2)Filter打包Jar放入Tomcat\lib目录下 3)对Tomcat的web.xml文件添加全局Filter配置

<filter>  
    <filter-name>gzFilter</filter-name>  
    <filter-class>com.bimface.offline.filter.GzFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>gzFilter</filter-name>  
    <url-pattern>*.gz</url-pattern>
</filter-mapping>

4. IIS

通过IIS信息服务管理器或者web.config文件进行规则配置对gz请求响应添加“Content-Encoding”头属性

5. NodeJS

在NodeJS服务中对gz请求响应添加“Content-Encoding”头属性,类似

response.writeHeader(200,{
    'Content-Encoding' : 'gzip',
    'content-type' : 'application/octet-stream'
});

例如Server.js:

var port = 8888;
var http = require('http');
var fs = require('fs');

var documentRoot = 'D:/Tools/nginx-1.5.0/html'; //需要访问的离线数据包文件的存放目录

var server= http.createServer(function(req,res){
    var url = req.url; 
    var file = documentRoot + url;

    fs.readFile(file, function(err,data){
        if(err){
            res.writeHeader(404,{
                'content-type' : 'text/html;charset="utf-8"'
            });
            res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
            res.end();
        }else{
            if(url.substr(url.length-3, 3) == ".gz"){
                res.writeHeader(200,{
                    'Content-Encoding' : 'gzip',
                    'content-type' : 'application/octet-stream'
                });
            }else{
                res.writeHeader(200,{
                    'content-type' : 'text/html;charset="utf-8"'
                });
            }
            res.write(data);
            res.end();
        }
    });

}).listen(port);