1. 反向代理服务器
Nginx 是一个高性能的HTTP和反向代理web服务器,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx是同类型软件中应用范围最广的开源类的反向代理服务器。
2. web应用服务器
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。目前生产中如果不是应用于容器和微服务,在同类型web应用服务器中Tomcat是一个不错的选择。
3. 内存数据库
Redis是一个高性能的key-value数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。Redis还支撑集群。redis-cluster采用无中心结构,每个节点都维护着集群的信息,并且节点之间互相通信;节点的 fail 是通过集群中超过半数的节点检测失效时才生效无需人为干扰;客户端与redis节点直连不需要中间proxy层,client根据node返回的错误信息重定向请求;redis-cluster实现了故障转移、负载均衡、高可用性、高并发等功能。
4. 关系型数据库
MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL [1] 自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。
Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。
1. 系统要求
RHEL 6.5 CENTOS 6.5 及以上
2. 软件要求
开源软件生产安装要求一般要求最新稳定版本,以下安装版本是目前要求版本,具体如下所示:
Nginx1.20.1、jdk1.8.0_144、Tomcat-8.5.71、keepalive-2.1.0、redis5.0.13、mysql5.7.35
依赖:针对不同的软件需要不同的依赖包,具体如下所示:
Nginx:openssl openssl-devel zlib zlib-devel pcre pcre-devel gcc make automake autoconf libtool gcc-c++
Tomcat:主要依赖于jdk环境
Redis:tcl gcc make
Mysql:无
Linux下root账号安装:
yum install libaio openssl openssl-devel tcl ssl * gcc* lua zlib zlib-devel pcre pcre-devel-y
3. 系统架构要求
每个环节必须要求存在高可用,nginx+keepalived实现高可用,mysql+keepalived实现高可用,redis哨兵或集群架构实现高可用。
4. 硬件要求
网络1000Mbps及以上
内存和cpu针对不同的软件建议不同的大小,如下
Nginx:4G2C
Tomcat:8G4C+
Redis:内存建议8G及以上,CPU4个以上
Mysql:内存建议8G及以上,CPU4个以上
5. 关闭selinux
修改selinux配置文件:SELINUX=disabled
6. 关闭防火墙
关闭防火墙
systemctl stop firewalld.service 或service iptables stop
禁用防火墙
systemctl disable firewalld.service 或 chkconfig iptables off
1. Keepalived编译
安装依赖包:
yum install gcc* openssl* ssl* -y
解压keepalived安装包并进去加压目录:
./configure --prefix=/data/keepalived/
创建软连接:
ln-s/data/keepalived/etc/keepalived/
keepalived.conf etc/keepalived/keepalived.conf
2. 检查脚本编写
cat data/keepalived/sbin/check.sh#!/bin/bashps=`ss -anl|grep LISTEN|grep -w 8080|wc -l`if [$ps -ne 1]; thenpkill keepalivedfi
注:check.sh的权限必须是700才能调用执行:
chmod 700 data/keepalived/sbin/check.sh
3. keepalived配置
cat data/keepalived/etc/keepalived/keepalived.conf! Configuration File for keepalivedvrrp_script chk_local {script "/data/keepalived/sbin/check.sh"interval 3weight -2}vrrp_instance VI_1 { state BACKUP #slave: state BACKUP interface eth0 virtual_router_id 51 priority 100 #slave: priority 90nopreempt #不抢占 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.66 }track_script {chk_local}}
4. 启动
/data/keepalived/sbin/keepalived -f /data/keepalived/etc/keepalived/keepalived.conf -S 0
注:nginx和mysql的keepalived高可用安装配置一样,只是把监听nginx的端口换成监听mysql的端口即可。
1. 安装准备:
确认 data 目录其他用户有写权限
检查依赖包:pcre pcre-devel zlib zlib-devel openssl openssl-devel
确认安装包:nginx-1.12.0.tar.gz
准备两台主机,两台主机安装方式一模一样
解压 tar -zxvf nginx-1.12.0.tar.gz -C data
2. 编译安装:
配置执行以下命令
cd data/nginx-1.12.0./configure --prefix=/data/nginx \--with-http_realip_module \--with-http_sub_module \--with-http_flv_module \--with-http_dav_module \--with-http_gzip_static_module \--with-http_stub_status_module \--with-http_addition_module \--with-http_ssl_module
编译
make
安装
make install
3. 修改nginx配置文件
修改配置文件
vi /data/nginx/conf/nginx.conf
a.添加如下代码:
location nginx_status {stub_status on; #开启stub_status监控模块access_log off; #访问日志不记录到log中allow 127.0.0.1; #只允许本机访问deny all; # 不允许其他ip地址访问}
b.到 server 所在代码段:
include data/nginx/conf/conf.d/*.conf
c.在http模块中填下如下代码:
server_tokens off; #屏蔽nginx的版本号
修改nginx端口
由于非root用户只能使用大于1024的的端口,
修改 port :80 为 port :7280
4. 启动nginx
执行命令:
/data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf
查看启动进程 ps -ef| grep nginx
5. 测试启动情况
访问 http://localhost:7280
访问 http://localhost:7280/nginx_status
6. 反向代理配置
在http模块中填下如下代码:
upstream webserver {server tomcat1_ip:port;server tomcat2_ip:port;server tomcat3_ip:port;server tomcat4_ip:port;}
注:该配置为nginx进来的请求轮询依次分发到后端各web服务,upstream后端的webserver名字在server模块中localtion代码段里面添加如下内容:
proxy_pass http://webserver。
1. jdk、tomcat解压
tar -zxvf jdk-8u144-linux-x64.tar.gzmv data/jdk1.8.0_144 data/jdktar -zxvf apache-tomcat-8.5.71.tar.gzmv data/apache-tomcat-8.5.71 /data/tomcat
2. java环境变量添加
vim .bash_profileJAVA_HOME=/data/jdkJAVA_BIN=/data/jdk/binPATH=$PATH:$JAVA_BINCLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOME JAVA_BIN PATH CLASSPATHsource .bash_profilejava -version
3. tomcat配置修改
vi data/tomcat/conf/server.xml<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="400" minSpareThreads="200" maxSpareThreads="500"connectionTimeout="200000" maxHttpHeaderSize="102400" maxPostSize="-1"redirectPort="8443" URIEncoding="UTF-8" /><Host name="localhost" appBase="/data/tomcat/webapps"unpackWARs="true" autoDeploy="true" /><Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs" prefix="localhost_access_log." suffix=".txt"pattern="%h|%{X-FORWARDED-FOR}i|%l|%u|%t|%r|%s|%T|%b|%{Referer}i|%{User-Agent}i" />
4. JVM配置
vi catalina.shJAVA_OPTS="-server -Xmx4g -Xms4g -Xmn256m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Duser.timezone=GMT+8 -verbose:gc -Xloggc:$CATALINA_BASE/logs/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails"
1. 安装准备
确认 data 目录其他用户有写权限,确认依赖包gcc/tcl/make
安装包:redis-5.0.13.tar.gz
主备三台主机,三台主机单节点安装启动方式一模一样
解压:tar -xvf redis-5.0.13.tar.gz -C data
2. 编译安装
cd /data/redis-5.0.13make MALLOC=libccd src ; make testcd ../make install PREFIX=/data/rediscd ../redismkdir data log conf tmp monitor
3. 修改redis配置文件
每台主机需要配置两个配置文件分别为7001端口和7002端口,配置要求如下所示:
cat /data/redis/conf/7001.confbind 0.0.0.0protected-mode yesport 7001tcp-backlog 511timeout 0tcp-keepalive 60daemonize yessupervised nopidfile /data/redis/tmp/redis7001.pidloglevel verboselogfile "/data/redis/log/redis.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir /data/redis/dataslave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100requirepass d^L8sU_s9masterauth d^L8sU_s9maxclients 20000maxmemory 4Gmaxmemory-policy volatile-lrumaxmemory-samples 3appendonly noappendfilename "appendonly.aof"appendfsync everysecaof-rewrite-incremental-fsync yesno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60cluster-replica-validity-factor 0cluster-require-full-coverage nohz 100
cat /data/redis/conf/7001.conf配置中只需要把7001改成7002。
4. 启动redis
三台主机redis都安装完成后,把3台主机6个redis都启动,启动命令如下:
/data/redis/bin/redis-server /data/redis/conf/7001.conf/data/redis/bin/redis-server /data/redis/conf/7002.conf
5. 集群安装
任意一台redis主机上执行如下命令:
/data/redis/bin/redis-cli --cluster create ip1:7001 ip1:7002ip2:7001 ip2:7002 ip3:7001 ip3:7002 --cluster-replicas 1 -a 'd^L8sU_s9'
6. 测试redis集群
检查集群信息:
/data/redis/bin/redis-cli -c -h ip1 -p 7001 -a ' d^L8sU_s9' cluster info
检查集群节点状态:
/data/redis/bin/redis-cli -c -h ip1 -p 7001 -a ' d^L8sU_s9' cluster ndoes
检查单节点信息:
/data/redis/bin/redis-cli -c -h ip1 -p 7001 -a ' d^L8sU_s9' info
1. 安装准备
确认 /data 目录其他用户有写权限
安装包:mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
准备两台主机
解压:tar -xvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz -C /data
2. 初始化安装
进入安装目录并重命名解压目录并进入目录:
cd /data && mv mysql-5.7.35-linux-glibc2.12-x86_64 mysql && cd /data/mysql
创建数据及日志等目录:
mkdir data log
根据配置文件初始化mysql:
./bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --initialize-insecure --user=mysql --innodb_undo_tablespaces=3
Mysql配置文件如下:
cat /data/mysql/conf/my.cnf[client]port=3306socket=/tmp/mysql.sockdefault-character-set=utf8[mysql]no-auto-rehashdefault-character-set=utf8[mysqld]socket=/tmp/mysql.sockbasedir=/data/mysqldatadir=/data/mysql/datasql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESport=3306character-set-server=utf8explicit_defaults_for_timestamp=truelower_case_table_names=1back_log=200max_connections=3000max_connect_errors=100000table_open_cache=512external-locking=FALSEmax_allowed_packet=1024Msort_buffer_size=8Mjoin_buffer_size=8Mthread_cache_size=51query_cache_size=32M#query_cache_limit=4Mtransaction_isolation=REPEATABLE-READtmp_table_size=96Mmax_heap_table_size=96Mskip-name-resolve###***slowqueryparametersslow_query_log_file=/data/mysql/log/slow.loglong_query_time=1slow_query_log = 1###***binlogparameterslog-bin=/data/mysql/log/mysql-binbinlog_cache_size=16Mmax_binlog_cache_size=128Mmax_binlog_size=512Mbinlog_format=ROWexpire_logs_days=7###***MyISAMparameterskey_buffer_size=16Mread_buffer_size=8Mread_rnd_buffer_size=16Mbulk_insert_buffer_size=8M#***Innodbstorageengineparametersinnodb_buffer_pool_size=4Ginnodb_data_file_path=ibdata1:1G:autoextendinnodb_read_io_threads=8innodb_write_io_threads=8innodb_thread_concurrency=16innodb_flush_log_at_trx_commit=1innodb_log_buffer_size=16Minnodb_log_file_size=512Minnodb_log_files_in_group=4innodb_max_dirty_pages_pct=75innodb_buffer_pool_dump_pct=75innodb_lock_wait_timeout=50innodb_file_per_table=oninnodb_undo_tablespaces=3###***master-slave replication parameters
log-slave-updates=truegtid-mode=onenforce-gtid-consistency=truemaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=4slave-parallel-type=LOGICAL_CLOCKslave-preserve-commit-order=1master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log_events=1[mysqldump]quickmax_allowed_packet=1024M[myisamchk]key_buffer=16Msort_buffer_size=16Mread_buffer=8Mwrite_buffer=8M[mysqld_safe]open-files-limit=8192log-error=/data/mysql/log/error.logpid-file=/data/mysql/log/mysqld.pid
启动主从mysql:
/data/mysql/bin/mysqld_safe --defaults-file=/data/mysql/conf/my.cnf &
主从初始化及启动方式一样。
3. 配置mysql主从
主库操作:登陆mysql:
/data/mysql/bin/mysql -urootmysql>update mysql.user set authentication_string=password('*') where user='root';mysql>flush privileges;mysql>grant replication slave on *.* to repl@'%' identified by '****';
从库操作:登陆mysql:
/data/mysql/bin/mysql -urootmysql>change master to master_host='主库ip',master_user='repl',master_port=3306,master_password='Rep2018#',master_auto_position=1;mysql>start slave;
4. 配置mysql双主
从库操作:
mysql>grant replication slave on *.* to repl@'%' identified by '****';
主库操作:
mysql>change master to master_host='从库ip',master_user='repl',master_port=3306,master_password='Rep2018#',master_auto_position=1;mysql>start slave;
5. 测试双主同步
db1操作:
a. 登陆数据库
Create database if not exists dbname;
b. 查看db2是否已通过过来dbname。
db2操作:
a. 登陆数据库
use dbname
create table tablename (id int(11),name varchar(25) );
b. 查看db1是否已同步过来tablename。

至此一个实现高可用反向代理集群即安装完成,简单的架构如上图所示;
nginx主要实现高可用反向代理负载均衡功能;
web服务多机主要提高程序的的并发处理能力及避免单点故障;
redis做缓存数据库可以缓存不怎么修改的配置信息或序列计数等信息提高程序的处理效率;
mysql主从主要就是存储数据并保障主从读写分离机failover自动切换避免单点故障。
更多精彩干货分享
点击下方名片关注
IT那活儿





