1、源码编译安装LNMP架构环境;
安装编译工具和库文件
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make cmake libtool* git tree
编译安装nginx
[root@localhost opt]# wget http://nginx.org/download/nginx-1.8.1.tar.gz #下载nginx安装包
[root@localhost opt]# tar xzvf nginx-1.8.1.tar.gz #解压安装包
[root@localhost nginx-1.8.1]# ./configure \
> --prefix=/usr/local/nginx \
> --with-http_realip_module \
> --with-http_sub_module \
> --with-http_ssl_module \
> --with-http_gzip_static_module \
> --with-pcre
[root@localhost nginx-1.8.1]# make && make install
[root@localhost nginx-1.8.1]# vim /usr/local/nginx/conf/nginx.conf #修改php相关配置
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
[root@localhost nginx-1.8.1]# /usr/local/nginx/sbin/nginx #启动nginx编译安装mysql
[root@localhost opt]# groupadd mysql #添加mysql组 [root@localhost opt]# useradd -r -g mysql mysql #添加mysql用户 [root@localhost opt]# tar xzvf mysql-5.6.24.tar.gz [root@localhost opt]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio #安装编译代码所需要的包 [root@localhost opt]# cd /opt/mysql-5.6.24 [root@localhost mysql-5.6.24]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ [MySQL安装的根目录] -DMYSQL_DATADIR=/mydata/mysql/data \ [MySQL数据库文件存放目录] -DSYSCONFDIR=/etc \ [MySQL配置文件所在目录] -DMYSQL_USER=mysql \ [MySQL用户名] -DWITH_MYISAM_STORAGE_ENGINE=1 \ [MySQL的数据库引擎] -DWITH_INNOBASE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎] -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎] -DWITH_MEMORY_STORAGE_ENGINE=1 \ [MySQL的数据库引擎] -DWITH_READLINE=1 \ [MySQL的readline library] -DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \ [MySQL的通讯目录] -DMYSQL_TCP_PORT=3306 \ [MySQL的监听端口] -DENABLED_LOCAL_INFILE=1 \ [启用加载本地数据] -DENABLE_DOWNLOADS=1 \ [编译时允许自主下载相关文件] -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all \ [使MySQL支持所有的扩展字符] -DDEFAULT_CHARSET=utf8 \ [设置默认字符集为utf8] -DDEFAULT_COLLATION=utf8_general_ci \ [设置默认字符校对] -DWITH_DEBUG=0 \ [禁用调试模式] -DMYSQL_MAINTAINER_MODE=0 -DWITH_SSL:STRING=bundled \ [通讯时支持ssl协议] -DWITH_ZLIB:STRING=bundled [允许使用zlib library] [root@localhost mysql-5.6.24]# make && make install [root@localhost local]# chown -R mysql:mysql /usr/local/mysql/ #修改mysql文件夹属组和属主 [root@localhost local]# chown -R mysql:mysql /mydata/mysql/data [root@localhost etc]# vim /etc/my.cnf #修改my.conf配置文件 # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # These are commonly set, remove the # and set as required. basedir=/usr/local/mysql datadir=/mydata/mysql/data socket=/var/lib/mysql/mysql.sock character-set-server=utf8 user= mysql # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [root@localhost local]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/mysql/data #初始化mysql数据库
编译安装php
[root@localhost opt]# tar xzvf php-5.6.5.tar.gz [root@localhost php-5.6.5]# ./configure --enable-opcache --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring=all --with-pdo-mysql --enable-sockets --enable-mbstring --enable-fpm --with-curl --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-gd --with-libxml-dir=/usr --enable-xml --with-openssl --with-iconv [root@localhost php-5.6.5]# make && make install [root@localhost etc]# cp /opt/php-5.6.5/php.ini-development /usr/local/php/etc/php.ini [root@localhost etc]# cd /usr/local/php/etc/ [root@localhost etc]# cp php-fpm.conf.default php-fpm.conf [root@localhost etc]# /usr/local/php/sbin/php-fpm #启动php [root@localhost html]# vim /usr/local/nginx/html/index.php #创建一个php页面 <?php phpinfo(); ?>
2、编写一个脚本完成以下功能:
(1)、一键搭建LNMP源码编译环境;
(2)、可通过在脚本后面跟上一些参数来自定义安装目录等其他选项。
[root@localhost shell]# cat /shell/LNMP.conf #参数较多放在一个配置文件中
nginx_dir=/usr/local/nginx
mysql_dir=/user/local/mysql
mysqldata_dir=/mysqldata
php_dir=/usr/local/php
[root@localhost shell]# cat /shell/LNMP.sh
#!/bin/bash #加载配置文件
source $1 #nginx安装函数
nginx() {
groupadd -r nginx
useradd -s /sbin/nologin -g nginx -r nginx
cd /opt
echo "------------开始安装nginx-1.8.1------------"
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar xzvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --prefix=${nginx_dir} --with-http_realip_module --with-http_sub_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre
make && make install
}
#mysql安装模块
mysql() {
groupadd mysql
useradd -r -g mysql mysql
cd /opt echo "------------开始安装libmcrypt-2.5.7------------"
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.24.tar.gz
tar mysql-5.6.24.tar.gz cd mysql-5.6.24
cmake . -DCMAKE_INSTALL_PREFIX=${mysql_dir} \
-DMYSQL_DATADIR=${mysqldata_dir} \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DMYSQL_GROUP=mysql
make && make install
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
chown -R root:mysql ${mysql_dir}
chown -R root:mysql ${mysqldata_dir}
}
#php安装模块
php() {
cd /opt
echo "------------开始安装libmcrypt-2.5.7------------"
wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz
tar xvf libmcrypt-2.5.7.tar.gz
cd /opt/libmcrypt-2.5.7
./configure --prefix=/usr/local/libmcrypt && make && make instal
l
echo "------------开始安装php-5.6.5------------"
wget http://cn2.php.net/distributions/php-5.6.5.tar.gz
tar xzvf php-5.6.5.tar.gz
cd php-5.6.5
./configure --enable-opcache --prefix=${php_dir} --with-config-file-path=${php_dir}/etc --with-mysql=${mysql_dir} --with-mysqli=${mysql_dir}/bin/mysql_config --enable-mbstring=all --with-pdo-mysql --enable-sockets --enable-mbstring --enable-fpm --with-curl --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-gd --with-libxml-dir=/usr --enable-xml --with-openssl --with-iconv && make && make install
cp ${php_dir}/etc/php-fpm.conf.default ${php_dir}/etc/php-fpm.conf
cp /opt/php-5.6.5/php.ini-development ${php_dir}/etc/php.ini
}
yum -y install gcc gcc-c++ make pcre-* zlib-* cmake ncurses-devel libjpeg* libpng* freetype* libcurl-devel libvpx-devel libxml2 libxml2-devel libXpm libXpm-devel libXpm.i686 libXpm.i686-devel openldap-devel
#安装nginx软件
nginx
if [ $? -eq 0 ];then
echo "nginx安装成功!!!"
else
echo "nginx安装异常!!!"
exit
fi
#安装mysql数据库
mysql
if [ $? -eq 0 ];then
echo "mysql安装成功!!!"
else
echo "mysql安装异常!!!"
exit
fi
#安装php
php if [ $? -eq 0 ];then
echo "php安装成功!!!"
exit
else
echo "php安装异常!!!"
exit
fi3、结合图形描述LVS的工作原理;
lvs介绍
LVS的英文全名为“Linux Virtual Server”,即Linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统。
Lvs原理介绍
图示如下:

