apache80端号跳转443端口

apache80端号跳转443端口调取的虚拟主机的配置文件

 

调取虚拟主机内容,80端口的顶级域名,跳转至www的443端口

<VirtualHost ip:80>      80重写443端口

ServerAdmin aaa.com       需要跳转的域名

DocumentRoot “/home/wwwroot/baoxian_program”    访问网页路径

ServerName aaa.com               网页域名

RewriteEngine On                         url重写向开启

RewriteCond %{SERVER_PORT} !^443$        指定跳转至443端口

RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R,L]      跳转至https://www.域名.com/url

<Directory “/home/wwwroot/baoxian_program”>       所需访问页面存放路径

Options none

AllowOverride none

Order allow,deny

Allow from all

Require all granted

 

</Directory>

</VirtualHost>

 

 

<VirtualHost ip:443>            443端口配置

SSLEngine On                         ssl开启

SSLCertificateKeyFile /home/ssl/www.aaa.com.key    私钥文件

SSLCertificateChainFile /home/ssl/www.aaa.com_ca.crt   安全证书

SSLCertificateFile /home/ssl/www.aaa.com.cer      安全证书

DocumentRoot “/home/wwwroot/baoxian_program”     网页存放路径

ServerName www.aaa.com                 访问域名

ServerAlias www.aaa.com                    域名别名

#RewriteEngine On

#RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]

<Directory “/home/wwwroot/baoxian_program”>

Options FollowSymLinks ExecCGI     选项

AllowOverride All                  指令 所有

Order allow,deny                  订单允许,拒绝

Allow from all                       允许所有

Require all granted                   需要开启

</Directory>

</VirtualHost>

nginx,apache开启文件目录浏览功能

我们都知道在apache下可以配置访问web服务器的某个路径时,自动显示其目录下面的文件列表的,其实Nginx一点也不比apache弱,它当然也可以实现这个功能,而且还非常容易和简单;主要用到autoindex 这个参数来开启,其配置如下:

复制代码代码如下:
location / {
root /data/www/file                     //指定实际目录绝对路径;
autoindex on;                            //开启目录浏览功能;
autoindex_exact_size off;            //关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_localtime on;              //开启以服务器本地时区显示文件修改日期!
}

如上配置后,用IE访问该服务器的根目录,就会显示出 /data/www/file目录下的所有文件列表,Nginx目录浏览效果图:

为了备忘,最后将apache下的配置方法也记录一下!实现效果和上面一样!

复制代码代码如下:
Alias / ”/data/www/file”
< Directory  ”/data/www/file” >
Options Indexes                                               //开启目录列表索引模式
Order allow,deny
IndexOptions  NameWidth = 25   Charset = UTF -8     //设定文件名显示长度,文字字符编码
Allow from all
</ Directory >

apache开启目录浏览功能

主配置文件 httpd.conf 中修改:
1)添加支持模块。

LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so

注意一定要拥有这两个模块,否则下面的配置不生效,返回404 Not Found错误。
这个模块也有可能直接编译到Apache核心文件httpd中去了。

2)为DocumentRoot目录添加Options Indexes,即可生成目录。

<Directory "/htdocs">
Options Indexes FollowSymLinks
</Directory>

这里Indexes控制是否打开目录浏览,如果要关闭目录浏览,使用

Option -Indexes

3)加载 httpd-autoindex.conf 配置

Include conf/extra/httpd-autoindex.conf

故障案例:主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server

场景一:因为数据量非常,大概有1.4T,需要在原先master1-slave1的情况下再创建一个库slave2,并且挂在slave1下,即master1-slave1-slave2的结构。为了方便,当时停掉从库salve1,show master status记录状态,开启log_slave_updates,并且关闭salve1,然后将这个从库的data文件夹直接copy到新的从库,结果在创建slave2和slave1的主从关系时报错

