使用nginx和tomcat搭建集群环境

原创
2016/03/11 17:38
阅读数 3.1K

一、先解释下什么是反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。这是百度百科上反向代理的定义,如果你对该定义有些模糊的话,继续 向下看。

实际上,我们配置了Nginx反向代理后,系统的物理结构可能是下面这样子的,

配置Nginx反向代理Tomcat

当我们访问一个域名/IP地址时,实际访问的是我们配置的Nginx 服务器,Nginx服务器的真实身份只是代理,它代理了许多不同的真正服务器(如下图中的Tomcat,Resin,IIS等)。这就是反向代理。

虽然配置反向代理比较麻烦,但是它的作用性还是很大滴。一方面是为了安全性考虑,另一方面是提供应用的访问性能。至于原理呢,本文就不详细介绍了。接下来配置Ngin的反向代理Tomcat,实现负载均衡和灾备的作用。


二、前期准备

 1、nginx的安装

(1)安装支持正则的pcre模块
# rpm -ivh  pcre-devel-6.6-2.el5_1.7.i386.rpm

ps:如果提示缺插件,需要root权限执行下面命令

[root@localhost tomcat]#
 yum install apr apr-devel apr-util apr-util-devel pcre-devel -y
(2)安装nginx

# wget http://nginx.org/download/nginx-1.9.9.tar.gz 
# tar zxvf nginx-1.9.9.tar.gz
# cd nginx-1.9.9
# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
# make 
# make install
(3)启动nginx
# /usr/local/nginx/sbin/nginx
(4)访问nginx(默认为80端口)
http://192.168.28.27

ps:如果访问不了,查看下防火墙设置,是否开放了80端口。修改防火墙配置,请问度娘。

2、tomcat 安装(略) 

1.如果需要修改tomcat发布目录为自己制定的目录,需要做如下调整,创建两个发布目录:

    mkdir -p /usr/webapps/{www1,www2} 

编辑vi /usr/local/tomcat1/conf/server.xml 在最后</Host>前一行加下内容:

    <Context  path="" docBase="/usr/webapps/www1" reloadable="false"/> 

2.编辑vi /usr/local/tomcat2/conf/server.xml 在最后</Host>前一行加下内容:

    <Context  path="" docBase="/usr/webapps/www2" reloadable="false"/> 

3.tomcat1发布目录内容:

    <html>   
    <body>   
    <h1>TOMCAT_1 JSP Test Page</h1>   
    <%=new java.util.Date()%>   
    </body>   
    </html>

4.tomcat2发布目录内容:

<html>   
    <body>   
    <h1>TOMCAT_2 JSP Test Page</h1>   
    <%=new java.util.Date()%>   
    </body>   
    </html>

然后访问http://ip:8080、8081查看测试内容。


三.nginx与tomcat整合

1. 在/usr/local/nginx/conf下面添加文件proxy.conf

# cat /usr/local/nginx/confg/proxy.conf

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr; #获取真实IP
#proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for; #获取代理者的真实ip
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

 

2.配置nginx.conf

# cat /usr/local/nginx/confg/nginx.conf

下面内容复制到文件中:
user  www www;  #此处使用事先创建的www用户,也可以使用其他用户
worker_processes  1;
pid     /usr/local/nginx/logs/nginx.pid;

events {
    use epoll;
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    include     /usr/local/nginx/conf/proxy.conf;   #一定要指向代理文件,可以重命名

    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout  65;

    upstream tomcat_server {#代理tomcat服务器

upstream tomcat_server {#代理tomcat服务器

            server 192.168.28.27:8080 weight=1 max_fails=2 fail_timeout=30s;

            server 192.168.28.28:8080 weight=1 max_fails=2 fail_timeout=30s;

            ip_hash; 

    }     

    server {

        listen       80;
        server_name  localhost;

        charset gb2312;

        location / {
             root /www/web/ROOT; #工程根目录
             index  index.html index.htm;
        }

        location ~ .*.jsp$ {     #匹配以jsp结尾的,tomcat的网页文件是以jsp结尾         
                index   index.jsp;
                proxy_pass   tomcat_server; #主要在这里,设置一个代理,对应上面的服务器配置
        }

        location /nginxstatus {
                stub_status on;
                access_log on;
                auth_basic "nginxstatus";
                auth_basic_user_file /usr/local/nagois/etc/htpasswd.users;
        }

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 

3.测试

在/www/web/ROOT下添加文件index.jsp

# cat index.jsp   (可以使用此jsp做测试 http://blog.csdn.net/god_wot/article/details/46376167)
the port:80

重启nginx

http://192.168.28.27   #nginx部署在27上

http://192.168.28.28:8080   #tomcat部署在28上,27反代理到28,或者其他机器

http://192.168.28.27/index.jsp

ps:这个测试结果就是上面的index.jsp页面返回的结果。不停的刷新页面,就在27和28两台机器上倒腾,关掉28,就只显示27,反之亦然。实现了负载分担和双机热备的功能。

4.相关操作命令

nginx启动、重启、关闭

一、启动  

cd usr/local/nginx/sbin

./nginx

二、重启

更改配置重启nginx  

# /usr/local/nginx/sbin/nginx -s reload

或者kill -HUP 主进程号或进程号文件路径

或者使用

cd /usr/local/nginx/sbin

./nginx -s reload

 判断配置文件是否正确 

nginx -t -c /usr/local/nginx/conf/nginx.conf

或者

cd  /usr/local/nginx/sbin

./nginx -t

三、关闭

  查询nginx主进程号

  ps -ef | grep nginx

  从容停止   kill -QUIT 主进程号

  快速停止   kill -TERM 主进程号

  强制停止   kill -9 nginx

  若nginx.conf配置了pid文件路径,如果没有,则在logs目录下

  kill -信号类型 '/usr/local/nginx/logs/nginx.pid'

四、升级

  1、先用新程序替换旧程序文件

  2、kill -USR2 旧版程序的主进程号或者进程文件名

    此时旧的nginx主进程会把自己的进程文件改名为.oldbin,然后执行新版nginx,此时新旧版本同时运行

  3、kill -WINCH 旧版本主进程号

  4、不重载配置启动新/旧工作进程

    kill -HUP 旧/新版本主进程号

    从容关闭旧/新进程

    kill -QUIT 旧/新进程号

    快速关闭旧/新进程

    kill -TERM 旧/新进程号

四.问题收集

1、重启tomcat,卡了30秒

环境搭建好后,webbench了一下,并发提升了3倍,太牛掰了吧。不过,重启其中一台tomcat27,点击网页,卡了30秒,才恢复正常,没有及时切换过去,不过服务未中断。(待解决)

2、登录时,图片校验失败,Session未实现共享

测试功能,所有请求都正常,就是登录时的图片校验失败,原因是从27上发来的图片,发到28上校验,取不到session里存的图片校验码,所以验证失败,在nginx的upstream上加了一个参数ip_hash; 就恢复正常了!不过,不是最优的,还可以使用Memcached来实现session共享的功能。后面再开新篇说明。



展开阅读全文
打赏
1
41 收藏
分享
加载中
给力
2016/03/11 18:46
回复
举报
更多评论
打赏
1 评论
41 收藏
1
分享
返回顶部
顶部