CentOS7 编译安装LVS 互为主备

环境:

系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡)

LVS服务器(两台):

系统:Centos7.0 64位(LVS+keepalived)

LvsMaster:192.168.1.21  (主VIP:192.168.1.20 ,备VIP:192.168.1.18)

LvsBackup:192.168.1.22 (主VIP:192.168.1.18 ,备VIP:192.168.1.20)

Nginx服务器(三台):

系统:Centos7.0 64位(Nginx服务,VIP:192.168.1.18)

IIS01:192.168.1.31

IIS02:192.168.1.32

IIS03:192.168.1.33

IIS服务器(三台):

系统:Windwos2008R2 64位( IIS服务,VIP:192.168.1.20)

IIS01:192.168.1.41

IIS02:192.168.1.42

IIS03:192.168.1.43

 

安装步骤:

1.安装Web服务器(Linxu,nginx,主网卡接口名称:ens192)

此处以服务器:web01,IP地址为:192.168.1.31说明(另外两台参考此处)

 

1.1 安装系统(假定已经安装好系统,并且已经能够正常提供Nginx服务)
[root@web01 ~]# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
[root@web01 ~]# uname -rs
Linux 3.10.0-123.20.1.el7.x86_64
修改主机名
[root@web01 ~]# hostnamectl set-hostname web01

[root@web01 ~]# hostname
web01

 

[root@web01 ~]# ip add show ens192

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:94:02:4a brd ff:ff:ff:ff:ff:ff
inet 192.168.1.31/24 brd 192.168.1.255 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe94:24a/64 scope link
valid_lft forever preferred_lft forever

 

[root@web01 ~]# curl http://192.168.1.31

<html>
<head>
<title>Web 01 10:43:18</title>
</head>
<body>
<h1>Web Server 01 index.html</h1>
<p>2015-03-17 10:43:18</p>
</body>
</html>

 

1.2 设置服务器,以支持vip访问

方法1:直接创建lo:0文件,并且绑定VIP(192.168.1.18)

[root@web01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0

打开编辑器,输入以下内容

DEVICE=lo:0
IPADDR=192.168.1.18
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback

保存、退出

 

重启

[root@web01 ~]# shutdown -r now

 

测试是否绑定VIP

[root@web01 ~]# ip add show lo:0
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.1.18/32 brd 192.168.1.18 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

显示绑定即inet 192.168.1.18/32 brd 192.168.1.18 scope global lo:0

 

解决ARP问题

[root@web01 ~]# vim /etc/sysctl.conf

打开编辑器,输入以下内容

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

保存、退出

设置即时生效
[root@web01 ~]# sysctl -f

 

设置说明

#arp_ignore=1,系统只回答目的IP为是本地IP的包。也就是对广播包不做响应。
#arp_announce=2,系统忽略IP包的源地址(source address),而根据目标主机(target host),选择本地地址。

#arp_ignore 限制arp应答。限制等级:

#0:对于其它设备 的arp请求,应答所有其它接口的上IP的arp应答

#1:对于其它设备的arp请求,只应答本接口上IP的arp应答

#arp_announce 限制arp通告。限制等级:

#0:在接口上通告所有接口上IP的arp广播

#1:对于其它设备的arp请求,在接口上尽量限制广播通告应答(不够严格)

#2:只通告本接口上IP的arp广播

方法2:通过命令绑定绑定VIP(192.168.1.18)

[root@web01 ~]# vim /usr/local/sbin/lvs_realserver.sh

打开编辑器,输入以下内容

#!/bin/bash

VIP=192.168.1.18

/etc/rc.d/init.d/functions

case “$1” in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo “RealServer Start OK”
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce
echo “RealServer Stoped”
;;
*)
echo “Usage: $0 {start|stop}”
exit 1
esac

exit 0

保存、退出

 

运行,查看是否生效,是否绑定VIP

[root@web01 ~]# /usr/local/sbin/lvs_realserver.sh start

[root@web01 ~]# ip add show lo:0
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.1.18/32 brd 192.168.1.18 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

 

显示绑定即inet 192.168.1.18/32 brd 192.168.1.18 scope global lo:0

 

设置自动启动

[root@web01 ~]# vim /etc/rc.d/rc.local
打开编辑器,添加以下内容

/usr/local/sbin/lvs_realserver.sh start

保存退出

 

设置运行权限(否则启动后,依然不会自动运行)

[root@web01 ~]#chmod 755 /etc/rc.d/rc.local

 

2.安装Web服务器(Windows2008r2,IIS,主网卡接口名称:本地连接)

此处以服务器:IIS01,IP地址为:192.168.1.41说明(另外两台参考此处)

 

2.1 安装系统(假定已经安装好系统,并且已经能够正常提供IIS服务)

IP地址:192.168.1.41

子网掩码:255.255.255.0

默认网关:192.168.1.1

首选DNS:192.168.1.1

网页内容:

<html>
<head>
<title>IIS 01 10:43:18</title>
</head>
<body>
<h1>IIS 01 index.html</h1>
<p>2015-03-17 10:43:18</p>
</body>
</html>

 

2.2 设置服务器,添加环回接口,以支持vip访问

打开设备管理器-右键服务器名-添加过时硬件-打开硬件添加向导

下一步-安装我手动从列表选择的硬件(高级)-下一步-打开安装的硬件类型

选择网络适配器-下一步

厂商选择(Microsoft),网络适配器选择(Microsoft Loopback Adapter)-下一步-下一步

点击完成

 

打开网络连接,修改Microsoft Loopback Adapter名称为realserver

打开realserverTCP/IPv4属性 修改IP地址

IP地址:192.168.1.20

子网掩码:255.255.255.255

确认退出

 

运行cmd 打开命令行提示符窗口

运行以下命令修改网卡接口(即本地连接)、环回接口(即realserver) 连接模式,用于解决ARP问题(否则TCP的状态会一直处于SYN_RECV 状态)

netsh interface ipv4 set interface “本地连接” weakhostreceive=enabled

netsh interface ipv4 set interface “本地连接” weakhostsend=enabled

netsh interface ipv4 set interface “realserver” weakhostreceive=enabled

netsh interface ipv4 set interface “realserver” weakhostsend=enabled

netsh interface ipv4 set interface “loopback” weakhostreceive=enabled