Fatal error: The slave I/O thread stops because master and slave have equal mysql server UUIDs; these UUIDs must be different for replication to work.

原因分析:

mysql5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy  data文件夹后server_uuid是相同的,show variables like ‘%server_uuid%’;

解决方法:

找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可

场景二:创建主从关系时copy了同样的my.cnf文件,报错

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;

原因分析:

和server_uuid类似,servier_id也得保证不一样

解决方法:

找到my.cnf配置文件中的server_id,修改从库的server_id保证和复制结构中的其他db不一样,重启db即可

Linux netstat命令详解

Linux netstat命令详解

一  简介

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

输出信息含义

执行netstat后,其输出结果为

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHED

tcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHED

tcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED

tcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED

tcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSE

Active UNIX domain sockets (w/o servers)

Proto RefCnt Flags Type State I-Node Path

unix 1 [ ] STREAM CONNECTED 16178 @000000dd

unix 1 [ ] STREAM CONNECTED 16176 @000000dc

unix 9 [ ] DGRAM 5292 /dev/log

unix 1 [ ] STREAM CONNECTED 16182 @000000df

从整体上看,netstat的输出结果可以分为两个部分:

1)         一个是Active Internet connections,称为有源TCP连接,其中”Recv-Q”和”Send-Q”指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

2)         另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。

Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

二  常见参数

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项

-u (udp)仅显示udp相关选项

-n 拒绝显示别名,能显示数字的全部转化成数字。

-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名

-r 显示路由信息,路由表

-e 显示扩展信息,例如uid等

-s 按各个协议进行统计

-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

三  实用命令实例

3.1列出所有端口 (包括监听和未监听的)

3.1.1    列出所有端口 netstat -a

# netstat -a | more

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 localhost:30037         *:*                     LISTEN

udp        0      0 *:bootpc                *:*

Active UNIX domain sockets (servers and established)

Proto RefCnt Flags       Type       State         I-Node   Path

unix  2      [ ACC ]     STREAM     LISTENING     6135     /tmp/.X11-unix/X0

unix  2      [ ACC ]     STREAM     LISTENING     5140     /var/run/acpid.socket

3.1.2    列出所有 tcp 端口 netstat -at

# netstat -at

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 localhost:30037         *:*                     LISTEN

tcp        0      0 localhost:ipp           *:*                     LISTEN

tcp        0      0 *:smtp                  *:*                     LISTEN

tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

3.1.3    列出所有 udp 端口 netstat -au

# netstat -au

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

udp        0      0 *:bootpc                *:*

udp        0      0 *:49119                 *:*

udp        0      0 *:mdns                  *:*

3.2列出所有处于监听状态的 Sockets

3.2.1    只显示监听端口 netstat -l

# netstat -l

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 localhost:ipp           *:*                     LISTEN

tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

udp        0      0 *:49119                 *:*

3.2.2    只列出所有监听 tcp 端口 netstat -lt

# netstat -lt

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 localhost:30037         *:*                     LISTEN

tcp        0      0 *:smtp                  *:*                     LISTEN

tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

3.2.3    只列出所有监听 udp 端口 netstat -lu

# netstat -lu

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

udp        0      0 *:49119                 *:*

udp        0      0 *:mdns                  *:*

3.2.4    只列出所有监听 UNIX 端口 netstat -lx

# netstat -lx

Active UNIX domain sockets (only servers)

Proto RefCnt Flags       Type       State         I-Node   Path

unix  2      [ ACC ]     STREAM     LISTENING     6294     private/maildrop

unix  2      [ ACC ]     STREAM     LISTENING     6203     public/cleanup

unix  2      [ ACC ]     STREAM     LISTENING     6302     private/ifmail

unix  2      [ ACC ]     STREAM     LISTENING     6306     private/bsmt

3.3显示每个协议的统计信息

3.3.1    显示所有端口的统计信息 netstat -s

# netstat -s

Ip:

11150 total packets received

