php添加模块,tomcat 负载均衡 session共享 varnish HA

来源:互联网 发布:淘宝开店规则大全 编辑:程序博客网 时间:2024/06/07 02:41

phpize              ##预编译


##########php
添加模块##########
tar zxf memcache-2.2.5.tgz              ##
先下载模块  然后解压
cd memcache-2.2.5          
cd /usr/local/lnmp/php/bin
vim ~/.bash_profile                 ##
添加一个变量路径
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin

export PATH

which phpize                   
source ~/.bash_profile                  ##
加载路径
which phpize
cd memcache-2.2.5
phpize                      ##
预编译
./configure                     ##
make                        ##
编译
make install                    ##
安装
cd /usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20131226/
ls
php -m                      ##
查看php的模块
 php -m | grep memcache
/etc/init.d/php-fpm status          ##
打开php-fpm
/etc/init.d/php-fpm start

cd /usr/local/lnmp/php/etc
vim php.ini                     ##
添加模块
     850 extension=memcache.so

/etc/init.d/php-fpm reload
php -m | grep memcache          ##
查看添加模块模块添加成功
cd memcache-2.2.5
cp example.php memcache.php /usr/local/lnmp/nginx/html/
netstat -autlp | grep 11211
yum install memcached -y        ##
因为memcacahe要连接11211端口 所以安装memcached它监听的就是11211端口
vim example.php

cd /usr/local/lnmp/nginx/html/
vim memcache.php
  22define('ADMIN_USERNAME','memcache');   // Admin Username
  23define('ADMIN_PASSWORD','yiyibushe');  // Admin Password
  24 define('DATE_FORMAT','Y/m/dH:i:s');
  25 define('GRAPH_SIZE',200);
  26 define('MAX_ITEM_DUMP',50);
  27
  28 $MEMCACHE_SERVERS[] ='localhost:11211'; // add more as an array

vim /etc/sysconfig/memcached
/etc/init.d/memcached start
nginx





##############jdk   tomcat#############

tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
cd /usr/local/
ln -s jdk1.7.0_79/ java
vim /etc/profile
 
  80 exportJAVA_HOME=/usr/local/java
  81 exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
  82 export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
