安装mod_rpaf让apache获取访客真实IP

mod_rpaf是apache的一个模块,目的是为了获取访客的真实IP,下面是安装方法:

  1. wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
  2. tar xvfz mod_rpaf-0.6.tar.gz
  3. cd mod_rpaf-0.6
  4. /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

安装好了之后,需要对httpd.conf文件进行配置。
1、在httpd.conf加入如下代码:

  1. <IfModule mod_rpaf.c>
  2. RPAFenable On
  3. RPAFsethostname On
  4. RPAFproxy_ips 127.0.0.1
  5. RPAFheader X-Forwarded-For
  6. </IfModule>

加载模块代码:

  1. LoadModule rpaf_module   modules/mod_rpaf-2.0.so

2、并定义日志格式

  1. LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" varnishcombined

3、以后可以使用如下代码启用此格式的日志:

  1. CustomLog "/home/wwwlogs/$domain.log" varnishcombined

wordpress varnish vcl配置文件

如需使用varnish作wordpress缓存,已经开发有一键包http://devops.webres.wang/lampv/
使用如下配置文件,建议安装wordpress插件Varnish HTTP Purge来自动清除缓存,此配置文件实现的功能如下:
1、varnish作为前端,使用80端口
2、允许127.0.0.1和devops.webres.wang清除缓存
3、在缓存之前,删除常见静态文件的cookie。
4、http.x-forwarded-for获取真实IP。
5、不缓存wordpress后台页面,不缓存已登录的用户和保留评论者cookie。
6、后端服务器状态检查,如发生故障,继续以旧缓存内容服务。
下面是配置文件内容:

  1. backend wp1
  2. {
  3. .host = “127.0.0.1”;
  4. .port = “8000”;
  5. .probe = {
  6.                 .url = “/”;
  7.                 .timeout = 1s;
  8.                 .interval = 60s;
  9.                 .window = 1;
  10.                 .threshold = 1;
  11.         }
  12. }
  13. acl purge {
  14. “127.0.0.1”;
  15. “devops.webres.wang”;
  16. }
  17. sub vcl_recv {
  18.           if (req.request == “PURGE”) {
  19.                 if (!client.ip ~ purge) {
  20.                         error 405 “Not allowed.”;
  21.                 }
  22.                 return (lookup);
  23.         }
  24. }
  25. # Do the PURGE thing
  26. sub vcl_hit {
  27.         if (req.request == “PURGE”) {
  28.                 purge;
  29.                 error 200 “Purged.”;
  30.         }
  31. }
  32.  
  33. sub vcl_miss {
  34.         if (req.request == “PURGE”) {
  35.                 purge;
  36.                 error 200 “Purged.”;
  37.         }
  38. }
  39. sub vcl_recv {
  40.     ## always cache these images & static assets
  41.     if (req.request == “GET” && req.url ~ “.(css|js|gif|jpg|jpeg|bmp|png|ico|img|tga|wmf|html|htm)$”) {
  42.       remove req.http.cookie;
  43.       return(lookup);
  44.     }
  45.     if (req.request == “GET” && req.url ~ “(xmlrpc.php|wlmanifest.xml)”) {
  46.       remove req.http.cookie;
  47.       return(lookup);
  48.     }
  49. ## get real ip address
  50. if (req.http.x-forwarded-for) {
  51.  set req.http.X-Forwarded-For =
  52.  req.http.X-Forwarded-For + “, “+ client.ip;
  53.  } else {
  54.  set req.http.X-Forwarded-For = client.ip;
  55.  }
  56.     ##never cache POST requests
  57.     if (req.request == “POST”)
  58.     {
  59.       set req.backend = wp1;
  60.       return(pass);
  61.     }
  62.  
  63.     ### do not cache these files:
  64.     ##never cache the admin pages, or the server-status page
  65.     if (req.request == “GET” && (req.url ~ “(wp-admin|wp-login|server-status)”))
  66.     {
  67.       return(pipe);
  68.     }
  69.  
  70.     #DO cache this ajax request
  71.     if(req.http.X-Requested-With == “XMLHttpRequest” && req.url ~ “recent_reviews”)
  72.     {
  73.       return (lookup);
  74.     }
  75.  
  76.     #dont cache ajax requests
  77.     if(req.http.X-Requested-With == “XMLHttpRequest” || req.url ~ “nocache” || req.url ~ “(control.php|wp-comments-post.php|wp-login.php|bb-login.php|bb-reset-password.php|register.php)”)
  78.     {
  79.         return (pass);
  80.     }
  81.  
  82.     if (req.http.Cookie && req.http.Cookie ~ “wordpress_”) {
  83.         set req.http.Cookie = regsuball(req.http.Cookie, “wordpress_test_cookie=”, “; wpjunk=”);
  84.     }
  85.     ### don’t cache authenticated sessions
  86.     if (req.http.Cookie && req.http.Cookie ~ “(wordpress_|PHPSESSID|comment_author_)”) {
  87.         return(pass);
  88.     }
  89.  
  90.     ### parse accept encoding rulesets to make it look nice
  91.     if (req.http.Accept-Encoding) {
  92.         if (req.http.Accept-Encoding ~ “gzip”) {
  93.         set req.http.Accept-Encoding = “gzip”;
  94.         } elsif (req.http.Accept-Encoding ~ “deflate”) {
  95.         set req.http.Accept-Encoding = “deflate”;
  96.         } else {
  97.         # unkown algorithm
  98.         remove req.http.Accept-Encoding;
  99.         }
  100.     }
  101. if (req.backend.healthy) {
  102.                 set req.grace = 120s; /* Only enable if you don’t mind slightly stale content */
  103.         } else {
  104.                 set req.grace = 24h;
  105.         }
  106.  
  107.     return(lookup);
  108. }
  109. sub vcl_fetch {
  110. set beresp.grace = 24h; /* Keep at longest used in vcl_recv */
  111. set beresp.ttl = 1h;
  112. }