1 with invalid addresses

0 forwarded

0 incoming packets discarded

11149 incoming packets delivered

11635 requests sent out

Icmp:

0 ICMP messages received

0 input ICMP message failed.

Tcp:

582 active connections openings

2 failed connection attempts

25 connection resets received

Udp:

1183 packets received

4 packets to unknown port received.

…..

3.3.2    显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su

# netstat -st

# netstat -su

3.4在 netstat 输出中显示 PID 和进程名称 netstat -p

netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。

# netstat -pt

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        1      0 ramesh-laptop.loc:47212 192.168.185.75:www        CLOSE_WAIT  2109/firefox

tcp        0      0 ramesh-laptop.loc:52750 lax:www ESTABLISHED 2109/firefox

3.5在 netstat 输出中不显示主机,端口和用户名 (host, port or user)

当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。

同样可以加速输出,因为不用进行比对查询。

# netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令

# netsat -a –numeric-ports

# netsat -a –numeric-hosts

# netsat -a –numeric-users

3.6持续输出 netstat 信息

netstat 将每隔一秒输出网络信息。

# netstat -c

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 ramesh-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED

tcp        1      1 ramesh-laptop.loc:52564 101.11.169.230:www      CLOSING

tcp        0      0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED

tcp        1      1 ramesh-laptop.loc:42367 101.101.34.101:www      CLOSING

^C

3.7显示系统不支持的地址族 (Address Families)

netstat –verbose

在输出的末尾,会有如下的信息

netstat: no support for `AF IPX’ on this system.

netstat: no support for `AF AX25′ on this system.

netstat: no support for `AF X25′ on this system.

netstat: no support for `AF NETROM’ on this system.

3.8显示核心路由信息 netstat -r

# netstat -r

Kernel IP routing table

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

192.168.1.0     *               255.255.255.0   U         0 0          0 eth2

link-local      *               255.255.0.0     U         0 0          0 eth2

default         192.168.1.1     0.0.0.0         UG        0 0          0 eth2

注意: 使用 netstat -rn 显示数字格式,不查询主机名称。

3.9找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

# netstat -ap | grep ssh

tcp        1      0 dev-db:ssh           101.174.100.22:39213        CLOSE_WAIT  –

tcp        1      0 dev-db:ssh           101.174.100.22:57643        CLOSE_WAIT  –

找出运行在指定端口的进程

# netstat -an | grep ‘:80’

3.10         显示网络接口列表

# netstat -i

Kernel Interface table

Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg

eth0       1500 0         0      0      0 0             0      0      0      0 BMU

eth2       1500 0     26196      0      0 0         26883      6      0      0 BMRU

lo        16436 0         4      0      0 0             4      0      0      0 LRU

显示详细信息,像是 ifconfig 使用 netstat -ie:

# netstat -ie

Kernel Interface table

eth0      Link encap:Ethernet  HWaddr 00:10:40:11:11:11

UP BROADCAST MULTICAST  MTU:1500  Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Memory:f6ae0000-f6b00000

3.11         IP和TCP分析

3.11.1          查看连接某服务端口最多的的IP地址

wss8848@ubuntu:~$ netstat -nat | grep “192.168.1.15:22” |awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -20

18 221.136.168.36

3 154.74.45.242

2 78.173.31.236

2 62.183.207.98

2 192.168.1.14

2 182.48.111.215

2 124.193.219.34

2 119.145.41.2

2 114.255.41.30

1 75.102.11.99

3.11.2           TCP各种状态列表

wss8848@ubuntu:~$ netstat -nat |awk ‘{print $6}’

established)

Foreign

LISTEN

TIME_WAIT

ESTABLISHED

TIME_WAIT

SYN_SENT

先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。

wss8848@ubuntu:~$ netstat -nat |awk ‘{print $6}’|sort|uniq -c

143 ESTABLISHED

1 FIN_WAIT1

1 Foreign

