高可用负载均衡集群¶
Nginx配置优化¶
ApacheBench工具,用于测试服务器性能 $ cd /usr/local/apache2/bin $ ./ab -n10 -c2 http://192.168.1.100/ # -n10发送请求总数,-c2并发数 当并发数大时需要 $ ulimit -a # 查看最大打开文件数 $ ulimit -n 65535 #临时调整最大打开文件数
优化Nginx连接数 编辑配置文件nginx.conf
# 指定工作进程的个数,auto根据cpu核心数量控制 worker_pocesses auto; # 设置最多打开文件数量 worker_rlimit_nofile 65535; events { # 每个工作进程可接收的连接数 worker_connections 65535; # 是否允许一个工作进程响应多个请求 mulit_accepte on; }
限制并发请求 限制同一个 IP 的并发数编辑配置文件nginx.conf http { # 也可位于server和location中 #开启共享内存空间perip用于存放客户端ip,大小为10MB limit_conn_zone $binary_remote_addr zone=perip:10m; #相同IP并发连接数限制为10个,超过返回503 limit_conn perip 10; }
限制虚拟主机的并发数编辑配置文件nginx.conf http {... limit_conn_zone $server_name zone=perserver:10m server { listen 80; server_name localhost; limit_conn perserver 20; } }
限制响应的传输速率编辑配置文件nginx.conf http {... limit_rate 100k; # 100KB/s limit_rate_after 10m; # 传输10M数据后开始限速,省略则立即限速 }
生成测试文件 $ cd /usr/local/nginx/html $ dd if=/dev/zero of=100m.test bs=1M count=100 # dd按照指定大小的块复制文件,if输入文件,of输出文件,bs块大小,count块数量
LNMP分布式部署¶
拓扑图 0Nginx负载均衡*1→12Web(Nginx+php)*2→34MySQL*2(主从) 5Nginx静态文件缓存*1----------------------->6文件存储(NFS)*1 7Nginx+php文件上传*1-------------------->8数据缓存Memcached*1
1网卡配置脚本¶
1网卡配置脚本netconfig.sh
#! /bin/bash eth0=/etc/sysconfig/network-scripts/ifcfg-eth0 mac=`ifconfig -a |grep -o HWaddr.* |cut -c 8-24` if [ "$1" = "" ] || [ "$mac" = "" ]; then exit 3; fi sed -i 's/IPADDR=.*/IPADDR=192.168.1.'$1'/g' $eth0 sed -i 's/HWADDR=.*/HWADDR='$mac'/g' $eth0 sed -i 's/UUID=.*/UUID='`uuidgen`'/g' $eth0 start_udev
2部署nginx环境¶
下载解压安装 编译时安装http_realip_module模块 $ useradd -s /bin/nologin -M www $ mkdir -p /data/www $ cp ../html/* /data/www $ chown -R www:www /data/www $ vi ../conf/nginx.conf user www; server { listen 80; server_name localhost; root /data/www; index index.html index.htm; } $ service nginx start $ iptables -I INPUT -p tcp --dport 80 -j ACCEPT $ service iptables save # 没有安装iptables-service此命令不好使可以用firewalld --zone=public --add-port=80/tcp --permanent然后firewalld --reload
3Nginx+PHP搭建¶
PHP依赖安装配置PHP-FPM启动防火墙配置 Nginx负载均衡服务器配置反向代理和负载均衡nginx.conf upstream web_server { server 192.168.1.101; server 192.168.1.102; keepalive 32; # 与后端服务器保持长连接数 } server { listen 80; server_name web.test www.web.test; location / { proxy_pass http://web_server; proxy_http_version 1.1; proxy_set_header Connection ""; # 清空客户端Connection头 proxy_set_header Host $host; # 传递请求的Host头 proxy_set_header X-Real-IP $remota_addr; # 传递客户端真实IP } } 后端Web服务器配置nginx.conf 添加以下指令 real_ip_header X-Real-IP; #从指定消息头部获取真实客户端IP set_real_ip_from 192.168.1.100 # 只从指定服务器(负载均衡服务器)获取X-Real-IP
4搭建NFS文件服务器¶
NFS服务器配置192.168.1.106 $ yum -y install nfs-utils # 直接安装 $ vi /etc/sysconfig/nfs 取消注释 MOUNT_PORT=82 $ service rpcbind start # 开启rpcbind服务 $ service nfs start # 开启nfs服务 $ chkconfig nfs on # 添加开机启动 防火墙开放以下端口,iptables或firewalld 111 portmapper 用于端口映射 892 rpc.mountd 用于管理NFS文件系统 2049 nfs NFS服务端口号 配置共享目录 $ mkdir /share $ chmod 777 /share $ echo '/share * (rw)' > /etc/exports # 配置/share为共享目录,语法:路径 IP段 (权限),任意IP用*表示 $ service nfs reload 静态文件缓存服务器配置192.168.1.105 $ yum -y install nfs-utils # 安装nfs软件 $ showmount -e 192.168.1.106 # 查看NFS服务器中的共享目录 $ mkdir /data/share $ mount 192.168.1.106:/share /data/share # 挂载共享目录 $ cd /data/share $ echo Hello > test.txt # 读写测试 $ cat test.txt # 也可以在NFS上查看$ ll /share和cat etc/paccwd |grep nfsnobody $ echo '192.168.1.106:/share /data/share nfs defaults 0 0 ' >> /etc/fstab # 重启后自动挂载NFS远程文件 静态文件缓存服务器nginx.conf添加以下语句 http {...
代理临时目录¶
proxy_temp_path proxy_temp;
web缓存目录和参数配置¶
proxy_cache_path proxy_cache levels=1:2 keys_zone=one:80m inactive=7d max_size=5g; server { # 本地80虚拟主机用于接收静态页面请求 listen 80; server_name file.web.test; add_head X-Cache upstream_cache_status; location / { proxy_pass http://web_server; # 设置反向代理,本例代理localhost proxy_http_version 1.1; proxy_set_header Connection ""; proxy_cache one; # 设置缓存区名称 proxy_cache_key hosturiuriuriuriis_args$args; proxy_cache_valid 200 304 2d; # 状态码200和304的文件缓存2天 } } upstream web_server { server localhost:81; keepalive 32; # 设置最大长连接数 } server { # 本地81虚拟主机用于从缓存服务器挂载点NFS取得缓存文件 listen 81; server_name localhost; root /data/share; # 指定缓存文件保存目录 index index.html index.htm; }
5文件上传服务器192.168.1.107¶
$ yum -y install nfs-utils # 安装nfs软件 $ mkdir /data/share # 创建挂在目录 $ mount 192.168.1.106:/share /date/share # 挂载 $ echo '192.168.1.106:/share /data/share nfs defaults 0 0 ' >> /etc/fstab # 重启后自动挂载NFS远程文件 $ mkdir -m 777 /data/share/uploads # 创建上传文件目录 配置文件上传服务器nginx.conf client_max_body_size 20m; # 修改最大上传数据量,默认1m 同时还需要配置php.ini $ vi /usr/local/php/lib/php.ini post_max_size=20M # 通过POST提交的最大限制 file_uploads=On # 是否允许文件上传 upload_max_filtersize=10M # 上传文件最大限制 ;upload_tmp_dir = # 上传文件临时保存目录,默认为/tmp $ service php-fpm reload $ service nginx reload 测试文件upload.php
<form method="post" enctype="multipart/form-data"> <input type="file" name="up"> <input type="submit"> </form> <?php if(isset($_FILES['up']) && $_FILES['up']['error'] ==0){ $savepath='uploads/'.time().'.dat'; if(move_uploaded_file($_FILES['up']['tmp_name'], "/data/share/$savepath")){ echo "File:<a href=\"http://file.web.test/$savepath\">Donload</a>" } } ?>
搭建MySQL服务器¶
依赖 $ yum -y install gcc-c++ cmake ncurses-devel 下载过程省略 $ cd /usr/local/源码目录 cmake参数 $ cmake . -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci $ make && make install && cd ..
配置MySQL $ vi /etc/my.cnf 配置文件更改如下 datadir= /data/mysql # 数据保存目录 socket= /tmp/mysql.sock # sock文件保存目录 user=mysql # MySQL的工作用户 运行初始化程序 $ cd /usr/local/mysql $ ./scripts/mysql_install_db 启动并添加服务 $ cp support-files/mysql.server /etc/init.d/mysql $ chkconfig --add mysql $ service mysql start 查看端口占用 $ netstat -tnlp |grep mysql 防火墙通过 $ iptables -I INPUT -p tcp --dport 3306 -j ACCEPT $ service iptables save 配置用户,实际上就是给root加密码,不允许匿名登陆的操作 $ /usr/local/mysql/bin/mysql mysql>UPDATE mysql.uer SET password=password('123456')WHERE user='root'; mysql>DELETE FROM mysql.user WHERE user=''; mysql>FLUSH PRIVILEGES; mysql>EXIT
实现MySQL主从复制 主MySQL服务器192.168.1.103 $ vim /etc/my.cnf [mysqld] log-bin=mysqlbin-log # 日志文件名 server-id=103 # 自定义服务器ID $ service mysql restart $ ll /data/msql/mysqlbin # 查看操作日志目录mysqlbin-log文件,文件名放到从机master_log_file中,此例为mysqlbin-log.000001 创建用于主从复制的用户 $ /usr/local/mysql/bin/mysql -uroot -p123456 mysql>GRANT REPLICATION SLAVE ON . TO 'slave'@'192.168.1.104' IDENTIFIED BY '123456'; 创建用户授权复制给slave@从机 密码 mysql>SHOW MASTER STATUS; # 查看Position字段并记住放到从机master_log_pos中,此例为262 从MySQL服务器192.168.1.104 $ vim /etc/my.cnf [mysqld] server-id=104 # 自定义服务器ID $ service mysql restart $ /usr/local/mysql/bin/mysql -uroot -p123456 mysql>CHANGE MASTER TO master_hsot='192.168.1.103', master_user='slave', master_password='123456', master_log_file='mysqlbin-log.000001',master_log_pos=262; mysql>START SLAVE; # 停止可用命令SLAVE STOP mysql>SHOW SLAVE STATUS \G **********************1.row*********************** Slave_IO_State:Waiting for master to send event #等待主服务器发送事件 Master_Host: 192.168.78.17 #主服务器地址 Master_User: slave #主服务器用户名 Master_Port: 3306 #主服务器端口号 Connect_Retry: 60 #连接失败重试次数 Master_Log_File: mysqlbin-log.000001 #主服务器日志文件 Read_Master_Log_Pos: 262 #主服务器日志读取位置 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 256 Relay_Master_Log_File: mysqlbin-log.000001 Slave_IO_Running: Yes #从服务器IO运行中 Slave_SQL_Running: Yes #从服务器SQL运行中 ...
同步测试 在主服务器中写人数据 mysql>CREATE TABLE test.a(id INT, num INT); mysql>INSERT INTO test.a VALUES(1, 2); 在从服务器中读取数据 mysql>SELECT * FROM test.a \G id: 1 num: 2 在从服务器中写入数据 mysql>INSERT INTO test.a VALUES(3, 4); 在主服务器中读取数据 mysql>SELECT FROM test.a \G id: 1 num : 2 从服务器的变化在主服务器中无法查到
搭建Memcached缓存服务器¶
缓存服务器Memcached192.168.1.108 安装Memcached $ yum -y install gcc libevent-devel 安装perl(dpkg安装必备) $ wget https://www.cpan.org/src/5.0/perl-5.28.1.tar.gz $ tar -zxvf perl-5.28.1.tar.gz $ cd perl-5.28.1 $ ./Configure -de $ make && make install 安装 $ wget http://www.memcached.org/files/memcached-1.5.12.tar.gz $ tar -zxvf memcached-1.5.12.tar.gz $ cd memcached-1.5.12 $ ./configure $ make && make install 配置系统服务和开机启动 $ cd /usr/local/src/memcached-1.5.12/scripts $ cp memcached-init /etc/init.d/memcached $ chkconfig --add memcached 复制start-memcache脚本 $ mkdir -p /usr/share/memcached/scripts $ cp start-memcached /usr/share/memcached/scripts/ 为start-memcached脚本创建软连接 $ ln -s /usr/local/bin/memcached /usr/bin/memcached 从debian中获取dpkg $ yum -y install gcc-c++ wget perl xz ncurses-devel $ wget http://mirrors.tuna.tsinghua.edu.cn/debian/pool/main/d/dpkg/dpkg_1.19.2.tar.xz $ tar -xvf dpkg_1.19.2.tar.xz $ cd dpkg-1.19.2/ $ ./configure --without-libselinus (需要安装perl) $ make $ cp utils/start-stop-daemon /usr/local/sbin/ 启动Memcached服务 创建并编写配置文件 $ vim /etc/memcached.conf -m 512 # 分配的内存大小MB,默认64MB -p 11211 # 配置监听TCP端口默认11211 -u nobody #配置Memcached的工作用户 -c 1024 #配置最高并发连接数,默认1024 -t 16 #配置使用的线程数,默认4 $ service memcached start 防火墙开放端口 $ iptables -I INPUT -p tcp --dport 11211 -j ACCEPT $ service iptables save
PHP配置访问Memcached192.168.1.102、103、107 $ yum install cyrus-sasl-devel $ cd /usr/local/src $ wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz $ tar -zxvf libmemcached-1.0.18.tar.gz $ cd libmemcached-1.0.18 $ 安装PHP的Memcached扩展 $ wget http://pecl.php.net/get/memcached-3.1.3.tgz $ tar -zxvf memcached-3.1.3.tgz $ cd memcached-3.1.3 # 下面命令需要在此目录下运行 为PHP的Memcached扩展生成configure文件 $ /usr/local/php/bin/phpize # 查看Zend Module Api No此例为20180731 $ ./configure --with-php-config=/usr/local/php/bin/php-config $ make && make install 在PHP的配置文件php.ini中加载Memcache扩展 $ vim /usr/local/php/lib/php.ini extension=/usr/local/php/lib/php/extensions/no-debug-nonzts-20180731/memcached.so $ service php-fpm reload
连接测试
<?php $mem=new Memcached(); # 连接Memcache服务器 $mem->addServer('192.168.1.108', 11211); $mem->set('UserName', 'James'); # 保存数据(Key=UserName,Value=James) echo $mem->get('Username'); # 获取数据 ?>
ThinkPHP项目部署¶
创建MySQL独立数据库用户 192.168.1.103(主数据库服务器)
$ /usr/local/mysql/bin/mysql -uroot -p123456 mysql>CREATE DATABASE web # 为web服务器各自创建用户 mysql>GRANT USAGE ON *.* TO 'web'@'192.168.1.101' IDENTIFIED BY '123456'; mysql>GRANT USAGE ON *.* TO 'web'@'192.168.1.102' IDENTIFIED BY '123456'; # 分配数据库权限 mysql>GRANT ALL PRIVILEGES ON web.* TO 'demo'@'192.168.1.101'; mysql>GRANT ALL PRIVILEGES ON web.* TO 'demo'@'192.168.1.102'; FLUSH PRIVILEVES; EXIT
# 根据项目源码PATHINFO配置重写规则 rewrite ^/index.php/ (.*)/index.php?s=$1 break; # 请求文件不存在,重定向到index.php location / { try_files $uri $uri/ /index.php?s=$uri; } #防止静态文件不存在的请求被内部重定向到index.php location ~ \. (gif|jpg|jpeg|png|swf|xml|ico|css|js|map|txt)${ expires 30d; } # .php发送给php-fpm location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; include fastcgi.conf; }
Nginx+Keepalived高可用方案¶
安装和配置Keepalived服务¶
安装Keepalived
$ cd /usr/local/src
$ yum -y install libnl libnl-devel
$ yum install -y libnfnetlink-devel
$ curl -O http://www.keepalived.org/software/keepalived-2.0.11.tar.gz
$ tar -zxvf keepalived-2.0.11.tar.gz
$ cd keepalived-2.0.11
$ ./configure
$ make && make install
添加到系统服务开机启动
$ cd /usr/local/src/keepalived-2.0.11/keepalived/etc/init.d/
$ cp keepalived /etc/init.d/
$ chkconfig keepalived on
配置文件创建软连接
$ cd /usr/local/etc/sysconfig/
$ ln -s pwd
/keepalived /etc/sysconfig/keepalived
程序文件创建软连接
$ ls /usr/local/sbin/
$ ln -s pwd
/keepalived /usr/sbin/keepalived
配置主服务器的Keepalived
$ less /usr/local/etc/keepalived/keepalived.conf
创建配置文件
$ mkdir /etc/keepalived
$ vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { #配置一个虚拟路由VI_1
state MASTER #角色master或backup
interface eth0 #指定检测网卡
virtual_route_id 21 #虚拟路由标识同一VRRP内应一致
mcast_src_ip 192.168.1.101 #设置Real IP(默认网卡主IP)
priority 100 #优先级权重0~254
advert_int 1 #同步时间间隔秒
authentication { #设置验证类型和密码
auth_type PASS #PASS为密码验证
auth_pass 123456 #密码主备密码相同
}
virtual_ipaddress { #设置Virtual IP 地址池
192.168.1.110 #主备VIP地址池相同
}
}
启动Keepalived服务
$ service keepalived start
查看Keepalived进程
$ ps aux |grep keepalived
查看Keepalived添加的Virtual IP
$ ip a |grep 192.168.1.110
Keepalived启动后可以使用192.168.1.110访问服务器
配置备服务器的Keepalived
创建配置文件
$ mkdir /etc/keepalived
$ vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { #配置一个虚拟路由VI_1
state BACKUP #角色master或backup
priority 90 #降低优先级权重
...
}
主服务器开放服务器端口112允许备服务器
$ iptables -I INPUT -s192.168.1.102 -p112 -jACCEPT
$ service iptables save
备服务器开放服务器端口112允许主服务器
$ iptables -I INPUT -s192.168.1.101 -p112 -jACCEPT
$ service iptables save
使用Keepalived监控Nginx服务 自动监控Nginx 创建配置文件 $ mkdir /etc/keepalived $ vim /etc/keepalived/keepalived.conf vrrp_script chk_nginx { # 配置用于检测nginx运行状态的脚本 script "/chk_nginx.sh" # 用于检测的脚本文件路径 interval 2 #没2秒执行一次检测脚本 weight -20 #当检测失败时,权重发生变化 } vrrp_instence VI_1 { #为VI_1添加监控脚本 ... track_script { chk_nginx } } vim /chk_nginx.sh # 创建检测脚本
#! /bin/bash if[ `ps -C nginx --no-header |wc -l` -eq 0 ]; then service nginx start sleep 2 if[ `ps -C nginx --no-header |wc -l` -eq 0 ]; then service keepalived stop fi fi $ chmod +x /chk_nginx.sh $ service keepalived reload
高可用性测试
$ service nginx stop $ ps -C nginx --no-header # 此时由于检测脚本可以启动nginx,主nginx服务被恢复 $ cd /usr/local/ngins/sbin $ vim test.sh #! /bin/nash service nginx stop chmod -x nginx $chmod +x test.sh $ ./test.sh # 此时nginx被去除执行权限无法启动,切换到备用服务器