0x0 前言
近日,为解决生产环境热部署问题,决定在服务器中增加一个tomcat组成集群,利用集群解决热部署问题。
这样既能解决高并发瓶颈问题,又能解决热部署(不影响用户使用的情况下平滑更新生产服务器)问题。
因为项目是前后端分离的,所以本以为成本很低,没想到遇到了一系列的坑,解决了2天才搞定,发现了很多不是集群而是项目本身的问题。
我是同一个服务器下配置tomcat和nginx等,本文主要面向有一定基础的读者,基本配置就不在本文累述了(基础问题可以留言或者发邮件)。
0x0_1 服务器环境
服务器: CentOS 6.5
web容器:Tomcat 7.0.25
反向代理:Nginx 1.8
java: jdk 1.7
0x0_2 集群
我是同一个服务器部署两个tomcat,所以地址是127.0.0.1 也可以换成其他服务器的ip
tomcat文件名 | ip地址 | 端口 | 项目名 |
---|---|---|---|
tomcat7-1 | 127.0.0.1 | 8080 | borrow |
tomcat7-2 | 127.0.0.1 | 8090 | borrow |
0x1 tomcat集群配置
修改tomcat的conf/server.xml
如下
tomcat7-1:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Server</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8005"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">shutdown</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"SHUTDOWN"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Connector</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8080"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">protocol</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"HTTP/1.1"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">connectionTimeout</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"20000"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">redirectPort</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8443"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">URIEncoding</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"UTF-8"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">compression</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"on"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">compressionMinSize</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"2048"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">noCompressionUserAgents</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"gozilla,traviata"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">compressableMimeType</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"text/html,text/xml,text/javascript,text/css,text/plain"</span> /></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Connector</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8009"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">protocol</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"AJP/1.3"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">redirectPort</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8443"</span> /></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
tomcat7-2:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Server</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8015"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">shutdown</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"SHUTDOWN"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Connector</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8090"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">protocol</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"HTTP/1.1"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">connectionTimeout</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"20000"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">redirectPort</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8443"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">URIEncoding</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"UTF-8"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">compression</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"on"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">compressionMinSize</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"2048"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">noCompressionUserAgents</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"gozilla,traviata"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">compressableMimeType</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"text/html,text/xml,text/javascript,text/css,text/plain"</span> /></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Connector</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8019"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">protocol</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"AJP/1.3"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">redirectPort</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"8443"</span> /></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
以上配置,只有端口号(port)是必要配置,其他按平常配置即可,多个tomcat以此类推。
创建测试页面
自己分别在tomcat中创建测试页面,可以区分不同的tomcat服务器即可
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">table</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">align</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"centre"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">border</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"1"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">tr</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span>Tomcat7_1 Session ID<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span> <span class="vbscript" style="box-sizing: border-box;"><% session.setAttribute(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"www.zemo.com"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"www.zemo.com"</span>); %></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span><span class="vbscript" style="box-sizing: border-box;"><%= session.getId() %></span><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">tr</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">tr</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span>Created on<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span><span class="vbscript" style="box-sizing: border-box;"><%= session.getCreationTime() %></span><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">td</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">tr</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">table</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
启动2个tomcat,确认都启动了即可。
0x2 nginx均衡负载配置
这里使用ip_hash 集群方式,尽量分流。但是如果是同一个局域网下用户大量访问就没有用了,不过可以再增加其他的措施,比如缓存session,因为这里主要是为了解决热部署问题, 所以都不是问题。
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">upstream borrow { ip_<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">hash</span>; server <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">127.0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8080</span> weight=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> max_fails=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> fail_timeout=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>s; server <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">127.0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8090</span> weight=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> max_fails=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> fail_timeout=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>s; } server { listen <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>; server_name www.zemo.com;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#这个是随便写的...不用访问了</span> access_log /usr/local/var/log/nginx/borrow_access.log; location / { proxy_redirect off; proxy_<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">set</span>_header Host <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$host</span>; proxy_<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">set</span>_header X-Forwarded-For <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$remote_addr</span>; client_max_body_size <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>m; client_body_buffer_size <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">128</span>k; proxy_connect_timeout <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>; proxy_send_timeout <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>; proxy_<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">read</span>_timeout <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">900</span>; proxy_buffer_size <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>k; proxy_buffers <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span>k; proxy_busy_buffers_size <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">64</span>k; proxy_temp_file_write_size <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">64</span>k; proxy_pass http://borrow; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#这里borrow 指向上面名为borrow的upstream</span> } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>
- weight 访问权重
- max_fails 最大失败次数
- fail_timeout 最大失败等待时间
测试配置是否正确
<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">zemochen:Program SuperZemo$ sudo nginx -t nginx: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> configuration <span class="hljs-type" style="box-sizing: border-box;">file</span> /usr/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">local</span>/etc/nginx/nginx.conf syntax <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> ok nginx: configuration <span class="hljs-type" style="box-sizing: border-box;">file</span> /usr/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">local</span>/etc/nginx/nginx.conf test <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> successful</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
重启nginx
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">zemochen:Program SuperZemo$ <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">sudo</span> nginx <span class="hljs-operator" style="box-sizing: border-box;">-s</span> reload</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
观察tomcat的session
- 先访问以下www.zemo.com
- 关闭tomcat7_1,只留tomcat7_2观察session id
- 开启tomcat7_1,关闭tomcat7_2观察session id
你会发现两个session id,下面讲解tomcat 的session共享
0x3 tomcat session共享
0x3_1 server.xml配置
tomcat 有自带复制session功能,在server.xml
中增加<Cluster>
配置即可,不知道写在哪里的,找到server.xml
中的<Cluster>
注释样例,写在下面即可。基本上就是写在<Host></Host>
里面最后就行了。配置如下:
<code class="hljs handlebars has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="xml" style="box-sizing: border-box;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Cluster</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.tcp.SimpleTcpCluster"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">channelSendOptions</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"6"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Manager</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.session.BackupManager"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">expireSessionsOnShutdown</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"false"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">notifyListenersOnReplication</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"true"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">mapSendOptions</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"6"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Channel</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.group.GroupChannel"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Membership</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.membership.McastService"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">address</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"228.0.0.4"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"45564"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">frequency</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"500"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">dropTime</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"3000"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Receiver</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.transport.nio.NioReceiver"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">address</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"127.0.0.1"</span> <!<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">--</span>这里写本<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">tomcat</span>的<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">IP</span>地址 <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">--</span>></span> port="5000" selectorTimeout="100" /> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Sender</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.transport.ReplicationTransmitter"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Transport</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.transport.nio.PooledParallelSender"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Sender</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Interceptor</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Interceptor</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Interceptor</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Channel</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Valve</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.tcp.ReplicationValve"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">filter</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Valve</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.session.JvmRouteBinderValve"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Deployer</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.deploy.FarmWarDeployer"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">tempDir</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"/tmp/war-temp/"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">deployDir</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"/tmp/war-deploy/"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">watchDir</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"/tmp/war-listen/"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">watchEnabled</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"false"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">ClusterListener</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">ClusterListener</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">className</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"org.apache.catalina.ha.session.ClusterSessionListener"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Cluster</span>></span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul>
修改server.xml
中的<Engine>
增加jvmRoute="tomcat7-1"
,配置如下:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">Engine</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"Catalina"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">defaultHost</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"localhost"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">jvmRoute</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"tomcat7-1"</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
tomcat7-2同理,配置这两个。
0x3_2 web.xml配置
在conf/web.xml
中的<webapp></webapp>
中增加<distributable />
我的项目是j2ee项目,所以写在了项目的web.xml
里,项目中的web.xml
优先级高于tomcat本身的。
配置代码块如下:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">web-app</span>></span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"><!--其他配置省略,下面mime-mapping 也是与本问无关,为了体现最下面所以带了一部分--></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">mime-mapping</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">extension</span>></span>apk<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">extension</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">mime-type</span>></span>application/vnd.android.package-archive<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">mime-type</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">mime-mapping</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">distributable</span> /></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">web-app</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
0x4 注意:
这里要注意,Nginx只需要配置一份,而tomcat有几个节点,server.xml
、web.xml
就配置几个:
- shutdown端口都不同
- Connect 的http端口都不同
- Ajp 端口不同
<Cluster>
中的<Receiver>
属性address
指向改tomcat的IP地址<Engine>
中的jvmRoute
名要与tomcat文件名相同
0x5 结果截图
整个环境全都启动后, 访问域名, 可以看到如下截图,我的图可以看出,访问到的是tomcat7-1,注意,我的测试网页并没有写tomcat7-1,而是自己加到session id里的,这里是自动增加jvmRoute的值,说明session复制成功…
因为刚才确定被代理到了tomcat7-1,我们用的是ip_hash的分配方式,所以我们直接关闭tomcat7-1,再刷新页面,确保代理到另一个tomcat,效果图如下,可以看到只有后缀.tomcat7-2
不同,至此一个均衡负载集群就可以了,既解决了热部署问题,又解决了分担服务器压力,负载均衡问题。