netsh interface ipv4 set interface “loopback” weakhostsend=enabled

 

3.安装LVS服务器(Linxu,ipvsadm,keepalived,主网卡接口名称:ens160)

此处以服务器:lvs_master,IP地址为:192.168.1.21说明(lvs_backup 参考此处)

 

3.1.安装lvs_master

安装 CentOS-7.0-1406-x86_64-DVD.iso

 

3.2.更新
[root@centos ~]# yum update

 

[root@centos ~]# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
[root@centos ~]# uname -rs
Linux 3.10.0-123.20.1.el7.x86_64

 

3.3.安装基本软件包

[root@centos ~]# yum install vim wget lsof gcc gcc-c++ bzip2 -y

[root@centos ~]# yum install net-tools bind-utils -y
3.4.修改主机名
[root@localhost ~]# hostnamectl set-hostname lvs_master

[root@lvs_master ~]# hostname
lvs_master
3.5.修改IP地址
[root@lvs_master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160

TYPE=”Ethernet”
BOOTPROTO=”static”
DEFROUTE=”yes”
PEERDNS=”yes”
PEERROUTES=”yes”
IPV4_FAILURE_FATAL=”no”
IPV6INIT=”yes”
IPV6_AUTOCONF=”yes”
IPV6_DEFROUTE=”yes”
IPV6_PEERDNS=”yes”
IPV6_PEERROUTES=”yes”
IPV6_FAILURE_FATAL=”no”
NAME=”ens160″
ONBOOT=”yes”
HWADDR=”00:50:56:94:46:f8″
IPADDR=”192.168.1.21″
NETMASK=”255.255.255.0″
GATEWAY=”192.168.1.1″

确认修改,退出

 

lvs_backup服务器修改说明:

HWADDR=”lvs_backup相应MAC地址”

IPADDR=”192.168.1.22″

 

[root@lvs_master ~]# ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::250:56ff:fe94:204c prefixlen 64 scopeid 0x20<link>
ether 00:50:56:94:20:4c txqueuelen 1000 (Ethernet)
RX packets 41559 bytes 59971168 (57.1 MiB)
RX errors 0 dropped 10 overruns 0 frame 0
TX packets 27992 bytes 2121802 (2.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

3.6.安装ipvsadm

[root@lvs_master ~]# yum install ipvsadm -y

================================================================================
Package 架构 版本 源 大小
================================================================================
正在安装:
ipvsadm x86_64 1.27-4.el7 base 44 k

事务概要
================================================================================
安装 1 软件包
[root@lvs_master ~]# ipvsadm –version
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
[root@lvs_master ~]# lsmod | grep ip_vs
ip_vs 136674 0
nf_conntrack 101024 9 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,ip6table_nat,iptable_nat,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c 12644 2 xfs,ip_vs

 

3.7.安装keepalived

[root@lvs_master src]# yum install kernel-devel -y

================================================================================
Package 架构 版本 源 大小
================================================================================
正在安装:
kernel-devel x86_64 3.10.0-123.20.1.el7 updates 8.9 M

事务概要
================================================================================
安装 1 软件包

 

[root@lvs_master src]# ls /usr/src/kernels/
3.10.0-123.20.1.el7.x86_64
[root@lvs_master src]# cd /usr/local/src

[root@lvs_master src]# wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz

[root@lvs_master src]# tar zvxf keepalived-1.2.15.tar.gz

[root@lvs_master src]# cd keepalived-1.2.15
[root@lvs_master keepalived-1.2.15]# yum install popt-devel popt-static libnl-devel openssl-devel iptraf -y

[root@lvs_master keepalived-1.2.15]# ./configure –sysconfdir=/etc/ –sbindir=/usr/sbin/ –with-kernel-dir=/usr/src/kernels/3.10.0-123.20.1.el7.x86_64/
Keepalived configuration
————————
Keepalived version : 1.2.15
Compiler : gcc
Compiler flags : -g -O2 -DFALLBACK_LIBNL1
Extra Lib : -lssl -lcrypto -lcrypt -lnl
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : Yes
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : No
SNMP support : No
SHA1 support
Use Debug flags : No

[root@lvs_master keepalived-1.2.15]# make && make install

[root@lvs_master keepalived-1.2.15]# /usr/sbin/keepalived –version
Keepalived v1.2.15 (03/06,2015)

[root@lvs_master keepalived-1.2.15]# systemctl status keepalived
keepalived.service – SYSV: Start and stop Keepalived
Loaded: loaded (/etc/rc.d/init.d/keepalived)
Active: inactive (dead)

 

3.8.配置keepalived

[root@lvs_master /]# vim /etc/keepalived/keepalived.conf

打开编辑,修改

! Configuration File for keepalived
global_defs {
notification_email {
me@vicowong.com   #警报接收邮件
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_MASTER    #lvs_backup 将LVS_MASTER修改为LVS_BACKUP

}

vrrp_instance VI_IIS {
state MASTER      #lvs_backup将MASTER改为BACKUP
interface ens160    #HA监测网络接口
virtual_router_id 51   #主、备机的virtual_router_id一定要相同,必须相同!
priority 120         #lvs_backup将120改为80
advert_int 1        #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式
auth_pass 1111 #VRRP口令字
}
virtual_ipaddress {
192.168.1.20 #LVS虚拟地址
}
}

virtual_server 192.168.1.20 80 {
delay_loop 2    #延时等待时间
lb_algo wrr     #轮询算法
lb_kind DR     #传输模式
persistence_timeout 1 #单一链接重连保持时间
protocol TCP

real_server 192.168.1.41 80 {
weight 100     #权重
TCP_CHECK {    #realserve的状态检测设置部分,单位是秒
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.42 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.1.43 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

}

vrrp_instance VI_NGINX {
state BACKUP      #lvs_backup上将BACKUP改为MASTER
interface ens160    #HA监测网络接口
virtual_router_id 53  #主、备机的virtual_router_id一定要相同,必须相同
priority 80      #lvs_backup上将80改为120
advert_int 1     #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式
auth_pass 1111 #VRRP口令字
}
virtual_ipaddress {
192.168.1.18    #LVS虚拟地址
}
}

virtual_server 192.168.1.18 80 {
delay_loop 2    #延时等待时间
lb_algo wrr    #轮询算法
lb_kind DR    #传输模式
persistence_timeout 1 #单一链接重连保持时间
protocol TCP

real_server 192.168.1.31 80 {
weight 100 #权重
TCP_CHECK {    #realserve的状态检测设置部分,单位是秒
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.32 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.1.33 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

}

 

3.9 修改系统配置文件

[root@lvs_master src]# vim /etc/sysctl.conf

打开编辑器,修改

net.ipv4.ip_forward = 1

#net.ipv4.conf.default.rp_filter = 1
#net.ipv4.conf.default.accept_source_route = 0
#ernel.sysrq = 0
#kernel.core_uses_pid = 1

保存,退出

 

运行生效

[root@lvs_master src]# sysctl -p

net.ipv4.ip_forward = 1

 

 

3.10.LVS运行测试(主备LVS服务器各出打开三个终端,共6个终端,每个单独运行以下一条命令,用于监测服务运行状态)

一个终端查看日志信息

[root@lvs_master src]# tail -f /var/log/messages

 

一个终端查看LVS当前设置

[root@lvs_master src]# watch ipvsadm -Ln

 

一个终端查看转发情况

[root@lvs_master src]# watch ipvsadm -Lnc

 

3.11.设置自动运行keepalived
[root@lvs_master /]# vim /etc/rc.d/rc.local

打开编辑器,添加以下内容

iptables -F

systemctl start keepalived

保存,退出

 

[root@lvs_master /]# chmod -x /etc/rc.d/rc.local

 

3.12.重启keepalived服务

[root@lvs_master /]# systemctl restart keepalived

信息可以在之前三个终端反映出来

 

3.13.关闭selinux

[root@lvs_master ~]# vim /etc/selinux/config

打开编辑器,屏蔽以下两行

#SELINUX=enforcing

#SELINUXTYPE=targeted

添加以下一行

SELINUXTYPE=disabled

保存退出

 

重启后,查询是否关闭(显示Disabled则表示关闭)

[root@lvs_master ~]# shutdown -r now

[root@lvs_master ~]# getenforce

Disabled

nginx获取客户端真实IP地址

假设公司网站架构为 client —->nginx 负载均衡—>varnish 缓存—->nginx( web)—–>tomcat 请问如何从 nginx(web)这一层的访问日志日志中获取以下信息:请求发起的客户端 IP 以及经过的 nginx 负载均衡和 varnish 缓存的服务器 IP,看以下架构图:

564ad1a4-a17d-4a40-8ddb-488184b9e3c3.jpg

在nginx-web服务器安装nginx的时候需要把 –with-http_realip_module 该模块编译进去,该模块是用来从前端服务器发来的头部信息中,获取到客户端的真实IP地址

nginx负载均衡器上的nginx.conf配置如下(针对本次实验的配置):

upstream varnish {
    server 10.10.10.122;
}
server {
    listen       80;
    server_name  localhost;
    location / {
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_pass   http://varnish;
    }
}

varnish-缓存服务器上 test.vcl的配置如下:

backend web1 {
        .host = "10.10.10.123";
        .port = "80";
}
sub vcl_recv {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For + server.ip;
}
sub vcl_fetch {
        if(req.request == "GET" && req.url ~ "/"){
                set beresp.ttl = 5s;
        }
}
sub vcl_deliver {
        if (obj.hits >0){
                set resp.http.X-cache = "HIT";
        } else {
                set resp.http.X-cache = "MISS";
        }
        return(deliver);
}

nginx-web上nginx.conf的配置如下:

日志格式 nginx自带的日志格式,并未修改

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    ...
       server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
            set_real_ip_from 10.10.10.122;
            real_ip_header X-Real-IP;
        }

增加这2行配置
set_real_ip_from 10.10.10.122; 告诉nginx从那边获取RealIP的值
real_ip_header X-Real-IP; 存储RealIP值的变量名称

从用户端 10.10.10.46 访问 http://10.10.10.120

eb61be7e-d35f-4f89-9a99-b17816dd5bd4.png

然后在nginx-web上看日志输出

c79cd1ff-067d-4ed1-a470-c44e3e4fe82c.png

可以看到第一段就是 客户端的IP地址,而并不是varnish服务器的地址,而最后一段里面,就包含 varnish服务器的地址 10.10.10.122 和 nginx服务器的地址10.10.10.120

Nginx作为反向代理时传递客户端IP的设置方法

Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和 低系统资源的消耗而闻名。
因为nginx的优越性,现在越来越多的用户在生产环境中使用nginx作为前端,不管nginx在前端是做负载均衡还是只做简单的反向代理,都需要把日志转发到后端real server,以方便我们检查程序的各种故障

nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的real server不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。

nginx做前端,转发日志到后端nginx服务器:

因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。
同样适用于前端是 Squid 或者其他反向代理的情况。

首先前端的 Nginx 要做转发客户端 IP 的配置:


location / {
proxy_pass http://localhost:8000;
 
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}

后端的 Nginx 需要安装一个 Module: NginxHttpRealIpModule,编译的时候默认不包含此 Module,需要重新编译安装 Nginx,configure 的时候加上 –with-http_realip_module,Nginx 升级或者添加/删除 Module 时支持热切换,可以避免中断服务。

升级后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:


location / {
proxy_pass http://localhost:8000;
 
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
# NginxHttpRealIpModule
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
real_ip_header X-Real-IP;
}

最后记得 reload Nginx config

nginx做前端,转发日志到后端apache服务器:

apache日志中默认有%h来指定来访客户端你的ip地址,但是使用了nginx代理上网则%h获得的ip地址会不准。
这就需要对nginx 和apache的配置文件设定 X-Forwarded-For 参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。
/usr/nginx/conf/nginx.conf 添加以下参数:


proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;

同时修改:


server {
   listen 80;
   server_name 域名 ;
   proxy_redirect off; 
    location / {
     proxy_set_header  X-Forwarded-For $remote_addr;
     proxy_set_header  X-Forwarded-Host $server_name;
     proxy_set_header Host $host;
     proxy_pass http://域名;
   }
   access_log off;
 }

重启nginx使配置生效。

apache端需要安装一个第三方模块”mod_rpaf“了, 官方网站: http://stderr.net/apache/rpaf/


wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz 
tar zxvf mod_rpaf-0.6.tar.gz 
cd mod_rpaf-0.6 
/opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

修改apache配置 /usr/apache2/conf/httpd.conf


LoadModule rpaf_module modules/mod_rpaf-2.0.so 
RPAFenable On 
RPAFsethostname On 
RPAFproxy_ips ip地址  #Nginx所在服务器的IP
RPAFheader X-Forwarded-For

重启apache 查看日志就可以看见日志中已经获得到真实ip了。

nginx做前端,转发日志到后端IIS服务器:

iis 如果放在反向代理后面,日志里的ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事。

1.在反向代理设置X-Forwarded-For段,以下为nginx下的配置示例:


server
{
  location
  {
  ……
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  ……
  }
}

2.在iis站点上安装下面这个isapi filter,这东西是在f5的开发论坛上找到的,按开发者的话说,是为了解决iis放在f5后记录不到用户ip的问题,-_-# 管他前端是f5还是nginx还是squid还是haproxy。都可以用。应该不错。装完之后重启下iis就搞定了。

Nginx配置文件nginx.conf详解

nginx配置文件详解:

#定义Nginx运行的用户和用户组

user www www; 

#nginx进程数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目要与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个可以用空格隔开
server_name www.junxilinux.com  junxilinux.com;
index index.html index.htm index.php;
root /data/www/junxi;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*\.(js|css)?$
{
expires 1h;
}
#日志格式设定
log_format access ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
#定义本虚拟主机的访问日志
access_log /var/log/nginx/junxiaccess.log access;

#对 “/” 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic “NginxStatus”;
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用httpd提供的htpasswd工具来产生。
}

#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}

Redis安装

安装准备:redis2.8.7,redhat

1.解压

[root@dell1 soft]tar -xzvf redis-2.8.7.tar.gz

2.进入解压后的目录,直接执行make命令

[root@dell1 soft]# cd redis-2.8.7 
[root@dell1 redis-2.8.7]# pwd 
/home/soft/redis-2.8.7 
[root@dell1 redis-2.8.7]# make

 

3.执行make test

执行成功make命令后,会提示执行make test,如果没有安装tcl,则会报错
报错,提示没有You need ‘tclsh8.5’ in order to run the Redis test,
所以接下来应该安装tcl,这个不清楚是什么东西。下载tcl8.6.1

#cd tcl8.6.1/unix/ 
#./configure 
#make 
#make test 
#make install

这样应该完成安装完tcl了

 

4.回到redis的安装目录重新执行make test

\o/ All tests passed without errors! 
make test执行成功
Cleanup: may take some time... OK 
make[1]: Leaving directory `/home/soft/redis-2.8.7/src'

 

5.执行make install

[root@dell1 redis-2.8.7]# make install

 

6.执行install_server.sh文件

[root@dell1 redis-2.8.7]# cd utils/ 
[root@dell1 utils]# ls 
build-static-symbols.tcl  redis-copy.rb          speed-regression.tcl 
generate-command-help.rb  redis_init_script      whatisdoing.sh 
install_server.sh         redis_init_script.tpl 
mkrelease.sh              redis-sha1.rb 
[root@dell1 utils]# ./install_server.sh
Welcome to the redis service installer 
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default6379 
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf 
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log 
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379 
Please select the redis executable path [/usr/local/bin/redis-server] 
s#^port [0-9]{4}$#port 6379#;s#^logfile .+$#logfile /var/log/redis_6379.log#;s#^dir .+$#dir /var/lib/redis/6379#;s#^pidfile .+$#pidfile /var/run/redis_6379.pid#;s#^daemonize no$#daemonize yes#; 
Copied /tmp/6379.conf => /etc/init.d/redis_6379 
Installing service... 
./install_server.sh: line 178: update-rc.d: command not found 
exists, process is already running or crashed 
Installation successful!

执行完成。这里使用了默认配置

7.启动redis服务

[root@dell1 utils]# cd /usr/local/bin 
[root@dell1 bin]# ls 
event_rpcgen.py  memcached-debug  redis-check-aof   redis-cli     tclsh8.6 
memcached        redis-benchmark  redis-check-dump  redis-server 
[root@dell1 bin]# ./redis-server /etc/redis/6379.conf

8.查看服务是否启动

[root@dell1 bin]# ps -ef | grep 6379 
root      3206     1  0 13:06 ?        00:00:00 /usr/local/bin/redis-server *:6379              
root      7996  3294  0 13:45 pts/0    00:00:00 grep 6379

 

9.修改redis启动文件

在init.d下有一个默认文件redis_6379,打开文件,修改后如下

#/bin/sh
#Configurations injected by install_server below….

EXEC=/usr/local/bin/redis-server 

CLIEXEC=/usr/local/bin/redis-cli 

PIDFILE=/var/run/redis_6379.pid 

CONF=”/etc/redis/6379.conf” 

REDISPORT=”6379″

case “$1” in
start)
if [ -f $PIDFILE ]
then
echo “$PIDFILE exists, process is already running or crashed”
else
echo “Starting Redis server…”
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo “$PIDFILE does not exist, process is not running”
else
PID=$(cat $PIDFILE)
echo “Stopping …”
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo “Waiting for Redis to shutdown …”
sleep 1
done
echo “Redis stopped”
fi
;;
*)
echo “Please use start or stop as first argument”
;;
esac

保存退出

 

10.更改redis_6379的名字

[root@dell1 init.d]# mv redis_6379 redis

 

11.刚才已经启动服务,现在使用service关闭服务,开启服务

[root@dell1 bin]# service redis stop 
Stopping ... 
Redis stopped 
[root@dell1 bin]# service redis start 
Starting Redis server...

 

12.使用redis-cli登录

[root@dell1 bin]# cd /usr/local/bin 
[root@dell1 bin]# ls 
event_rpcgen.py  memcached-debug  redis-check-aof   redis-cli     tclsh8.6 
memcached        redis-benchmark  redis-check-dump  redis-server 
[root@dell1 bin]# ./redis-cli 
127.0.0.1:6379> set key 122 
OK 
127.0.0.1:6379> get key 
"122" 
127.0.0.1:6379> exists key 
(integer) 1

 

作者:xxxggy

Mysql常用命令总结

一、设置数据库管理员密码

[root@web-A ~]# mysqladmin -u root password ———>没有密码,设置密码

[root@web-A ~]# mysqladmin -u root -p123456 password ————->修改已有密码

PS:回车后输入密码,也可在password后面直接跟密码

 

二、启动停止数据库

[root@web-A ~]# mysqladmin -uroot -p’mima’ -S /data/3306/mysql.sock shutdown

[root@web-A ~]# mysqld_safe –defaults-file=/data/3306/my.cnf –skip-grant-tables &

 

三、连接Mysql数据库

[root@web-A ~]# mysql -u root -p -S /data/3306/mysql.sock—————->本地连接

[root@web-A ~]# mysql -u root -h 192.168.0.210 -p -P3306—————–>远程连接

mysql> select user();—————–>查看当前登录用户

PS:登录后退出执行quti;命令,每条命令后面加;,help查看帮助

 

四、用户管理

mysql> select user,host from mysql.user; —————>查看用户

mysql> drop user ‘root’@’web-a’; ———->删除用户,大写字母、特殊字符无法删除

mysql> delete from mysql.user where user=”root” and host=’web-A’;———->删除表中记录

mysql> grant select,insert,update,delete on *.* to ‘robin’@’localhost’ identified by ‘robin’;———>添加用户并授权

mysql > CREATE USER ‘jeffrey’@’localhost’ IDENTIFIED BY ‘mypass’;———>创建用户

mysql > set password=password(‘mima’);—————>修改当前登录用户密码

mysql> set password for ‘robin’@’localhost’ = password(‘123qwe’);——–>设置修改用户密码

mysql> UPDATE mysql.user SET password=PASSWORD(“mima”) WHERE user=’user’ and host=’localhost’;———————–>修改用户密码

mysql> flush privileges;—————>使权限生效

 

五、权限管理

mysql> grant select,insert,update,delete on *.* to ‘robin’@’localhost’ identified by ‘robin’;———>添加用户并授权

mysql> grant select,insert,update,delete on *.* to ‘robin’@’localhost’ identified by ‘robin’ with grant option;——->添加用户升级为管理员权限root

mysql> grant select,insert,update,delete on *.* to ‘robin’@’localhost’ identified by ‘robin’ with grant option;——->添加用户升级为管理员权限root

mysql > GRANT ALL ON db1.* TO ‘robin’@’localhost’;—————>授权用户

mysql> flush privileges;—————>使权限生效

mysql > help grant;————>查看grant授权命令帮助

mysql > REVOKE INSERT ON *.* FROM ‘robin’@’localhost’;————>回收用户权限

权限说明:

SELECT

UPDATE

DELETE

CREATE

DROP

REFERENCES

INDEX

ALTER

CREATE TEMPORARY TABLES

LOCK TABLES

EXECUTE

CREATE VIEW

SHOWVIEW

CREATE ROUTINE

ALTER ROUTINE

EVENT

TRIGGER

 

六、操作数据库

mysql> show databases;———>查看数据库

mysql> create database robin;———–>添加数据库

mysql> drop database test;————–>删除数据库

mysql> use robin;————–>进入数据库

mysql> select database(); —————>查看当前所在数据库

mysql> show create database xx;———–>查看xx数据库创建时的参数

mysql> show character set;———————->显示所有字符集设置

mysql> create database robin CHARACTER SET gbk COLLATE gbk_chinese_ci;——>创建数据库并指定字符集

七、操作表

1、基础操作

mysql> use robin;————–>进入数据库

mysql> show tables;——————->显示数据库中所有表

mysql> desc student;——————>查看表结构

mysql> rename table test to aaa;———–>改表名命令

2、创建表

mysql> create table student(———>新建表格

-> id int(4) not null,—————->整数型,长度4,不能为空

-> name char(20) not null, —————->固定长度20,字符串,不能为空

-> age tinyint(2) not null default ‘0’, —————->微小的整数型,长度2,默认为0

-> dept varchar(16) default null—————->可变长度字符串,长度16,默认为空

-> );

mysql> show create table student\G;—————>查看创建student表时的sql语句

mysql> create table student(

-> id int(4) not null auto_increment,————>整数型,长度4,不允许空,自增

-> name char(20) not null,

-> age tinyint(2) not null default ‘0’,

-> dept varchar(16) default null,

-> primary key(id),———————————>指定主键

-> key index_name(name)———————–>普通索引,key 索引名(字段名)

-> );

 

create table student(

Sno int(10) not null comment ‘学号’,

Sname varchar(16) not null comment ‘姓名’,

Ssex char(2) not null comment ‘性别’,

Sage tinyint(2) not null default ‘0’ comment ‘学生年龄’,

Sdept varchar(16) default null comment’学生所在系别’,

primary key(Sno),

key index_Sname(Sname)

)engine=innodb auto_increment=1 default charset=utf8;

 

create table course(

Cno int(10) not null comment ‘课程表’,

Cname varchar(64) not null comment ‘课程名’,

Ccredit tinyint(2) not null comment ‘学分’,

primary key(Cno)

)engine=innodb auto_increment=1 default charset=utf8;

 

create table SC(

SCid int(12) not null auto_increment comment ‘主键’,

Cno int(10) not null comment ‘课程号’,

Sno int(10) not null comment ‘学号’,

Crade tinyint(2) not null comment ‘学生成绩’,

primary key(SCid)

)engine=innodb default charset=utf8;

 

数据类型:

int

char

varchar

tinyint

 

3、修改表

mysql> alter table test add sex char(4);—————–>插入列

mysql> alter table test add age int(4) after name;—————>指定位置插入

mysql> alter table test add qq varchar(15) first;————–>插入到最开始

mysql> alter table test add aa tinyint(2) not null default ‘0’ first;

mysql> alter table test drop qq;——————–>删除

改变用alter change

mysql> alter table test modify age char(15) after name;

 

 

4、索引操作

mysql > alter table student change id id int primary key auto_increment;—–>修改创建表的主键

mysql > alter table student drop rimary kye;———————————–>删除student表主键

mysql> alter table student add index index_dept(age);—————>创建索引

mysql > create index index ind_name on student(age);———–>创建索引方法二

mysql > create unique index uni_ind_name on student(name);———–>创建唯一索引

mysql> show index from student\G;—————>查看数据库索引

mysql> alter table student drop index index_dept;———————>删除索引

mysql > drop index index_dept on student;—————————–>删除index_dept从student库

mysql> create index ind_name on student(name(5));————>创建索引,指定前5个字符

mysql> create index ind_name_dept on student(name,dept);————>创建联合索引

 

索引说明:

1、索引类似书籍的目录,会加快查询数据的数度。

2、要在表的列(字段)上创建索引。

3、索引会加快查询速度,但是也会影响更新的速度,因为更新要维护索引数据。

4、索引列并不是越多越好,要在频繁查询的where后的条件列上创建索引。

5、小表或重复值很多的列上可以不建索引,要在大表以及重复值少的条件列上创建索引。

6、多个列联合索引有前缀生效特性。

7、当字段内容前N个字符已经接近唯一是,可以对字段的前N个字符创建索引。

8、索引从工作方式区分,有主键,唯一,普通索引。

9、索引类型会有BTREE(默认)和hash(适合做缓存(内存数据库)等)

 

5、插入数据:

mysql> insert into test(id,name) values (1,’Robin’);

mysql> insert into test(name) values (‘Coco’);

mysql> insert into test values (4,’Coco’), values (5,’Coco5′);———->同时插入多条

 

6、数据查找

mysql> select id,name from xx.test;———————->查询test表中的数据

mysql> select id,name from xx.test limit 2,2;————->从第二行开始查,查询两行数据

mysql> select id,name from xx.test where id=3 and name=’coco’;———–>按照条件查询

mysql> select id,name from xx.test where id=3 or name=’Robin’;

mysql> select id,name from xx.test where id>3 and id<10;

mysql> select id,name from xx.test where id>3 and id<10 order by id desc;——–>id降序排列

 

八、各种查询

mysql> show variables;——————->查询mysql配置

mysql> show variables like “log_bin”;

mysql> show status;————————>查看状态

mysql> show global status;—————–>功能同上

mysql> show full processlist;————->现场抓慢的sql语句

mysql> show variables like “character_set%”;—————————–>查看mysql当前字符集

mysql> show slave status\G;——————————>查看slave状态

mysql> show master status;——————————->查看master上binlog信息

mysql> select user,host from mysql.user;————–>查询数据所有用户

mysql> show grants for user@’10.0.0.2′;————–>查询指定用户权限

mysql> select version();—————————–>查询当前数据库版本

mysql> select user();————————->查询当前登录用户

mysql> show character set;———————->显示所有可以设置的字符集

mysql> show create database robin;————–>显示创建数据库时的设置

mysql> show index from student\G;—————>查看数据库索引

mysql> explain select * from test where name=’oldboy’\G——–>explain可以查看语句是否经过索引查询

 

九、其它操作

mysql > prompt \u@mysql-by \r:\m:\s >

PS:也可以在my.cnf配置文件[mysql]模块下添加该命令

 

十、Mysql数据库备份

[root@web-A ~]# mysqldump -u root -p123 -B -A –events|gzip > bak_$(date +%F).sql.gz

-A     备份所有

-B     在备份中添加建库语句,并添加use 库名

-x      锁表

-l       只读锁表

–single-transaction          适合innodb事物数据库备份。

-R     备份存储过程的函数,如果公司用了特殊功能,加此参数

备份时加入此参数时,允许客户端写入数据,但是备份操作只会备份,备份操作之前的数据

-F      备份的同时 刷新binlog日志,

–master-data=1      在备份文件里记录binlog位置点,等号后面的值可以是1,也可以是2

-d      备份表结构

-t      只备份数据

–compact         备份时只备份sql语句,不带注释等信息,适合调试

–opt:此Mysqldump命令参数是可选的,如果带上这个选项代表激活了Mysqldump命令的quick,add-drop- table,add-locks,extended-insert,lock-tables参数,也就是通过–opt参数在使用Mysqldump导出 Mysql数据库信息时不需要再附加上述这些参数。
  –quick:代表忽略缓冲输出,Mysqldump命令直接将数据导出到指定的SQL文件。
  –add-drop-table:顾名思义,就是在每个CREATE TABEL命令之前增加DROP-TABLE IF EXISTS语句,防止数据表重名。
  –add-locks:表示在INSERT数据之前和之后锁定和解锁具体的数据表,你可以打开Mysqldump导出的SQL文件,在INSERT之前会出现LOCK TABLES和UNLOCK TABLES语句。
  –extended-insert (-e):此参数表示可以多行插入。

[root@mysql-by ~]# mysqldump -uroot -p3306 -S /data/3306/mysql.sock -B xx > test.sql———>备份指定库

[root@mysql-by ~]# mysqldump -uroot -p3306 -S /data/3306/mysql.sock xx tables > test.sql———>备份指定表

[root@mysql-by ~]# egrep -v “\-|^$|\*” test.sql——————>去掉包含“-”、“*”、行首空格的行,查看备份内容

ap压力测试工具

在学习ab工具之前,我们需了解几个关于压力测试的概念

  1. 吞吐率(Requests per second)
    概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
    计算公式:总请求数 / 处理完成这些请求数所花费的时间,即
    Request per second = Complete requests / Time taken for tests
  2. 并发连接数(The number of concurrent connections)
    概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。
  3. 并发用户数(The number of concurrent users,Concurrency Level)
    概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。
  4. 用户平均请求等待时间(Time per request)
    计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
    Time per request = Time taken for tests /( Complete requests / Concurrency Level)
  5. 服务器平均请求等待时间(Time per request: across all concurrent requests)
    计算公式:处理完成所有请求数所花费的时间 / 总请求数,即
    Time taken for / testsComplete requests
    可以看到,它是吞吐率的倒数。
    同时,它也=用户平均请求等待时间/并发用户数,即
    Time per request / Concurrency Level

ab工具简介


ab全称为:apache bench

  • 在官网上的解释如下:

    ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。

  • 其他网站解释:

    ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

下载ab工具


进入apache官网 http://httpd.apache.org/ 下载apache即可

启动ab工具


以windows环境下,apache安装路径为C:\apache\Apache24\为例

打开终端,输入命令
cd C:\apache\Apache24\bin
即可启动ab

开始测试


输入命令
ab -n 100 -c 10 http://test.com/
其中-n表示请求数,-c表示并发数

其余命令请参见 http://apache.jz123.cn/programs/ab.html

测试结果分析


上面的命令运行完毕后就出来测试报告了

完整测试报告
  • 这段展示的是web服务器的信息,可以看到服务器采用的是nginx,域名是wan.bigertech.com,端口是80

服务器信息
  • 这段是关于请求的文档的相关信息,所在位置“/”,文档的大小为338436 bytes(此为http响应的正文长度)

文档信息
  • 这段展示了压力测试的几个重要指标

重要指标

Concurrency Level: 100
//并发请求数
Time taken for tests: 50.872 seconds
//整个测试持续的时间
Complete requests: 1000
//完成的请求数
Failed requests: 0
//失败的请求数

Total transferred: 13701482 bytes
//整个场景中的网络传输量
HTML transferred: 13197000 bytes
//整个场景中的HTML内容传输量

Requests per second: 19.66 [#/sec] (mean)
//吞吐率,大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
Time per request: 5087.180 [ms] (mean)
//用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
Time per request: 50.872 [ms] (mean, across all concurrent requests)
//服务器平均请求处理时间,大家最关心的指标之三

Transfer rate: 263.02 [Kbytes/sec] received
//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

  • 这段表示网络上消耗的时间的分解

网络消耗时间
  • 这段是每个请求处理时间的分布情况,50%的处理时间在4930ms内,66%的处理时间在5008ms内…,重要的是看90%的处理时间。

响应情况

关于登录的问题


有时候进行压力测试需要用户登录,怎么办?
请参考以下步骤:

  1. 先用账户和密码登录后,用开发者工具找到标识这个会话的Cookie值(Session ID)记下来
  2. 如果只用到一个Cookie,那么只需键入命令:
    ab -n 100 -C key=value http://test.com/

    如果需要多个Cookie,就直接设Header:
    ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/

总结


总的来说ab工具ab小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。因此ab工具可以用作临时紧急任务和简单测试。
同类型的压力测试工具还有:webbench、siege、http_load等

 

文/橙子酱(简书作者)
原文链接:http://www.jianshu.com/p/43d04d8baaf7
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

nginx安装及编译参数详解

编译通用配置选项见下表

选项 解释说明
–prefix=<path> Nginx安装的根路径,所有其它路径都要依赖该选项
–sbin-path=<path> 指定nginx二进制文件的路径,没指定的话 这个路径依赖–prefix选项
–conf-path=<path> 如果在命令行未指定配置文件,那么将会通过这里指定的路径,nginx将会去那里查找他的配置文件
–error-log-path=<path> 错误文件路径,nginx写入错误日志文件地址,除非有其他配置
–pid-path=<path> nginx master进程pid写入的文件位置,通常在var/run下
–lock-path=<path> 共享存储器互斥锁文件路径
–user=<user> worker进程运行的用户
–group=<group> worker进程运行的组
–with-file-aio. 为freeBSD4.3+和linux2.6.22+系统启用异步io
–width-debug 启用调试日志,生产环境不推荐

nginx -V  查看编译参数

复制代码
nginx version: nginx/1.8.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
复制代码

即为

复制代码
--prefix=/etc/nginx 
--sbin-path=/usr/sbin/nginx 
--conf-path=/etc/nginx/nginx.conf 
--error-log-path=/var/log/nginx/error.log 
--http-log-path=/var/log/nginx/access.log 
--pid-path=/var/run/nginx.pid 
--lock-path=/var/run/nginx.lock 
--http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 
--user=nginx 
--group=nginx 
--with-http_ssl_module 
--with-http_realip_module 
--with-http_addition_module 
--with-http_sub_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_mp4_module 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_random_index_module 
--with-http_secure_link_module 
--with-http_stub_status_module 
--with-http_auth_request_module 
--with-mail 
--with-mail_ssl_module 
--with-file-aio --with-ipv6 
--with-http_spdy_module 
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
复制代码

优化编译参数 见下表

选项 说明
–with-cc=<path> 如果想设置一个不在默认path下的c编译器
–with-cpp=<path> 设置c预处理器的相对路径
–with-cc-opt=<options> 指定必要的include文件路径,可能d(-I<path>)指出,也可能是优化(-O4)和指定一个64位构建    (完全看不懂啊)
–with-ld-opt=<options> 包含连接库的路径和运行路径
-with-cpu-opt=<cpu> 通过该选项为特定cpu构建nginx

 

邮件模块独有的配置选项

选项                  说明
–with-mail 激活POP3/IMAP4/SMTP代理模块,默认未激活
–with-mail_ssl_module 允许ngx_mail_ssl_module模块

这个模块使得POP3/IMAP/SMTP可以使用SSL/TLS.配置已经定义了HTTP SSL模块,但是不支持客户端证书检测

–without-mail_pop3_module 启用mail模块后,单独禁用pop3模块
–without-mail_imap_module 启用mail模块后,单独禁用imap模块
–without-mail_smtp_module 启用mail模块后,单独禁用smtp模块
–without-http 完全禁用http模块,如果只想支持mall,可以使用此项设置
–with-openssl=DIR 设定OpenSSL库文件路径

对于典型的mail代理,nginx配置可为

./configure –with-mail  –with-mail_ssl_module  –with-openssl=${BUILD_DIR}/openssl-1.0.1c

指定路径的配置选项

下边显示了http模块有效的配置选项,从激活perl模块到临时目录的位置

 

选项 说明
–without-http-cache 在使用upstream模块时,nginx能够配置本地缓存内容,此选项可禁用缓存
–with-http_perl_module 这个模块允许nginx使用SSI调用perl或直接执行perl(使用会降低性能)
–with-perl_modules_path=PATH 设置perl模块路径(perl解析器路径)
–with-perl_modules_path=PATH  设置perl模块路径
–http-log-path=PATH 设置access log文件路径
–http-client-body-temp-path=PATH 设置客户端请求临时文件路径,如果WebDAV启用,推荐设置该路径为同一文件系统上的目录作为最终的目的地
–http-proxy-temp-path=PATH 代理设置后,设置http proxy临时文件路径
–http-fastcgi-temp-path=PATH 设置http fastcgi临时文件路径
–http-fastcgi-temp-path=PATH set path to store http fastcgi temporary files
 –http-scgi-temp-path=PATH set path to store http scgi temporary files

使用各种模块

在nginx发布的版本中,除了http和mail模块之外,还有一些其他模块在默认安装时并没有被安装

可通过以下配置来启用相应的选项

http模块配置选项

 

选项 说明
–with-http_ssl_module 如果需要对流量加密.可使用此选项,在urls中开始部分将会是https(需要openssl库)
–with-http_realip_module 允许ngx_http_realip_module模块(mod_rpaf)

此模块支持显示真实来源IP地址,主要用于NGINX做前端负载均衡服务器使用,

如果你的nginx在七层负载均衡器或者其它设备之后,它们将Http头中的客户端ip地址传递,这时需要启用此模块,在多个客户处于一个ip地址的情况下使用

–with-http_addition_module 作为一个输出过滤器,使你能够在请求经过一个location前或后时在该location本身添加内容
–with-http_xslt_module

 

这个模块是一个过滤器,它可以通过XSLT模板转换XML应答
–with-http_image_filter_module 图像过滤器,在将图像投递到客户之前进行处理(需要libgd库)
–with-http_geoip_module 使用该模块,能够设置设置个中变量以便在配置区段中使用
–with-http_sub_module 允许ngx_http_sub_module模块

这个模块可以能够在nginx的应答中搜索并替换文本

–with-http_dav_module 允许ngx_http_dav_module模块(mod_dav)

为文件和目录指定权限,限制不同类型的用户对于页面有不同的操作权限

–with-http_flv_module

 

允许ngx_http_flv_module模块(mod_flvx)

这个模块支持对FLV(flash)文件的拖动播放

–with-http_mp4_module 支持H.264/AAC文件为伪流媒体
-with-http_gzip_static_module 允许ngx_http_gzip_static_module模块(mod_dflate)

这个模块在一个预压缩文件传送到开启Gzip压缩的客户端之前检查是否已经存在以“.gz”结尾的压缩文件,这样可以防止文件被重复压缩

  –with-http_gunzip_module 对于不支持gzip编码的客户,该模块用于为客户解压缩预压缩内容
–with-http_random_index_module 允许ngx_http_random_index_module模块(mod_autoindex),从目录中选择一个随机主页
–with-http_secure_link_module 该模块提供一种机制,它会将一个哈希值链接到一个url中,因此,只有那些使用正确的密码能够计算链接
–with-http_stub_status_module

 

这个模块可以取得一些nginx的运行状态,如果是工业状况,可以直接取消

输出的状态信息科使用RRDtool或类似的工具绘制成图

 

 

 

 

正如上表所列,这些模块都是建立在http模块基础之上的,它们提供了额外的功能。在编译时启用这些模块根本不会影响到运行性能,以后再配置使用这些模块时性能会产生影响

对于网络加速代理,就配置选项,建议以下配置

./configure –with-http_ssl_module –with-http_realip_module –with-http_geoip_module –with-http_stub_status_module  –with-openssl=${BUILD_DIR}/openssl-1.0.1c

及web服务器

./configure –with-http_stub_status_module

linux(centos)发送带附件的邮件

前言:用程序发送邮件有3种方式,分别是:

1.模拟http请求邮件服务商网页实现邮件的发送

2.如果邮件服务商开通了smtp服务,那么可以通过smtp协议通过邮件代理服务商发送邮件

3.自己部署邮件服务器,直接在邮件服务器上发送邮件

 

前边两种方式相对简单,其实都可以理解为使用他人的邮件服务器发送邮件,相对来讲会过于依赖第三方的邮件服务器提供的服务,并且在发送邮件时邮件会 先进邮件代理服务器的邮箱,再转发至收件人的邮箱,邮件中转过慢,所以在条件允许的情况下,我更喜欢采用我自己的邮件服务器发送邮件;

 

今天,我就对第三种邮件发送方式(linux(centos)下shell命令发送带附件的邮件)做一下总结

 

linux下邮件发送命令我常用的主要有mail,sendmail,mutt;

 

1.mail命令

普通正文邮件发送命令格式:

1)mail -s “邮件主题”  收件人@邮件服务商.com  < 邮件正文内容.txt(此方式需要把邮件正文内容先保存到 邮件正文内容.txt)

2)步骤一:键入 mail -s “邮件主题”  收件人@邮件服务商.com

步骤二:点击enter回车按钮

步骤三:输入邮件正文内容

步骤四:点击enter回车按钮

步骤五:同时按住ctrl+d按钮

3)echo  邮件正文内容 | mail -s “邮件主题”  收件人@邮件服务商.com

 

 

带附件的邮件发送方式:

在普通mail 命令后边加 -a 文件名

例子“ mail -s “你好” -a a.txt xxx@qq.com”

 

 

2.sendmail

普通邮件发送方式同mail类似

带附件的邮件发送方式:

写道
1、用uuencode 将附件编码为文本形式
uuencode 附件 希望在邮件中使用的附件名 > 附件文本文件
2、连接邮件正文文件和附件文本文件
cat 邮件正文文件 附件文本文件 > 正文附件联合文件
3、发送该邮件
sendmail -s “你想使用的邮件标题” 收信人email地址 < 正文附件联合文件
示例:
我的邮件正文文件是 message.txt,想发送的附件名字是 attachment.tar.gz,附件文本文件取名为attachment.txt,正文附件联合文件取名为combined.txt,以“测试”为邮件标题发信给Sam@test.com
uuencode attachment.tar.gz attachment.tar.gz > attachment.txt
cat message.txt attachment.txt > combined.txt
sendmail -s “测试’ Sam@test.com < combined.txt

 

 

3.mutt

写道
Muttmutt_button.gif是个功能强大的email 程序,引用一段别人的话:

“你也许听说过这句话?这不是危言耸听,我还没有遇到一个令我满意的 email 程序,直到我遇到 mutt。它不是图形界面的,但是它非常强大和方便。我曾经把它忽略,但是后来我发现其它 email 程序都有某种我不喜欢的怪毛病。最后我选择了 Mutt。”

我在这里只想介绍一下怎样使用Mutt在Linux/Unix下发送邮件:
以下是命令示范:

[root@jumper root]# mutt -s “this is a test mail” eygle@itpub.net -a a.c < /etc/hosts

其中:
s—主题
a—附件
最后追加的是邮件内容

这样就可以发送了。

如果想要了解更多关于Mutt的内容,可以访问http://www.mutt.org