1 LAST_ACK

36 LISTEN

6 SYN_SENT

113 TIME_WAIT

1 established)

linux防CC脚本,3分钟实现轻松防CC攻击

只需把以下代码保存为limit.sh,并且运行就可以实现轻松防CC攻击。原理是直接读取日志,只要访问量过高,就会自动把IP添加至linux自带防火墙iptables当中。

以下代码当中,请注意修改路径,否则不会生效哟。

#!/bin/sh
cd /var/log/httpd/
cat access_log|awk '{print $1}'|sort|uniq -c|sort -n -r|head -n 20 > a
cp /dev/null access_log
cp /dev/null error_log
cp /dev/null limit.sh
cp /dev/null c
#awk '{print $2}' a|awk -F. '{print $1"."$2"."$3}'|sort|uniq > b
cat a|while read num ip
do
if [ "$num" -gt "20" ]
then
echo $ip >> c
fi
done
cat c|awk -F. '{print $1"."$2"."$3}'|sort|uniq > b
#cat c|sort|uniq > b
for i in `cat b`
#cat b|sed 's/\./ /g'|while read i1 i2 i3 i4
do
if `cat ourip |grep $i > /dev/null 2>&1`
then
echo "`date` $i" >> test
else
echo "iptables -I INPUT -p tcp -dport 80 -s $i.0/24 -j DROP" >> limit.sh
fi
done

iptables防DDOS攻击和CC攻击设置

防范DDOS攻击脚本

#防止SYN攻击 轻量级预防
iptables -N syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT

#防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
iptables -A INPUT -i eth0 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP
iptables -A INPUT -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT

#用Iptables抵御DDOS (参数与上相同)
iptables -A INPUT  -p tcp –syn -m limit –limit 12/s –limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT

##########################################################

防范CC攻击

当apache站点受到严重的cc攻击,我们可以用iptables来防止web服务器被CC攻击,实现自动屏蔽IP的功能。

1.系统要求

(1)LINUX 内核版本:2.6.9-42ELsmp或2.6.9-55ELsmp(其它内核版本需要重新编译内核,比较麻烦,但是也是可以实现的)。

(2)iptables版本:1.3.7

2. 安装

安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit

3. 配置相应的iptables规则

示例如下:

(1)控制单个IP的最大并发连接数

iptables -I INPUT -p tcp –dport 80 -m connlimit  –connlimit-above 50 -j REJECT #允许单个IP的最大连接数为 30
#默认iptables模块不包含connlimit,需要自己单独编译加载,请参考该地址
http://sookk8.blog.51cto.com/455855/280372不编译内核加载connlimit模块


