Nginx + JDK + Tomcat 负载均衡 集群 部署指南
来源:互联网 发布:数据库简答题 编辑:程序博客网 时间:2024/06/13 10:22
转自:http://blog.csdn.net/smartbetter/article/details/53535435
Nginx是一种服务器软件,也是一种高性能的http和反向代理服务器,同时还是一个代理邮件服务器。也就是说,我们在Nginx上可以发布网站,可以实现负载均衡(提高应答效率,避免服务器崩溃),还可以作为邮件服务器实现收发邮件等功能。而最常见的就是使用Nginx实现负载均衡。
与Tomcat相比,Tomcat面向Java语言,是重量级的服务器,而Nginx是轻量级的服务器。Apache服务器稳定、开源、跨平台,但是Apache服务器不支持高并发,Nginx能支持处理百万级的TCP连接,10万以上的并发连接,并且是一个很好的跨平台服务器。Nginx主要优点有可以实现高并发、部署简单、内存消耗少、成本低等,主要缺点有rewrite功能不够强大,模块没有Apache的多。
本篇主要讲解 Nginx + JDK + Tomcat 负载均衡的部署,注重实用性,文章每个部分之间没有太大关系,可根据需求分开学习。
下来看一下Nginx反向代理的过程:
Nginx负载均衡的过程(会自动选择压力较小的服务器进行访问):
可以看出,负载均衡是通过反向代理的原理实现的,所以也称 反向代理的负载均衡 。总的来说,负载均衡实现的方式分为软件实现和硬件实现两种,硬件实现运行的效率非常高,但是对应的成本也非常高。软件实现运行效率不如硬件,但是成本相对来说低得多。使用Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于Nginx是服务器软件,其执行效率也是非常高。
负载均衡的核心就是建立一个服务器集群,然后用户首先访问到第三方代理服务器(Nginx),然后由代理服务器选择一个集群中的服务器,然后将请求引入选定的服务器(Tomcat)。如下图,通过反向代理我们实现下面的负载均衡,这里我们假定 四台服务器公网的ip,一台做代理服务器,三台做负载均衡下的服务器:
到此整体架构已经非常清晰了,下面具体实现下(这里服务器选择CentOS,通过SSH进行远程操作,本地环境如果是Windows则可以尝试安装PuTTY,如果是Mac则直接使用终端工具即可)。
1.Linux下搭建Nginx服务器
1.下载安装
1.下载Nginx http://nginx.org/
2.上传Nginx安装包至服务器并安装Nginx
$ scp ~/Downloads/nginx-1.12.1.tar.gz root@192.168.2.20:/usr/local$ ssh root@192.168.2.20 //SSH连接# yum -y install gcc gcc-c++ autoconf automake //gcc、gcc-c++的库文件# yum -y install pcre pcre-devel //安装Nginx依赖包# yum -y install zlib zlib-devel
注意:-y表示遇到判断全部yes,autoconf表示自动配置,automake表示自动编译。
# cd /usr/local# tar -zxvf nginx-1.12.1.tar.gz //解压缩# cd nginx-1.12.1 //切换到该目录下# ./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服务器:
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
2.停止Nginx服务器的三种方式:
//从容停止# ps -ef|grep nginx //查看Nginx的主进程号(master process),假设此处查询得到1060# kill -quit 1060//快速停止# ps -ef|grep nginx# kill -term 1060//强制停止# pkill -9 nginx
3.重启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.13.2.tar.gz //解压缩 新版本Nginx# cd nginx-1.13.2 //切换到该目录下# ./configure //配置# make# cd /usr/local/nginx/sbin //打开 旧版本Nginx可执行文件位置# cp nginx nginx.old //备份 旧版本Nginx可执行文件,防止升级错误而无法恢复# cp -rfp /usr/local/nginx-1.13.2/objs/nginx /usr/local/nginx/sbin //复制新版本可执行文件到旧版本处# rm -f /usr/local/nginx-1.13.2.tar.gz //善后工作 删除压缩文件# rm -rf /usr/local/nginx-1.13.2 //删除文件夹
至此,Nginx服务器平滑升级成功。
3.Nginx中负载均衡的实现
# cd /usr/local/nginx/conf# touch fzjh.conf //不建议修改默认主配置文件nginx.conf,新建负载均衡配置文件fzjh.conf,保证服务器安全# vi fzjh.conf //用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; } }}
- 1
- 45
输入完成后按下 Esc,然后输入 :wq! 回车,就可以保存并退出负载均衡的配置文件了,下来我们加载我们的配置文件:
# /usr/local/nginx/sbin/nginx //启动Nginx# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fzjh.conf //加载配置文件
如果存在端口占用,使用 killall -9 nginx 命令 Kill 掉 Nginx 的程序。至此部署完毕。下面我们就开始部署安装负载均衡下的那三台真实提供数据的服务器的环境了。
2.Linux下安装jdk
1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.上传jdk安装包至服务器并安装jdk
$ scp ~/Downloads/jdk-8u131-linux-x64.tar.gz root@192.168.2.21:/usr/local$ ssh root@192.168.2.21 //SSH连接# cd /usr/local# tar -zxvf jdk-8u131-linux-x64.tar.gz //解压缩# mv jdk1.8.0_131/ jdk //将jdk1.8.0_131重命名为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
- 2
输入完成后按下Esc,然后输入 :wq! 保存退出。此时我们想让其立即生效,输入命令:
# source /etc/profile //更新profile文件
此时环境变量就配置成功了。下面我们验证一下jdk是否安装配置成功:
# java -version
如果返回java版本号则安装成功。
3.Linux下搭建Tomcat服务器
1.下载安装
1.下载Tomcat http://tomcat.apache.org/
2.上传Tomcat安装包至服务器并安装Tomcat
$ scp ~/Downloads/apache-tomcat-8.5.16.tar.gz root@192.168.2.21:/usr/local$ ssh root@192.168.2.21 //SSH连接# cd /usr/local# tar -zxvf apache-tomcat-8.5.16.tar.gz //解压缩# mv apache-tomcat-8.5.16/ tomcat //重命名为tomcat
3.设置Tomcat网页文件目录,Tomcat默认网页文件的路径是 /usr/local/tomcat/webapps/ROOT,但是一般我们不在这里存放,我们在Linux根目录新建 data/wwwroot 目录。
# mkdir /data //新建目录# mkdir /data/wwwroot# mkdir /data/wwwlogs# cd /usr/local/tomcat/conf# vi server.xml
然后找到Host节点下的appBase=”webapps”,修改为:
appBase="/data/wwwroot"
- 1
- 1
输入完成后按下Esc,然后输入 :wq! 保存退出,然后重启Tomcat即可生效。配置Tomcat环境变量,我们在配置jdk的时候已经配置好了,可以回头看一下。
2.Tomcat的启动、停止
//启动Tomcat服务器# /usr/local/tomcat/bin/startup.sh//停止Tomcat服务器:# /usr/local/tomcat/bin/shutdown.sh
到此,Nginx + JDK + Tomcat 负载均衡 集群 已经部署完毕了。下面拓展一下linux下安装MySQL数据库与SVN的方法。
4.Linux下安装MySQL5.7数据库
1.下载mysql数据库二进制安装包http://dev.mysql.com/downloads/mysql/
2.上传或者直接在Linux中下载MySQL数据库二进制安装包
$ scp ~/Downloads/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz root@192.168.2.2:/usr/local //上传# wget -P /usr/local http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz //下载
3.安装MySQL
$ ssh root@192.168.2.30 //SSH连接# groupadd mysql //建立mysql的组# useradd -r -g mysql mysql //增加用户mysql到mysql的组中# cd /usr/local# tar -zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz //解压缩二进制文件# mv mysql-5.7.18-linux-glibc2.5-x86_64 mysql //更名# cd /usr/local/mysql# chown -R mysql . //将 /usr/local/mysql 的拥有者更改为mysql# chgrp -R mysql . //将 /usr/local/mysql 归到mysql组中//初始化表配置, mysql5.7和之前版本不同# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
注意输出日志最后一行,和之有版本不同,它给了root一个初始密码,后面登录的时候要用到这个密码。
[Note] A temporary password is generated for root@localhost: F2k/M9)<3e_Y
将/usr/local/mysql目录改回root用户所有,mysql用户只需作为/data/mysql/目录下所有文件的所有者。
# cd /usr/local/mysql# chown -R root .# chown -R mysql /data/mysql/# cp support-files/my-default.cnf /etc/my.cnf //复制配置文件# mkdir /usr/local/mysql/tmp/ //创建tmp目录# chown -R mysql:mysql tmp //赋予mysql权限
mysql5.7配置文件还需要修改my.cnf配置:
# vi /etc/my.cnf
替换为:
[client]port = 3306socket=/usr/local/mysql/tmp/mysql.sockdefault-character-set=utf8mb4[mysql]prompt="MySQL [\d]> "no-auto-rehashdefault-character-set=utf8mb4[mysqld]port=3306socket=/usr/local/mysql/tmp/mysql.sockbasedir=/usr/local/mysql datadir=/data/mysqlpid-file=/data/mysql/mysql.piduser=mysqlbind-address=0.0.0.0server-id=1init-connect='SET NAMES utf8mb4'character-set-server=utf8mb4skip-name-resolve#skip-networkingback_log=300max_connections = 1000max_connect_errors = 6000open_files_limit = 65535table_open_cache = 256max_allowed_packet = 4Mbinlog_cache_size = 1Mmax_heap_table_size = 8Mtmp_table_size = 32Mread_buffer_size = 2Mread_rnd_buffer_size = 8Msort_buffer_size = 8Mjoin_buffer_size = 8Mkey_buffer_size = 16Mthread_cache_size = 16query_cache_type = 1query_cache_size = 16Mquery_cache_limit = 2Mft_min_word_len = 4log_bin = mysql-binbinlog_format = mixedexpire_logs_days = 7 log_error = /data/mysql/mysql-error.logslow_query_log = 1long_query_time = 1slow_query_log_file = /data/mysql/mysql-slow.logperformance_schema = 0explicit_defaults_for_timestamp#lower_case_table_names = 1skip-external-lockingdefault_storage_engine = InnoDBinnodb_file_per_table = 1innodb_open_files = 500innodb_buffer_pool_size = 128Minnodb_write_io_threads = 4innodb_read_io_threads = 4innodb_thread_concurrency = 0innodb_purge_threads = 1innodb_flush_log_at_trx_commit = 2innodb_log_buffer_size = 2Minnodb_log_file_size = 32Minnodb_log_files_in_group = 3innodb_max_dirty_pages_pct = 90innodb_lock_wait_timeout = 120bulk_insert_buffer_size = 8Mmyisam_sort_buffer_size = 16Mmyisam_max_sort_file_size = 10Gmyisam_repair_threads = 1interactive_timeout = 28800wait_timeout = 28800[mysqldump]quickmax_allowed_packet = 16M[myisamchk]key_buffer_size = 16Msort_buffer_size = 8Mread_buffer = 4Mwrite_buffer = 4M
- 1
- 2
- 3
下来将mysqld服务加入开机自启动项并设置运行权限,这样就可以使用service mysql命令启动/停止服务,还需要把mysql.server中basedir的相关路径改为自定义的路径,默认路径是/usr/local/mysql
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql# chmod +x /etc/init.d/mysql# chkconfig --add mysql //把mysql注册为开机启动的服务# chkconfig --list mysql //查看是否添加成功 mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
将mysql加入环境变量:
# vi /etc/profile //添加配置 export PATH=$PATH:/usr/local/mysql:/usr/local/mysql/bin# source /etc/profile //更新profile文件就, 让其立即生效
mysql服务的开启和关闭:
# /etc/init.d/mysql start 或 serivce mysql start 或 bin/mysqld_safe&# /etc/init.d/mysql stop 或 service mysql stop 或 bin/mysqladmin -uroot -p
登录mysql服务修改root密码和添加mysql用户:
# mysql -uroot -p //输入前面保存的初始密码MySQL [(none)]> SET PASSWORD = PASSWORD('new password');MySQL [(none)]> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; //修改root密码MySQL [(none)]> flush privileges;MySQL [(none)]> exit# mysql -uroot -pMySQL [(none)]> use mysql;//添加mysql用户并授权远程登录MySQL [mysql]> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'; //添加mysql用户MySQL [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;//授权远程登录
另外有时候还有修改mysql用户密码的需求,操作如下:
# mysql -uroot -pMySQL [(none)]> use mysql;MySQL [mysql]> UPDATE mysql.user SET authentication_string=PASSWORD('new password') WHERE User='user';MySQL [mysql]> flush privileges;MySQL [mysql]> exit
找一台电脑测试一下,使用Navicat远程登录MySQL,登进成功。本篇文章到此结束。
5.Linux下安装SVN
# rpm -qa subversion //查询是否安装,一般centos都默认安装了此软件# yum -y install subversion //如果没有安装,快速安装subversion# svnserve --help //查看启动帮助# mkdir -p /data/svndata //创建svn的数据存储路径# mkdir -p /data/svnpasswd //创建svn的配置文件信息路径# svnserve -d -r /data/svndata/ //启动svn服务//检测svn服务是否正常启动# ps -ef | grep svn //第一种通过进程检测# netstat -lntup | grep 3690 //第二种通过端口3690检测# lsof -i :3690 //第三种通过文件检测, 需要root用户才可以执行//使用svnadmin建立svn项目版本库# svnadmin --help //查看创建项目版本库命令# svnadmin help create# svnadmin create /data/svndata/java //创建java版本库//配置java版本库的权限# cd /data/svndata/java/conf/ //进入java版本库配置目录# cp -p svnserve.conf svnserve.conf.default //备份配置文件# vim svnserve.conf
anon-access = none //禁止匿名访问auth-access = write //认证后有读的权限password-db = /data/svnpasswd/passwd //指定密码文件authz-db = /data/svnpasswd/authz //指定权限认证文件
- 2
//复制passwd和authz文件到java版本库的svnpasswd目录并修改权限# cp -p authz passwd /data/svnpasswd/# cd /data/svnpasswd/# chmod 700 authz passwd
为Svn版本库创建用户并授权访问指定项目版本库
# vim /data/svnpasswd/passwd. //编辑passwd文件配置用户和密码
[users]# harry = harryssecret# sally = sallyssecret# 等号前面是用户名, 后面是密码svnuser1 = 123svnuser2 = 123# 下面的定义的用户用来测试组的功能developer1 = 123456developer2 = 123456developer3 = 123456
- 1
- 2
# vim /data/svnpasswd/authz
[groups]# harry_and_sally = harry,sally# harry_sally_and_joe = harry,sally,&joe# 这里可以定义组,多个用户之间用逗号分隔developer = developer1,developer2,developer3# [/foo/bar]# harry = rw# &joe = r# * =# [repository:/baz/fuz]# @harry_and_sally = rw# * = r# 编辑authz文件配置读取权限[<java>:/] //[<版本库>:/项目/目录]@developer = rw //@<用户组名> = <权限>svnuser1 = rw //<用户名> = <权限>svnuser2 = r //<用户名> = <权限>
- 5
重新启动svn服务进行验证(修改passwd和authz文件不需要重启svn服务而修改svnserve.conf则需要)
# pkill svnserve //杀死svn服务# svnserve -d -r /data/svndata/ //启动svn
最后安装客户端进行java版本库的配置是否正确:
# svn --username=svnuser1 co svn://xxx.xxx.xxx.xxx/java
- Nginx + JDK + Tomcat 负载均衡 集群 部署指南
- Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
- Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
- Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
- Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
- Nginx+Tomcat+Mencached负载均衡集群部署笔记
- nginx+tomcat集群负载均衡
- nginx+tomcat集群负载均衡
- Nginx+Tomcat负载均衡集群
- Nginx+Tomcat负载均衡部署
- Nginx+Tomcat7+Mencached负载均衡集群部署
- 【Nginx入门系列】第六章 Nginx+tomcat集群负载均衡部署
- apache tomcat 集群 负载均衡 部署
- Nginx+Tomcat负载均衡与集群
- 转文:Nginx+Tomcat 负载均衡集群方案
- Nginx+tomcat配置集群负载均衡
- nginx + tomcat 集群实现负载均衡
- nginx + tomcat 集群实现负载均衡
- Excel浏览大工作表的方法(使用鼠标键盘名字框加定位)
- PC连上WIFI,浏览器找不到服务器无法上网 解决
- Linux下 mysqli_fetch_all函数问题
- Spring总结
- notes_September
- Nginx + JDK + Tomcat 负载均衡 集群 部署指南
- “==”和equals方法的区别
- 你们终于喊出自己就是公有云了?
- Linux下zookeeper的安装
- viewpager嵌套viewpager滑动处理
- java web学习总结27:jsp简单标签开发案例和打包
- VS code快捷键
- 两个数值互换的几种方式
- LoggerFactory打印代码错误日志