有些客户应用华丹快速开发平台开发的业务系统,业务访问比较大,如企业erp,还有省级政府应用,如税务数据分析平台,药监业务系统,都是全省范围内使用,这些系统建议布署成nginx(或tengine)+Tomcat集群的方式,由nginx处理所有静态内容,将动态内容转发给多个Tomcat处理。即使是在同一台服务器上布署多个Tomcat实例组成集群,实践证明,也会大幅度提升运行效率。建议优先选择Linux服务器,但也有很多用户使用Windows服务器,本文就以Windows为例,简单介绍一下在Windows下布署nginx+Tomcat集群发布华丹在线开发平台WEB应用。

以下简单介绍安装配置过程:

Jdk安装配置从略,要求jdk1.8及以上,为了便于安装Tomcat9。

首先安装配置2个(或4个,实例个数需要考量实际需要及服务器资源情况)Tomcat实例,这里选择是在同一台服务器上安装多个实例,如果是可以在不同服务器上安装效果更好,步骤大同小异。简单步骤如下:

1、从https://tomcat.apache.org/下载apache-tomcat-9.0.41-windows-x64.zip,解压缩至D:\webserver\目录下,重命名为cluster_tomcat_1。

2、将webapps目录整个删除。主要为了安全考虑,不要留自带的manager应用。

3、在D:\webserver\目录下创建目录webapps\ROOT,并将华丹开发平台程序(war包的话需要解压)复制到该目录下,保证index.jsp在ROOT根目录下。

4、将所要用到的数据库jdbc驱动都复制到%tomcat%\lib目录下。

5、修改conf\Server.xml中Connector配置,注意端口号80留给nginx使用,并增加一些必要的参数项,如下:

<Connector port="8085" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"

URIEncoding="UTF-8" />

其中,URIEncoding="UTF-8"是设置get方式提交的编码。

relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"是允许url中含有这些特殊符号。

然后将Host段内,appBase值由webapps修改为E:\webserver\webapps。

如里原来根路径不是/,注意修改平台中param.config中 的ContextRoot及Constants.js中ContextRoot值。

6、修改Tomcat中bin目录下的catalina.bat文件,在开始位置setlocal下面一行增加set JAVA_OPTS=-Xms1024m -Xmx1024m,设置Tomcat内存,生产环境最大内存最小内存一般设置同等大小。注意这里设置内存,只能通过startup.bat启动才生效,Tomcat注册成服务后以服务方式启动这个设置不生效,不过这里仍然设上。

7、修改tomcat中bin目录下的service.bat,找到

set DEFAULT_SERVICE_NAME=Tomcat9

set SERVICE_NAME=%DEFAULT_SERVICE_NAME%

将SERVICE_NAME修改成Cluster_Tomcat9_1,注意不要去修改DEFAULT_SERVICE_NAME,这里是为了在一台服务器上安装多个Tomcat实例,将每个Tomcat实例都注册成服务,因此要改服务名,如果是该服务器只布署一台Tomcat实例,无修修改。

搜索--DisplayName "Apache Tomcat 9.0 %SERVICE_NAME%" ^,改成--DisplayName "%SERVICE_NAME%" ^,这个主要是缩短服务显示名称,可以不改。

搜索

if "%JvmMs%" == "" set JvmMs=128

if "%JvmMx%" == "" set JvmMx=256

将最小内存最大内存均设置为1024,即1G,如下:

if "%JvmMs%" == "" set JvmMs=1024

if "%JvmMx%" == "" set JvmMx=1024

修改完后,保存退出,在命令行窗口中目录切换到%tomcat%\bin下,执行service install,会将Tomcat注册成名Cluster_Tomcat9_1的服务,将服务改成自启动,测试服务启动后Tomcat是否正确启动,通过浏览器访问http://127.0.0.1:8085能不能访问平台页面。

按如上方法安装第二个Tomcat实例,注意server.xml中的两个端口号不一样,一是<Server port="8005" shutdown="SHUTDOWN">这里改成8006,二是<Connector port="8085" protocol="HTTP/1.1",这里改成8086,然后service.bat中的SERVICE_NAME修改成Cluster_Tomcat9_2。

如上方法安装,所有Tomcat实例的应用目录均为D:\webserver\Root,方便以后布署维护。

接下来安装配置nginx,步骤如下:

