Nginx+部署指南Tomcat反向代理负载均衡集群

Nginx+Tomcat反向代理负载均衡集群部署指南

Nginx是一种服务器软件,也是一种高性能的http和反向代理服务器,同时还是一个代理邮件服务器。也就是说,我们在Nginx上可以发布网站,可以实现负载均衡(提高应答效率,避免服务器崩溃),还可以作为邮件服务器实现收发邮件等功能。而最常见的就是使用Nginx实现负载均衡。

Nginx与其他服务器的性能比较:

Tomcat服务器面向Java语言,是重量级的服务器,而Nginx是轻量级的服务器。Apache服务器稳定、开源、跨平台,但是Apache服务器不支持高并发,Nginx能支持处理百万级的TCP连接,10万以上的并发连接,并且是一个很好的跨平台服务器。
Nginx主要优点有可以实现高并发、部署简单、内存消耗少、成本低等,主要缺点有rewrite功能不够强大,模块没有Apache的多。

本篇主要讲解 Nginx + Tomcat 反向代理和负载均衡的部署,以通俗实用为主。本篇文章每个部分之间没有太大关系,可根据需求分开学习。

下来看一下Nginx反向代理的过程:

Nginx负载均衡的过程(会自动选择压力较小的服务器进行访问):


可以看出,负载均衡是通过反向代理的原理实现的,所以也称 反向代理的负载均衡 。所以我们会部署负载均衡,那么反向代理也就会了。

总的来说,负载均衡实现的方式分为软件实现和硬件实现两种,硬件实现运行的效率非常高,但是对应的成本也非常高。软件实现运行效率不如硬件,但是成本相对来说低得多。而使用Nginx服务器实现负载均衡,那么就是通过软件的方式来实现负载均衡,并且Nginx本身支持高并发等。故而使用Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于Nginx是服务器软件,其执行效率也是非常高。本篇的目的也就是帮助大家使用Nginx实现负载均衡。

负载均衡的核心就是建立一个服务器集群,然后用户首先访问到第三方代理服务器(这里我们选用Nginx),然后由代理服务器选择一个集群中的服务器,然后将请求引入选定的服务器(这里我们选用Tomcat)。

如下图,通过反向代理我们实现下面的负载均衡,这里我们 假定 四台服务器公网的ip,一台做代理服务器,三台做负载均衡下的服务器:


好了,整体架构已经基本上清晰了,下来我们来具体实现下:

提示:本篇我们基本上都是使用SSH进行相关操作的,Windows下可以尝试安装PuTTY,Mac下直接使用系统自带的终端工具即可。

1.Linux下搭建Nginx服务器

我们在 192.168.2.20 这台服务器上搭建Nginx服务器:

1)下载Nginx: http://nginx.org/

2)上传服务器Nginx安装包

$ scp ~/Downloads/nginx-1.10.2.tar.gz root@192.168.2.20:/usr/local

3)安装Nginx

$ ssh root@192.168.2.20                          //SSH连接 
# yum -y install gcc gcc-c++ autoconf automake   //gcc、gcc-c++的库文件 
# yum install -y pcre pcre-devel                 //安装Nginx依赖包 
# yum install -y zlib zlib-devel

注意:-y表示遇到判断全部yes,autoconf表示自动配置,automake表示自动编译。

# cd /usr/local 
# tar -zxvf nginx-1.10.2.tar.gz                 //解压缩 
# cd nginx-1.10.2                               //切换到该目录下 
# ./configure                                   //配置 
# make 
# make install                                  //安装

检验是否完成安装:

# cd /usr/local 
# ls                                            //如果存在nginx文件夹,则安装成功

经过上面的安装步骤和目录设置,nginx的启动程序就是/usr/local/nginx/sbin/nginx,默认配置文件是/usr/local/nginx/conf/nginx.conf,但是不建议直接编辑nginx.conf,一般我们都选择新建配置文件,然后在新建的配置文件中修改端口、反向代理路径等。

2.Nginx的启动、停止、信号控制

1)启动Nginx服务器(格式:Nginx可执行文件 -c Nginx配置文件):

# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

2)停止Nginx服务器:

停止Nginx服务器首先要查询Nginx的主进程号(master process),假设此处查询得到1060(方便下面演示使用):

# ps -ef|grep nginx

下来看如何停止Nginx服务器,停止Nginx有三种方式:

从容停止:

# ps -ef|grep nginx    //查看Nginx的主进程号(master process),假设此处查询得到1060 
# kill -quit 1060

快速停止:

# kill -term 1060

强制停止:

# pkill -9 nginx

3)重启Nginx服务器:

当我们修改了Nginx配置文件,需要重启才能生效。我们在重启之前还需要验证配置文件的正确性,然后进行重启操作:

# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf      //验证 
# /usr/local/nginx/sbin/nginx -s reload                                   //重启

4)平滑升级Nginx服务器

平滑升级不会停掉在运行着的进程,这些进程会继续处理请求,但不会再接受新请求,在这些老进程在处理完还在处理的请求后,停止。此平滑升级的过程中,新开的进程会被处理。这就是平滑升级。