1.首先用户向负载均衡器调度器(Director Server)发起请求,负载均衡器将请求发往至内核空间,交给内核模块进行检测。
2.内核模块中的PREROUTING链首先会收到用户请求,判断目标地址是否是负载均衡器的IP地址,如果是,则将数据包发往INPUT链。
3.IPVS模块是工作在INPUT链上的,当用户请求到达INPUT链上时,IPVS会将用户请求和自己已定义好的集群服务作对比,如果用户请求的就是定义的集群服务,那么IPVA会强行修改数据包里的目标IP地址和目标端口,并将新的数据包发往POSTROUTING链。
4.POSTROUTING链接收到数据包发现目标IP地址刚好是自己的后端的服务器,那么通过选路,将数据包最终发送给后端的服务器。
lvs的类型
根据架构有3种不同的模型
1、lvs-nat (Network Address Translation)(建议小规模使用)
2、lvs-dr (Direct Routing 直接路由)(建议大规模使用,也是现在较多使用场景的方法)
3、lvs-tun (Tunneling 隧道)(lvs-tun模型比较少用,因为它不能实现全局负载均衡,不能根据用户区域的距离来挑选最近的机房。这个最多为了实现异地容灾来实现的。)
lvs-nat模型
主要是修改目标IP地址为挑选出新的RS的IP地址。即请求进入负载均衡器时做DNAT,响应出负载均衡器时做SNAT。
图示如下:
1.当用户请求到达Director Server,此时请求的数据报文会先到达内核的PREROUTING链,此时报文的源IP是CIP,目标IP是VIP。
2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链。
3.IPVS内核模块比对数据包请求的服务是否为集群服务,如果是,则修改数据包的目标IP为后端服务器的IP,然后将数据包发至POSTROUTING链,做DNAT转换。此时报文的源IP是CIP,目标IP是RIP
4.POSTROUTING链通过选路,将数据包发送到Real Server。
5.Real Server比对发现目标IP是自己的IP,开始建立响应报文发回给Director Server,此时报文的源IP是RIP,目标IP是CIP.
6.Director Server在响应客户端之前,此时会将源IP地址修改为自己的IP地址,然后响应给客户端,做SNAT转换。此时报文的源IP是VIP。目标IP是CIP。
特性:
1.RS必须使用私有地址,将RS的网关指向DIP。
2.DIP和RIP必须是同一网段内。
3.请求和响应报文都要经过Director Server,高负载场景中,Director Server会出现性能瓶颈。
4.支持端口映射
5.RS可以使用任意操作系统
lvs-dr模型
将请求报文的目标MAC地址设定为天选出来的RS的MAC地址。即做MAC地址转换。
图示如下:
1.当用户请求到达Director Server,此时请求的数据报文huixiandao内核空间的PREROUTING链,此时报文的IP是CIP,目标IP是VIP。
2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链,
3.IPVS内核模块比对数据包请求的服务是否为集群服务,如果是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发至POETROUTING链中,此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址。
4.由于DS和RS实在同一网络中,所以两者之间的通信时通过二层协议来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
5.RS发现请求报文的MAC地址是自己的MAC地址,就接受此报文,处理完成以后,将响应报文通过IO接口传送给eth0网卡,然后向外发出,不经过负载均衡器。此时源IP地址为VIP,目标IP是CIP。
6.响应报文最终送至客户端。
特性:
1.保证前端路由将目标地址为VIP的报文全部发送给DS,而不是RS。
解决方案:
(1).在前端路由做静态地址路由绑定,将对于VIP的地址仅路由到DS上。
存在问题:用户未必有权限操作路由,
(2).arptables:在arp层次上实现arp解析时做防火墙规则,过滤RS响应arp请求,由iptables提供。
(3).修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制不能响应对VIP地址的解析请求。
2.RS可以使用私有地址,也可以使用公网地址,如果使用公网地址,可以直接对RIP进行直接访问。
3.RS和DS必须在同一物理网络中(即必须是同一物理网络)。
4.所有的请求报文经由DS,但响应报文必须不能经过DS。
5.不支持地址转换,即整个过程和不转换IP地址,只转换MAC地址。也不支持端口映射。
6.RS可以使大多数操作系统
7.RS的网关绝对不允许指向DIP,因为不允许响应报文经过DS。
8.RS的lo接口配置VIP的地址。
lvs-tun模型
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标地址为VIP)外部IP地址首部(源地址为DIP,目标地址为RIP)
图示如下:
1.当用户请求报文到达DS,此时请求的数据报文会先到内核的PREROUTING链。此时源IP是CIP,目标IP是VIP。
2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链。
3.IPVS比对数据包请求的服务是否为集群服务,如果是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP是RIP,然后发至POSTROUTING链。此时源IP是为DIP,目标IP是RIP。
4.POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP是DIP,目标IP是RIP。
5.RS收到报文后发现是自己的IP地址,就会将报文接受下来,拆除最外层的IP后,会发现里面还有一层IP首部,而且目标地址是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成滞后,通过lo接口送给eth0网卡,然后向外传递。此时的源IP地址为VIP,目标IP为CIP。
6.响应报文送达至客户端。
特性:
1.RIP、VIP、DIP全为公网地址。
2.RS的网关不会也不可能指向DIP。
3.所有的请求报文经由DS,但响应报文必须不能经过DS。
4.不支持端口映射。
5.RS的系统必须支持隧道模型。
4、阐述varnish的功能及其应用场景,并通过实际的应用案例来描述配置、测试、调试过程。
常见缓存工具
nginx , cache (disk)
squid 在负载较重时使用效果好,逐步被varnish替代
varnish(disk,memory) 轻量级环境中,年轻态的产品,
推荐使用varnish作为专用的缓存
使用
varnish 为开源的缓存服务器解决方案;
是DSL的编程语言;
对CPU性能要求不够但对I/O要求高;
缓存请求页面的可缓存页面,并依据页面的新鲜度来确定时候向后端服务器取数据;
常布置在后端服务器与前端服务器主机作为缓存服务器,来加快用户的请求访问速度;
能够根据不同的请求方法采用不同的策略来决定请求的流向;
配置
安装LNMP服务,并安装VARNISH服务
vim /etc/varnish/default.vcl
配置服务器
配置的选项
ACL的配置,用来允许一部分用户来进行管理的操作
配置需要缓存的服务的相关参数
配置接收到的ACL的处理,如只允许标准化组织定义的操作,而拒绝其他操作
配置需要分类处理的,如动静分离,而采用不同的缓存。或者不需缓存的数据
配置可进行purge的管理IP,防止其他人误操作使缓存清空
acl purge {
"localhost";
"127.0.0.1";
"192.168.188.0"/24;
}
后端服务器
backend web1 {
.host = "192.168.188.100";
.port = "80";
.connect_timeout = 1s; #连接超时时间
.first_byte_timeout = 8s;
.between_bytes_timeout = 5s;
.probe = {
.url = "/test1.html";
}
}
backend web2 {
.host = "192.168.188.101";
.port = "80";
.connect_timeout = 1s; #连接超时时间
.first_byte_timeout = 8s;
.between_bytes_timeout = 5s;
.probe = {
.url = "/test1.html";
}
}
定义集群
director realserver random {
{
.backend = web1;
.weight = 5;
}
{
.backend = web2;
.weight = 6;
}
}
缓存服务器接收到请求后的处理
sub vcl_recv {
如果请求为PURGE则只允许授权的访问
if (req.request == "PURGE") {
if (!client.ip ~ purge)
{
error 405 "Not allowed.";
}
return(lookup);
}
if (req.request == "REPURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
ban("req.http.host == " + req.http.host + " && req.url ~ " + req.url);
error 200 "Ban OK";
}
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
}
else {
set req.http.X-Forwarded-For = client.ip;
}
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization) {
/* Not cacheable by default */
return (pass);
}
# set req.grace = 4h;
if (req.request != "GET" && req.request != "HEAD") {
return(pipe);
}
elseif (req.url ~ ".(php|cgi)($|?)") #动态页面直接通过,不缓存
{
return(pass);
}
return(lookup);
}
命中后的处理
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
没有命中的处理
sub vcl_miss
{
return (fetch);
}
取数据
sub vcl_fetch
{
##对访问中get有包含jpg,png等格式的文件进行缓存,缓存时间为7天,s为秒
if (req.request == "GET" && req.url ~ ".(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$")
{
set beresp.ttl = 7d;
}
##对访问get中包含htm等静态页面,缓存300秒
if (req.request == "GET" && req.url ~ "/[0-9].htm$")
{
set beresp.ttl = 300s;
}
return (deliver);
}
添加在页面head头信息中查看缓存命中情况
sub vcl_deliver
{
set resp.http.x-hits = obj.hits ;
if (obj.hits > 0)
{
set resp.http.X-Cache = "HIT cqtel-bbs";
}
else
{
set resp.http.X-Cache = "MISS cqtel-bbs";
}
} 登录浏览器打开网页查看是否缓存,根据配置的obj
如果缓存可以使用F5强制刷新不使用缓存
5、搭建一套LVS-DR模型的高性能集群,并用Keepalived实现nginx与lvs的高可用集群,同时实现以下功能:
(1)、wordpress程序通过nfs共享给各个realserver;
(2)、后端realserver中的nginx和php分离
一、配置前的说明:
1.1用到的设备
前端两台服务用来调度,
后端两台RS用来提供服务,
由于NGING和PHP分离故提供另外的一台主机安装PHP
由于PHP需要数据库所以安装MySQL,
为了共享安装NFS文件共享服务
workpress也安装在这台服务器上
二、配置说明
2.1集群配置前的准备
1、同步时间(所有机器的时间向一台服务器同步),也可以配置NTP服务器来同步时间
ntpdate 210.72.145.44
2、配置集群服务的主机名
hostname dr1.magedu.com
hostname dr2.magedu.com
hostname rs1.mangedu.com
hostname rs2.magedu.com
hostname backen.magedu.com
3、配置/etc/hosts文件,加快域名的解析速度
192.168.10.131 dr1.magedu.com
192.168.10.132 dr1.magedu.com
192.168.10.133 rs1.mangedu.com
192.168.10.135 rs2.magedu.com
192.168.10.136 backen.magedu.com
2.3、共享用户的配置(在RS 和 BACKEN 服务器上配置, 配置的内容要相同以方便共享访问)
groupadd -r -g 498 nginx
useradd -r -g 498 -u 498 nginx
2.4、在后端服务器上安装NFS ,PHP , MYSQL , 如要加快PHP的访问可以安装xcache
安装nfs服务(在backed的服务器上安装)
创建共享的目录并配置用户和组为nginx
mkdir -pv /data/wordpress
chown nginx:ngxin /data/wordpress
vim /etc/exports
/data/wordpress (rw,no_root_squash)
service nfs start
安装MYSQL服务
仅为配置PHP服务一般安装即可
安装php 服务
配置服务通过fastcgi接口与远端的NGINX服务联系
vim /usr/local/php/etc/php-fpm.conf
listen = 192.168.10.136:9000 #监听物理网卡地址,供其它机器调用
user = nginx ##php-fpm以nginx用户运行
group = nginx
在共享目录下放置wordpress
修改wordpress配置
cp -a workpress /data/wordpress
cp wp-config-sample.php wp-config.php
vim wp-config.php
define name wpdb
define user wpuser
define db passwd wppasswd
登录数据库MYSQL创建用户并允许远端访问
mysql
GRADN ALL ON wpdb.* TO ‘‘wpuser‘@‘localhost‘ IDENTIFIED BY ‘wppasswd‘;
GRADN ALL ON wpdb.* TO ‘‘wpuser‘@‘192.168.%.%‘ IDENTIFIED BY ‘wppasswd‘;
CREATE DATABASE wpdb;
FLUSH PRIVILEGES
EXIT
2.5、安装nginx服务器(两台RS服务器上安装)
挂在后端服务器共享的目录(两台RS都要挂载)
mkdir -pv /www/wordpress
mount -t nfs 210.72.145.44:/data/wordpress /www/wordpress
编译安装nginx一定要启用fastcgi能于远端的PHP配合
并修改主配置文件
用户为nginx 组为nginx
并启用php, 配置监听的服务地址为php服务器的地址
location / {
root /www;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /www;
fastcgi_pass 192.168.10.136:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
修改两台服务器的内核参数来配置LVS-dr模型
推荐使用脚本修改
DR类型RS脚本示例:
#!/bin/bash
#
vip=192.168.10.100
interface="lo:0"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $interface $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev $interface
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $interface down
;;
status)
if ifconfig lo:0 |grep $vip &> /dev/null; then
echo "ipvs is running."
else
echo "ipvs is stopped."
fi
;;
*)
echo "Usage: `basename $0` {start|stop|status}"
exit 1
esac
需要时启用脚本不需要时,恢复内核参数
2.6、安装sorry server和 keepalive LVS-DR(在两台调度器上安装,一台为主一台为从)
两台DR提供SORRY server
直接安装HTTPD服务即可,提供一个SORRY SERVER页面
echo "this is for sorry server" > /var/www/html/index.html
安装keepalive (两台前端调度服务都需要安装)
yum install keepalive
配置示例:
(rs1.magedu.com和rs2.magedu.com的配置基本相同相同
配置一台另一台直接拷贝配置,以减少出错
但要注意一台实例配置为主,另一台配置为从
)
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_mcast_group 224.0.1.100
}
vrrp_script chk_mt {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 84ae57f7f4f6
}
virtual_ipaddress {
192.168.80.100/16 dev eth0 label eth0:1
}
track_script {
chk_mt
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.10.133 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.135 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
启动服务
service keepalived start
提供keepalive服务转换的脚本
通知脚本:(编写的脚本保存到/etc/keepalived/notify.sh)
#!/bin/bash
vip=192.168.10.100
contact=‘root@localhost‘
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date ‘+%F %H:%M:%S‘`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo ‘Usage: `basename $0` {master|backup|fault}‘
exit 1
;;
esac
chmod +x /etc/keepalived/notify.sh原文:http://5276007.blog.51cto.com/5266007/1885804