1、参考Windows下安装nginx并将其注册成服务,将nginx安装在D:\webserver\nginx目录下,将注册成服务。

2、D:\webserver目录下,创建static目录,将webapps\Root目录下华丹开发平台WEB应用目录整个复制到该目录下,并删除web-inf整个目录,再删除除根目录下index.jsp目录外的所有的jsp文件,保留静态文件。再次强调,这一步很重要,必须删除,否则一些关键的核心代码就会被nginx直接爆露到网上,别人可以随意下载,造成代码泄露。注意,这里保留一下index.jsp文件是因为下面配置nginx时,将index.jsp设为默为页:

location = / {

           #主页文件

           index index.jsp;            

       }

如果没有这个文件,默认页设置失效。

8、配置nginx

修改D:\webserver\nginx\conf\nginx.conf文件,参考如下设置:

#user  nobody;

worker_processes  auto;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type  application/octet-stream;

   server_tokens  off;#隐藏版本号

   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                     '$status $body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

   #access_log  logs/access_$year$month$day.log  main;

   client_max_body_size  10m;

   sendfile        on;

   #tcp_nopush     on;

   #keepalive_timeout  0;

   keepalive_timeout  65;

   #Gzip Compression

   gzip on;

   gzip_buffers 16 8k;

   gzip_comp_level 6;

   gzip_http_version 1.1;

   gzip_min_length 256;

   gzip_proxied any;

   gzip_vary on;

   gzip_types

     text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml

     text/javascript application/javascript application/x-javascript

     text/x-json application/json application/x-web-app-manifest+json

     text/css text/plain text/x-component

     font/opentype application/x-font-ttf application/vnd.ms-fontobject

     image/x-icon;

   gzip_disable "MSIE [1-6]\.(?!.*SV1)";

   upstream webserver {

   server 127.0.0.1:8085;

   server 127.0.0.1:8086;

   ip_hash; #同一IP定向到后端同一台webserver,避免session共享的问题

   }

   server {

       listen       80;       

       if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") {

          set $time $1$2$3;

       }

       access_log  logs/access_${time}.log  main;

       charset utf-8;

       #文件夹

       root E:\webserver\static;        

       location = / {

           #主页文件

           index index.jsp;            

       }

       location ~* \.(jsp|do|action)$

       {

           # 真实的客户端IP

           proxy_set_header   X-Real-IP        $remote_addr;

           proxy_set_header   REMOTE-HOST      $remote_addr;

           # 请求头中Host信息

           proxy_set_header   Host             $http_host;#注意这里如果涉及到路由器端口映射就必须用$http_host,否则可以用$host

           # 代理路由信息,此处取IP有安全隐患

           #String ip=request.getHeader("X-Forwarded-For");java中取远程IP需要该项,否则返回nginx地址127.0.0.1

           proxy_set_header   X-Forwarded-For  $remote_addr;#$proxy_add_x_forwarded_for;

           # 真实的用户访问协议

           proxy_set_header   X-Forwarded-Proto $scheme;

           proxy_pass http://webserver;

           expires -1;

       }

       #静态文件交给nginx处理,有写~ .*\.(htm|html|xhtml|txt|xml)$,.*表示前面有0-n个字符,意义不大。

       location ~* \.(htm|html|xhtml|txt|xml)$

       {

           #expires 1d;#不设置expires则响应304,默认缓存,设置后,没过期不会访问服务器,也没日志

       }

       #静态文件交给nginx处理

       location ~* \.(js|css)$

       {

           #expires 1d;

           access_log off;

       }

       #静态文件交给nginx处理

       location ~* \.(gif|jpg|jpeg|png|bmp|swf|ico|flv|mid|mp3|wma)$

       {

           expires 1d;

           access_log off;

       }

       #通常对应下载文件

       location ~* \.(rar|zip|doc|ppt|pdf|xls)$

       {

       }

       

       #error_page   500 502 503 504  /50x.html;  

       #location = /50x.html {

       #    root   html;

       #}

       

       location /nginx_status {

           stub_status on;

           access_log off;

           allow 127.0.0.1;

           deny all;

       }

       

       location ~* /\.ht {

          deny all;

       }

   }

}

配置好后,可在命令行窗口中执行nginx -t,检查配置是否正确。配置完成后,重启nginx服务。

通过上面的操作,我们完成了将华丹开发平台布署在nginx+tomcat集群上,可大幅度提升负载量,提升运行效率。