跳转至

高可用负载均衡集群

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
用法./netconfig.sh 100 # 配置IP为192.168.1.100

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
上传项目文件到站点目录 192.168.1.101、102、107(web服务器,文件上传服务器) $ tar -zxvf demo-1.0.tar.gz $ rm -rf /data/www $ mv web-1.0/data/www $ chown -R www:www /data/www 配置项目数据库 192.168.1.103(主数据库服务器) $ curl -o data.sql http://192.168.1.107/data.sql $ /usr/local/mysql/bin/mysql -uroot -p123456 mysql>USE web; mysql>source /root/data.sql 191.168.1.101、102(web服务器) $ cd /data/www/ $ rm -f data.sql 软件项目更改配置和单一入口配置(项目源码中配置) 配置192.168.1.101、102(web服务器)nginx.conf
# 根据项目源码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;
}
利用Memcached保存Session 配置192.168.1.101、102、107(web服务器,上传服务器) 创建分布式配置文件(可以修改php.ini中的非关键配置) $ vim /data/www/ .user.ini session.save_handler=memcached session.save_path="192.168.1.108:11211" $ rm -f /tmp/sess_* # 删除本地服务器中的Session文件 文件上传下载分离 配置192.168.1.105(静态文件缓存服务器)http://file.web.test 将项目文件上传到105,解压后复制静态文件到NFS中 $ tar -zxvf web-1.0.tar.gz $ cp -R web-1.0/Public /data/share 配置项目文件的下载和上传服务器模板路径101、102(Web服务器) 配置上传服务器102.168.1.107 $ cd /data/www $ rm -rf data.sql Public/Uploads # 删除本地的上传目录 $ ln -s /data/share/Public/Uploads Public/Uploads # 建立NFS的软连接 $ chmod -R 777 Public/Uploads $ vim /usr/local/nginx/conf/nginx.conf location / { return 403; } location /upload.php { try_files $uri =404; add_header Access-Control-Allow-Origin *; # 允许跨域请求 fastcgi_pass unix:/tmp/php-cgi.sock; include fastcgi.conf; } $ service nginx reload

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被去除执行权限无法启动,切换到备用服务器