echo $JAVA_HOME
echo $CLASSPATH
echo $PATH
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
cd /usr/local/
ln -s apache-tomcat-7.0.37/ tomcat
cd tomcat/
bin/startup.sh                  ##
开启tomcat
netstat -antlp | grep :8080
cd webapps/ROOT/                ##tomcat
的发布文件
cd /usr/local/lnmp/nginx/conf/
vim nginx.conf
  68          location ~ \.jsp$ {       ##
代理所有的.jsp文件 8080端口的
  69                 proxy_passhttp://172.25.14.1:8080;

nginx -t
nginx  -s reload



重新开启一台虚拟机  安装jdktomcat 然后启动tomcat让跑8080端口

把压缩包传过来 然后按上面步骤解压就行



作业   nginx怎么家memcache模块






############
基于cookiesnginx负载均衡算法  url_hash#########




tar zxf nginx-1.10.1.tar.gz         ##
安装版本10nginx

cd nginx-1.10.1

cd auto/cc/gcc
vim auto/cc/gcc             ##
注释掉debug
tar nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz zxf
tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz   ##
解压模块
cd nginx-1.10.1
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module--with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d                   ##
重新添加一个模块
make
make install
cd /usr/local/lnmp/nginx/
cd conf/

vim nginx.conf                          ##
修改的时候先把nginx stop
                               
然后修改完了在打开

   17 http {  upstream westos{
 18                 sticky;
 19                 server 172.25.14.1:8080;
 20                 server 172.25.14.2:8080;
 21 }
 68          location ~ \.jsp$ {
 69                 proxy_passhttp://westos;
 70         }





############tmocat 
解决单点故障   交叉存储#############

<T1><T2>
. \ /.
.  X .
. / \.
<M1><M2>


Tomcat-1 (T1)
session 存储在memcached-2 (T2)上。只有当 M2不可用时,T1才将 session
储在 memcached-1 (M1 T1 failoverNode)。使用这种配置的好处是, T1 M1 同时崩
溃时也不会丢失 session 会话,避免单点故障。




把如下软件包放置到/usr/local/tomcat/lib 目录中
kryo-1.03.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-1.5.1.jarmemcached-session-manager-tc7-1.5.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.5.1.jar
reflectasm-0.9.jar
vi /usr/local/tomcat/conf/context.xml
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.91:11211,n2:192.168.0.92:11211"
failoverNodes="n1"
#
node2 上此项设置为“n2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>





以下为测试页面,保存到/usr/local/tomcat/webapps/ROOT/test.jsp<%@page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster AppTest</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " +request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " +session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
访问 172.25.14.1/test.jsp,不同的主机访问时会调度到不同的 tomcat实例上处理
来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down掉当前正在响应的 tomcat
,nginx 会自动把用户的请求调度到另一个 tomcat实例上,同时 session 也没有丢掉。





############varnish##############

处理过程大致分为如下几个步骤:
(1)Receive
状态,也就是请求处理的入口状态,根据 VCL规则判断该请求应该是 Pass
Pipe,
或者进入 Lookup(本地查询)
(2)Lookup
状态,进入此状态后,会在 hash表中查找数据,若找到,则进入 Hit状态,否则进
miss 状态。
(3)Pass
状态,在此状态下,会进入后端请求,即进入 fetch状态。
(4)Fetch
状态, Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver
状态, 将获取到的数据发送给客户端,然后完成本次请求



2.
配置
# vi /etc/varnish/default.vcl
###
配置一个后端服务器
backend web1 {
.host = "192.168.0.188";
.port = "80";
}
###
配置 varnish 服务端口
# vi /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
# service varnish start
###
查看缓存命中情况
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}



/etc/init.d/varnish start       ##
开启varnish


[root@foundation14 mnt]# curl -I 172.25.14.3
HTTP/1.1 200 OK
Server: nginx/1.10.1
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/5.6.20
Content-Length: 85023
Accept-Ranges: bytes
Date: Sat, 20 May 2017 08:27:25 GMT
X-Varnish: 1251144347
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache

[root@foundation14 mnt]# curl -I 172.25.14.3
HTTP/1.1 200 OK
Server: nginx/1.10.1
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/5.6.20
Content-Length: 85023
Accept-Ranges: bytes
Date: Sat, 20 May 2017 08:27:26 GMT
X-Varnish: 1251144348 1251144347
Age: 2
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache



###
通过 varnishadm 手动清除缓存
# varnishadm ban.url .*$
#
清除所有
# varnishadm ban.url /index.html
#
清除 index.html 页面缓存
# varnishadm ban.url /admin/$
#
清除 admin 目录缓存










###########
不用域名站点的后端服务器##############



###
定义多个不同域名站点的后端服务器
backend web1 {
.host = "172.25.14.1";
.port = "80";
}
backend web2 {
.host = "172.25.14.2";
.port = "80";
}
#
当访问 www.westos.org 域名时从 web1上取数据,访问 bbs.westos.org 域名时到 web2 取数据,
访问其他页面报错。
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}


################vanish
的负载均衡###################
真机里面
vim /etc/hosts


172.25.14.3  server3.example.comwww.westos.org westos.org bbs.westos.org


vm1
里面开启nginx 80 端口

vm2
里面做虚拟主机
1011 <VirtualHost *:80>
1012     DocumentRoot /var/www/html
1013     ServerNameserver2.example.com
1014 </VirtualHost>
1015
1016 <VirtualHost *:80>
1017     DocumentRoot /www1
1018     ServerName www.westos.org
1019 </VirtualHost>
1020 <VirtualHost *:80>
1021     DocumentRoot /www2
1022     ServerName bbs.westos.org
1023 </VirtualHost>


vim /etc/hosts

172.25.14.2 server2 www.westos.org bbs.westos.org server2.example.org       ##
本地解析


开启httpd80端口

curl www.westos.org         ##
测试虚拟主机
curl bbs.westos.org        


vm3
里面  修改httpd的端口为8080 


然后修改vanish的配置文件
director lb round-robin {               ##
轮询
{
.backend = web1;
{
}
.backend = web2;
#
把多个后端聚合为一个组,并检测后端健康状况
}
}sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
return (pass);
#
为了测试方便,不进行缓存。
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}