# /usr/local/nginx/sbin/nginx -v             //查看当前版本

下面进行平滑升级:

# cd /usr/local 
# tar -zxvf nginx-1.11.6.tar.gz              //解压缩 新版本Nginx 
# cd nginx-1.11.6                            //切换到该目录下 
# ./configure                                //配置 
# make 
# cd /usr/local/nginx/sbin                   //打开 旧版本Nginx可执行文件位置 
# cp nginx nginx.old                  //备份 旧版本Nginx可执行文件,防止升级错误而无法恢复 
# cp -rfp /usr/local/nginx-1.11.6/objs/nginx /usr/local/nginx/sbin     //复制新版本可执行文件到旧版本处 
# rm -f /usr/local/nginx-1.11.6.tar.gz       //善后工作 删除压缩文件 
# rm -rf /usr/local/nginx-1.11.6             //删除文件夹

至此,Nginx服务器平滑升级成功。

3.Nginx中负载均衡的实现

我们还是先连接SSH,然后进行下面操作(一般不建议修改默认主配置文件nginx.conf,所以我们新建负载均衡配置文件fzjh.conf,保证服务器安全,如下):

# cd /usr/local/nginx/conf 
# touch fzjh.conf 
# vi fzjh.conf    //用vi编辑器打开文件,然后按键盘的i

注意:vi编辑器中,键盘按 i 进入 INSERT 状态,按 Esc 退出 INSERT 状态。
然后输入以下配置代码(注释部分按需开启):

#设置低权限用户,为了安全而设置的 
user nobody; 
 
 
#工作衍生进程数 
worker_processes 4; 
 
#设置错误文件存放路径 
#error_log logs/error.log; 
#error_log logs/error.log notice; 
#error_log logs/error.log info; 

 
#设置pid存放路径(pid是控制系统中重要文件) 
#pid logs/nginx.pid; 
 
 
#设置最大连接数 
events{ 
    worker_connections 1024; 
} 
 
 
http{ 
    
#主要是用于设置一组可以在proxy_pass和fastcgi_pass指令中使用额代理服务器,默认负载均衡方式为轮询     
    upstream tomcat_client {     
        #设置同一个cookie的两次/多次请求,请求的是同一台服务器 
        ip_hash; 
    
        #weight权重,默认1,权重越大访问概率越大,backup备用服务器,服务器全部崩溃后启动   
        server 192.168.2.21:8080 weight=5; 
        server 192.168.2.22:8080 weight=5; 
        server 192.168.2.23:8080 weight=5 backup; 
    } 
     
    #开启gzip压缩,开启后,访问网页会自动压缩     
    #gzip on; 
 
    #指定服务器的名称和参数     
    server { 
        listen 80;   
        server_name  test.nginxtest.net; 
 
        #设置字符         
        #charset koi8-r; 
 
        #location / 指用根目录做负载均衡         
        location / { 
            proxy_pass http://tomcat_client;   
            proxy_redirect default; 
            #设置代理 
            proxy_set_header Host $host;       
            proxy_set_header X-Real-IP $remote_addr; 
        } 
    } 
}

输入完成后按下Esc,然后输入:

:wq!

就可以保存并退出负载均衡的配置文件了,下来我们加载我们的配置文件:

# /usr/local/nginx/sbin/nginx                                           //启动Nginx 
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fzjh.conf        //加载配置文件

如果存在端口占用,可以使用如下命令Kill掉Nginx的程序:

# killall -9 nginx

至此,Nginx服务器部署完毕。下面我们开始部署负载均衡下的那三台真实提供数据的服务器。

4.Linux下安装jdk

我们在192.168.2.21、192.168.2.22、192.168.2.23这三台服务器安装jdk,以192.168.2.21为例:

1)下载jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html

2)上传服务器jdk安装包

$ scp ~/Downloads/jdk-8u112-linux-x64.tar.gz root@192.168.2.21:/usr/local

3)安装jdk

$ ssh root@192.168.2.21                 //SSH连接 
# cd /usr/local 
# tar -zxvf jdk-8u112-linux-x64.tar.gz  //解压缩 
# mv jdk1.8.0_112/ jdk                  //将jdk1.8.0_112重命名为jdk 
# vi /etc/profile                       //用vi编辑器打开文件,然后按键盘的i

下来我们移动光标至最后面,两个回车换行,然后添加下面代码配置java的环境变量:

JAVA_HOME='/usr/local/jdk'
CLASS_PATH='$JAVA_HOME/lib:$JAVA_HOME/jre/lib'
PATH='.:$PATH:$JAVA_HOME/bin'
CATALINA_HOME='/usr/local/tomcat'
export JAVA_HOME CATALINA_HOME

输入完成后按下Esc,然后输入:

:wq!

就可以保存并退出了。此时我们想让其立即生效,则需要继续输入命令:

# source /etc/profile

此时profile文件就更新了,此时环境变量就配置成功了。下面我们验证一下jdk是否安装配置成功:

# java -version

如果返回java版本号则安装成功。

5.Linux下搭建Tomcat服务器