(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数

iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –update –seconds 60 –hitcount 30 -j REJECT iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –set -j ACCEPT
#单个IP在60秒内只允许最多新建30个连接

4. 验证

(1)工具:flood_connect.c(用来模拟攻击)

(2)查看效果:

使用
watch ‘netstat -an | grep:21 | grep<模拟攻击客户机的IP>| wc -l’


实时查看模拟攻击客户机建立起来的连接数,

使用
watch ‘iptables -L -n -v | \grep<模拟攻击客户机的IP>’


查看模拟攻击客户机被 DROP 的数据包数。

5.注意

为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:

#cat/etc/modprobe.conf options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
#记录1000个IP地址,每个地址记录60个数据包 #modprobe ipt_recent

18个常用的网站性能测试工具

网站的加载速度是决定网站等级的重要因素,值得站长特别关注。原因很简单,没有人愿意为了打开一个网页而等老半天,换句话说,如果你的网站打开速度很慢,将流失大量的访客,甚至出现多米诺效应的不良影响。在埋头深入代码中试图提高网站速度之前,先要确定导致网站访问速度缓慢的真正原因是什么。本文收集了非常有用的WEB服务和工具,可以帮助你诊断和分析你的网站,让你更加全面的了解自己的网站性能。

在线测试工具

Pingdom

测试网站所有对象的加载时间(HTML,images,JavaScript,CSS,嵌入式框架等)。您还可以检查网站每个元素的加载速度并改善加载缓慢的项目。在测试结果中,可以看到网站每个元素的加载时间报告,元素的大小和元素的总数量。

GTmetrix

结合了最流行的Firefox性能组件YSlow的和谷歌网页速度测试工具。Gtmetrix给你提供改进网站速度的建议,虽然YSlow的和谷歌网页的速度测试的建议是针对Firefox的,也可以适用于其他浏览器。

Light Speed Now

测试你的网站的速度性能,并把测试报告发送给到你的邮箱。

Load Impact

Loadimpact对于一个每天有成千上万的游客访问的大型网站来说是个非常重要的工具。一个免费帐户允许你模拟50个用户访问的压力测试,还要更多的话你就必须升级高级账号。

Site-Perf

Gomez Networks

实时的测试单个网页的性能。

OctaGate

允许你监视用户打开你网站中一个或多个网页的时间。

Webslug

可以让你把你的网站和竞争对手的网站的加载速度进行比较。

WebToolHub

让你以了解您的网页在不同的访问速度下是如何加载的。用Webtoolhub你可以知道页面的大小的信息,以及在不同的连接速度下,网页中CSS,Javascript和图片的加载时间,这些都是进行基本的网页速度测试所需要的。

IWebTool

可以让你同一时间对比10个页面。您还可以检查主页,目录页面的载入时间。

Searchmetrics

显示了指定网站的加载持续时间。此值可用于显示网站加载了多久,是否需要换个ISP。

BrowserMob

不需要写测试脚本就可以知道网站即时的性能数据。

常用测试软件

Pylot

开源的测试工具,可以测试网站的性能和可扩展性。它运行HTTP负载测试,这是有用的容量规划,基准,分析和系统调整。

Google Page Speed

谷歌网页速度测试是一个开源的Firefox / Firebug插件。网站管理员和Web开发人员可以使用该工具来评估其网页的性能并获取有关如何改进它们的建议。

YSlow

YSlow用来分析网页性能,并在高性能网页规则基础上建议如何改善。

PageTest

Internet Explorer的插件,常用来显示浏览器加载内容时发出的请求并提供了该进页面性能的建议。

Multi-Mechanize 

是一个网站性能和负载测试的开源框架。它允许你编写Python脚本来生成对一个网站或Web服务的负载。

编译来源:推荐18个网站速度及性能检查工具

原文来自:Website Speed and Performance Checking Tools

它模拟浏览器下载图片,CSS,JS和其他文件,在报告中你可以看到先加载网站的哪些页以及加载时间。这是十分有用的性能报告,可以用来查找到提高你的网站的载入速度需要改善的元素。

WebWait

一些基准测试,测试你网站的连接速度。

网站压力测试工具webbench

网站压力测试工具有很多种,LinuxVPS学习者里之前也写了两个功能比较强大的网站压力测试工具《利用Apache Bench测试Web引擎性能》和《利用http_load测试Web引擎性能》,但它们的功能较多,操作起来较为繁琐。webbench操作非常简单,最多可以模拟3万个并发连接去测试网站的负载,效果也比较直观好用。

一、获得webbench

1、下载

  1. wget http://www.centoscn.com/tool/webbench-1.5.tar.gz

2、解压并编译

  • yum install y gcc ctags      #先安装编译需要的组件 
  • tar zxvf webbench1.5.tar.gz  #解压Webbench 
  • cd webbench1.5               #进入webbench目录 
  • make && make install          #编译安装

二、使用方法

  1.  
  2. webbench c 100 t 30 http://www.kwx.gd/

SSH按格式执行以上命令。

-c:线程数(最大30000线程)

-t:持续时间(秒)

三、结果查看

  1. [root@kwx.gd webbench1.5]# webbench c 100 t 30 http://www.kwx.gd/ #向www.kwx.gd发起100线程请求,持续时间30秒。 
  2. Webbench Simple Web Benchmark 1.5 
  3. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  4.  
  5. Benchmarking: GET http://www.kwx.gd/ 
  6. 100 clients, running 30 sec.  #100次连接,运行30秒 
  7.  
  8. Speed=604 pages/min, 194290 bytes/sec. #速度,604页/每分钟,194290字节/秒 
  9. Requests: 276 susceed, 26 failed.      #返回数,276次正常返回,26次失败返

memcached 双机热备

一、需求背景

发现公司好多项目都用到memched。并且都是单点,memched服务器 挂了就会影响业务,于是百度之,发现memched不可以集群,也没有看到有什么高可用方案,但是发现了repcached(memched主从复制),结合LVS的NAT模式不同端口转发实现memched双机HA,本文章记录本人的部署过程,从属实战,没有文字性的说明,欢迎各位指点。

二、环境:

1、系统环境:

  • CentOS release 6.4 (Final)

2、网络环境

  • 调度机(master):
  • vip:172.28.26.100
  • vip1:172.28.16.100(lvs转发网关   )
  • eth1:172.28.26.101 (内网)
  • eth2:172.28.16.101(lvs转发网段)
  • 调度机(backup):
  • eth1:172.28.26.99 (内网)
  • eth2:172.28.16.99(lvs转发网段)
  • memched备节点:
  • eth1:172.28.26.102 (内网)
  • eth2:172.28.16.102(lvs转发网段)
  • memched主节点:
  • eth1:172.28.26.103 (内网)
  • eth2:172.28.16.103(lvs转发网段)

3、路由策略

  • 调度机(master):
  • echo ‘201      eth1’>> /etc/iproute2/rt_tables
  • echo ‘default table eth1 via 172.28.26.1 dev eth1’> /etc/sysconfig/network-scripts/route-eth1
  • echo ‘from 172.28.26.101/255.255.255.255 table eth1’> /etc/sysconfig/network-scripts/rule-eth1
  • echo ‘from 172.28.26.100/255.255.255.255 table eth1’>> /etc/sysconfig/network-scripts/rule-eth1
  • echo ‘from 172.28.16.101/32 table ZW_LVS_LAN’> /etc/sysconfig/network-scripts/rule-eth2
  • memched节点1:
  • echo ‘default table ZW_LVS_LAN via 172.28.16.100’> /etc/sysconfig/network-scripts/route-eth2
  • echo ‘from 172.28.16.0/24 table ZW_LVS_LAN’> /etc/sysconfig/network-scripts/rule-eth2
  • echo ‘202       ZW_LVS_LAN’>> /etc/iproute2/rt_tables
  • memched节点2:
  • echo ‘default table ZW_LVS_LAN via 172.28.16.100’> /etc/sysconfig/network-scripts/route-eth2
  • echo ‘from 172.28.16.0/24 table ZW_LVS_LAN’> /etc/sysconfig/network-scripts/rule-eth2
  • echo ‘202       ZW_LVS_LAN’>> /etc/iproute2/rt_tables

4、内核参数

  • fs.file-max= 1000000
  • kernel.core_uses_pid = 1
  • kernel.msgmax = 1048560
  • kernel.msgmnb = 1073741824
  • kernel.shmall = 4294967296
  • kernel.shmmax = 68719476736
  • kernel.sysrq = 0
  • net.core.netdev_max_backlog = 1048576
  • net.core.rmem_default = 2097152
  • net.core.rmem_max = 16777216
  • net.core.somaxconn = 1048576
  • net.core.wmem_default = 2097152
  • net.core.wmem_max = 16777216
  • net.ipv4.conf.default.accept_source_route = 0
  • net.ipv4.conf.default.rp_filter = 1
  • net.ipv4.ip_forward = 1
  • net.ipv4.ip_local_port_range = 1024    65000
  • net.ipv4.neigh.default.gc_thresh1 = 10240
  • net.ipv4.neigh.default.gc_thresh2 = 40960
  • net.ipv4.neigh.default.gc_thresh3 = 81920
  • net.ipv4.tcp_fin_timeout = 1
  • net.ipv4.tcp_keepalive_intvl = 15
  • net.ipv4.tcp_keepalive_probes = 5
  • net.ipv4.tcp_keepalive_time = 30
  • net.ipv4.tcp_max_orphans = 3276800
  • net.ipv4.tcp_max_syn_backlog = 1048576
  • net.ipv4.tcp_max_tw_buckets = 50000
  • net.ipv4.tcp_mem = 94500000 915000000 927000000
  • net.ipv4.tcp_orphan_retries = 3
  • net.ipv4.tcp_reordering = 5
  • net.ipv4.tcp_retrans_collapse = 0
  • net.ipv4.tcp_retries2 = 5
  • net.ipv4.tcp_rmem = 4096        87380   4194304
  • net.ipv4.tcp_sack = 1
  • net.ipv4.tcp_synack_retries = 1
  • net.ipv4.tcp_syncookies = 0
  • net.ipv4.tcp_syn_retries = 1
  • net.ipv4.tcp_timestamps = 1
  • net.ipv4.tcp_tw_recycle = 1
  • net.ipv4.tcp_tw_reuse = 1
  • net.ipv4.tcp_window_scaling = 1
  • net.ipv4.tcp_wmem = 4096        16384   4194304
  • net.ipv6.conf.all.disable_ipv6 = 1
  • net.ipv6.conf.default.disable_ipv6 = 1
  • net.ipv4.conf.eth0.rp_filter = 1 #memched节点不需要
  • net.ipv4.conf.eth1.rp_filter = 1 #memched节点不需要
  • net.ipv4.conf.eth2.rp_filter = 1 #memched节点不需要
  • net.ipv4.conf.all.rp_filter = 0    #memched节点不需要

三、服务安装

1、调度机(master、backup)

  • yum -y install ipvsadm keepalived sendmail

2、memched节点1、memched节点2

  • tar -zxvf libevent-1.4.13-stable.tar.gz
  • cd libevent-1.4.13-stable
  • ./configure –prefix=/usr/local
  • make
  • make install
  • tar -zxvf memcached-1.4.15.tar.gz
  • cd memcached-1.4.15
  • ./configure –with-libevent=/usr/local
  • make
  • make install
  • tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz
  • cd memcached-1.2.8-repcached-2.2
  • ./configure  –enable-replication
  • make
  • make install

四、keepalived配置(master、backup)

[root@LVS1 keepalived]# cat /etc/keepalived/gobal_module

  • ! globalconfigure file
  • global_defs {
  • notification_email {
  • navyaijm@qq.com
  • }
  • notification_email_from navyaijm@qq.com
  • smtp_server 127.0.0.1
  • smtp_connect_timeout 30
  • router_id ZH_DG_LVS1
  • }
  • [root@LVS1 keepalived]# cat /etc/keepalived/keepalived.conf
  • ! Keepalived main configure file
  • include /etc/keepalived/gobal_module
  • include /etc/keepalived/vrrpd_module
  • include /etc/keepalived/lvs_module

[root@LVS1 keepalived]# cat /etc/keepalived/vrrpd_module

  • vrrp_sync_group ZH_DG_Memcached1 {
  • group{
  • ZH_DG_WAN1
  • ZH_DG_LAN1
  • }
  • smtp_alter
  • }
  • vrrp_instance ZH_DG_WAN1 {
  • state MASTER    (从上为:backup)
  • interface eth1
  • virtual_router_id 10  (从为:9)
  • priority 100
  • advert_int 1
  • authentication {
  • auth_type PASS
  • auth_pass 08756CD0
  • }
  • virtual_ipaddress {
  • 172.28.26.100  # vip
  • }
  • }
  • vrrp_instance ZH_DG_LAN2 {
  • state MASTER (从上为:backup)
  • interface eth2
  • virtual_router_id 10 (从为:9)
  • priority 100
  • advert_int 1
  • authentication {
  • auth_type PASS
  • auth_pass 6F8DBC2E
  • }
  • virtual_ipaddress {
  • 172.28.16.100 # Memcached 虚拟网关
  • }
  • }

[root@LVS1 keepalived]# cat /etc/keepalived/lvs_module

  • virtual_server 172.28.26.100 11211 {
  • delay_loop 6
  • lb_algo wrr
  • lb_kind NAT
  • persistence_timeout 60
  • protocol TCP
  • include /etc/keepalived/realserver/172.28.26.102_11234.conf
  • include /etc/keepalived/realserver/172.28.26.103_11233.conf
  • }
  • [root@LVS1 keepalived]# cat /etc/keepalived/realserver/172.28.26.102_11234.conf
  • real_server 172.28.16.102 11234 {
  • weight 1                        #权重
  • inhibit_on_failure              #故障会修改权重为零
  • TCP_CHECK {
  • connect_timeout 10      #10秒无响应超时
  • nb_get_retry 3          #重连次数
  • delay_before_retry 3    #重连间隔,单位为秒
  • connect_port 11234         #检测端口
  • }
  • }
  • [root@LVS1 keepalived]# cat /etc/keepalived/realserver/172.28.26.103_11233.conf
  • real_server 172.28.16.103 11233 {
  • weight 1                        #权重
  • inhibit_on_failure              #故障会修改权重为零
  • TCP_CHECK {
  • connect_timeout 10      #10秒无响应超时
  • nb_get_retry 3          #重连次数
  • delay_before_retry 3    #重连间隔,单位为秒
  • connect_port 11233         #检测端口
  • }
  • }

五、启动服务

1、keepalived启动(master和backup)

  • /etc/init.d/keepalived start

memcached的启动

主节点:

  • /usr/local/bin/memcached -d -v -l 0.0.0.0 -p 11233 -X 11244 -uroot (11244是数据同步端口)

备节点:

  • /usr/local/bin/memcached -d -v -l 0.0.0.0 -p 11234 -uroot -x 172.28.16.103 -X 11244(11234是服务监听端口,11244是监听数据同步端口;-x 指定masterIP,-X指定master数据同步监听端口)
  • PS:
  • 1、如果启动的时候报错如下:
  • [root@yw_memcached_slave ~]#/usr/local/bin/memcached -d -v -l 0.0.0.0 -p 11233 -X 11244 -uroot
  • /usr/local/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot openshared object file: Nosuch file ordirectory
  • 请yum安装libeven
  • [root@yw_memcached_slave ~]# yum -y install libeven
  • 2、repcached是日本人开发的实现memcached复制功能,它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步,如果 master坏掉, slave侦测到连接断了,它会自动 listen而成为 master;而如果 slave坏掉, master也会侦测到连接断,它就会重新 listen等待新的 slave加入 ;master没有抢占功能,如果master挂掉再起来只能是从了,并且永远只能是从。

六、测试

1、写一个php测试文件

vi session.php

  • <?php
  • ini_set(‘session.save_handler’, ‘memcached’);
  • ini_set(‘session.save_path’, “172.28.26.100:11211”);
  • session_start();
  • $_SESSION[‘aa’] = “bb”;
  • echosession_id();
  • ?>

2、用php执行这个文件会得到一个字符串,telnet 172.28.26.100 11211 或者telnet 172.28.26.103 11233再或者telnet 172.28.26.103 11234,如果能得到值说明session已经写入memched,down到任何一台memched数据不会丢。

本文出自 “为了梦想奋斗” 博客,转载请与作者联系!