重启httpd varnish服务


在浏览器里面测试www.westos.org



###########
varnish里面的ttl'值设置为过期##############

###varnish cdn
推送平台
http://code.google.com/p/varnish-php-bansys/
#
需要安装 php 支持
# unzip bansys.zip -d /var/www/html
# vi /var/www/html/bansys/config.php
#
只保留如下设置,其余注释掉
<?php
$var_group1 = array(
'host' => array('172.25.14.3'),
'port' => '80',
);
//varnish
群组定义
//
对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish
版本//2.x 3.x 推送命令不一样
$VAR_VERSION = "3";
?>
#bansys
有两种工作模式,分别是:telnet http 模式。
#telnet
模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish文件中的 “ -S $
{VARNISH_SECRET_FILE}”
这行,重启varnish服务即可。
#
如果是 http 模式需要对 varnish 做以下设置:
# vi /etc/varnish/default.vcl
acl westos {
#
设置访问控制
"127.0.0.1";
"172.25.14.0"/24;
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}


还需要把负载均衡里面的 return(pass);注释掉

然后重新启动vanish服务 

在浏览器里里面输入172.25.14.38080  进行测试

http

.*  
代表清楚全部的缓冲
/index.html     ##html
文件将ttl值设置为过期













#####################
高可用集群###############


重新创建两个虚拟机

然后修改主机名  ip  本地解析  还有两台虚拟机的时间要同步   关闭selinux  iptables

修改yum  http://172.25.14.250/rhel6.5            ##这样只会读到镜像下面的Server 所以我们要对yum源进行修改


两台虚拟机一致
server]
name=Red Hat Enterprise Linux
baseurl=http://172.25.14.250/rhel6.5/Server
enabled=1
gpgcheck=1


[HighAvailability]
name=HighAvailability
baseurl=http://172.25.14.250/rhel6.5/HighAvailability
gpgcheck=0


[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.14.250/rhel6.5/LoadBalancer
gpgcheck=0


[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.14.250/rhel6.5/ResilientStorage
gpgcheck=0

[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.14.250/rhel6.5/ScalableFileSystem
gpgcheck=0


server1 yum install ricci luci -y
server2 yum install ricci

server1server2进行passwd ricci       ricci用户进行修改密码

两台机器启动ricci  然后设置开机自启  chkconfig ricci on

server1 上打开luci  /etc/init.d/luci start


然后在浏览器里面进行https://172.25.14.1:8084

先输入你luci服务器的root用户和密码进行登陆

进去之后然后创建

创建用主机名server1 server2 密码用ricci用户的密码进行创建


完了之后点Download 那个  还有下面两个选项打勾

然后两台ricci主机会安装高可用套件


安装完成后在server1中启动luci




###############fence
栅栏##############

fence
的作用是当vm2 昏迷的时候,又可能会有醒来的时候 这个时候他的内存里面还存有数据 这样如果写入数据的话  会造成存储脑裂   所以我们应该直接让vm2跳电重启 luci服务机会联合vm1 直接把vm2跳电重启



在真机里面 
yum install fence-virtd.x86_64 fence-virtd-libvirt.x86_64fence-virtd-multicast.x86_64 -y 

然后fence_virtd -c

一直空格 遇到virt0的时候写br0


然后最后按y
因为没有这个目录所有我们需要先创建这个目录
mkdir /etc/cluster/

dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1     ##
写入128位随机数字

scp fence_xvm.key root@172.25.14.1:/etc/cluster/            ##
key传到两个ricci服务机上面
scp fence_xvm.key root@172.25.14.2:/etc/cluster/


然后 systemctl start fence_virtd.service                ##启动fence_virtd服务


浏览器里面操作  先点Fence Devices

add
选择Fence virt(mul....)

然后submit 输入一个名字vmfence(随便)


Nodes里面将虚拟机的idfence绑定       server1server2一样

add fence method   
输入一个名字fence1(随便)
add fence instance 
然后输入id




测试:因为server1luci服务机 所以我们不能把server1down 

server1上面 fence_node server2       ##server2立马跳电重启