我们在192.168.2.21、192.168.2.22、192.168.2.23这三台服务器搭建Tomcat服务器,以192.168.2.21为例:

1)下载Tomcat http://tomcat.apache.org/

2)上传服务器Tomcat安装包

$ scp ~/Downloads/apache-tomcat-8.5.9.tar.gz root@192.168.2.21:/usr/local

3)安装Tomcat

$ ssh root@192.168.2.21                 //SSH连接 
# cd /usr/local 
# tar -zxvf apache-tomcat-8.5.9.tar.gz  //解压缩 
# mv apache-tomcat-8.5.9/ tomcat        //将apache-tomcat-8.5.9重命名为tomcat

4)设置Tomcat网页文件目录

Tomcat默认网页文件的路径是 /usr/local/tomcat/webapps/ROOT,但是一般我们不在这里存放,我们在Linux根目录新建 data/wwwroot 目录:

# mkdir /data                         //新建目录 
# mkdir /data/www 
# mkdir /data/www/ROOT 
# cd /usr/local/tomcat/conf 
# vi server.xml                       //用vi编辑器打开server.xml配置文件,打开后键盘按i

我们找到Host节点下的appBase=”webapps”,修改为:

appBase='/data/www'

输入完成后按下Esc,然后输入:

:wq!

就可以保存并退出配置文件了,然后重启Tomcat即可生效,此时Tomcat的网页文件目录就变成了 /data/www/ROOT 了。

配置Tomcat环境变量,我们在配置jdk的时候已经配置好了,可以回头看一下。

6.Tomcat的启动、停止

1)启动Tomcat服务器

# /usr/local/tomcat/bin/startup.sh

2)停止Tomcat服务器:

# /usr/local/tomcat/bin/shutdown.sh

到此,Nginx + Tomcat 负载均衡 集群 已经部署完毕了。不过有了服务器,肯定也少不了数据库,下面拓展一下Linux下安装MySQL数据库的方法。

7.Linux下安装MySQL数据库

我们重新找了 192.168.2.30 这台服务器上MySQL数据库:

1)下载MySQL数据库 http://dev.mysql.com/downloads/mysql/

2)上传MySQL数据库安装包

$ scp ~/Downloads/mysql-5.1.51.tar.gz root@192.168.2.30:/usr/local

3)安装MySQL

$ ssh root@192.168.2.30                 //SSH连接 
# groupadd mysql                        //建立mysql的组 
# useradd mysql -g mysql                //增加用户mysql到mysql的组中  
 
# yum list|grep ncurses 
# yum -y install ncurses-devel 
# yum install ncurses-devel  
 
# cd /usr/local 
# tar -zxvf mysql-5.1.51.tar.gz         //解压缩 
# cd mysql-5.1.51 
 
# ./configure --prefix=/usr/local/mysql --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-readline --with-sll  
//配置,设置安装路径,设置编译mysql不带共享库,设置编译client不带共享库,设置要以rmp的方式安装tar包,设置以rmp的方式安装opensll  
 
# make 
# make install   //安装,在make[4]的时候等待时间比较长,几分钟到十几分钟,都是正常现象  
 
# /usr/local/mysql/bin/mysql_install_db --user       //对安装好的MySQL进行初始化 
# cp ./support-files/mysql.server /etc/init.d/mysql  //将MySQL启动服务复制到系统中并重命名为mysql 
# cp ./support-files/my-medium.cnf /etc/my.cnf       //复制规则文件 
# chmod 755 /etc/init.d/mysql                        //更改文件权限 
 
//文件权限由三个数字组成,第一位:文件拥有者的权限,第二位:文件拥有者同组的人的权限,第三位:文件拥有者非同组人的权限 
//7:可读可写可执行,5:可读可执行  
 
# cd /usr/local/mysql 
# chown -R mysql .                   //将 /usr/local/mysql 的拥有者更改为mysql 
# chgrp -R mysql .                   //将 /usr/local/mysql 归到mysql组中  
 
# ps -ef|grep mysql 
# kill -9 3632                    //将mysql所有进程号依次杀死,这里假定是3632 
# /usr/local/mysql/bin/mysql_install_db --user=mysql       //再次初始化 
# service mysql start                                      //启动MySQL 
# /usr/local/mysql/bin/mysqladmin -u root pass<A class=keylink href="http://www.it165.net/edu/ebg/" target=_blank>word</A> '123456'  //设置MySQL密码

到此MySQL就安装成功了,下来我们测试一下:

# /usr/local/mysql/bin/mysql -u root -p

如果输入密码后可以登进MySQL,那么就测试成功。下面我们设置MySQL允许开启远程连接:

# /usr/local/mysql/bin/mysql -u root -p 
 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; 
//创建用户用于远程连接(root:用户名,%:所有电脑都可以连接,也可以设置某个ip地址运行连接,123456:密码)  
 
mysql> flush privileges;            //立即生效

下面我们查询一下数据库的用户:

mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; 
mysql> q                           //登出

找一台电脑测试一下,使用Navicat远程登录MySQL,登进成功。

本篇文章到此结束。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容