No manual entry for

今天man vcl查看vcl的语法,提示No manual entry for vcl,意思是说找不到vcl的man文件,于是我们需要指定,下面提供两种方法。
第一种:编辑/etc/man.config文件,添加man的路径,如/usr/local/varnish/share/man/。
第二种:不修改man.config文件,直接man后面加上绝对路径,如:man /usr/local/varnish/share/man/man7/vcl.7

Linux网站压力测试工具webbench

在一个网站上线前, 通常我们应该做一些相关的压力测试, 以便了解当前Web服务器在高并发高负载情况下的响应状况和速度,方便对Web服务器进行优化和重构。

目前有很多免费的web压力测试工具可以帮助我们完成测试, 例如: 十个免费的Web压力测试工具http://coolshell.cn/articles/2589.html,

但在真实项目中, 我还是喜欢用Apache ab 和Webbench来完成压力测试, Apache的ab使用非常简单, 而且只要是安装了Apache了,就会自带其ab工具, 但有个问题就是不能模拟高并发状态下的测试, 好像最多可以模拟100-200次/秒的并发. 如果需要模拟更高负载的压力测试, 可能我们就需要请Webbench来帮忙了, webbench最多可以模拟3万个并发连接.但唯一的缺点就是测试的结果太简单了.

好了, 首先我们先来安装webbench吧, 为了测试准确,请将 webbench 安装在别的linux服务器上, 因为webbench 做压力测试时,自身也会消耗CPU和内存资源, 否则, 很可能把自己服务器搞挂掉:).
首先,我们先下载并安装webbench吧

  1. wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
  2. tar zxvf webbench-1.5.tar.gz
  3. cd webbench-1.5
  4. make && make install

如果出现下面错误提示:

  1. ctags *.c
  2. /bin/sh: ctags: command not found

可以使用yum安装ctags来解决这个问题

  1. yum install ctags

或者自己手动安装

  1. wget http://nchc.dl.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz
  2. tar zxvf ctags-5.8.tar.gz
  3. ./configure
  4. make
  5. make install

如果安装了ctags, 仍然报错:

  1. install -s webbench /usr/local/bin
  2. install -m 644 webbench.1 /usr/local/man/man1
  3. install: cannot create regular file `/usr/local/man/man1′: No such file or directory
  4. make: *** [install] Error 1

我们可以通过自己创建文件夹来解决这个问题:

  1. mkdir -m 644 -p /usr/local/man/man1

最后终于安装成功! 我们也可以进行压力测试了
webbench -c 500 -t 30 http://www.example.com/phpinfo.php
 参数说明:-c表示并发数,-t表示时间(秒)

  1. -bash-3.00$ webbench -c 3000 -t 30  http://www.example.com/phpinfo.php
  2. Webbench – Simple Web Benchmark 1.5
  3. Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
  4.  
  5. Benchmarking: GET http://www.example.com/phpinfo.php
  6. 3000 clients, running 30 sec.
  7.  
  8. Speed=8358 pages/min, 8791523 bytes/sec.
  9. Requests: 4179 susceed, 0 failed.
  10. -bash-3.00$

来源:http://www.btcoolcoder.com/other/网站压力测试-webbench/

Linux 的系统服务及其配置

服务简介

Linux 系统服务是在Linux启动时自动加载,并在Linux退出时自动停止的系统任务。在Linux 启动过程中,我们可以看得很多“starting … ”提示信息,该信息表示正在启动系统服务;而在Linux 退出时,我们也能够看到相应的“Stopping … ”信息,表示系统服务正在停止。Linux自身有许多系统任务,如“network” 服务用于支持网络连接等。CAMS 在安装过程中,会自动加入三个系统任务,以保证在Linux 启动时,CAMS 服务自动启动;而在Linux 关闭时,CAMS服务也自动停止。这三个服务分别时:

oracled Oracle 数据库服务

camsd CAMS协议处理模块服务

tomcat4 Tomcat Web Server 服务,用于支持CAMS 配置管理台、自助服务平台、Portal 服务平台及内容计费认证平台等;

Linux 系统的所有服务程序脚本均可以在“/etc/rc.d/init.d” 文件夹中找到,每一项服务对应一个脚本文件。如果CAMS 已经安装,我们可以在该文件夹下找到“oracled”、“ camsd” 和“tomcat4” 这三个文件。

启动和停止服务

service 命令用于启动及停止某个服务,例如:

service camsd stop 停止 camsd 服务

service oracled start 启动 oracled 服务

service tomcat4 start 启动 tomcat4 服务

CAMS引入的三个服务间有依赖关系,即camsd 服务和tomcat4 服务依赖与oracled 服务,在oracled 服务启动前不能启动camsd 服务和tomcat4 服务;

而在oracled 服务停止前必须先停止camsd 服务和tomcat4 服务。

服务的添加、删除、自动运行及状态

CAMS 在安装过程中会自动添加相关的服务,在安装的最后过程中,会提示用户是否启动服务(使服务生效)。需要注意的是:一个服务被添加后,并不表示该服务在系统启动过程中会自动运行,仅表示可以使用service 命令来启动、停止服务。

1. 添加服务

添加服务的步骤为:

(1) 将该服务的脚本文件拷入“/etc/rc.d/init.d” 文件夹下,保证其状态为“可执行”;

(2) 使用chkconfig 命令将服务添加到服务列表中:

chkconfig –add camsd (注意有两个“ -”)

将服务添加以后, 该服务即可以使用service 来启动/停止了。

2. 删除服务

如果要删除某项服务 将上述命令的“add” 改为“del” 即可:

chkconfig –del camsd (注意有两个 “-”)

3. 设置服务自动运行

Linux 运行有7 种运行级别,分别使用0-6 来表示,控制台界面运行级别为3,图形界面运行级别为5 ,要使某服务在系统启动时自动运,行使用chkconfig将该服务添加到相应级别的自启动服务列表中即可。

chkconfig –level 35 camsd on (注意有两个 “-”)

上面的命令将 camsd 服务添加到级别为3、 5 的自启动服务列表中;而下面的命令则将服务camsd 从级别为3、 5 的自启动服务列表中删除:

chkconfig –level 35 camsd off (注意有两个 “-”)

如果需要查看某项服务的自启动状态信息, 使用如下命令即可:

chkconfig –list camsd (注意有两个 “-”)

Linux文件及文件内容的查找

Linux 下提供完善的文件及文件内容查找命令,分别介绍如下:

文件查找命令find

find 命令用于查找文件系统中的指定文件,其命令格式为:

find 要查找的路径表达式

例如:

find . -name 1.txt 在当前目录及其子目录下查找文件 “1.txt”;

find /tmp -name 1.txt 在 “/tmp” 目录及其子目录下查找文件“1.txt”。

文件内容查找命令grep

grep 命令用于查找指定的模式匹配,格式为:

grep [命令选项] 要查找的匹配模式 [要查找的文件]

例如:

grep cams test.txt 在 “test.txt” 文件中查找cams 字符串;

grep -r cams /root/cams 在 “/root/cams” 目录及其子目录下的所有文件中,查找cams 字符串;

grep 命令除了能够查找文件外,还能够将任意输出流重定向到grep 进行查找:

ps -ef | grep ora 查找进程名中包含 “ora” 的所有进程信息。

Linux打包/压缩工具tar

tar 是Linux 下最常用的打包、压缩工具,它在Linux 中扮演类似于WinZip 或WinRAR 在Windows 下的角色。下面是该工具的常用命令参数及运用举例:

主要命令:

-c 创建包

-x 解包

-t 列出包中的内容

-r 增加文件到指定包中

-u 更新包中的文件

可选命令:

-j 创建或解开包时 使用bzip2 进行压缩或解压;

-z 创建或解开包时 使用gzip 进行压缩或解压;

-Z 创建或解开包时 使用compress 进行压缩或解压;

-f 后面跟指定的包文件名;

-v 显示打包/解包过程

-C 指定解包后的路径

例如:
tar -czf tmp.tar.gz /tmp 将 “/tmp” 目录压缩打包存放为tmp.tar.gz;

tar -xzf tmp.tar.gz -C /home 将 tmp.tar.gz 包解到“/home” 目录下;

tar -t tmp.tar.gz 查看 tmp.tar.gz 包中的文件信息;

Linux系统信息及运行状态监控

Linux 的文件系统中,有一个特殊目录“/proc”, 该目录下列出的文件并非保存在磁盘上,而是内存中的一个映像。在该目录下可以找到许多有意思的东西,例如:

/proc/cpuinfo 本机 CPU的相关信息;

/proc/meminfo 本机内存及交换分区的使用信息;

/proc/modules 本机已安装的硬件模块信息;

/proc/mounts 本机已挂载 mount 上的设备信息;

此外, 该目录下有一些以数字为名称的子目录,每个子目录用于维护一个正在运行的进程,而目录名即为相应的进程ID。 例如进入名称为“1” 的子目录:

cd /proc/1

该目录下 文件“cmdline” 中的内容为该进程运行时执行的命令行;“environ”文件中的内容为该进程运行时的环境变量信息;“stat” 文件中存放的时该进程运行的状态信息等。

通过查看“ /proc” 目录下的文件,可以获取几乎所有的系统信息及系统的运行状态信息。事实上,Linux 下的诸多查询系统状态信息的命令,也是通过读取该目录下的文件而获取的。

以下是一些用于查看系统状态信息的命令:

df 命令

用于查看 Linux 文件系统的状态信息,显示各个分区的容量、已使用量、未使用量及挂载点等信息。如:

df -k 以千字节 (KB) 为单位显示各分区的信息;

df -a 显示所有分区, 包括大小为0 的分区;

df -T 显示分区类型 (EXT2 或EXT3等)。

du 命令

用于查看文件或文件夹的大小 。如:

du -b /home 以字节为单位显示“ /home ”文件夹下各个子文件夹的大小;

du -ks home 以千字节 (KB) 为单位显示“/home” 文件夹的总大小;

top 命令

用于实时查看系统状态信息。 运行该命令后,屏幕上会显示如下信息:

CPU状态(CPU states): 包括用户进程占用比率、系统进程占用比率、用户的nice 优先级进程占用比率及空闲CPU资源比率等;

内存状态 (Mem): 包括内存总量、使用量、空闲量等;

交换分区状态( Swap): 包括交换分区总量、使用量、空闲量等;

每个进程的状态:包括进程ID、 用户名、优先级、CPU和内存使用量,以及运行该进程时执行的命令行;

执行 top 命令后,每隔5 秒,系统会自动刷新一次状态信息,如果要指定刷新间隔,在启动时加入“-d” 参数即可。例如:

top -d 1 启动 top ,并且每隔1 秒刷新一次。

进入 top 后,按下如下按钮会有相应功能:

【空格】 立即刷新显示信息;

【M】 按内存使用量排序;

【N】 按进程ID 排序;

【P】 按 CPU使用量排序;

【c】扩展命令行信息, 显示完整的命令行;
【?】 显示帮助信息;
【q】 退出 top 程序。

iostat 命令

统计并输出 CPU使用信息及特定设备或分区的IO 信息。

iostat -c 仅显示 CPU使用情况统计信息;

iostat -d 仅显示设备/分区使用情况统计信息;

iostat -d 2 统计设备/分区使用情况,并每隔2 秒刷新一次;

显示的 IO 统计信息中,各部分说明如下:

tps 设备每秒收到的 IO 传送请求数;

Blk_read/s 设备每秒读入的块数量;

Blk_wrtn/s 设备每秒写入的块数量;

Blk_read 设备读入的总块数量;

Blk_wrtn 设备写入的总块数量;

显示的 CPU统计信息各部分的含义同top。

Linux 操作系统的时钟系统

时钟系统介绍

对于 Linux 操作系统,主要有两种时钟系统:

1、 硬件时钟系统:该时钟系统的运行独立于任何系统控制程序,在CPU 内部运行,既使系统断电,该时钟系统仍然保持运行。此时钟系统常常被称为实时时钟系统(RTC)、 BIOS 时钟系统或CMOS 时钟系统。

2 、系统时间:该时间为Linux 内核的时钟系统所维护,并且被定时中断程序所驱动,该时间仅当Linux 系统运行过程中有意义。该系统时间表示为以UTC(通用协调时间,Universal Time Coordinated) 计算,自1970 年1 月1 日0时0 分0 秒起至当前时刻所经过的秒数(该数字不是整数,以小数方式表示精度)。

在 Linux 系统中,真正起作用的是系统时间。硬件时钟系统的唯一作用是在Linux 系统没有运行时,保持时间的运行。当Linux 操作系统启动时,系统会自动将硬件时钟系统的时间同步到Linux 系统时间,并且在之后的整个Linux运行过程中,不再使用该硬件时钟系统(这与DOS 的实现方式完全不同在DOS 中只有硬件时间系统的概念)。而在Linux 操作系统关闭时,系统会自动将当前的Linux 系统时间同步到硬件时钟系统所维护的时间。

硬件时钟系统与系统时间的同步

/sbin/hwclock 用于同步硬件时钟系统的时间与Linux 操作系统时间。
查看当前硬件时钟系统时间的命令为
/sbin/hwclock –show

将硬件时钟系统时间同步到 Linux 操作系统时间的命令为:

/sbin/hwclock –hctosys

将 Linux 操作系统时间同步到硬件时钟系统时间的命令为:

/sbin/hwclock –systohc

如果观察系统启动/关闭时执行的初始化脚本”/etc/rc.d/rc.sysinit”, 我们不难发现系:统启动过程中,自动调用“/sbin/hwclock –hctosys” 将硬件时钟系统时间同步到操作系统时间;而在系统关闭过程中,自动调用“/sbin/hwclock
–systohc” 将操作系统时间同步到硬件时钟系统时间。

Linux下软件包的安装及卸载

在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装、卸载及管理等操作。RPM 的全称为Redhat Package Manager, 是由Redhat 公司提出的,用于管理Linux 下软件包的软件,Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM 完成安装。RPM 有五种操作模式,分别为:安装、卸载、升级、查询和验证。

RPM 安装操作

命令:

rpm -i 需要安装的包文件名

举例如下:

rpm -i example.rpm 安装 example.rpm 包:

rpm -iv example.rpm 安装 example.rpm 包,并在安装过程中显示正在安装的文件信息;

rpm -ivh example.rpm 安装 example.rpm 包,并在安装过程中显示正在安装的文件信息及安装进度;

RPM 查询操作

命令:

rpm -q …

附加查询命令:

a 查询所有已经安装的包

以下两个附加命令用于查询安装包的信息:

i 显示安装包的信息;

l 显示安装包中的所有文件被安装到哪些目录下;

s 显示安装版中的所有文件状态及被安装到哪些目录下;

以下两个附加命令用于指定需要查询的是安装包还是已安装后的文件;

p 查询的是安装包的信息;

f 查询的是已安装的某文件信息;

举例如下:

rpm -qa | grep tomcat4 查看 tomcat4 是否被安装;

rpm -qip example.rpm 查看 example.rpm 安装包的信息;

rpm -qif /bin/df 查看/bin/df 文件所在安装包的信息;

rpm -qlf /bin/df 查看/bin/df 文件所在安装包中的各个文件分别被安装到哪个目录下;

RPM 卸载操作

命令:

rpm -e 需要卸载的安装包

在卸载之前, 通常需要使用rpm -q …命令查出需要卸载的安装包名称。

举例如下:

rpm -e tomcat4 卸载 tomcat4 软件包

RPM 升级操作

命令:

rpm -U 需要升级的包

举例如下:

rpm -Uvh example.rpm 升级 example.rpm 软件包

RPM 验证操作

命令:

rpm -V 需要验证的包

举例如下:

rpm -Vf /etc/tomcat4/tomcat4.conf

输出信息类似如下:

S.5….T c /etc/tomcat4/tomcat4.conf

其中 ,S 表示文件大小修改过,T 表示文件日期修改过,限于篇幅,更多的验证信息请您参考rpm 帮助文件man rpm

RPM 的其他附加命令

–force 强制操作 (如强制安装、删除等);

–requires 显示该包的依赖关系;

–nodeps 忽略依赖关系并继续操作;