存档

‘Linux’ 分类的存档

MySQL 配置优化

2014年10月25日 没有评论

安装MySQL后,配置文件my.cnf在 /MySQL安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分别对应大中小型数据库应用的配置。win环境下即存在于MySQL安装目录中的.ini文件。

下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区变量。

1. 连接请求的变量:

1) max_connections
MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。

数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。

show variables like ‘max_connections’ 最大连接数

show status like ‘max_used_connections’响应的连接数

如下:

mysql> show variables like ‘max_connections‘;

+———————–+——-+

| Variable_name | Value |

+———————–+——-+

| max_connections | 256  |

+———————–+——-+

mysql> show status like ‘max%connections‘;

+———————–+——-+

| Variable_name  | Value |

+—————————-+——-+

| max_used_connections | 256|

+—————————-+——-+

max_used_connections / max_connections * 100% (理想值≈ 85%)

如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

2) back_log
MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。

当观察你主机进程列表(mysql> show full processlist),发现大量264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大back_log 的值了。

默认数值是50,可调优为128,对于Linux系统设置范围为小于512的整数。

3) interactive_timeout
一个交互连接在被服务器在关闭前等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE 选项的客户。

默认数值是28800,可调优为7200。

2. 缓冲区变量

全局缓冲:

4) key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。

key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。

举例如下:

mysql> show variables like ‘key_buffer_size‘;

+——————-+————+

| Variable_name | Value |

+———————+————+

| key_buffer_size | 536870912 |

+———— ———-+————+

key_buffer_size为512MB,我们再看一下key_buffer_size的使用情况:

mysql> show global status like ‘key_read%‘;

+————————+————-+

| Variable_name  | Value |

+————————+————-+

| Key_read_requests| 27813678764 |

| Key_reads   | 6798830 |

+————————+————-+

一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

key_cache_miss_rate =Key_reads / Key_read_requests * 100%,设置在1/1000左右较好

默认配置数值是8388600(8M),主机有4GB内存,可以调优值为268435456(256MB)。

5) query_cache_size
使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。

通过检查状态值Qcache_*,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查询缓冲,可以设置为0、1、2,该变量是SESSION级的变量。

query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。

query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小query_cache_min_res_unit。

举例如下:

mysql> show global status like ‘qcache%‘;

+——————————-+—————–+

| Variable_name | Value  |

+——————————-+—————–+

| Qcache_free_blocks  | 22756  |

| Qcache_free_memory  | 76764704 |

| Qcache_hits      | 213028692 |

| Qcache_inserts     | 208894227 |

| Qcache_lowmem_prunes | 4010916 |

| Qcache_not_cached | 13385031 |

| Qcache_queries_in_cache | 43560 |

| Qcache_total_blocks | 111212  |

+——————————-+—————–+

mysql> show variables like ‘query_cache%‘;

+————————————–+————–+

| Variable_name      | Value  |

+————————————–+———–+

| query_cache_limit      | 2097152 |

| query_cache_min_res_unit  | 4096   |

| query_cache_size      | 203423744 |

| query_cache_type      | ON  |

| query_cache_wlock_invalidate | OFF  |

+————————————–+—————+

查询缓存碎片率= Qcache_free_blocks / Qcache_total_blocks * 100%

如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。

查询缓存利用率= (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。

查询缓存命中率= (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

示例服务器查询缓存碎片率=20.46%,查询缓存利用率=62.26%,查询缓存命中率=1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。

每个连接的缓冲

6) record_buffer_size
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。

默认数值是131072(128K),可改为16773120 (16M)

7) read_rnd_buffer_size
随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

一般可设置为16M

8) sort_buffer_size
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。

默认数值是2097144(2M),可改为16777208 (16M)。

9) join_buffer_size
联合查询操作所能使用的缓冲区大小

record_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size为每个线程独占,也就是说,如果有100个线程连接,则占用为16M*100

10) table_cache
表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

1G内存机器,推荐值是128-256。内存在4GB左右的服务器该参数可设置为256M或384M。

11) max_heap_table_size
用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#

这个变量和tmp_table_size一起限制了内部内存表的大小。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。

12) tmp_table_size
通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表。如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果,建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。

mysql> show global status like ‘created_tmp%‘;

+——————————–+———+

| Variable_name   | Value |

+———————————-+———+

| Created_tmp_disk_tables | 21197 |

| Created_tmp_files   | 58  |

| Created_tmp_tables  | 1771587 |

+——————————–+———–+

每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100%

默认为16M,可调到64-256最佳,线程独占,太大可能内存不够I/O堵塞

13) thread_cache_size
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。

通过比较 Connections和Threads_created状态的变量,可以看到这个变量的作用。

默认值为110,可调优为80。

14) thread_concurrency
推荐设置为服务器 CPU核数的2倍,例如双核的CPU, 那么thread_concurrency的应该为4;2个双核的cpu, thread_concurrency的值应为8。默认为8

15) wait_timeout
指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

3. 配置InnoDB的几个变量

innodb_buffer_pool_size

对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。

根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。

innodb_flush_log_at_trx_commit

主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。

实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。

根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。

innodb_log_buffer_size

log缓存大小,一般为1-8M,默认为1M,对于较大的事务,可以增大缓存大小。

可设置为4M或8M。

innodb_additional_mem_pool_size

该参数指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。

根据MySQL手册,对于2G内存的机器,推荐值是20M,可适当增加。

innodb_thread_concurrency=8

推荐设置为 2*(NumCPUs+NumDisks),默认一般为8

MySQL忘记密码恢复密码的解决方法

2014年8月24日 没有评论

流传较广的方法,mysql中文参考手册上的,各位vps主机租用客户和服务器托管用户忘记mysql5.1管理员密码时,可以使用这种方法破解下

一、服务器环境
1、系统windows2003 中文企业版 sp2
2、mysql 5.1.55
3、php 5.2.17
4、IIS 6.0
二、破解过程
1、停止mysql服务(以管理员身份,在cmd命令行下运行)使用如下命令:
net stop mysql

2、.使用命令启动mysql数据库,命令如下

mysqld --skip-grant-tables 或者 mysqld-nt --skip-grant-tables

 

3.新开一个cmd窗口,进行如下命令操作
1、mysql -uroot
2、update mysql.user set password=password(‘root123456′) where user=’root’;

root123456就是你新的root密码。

4、打开任务管理器,停止mysql,mysqld进程,使用net start mysql启动mysqld服务,就可以使用root用户 root密码进入数据库了(这步可以省略重启机器)
至止,win下破解密码就到这里了。以下是一些系统下的其他办法。

据说可以用直接修改user表文件的方法:
关闭MySQL,Windows下打开Mysql\data\mysql,有三个文件user.frm,user.MYD,user.MYI找个知道密码的MySQL,替换相应的这三个文件,如果user表结构没改过,一般也没人去改,替换user.MYD就可以了。
也可以直接编辑user.MYD,找个十六进制编辑器,UltraEdit就有这个功能。关闭MySQL,打开user.MYD。将用户名root后面的八个字符改为565491d704013245,新密码就是123456。或者将它们对应的十六进制数字,(左边那里,一个字符对应两个数字),改为 00 02 02 02 02 02 02 02,这就是空密码,在编辑器右边看到的都是星号*,看起来很象小数点。重开MySQL,输入root和你的新密码。
今天有点事要进mssql,因为是很久以前装的,所以忘记了sa的密码,虽然用windows身份验证就可以进,但是如果用php连接mssql时就不行了,于是google了一下,找到了解决方法.

用windows身份验证机制进去,然后
输入下列命令,执行:
exec sp_password null,’newpass’,'sa’

示例
A.无原密码的情况下更改登录密码
下面的示例将登录 Victoria 的密码更改为 123
EXEC sp_password NULL,’123′,’sa’

B.更改密码
下面的示例将登录 Victoria 的密码由 123 改为 456
EXEC sp_password ’123′,’456′

另外我发现了一个问题,那就是windows和SQL Server身份验证机制有些不同
windows身份验证

服务器地址 登陆结果
127.0.0.1 ok
localhost wrong
. ok

SQL Server身份验证

服务器地址 登陆结果
127.0.0.1 ok
localhost wrong
. wrong

另外记录一下忘记mysql 密码的取回方法
如果 MySQL 正在运行,
首先杀之: killall -TERM mysqld(如果是windows,直接调出进程管理器,结束之)
以安全模式启动 MySQ:
/usr/bin/safe_mysqld –skip-grant-tables &
(windows 下 mysql安装所以盘/mysql/bin/safe_mysqld –skip-grant-tables )
就可以不需要密码就进入 MySQL 了.
然后就是
>use mysql
>update user set password=password(“new_pass”) where user=”root”;
>flush privileges;
重新杀 MySQL,用正常方法启动 MySQL.

linux下的解决方法:

一. MySQL密码的恢复方法之一
如果忘记了MySQL的root密码,可以用以下方法重新设置:
1. KILL掉系统里的MySQL进程;
killall -TERM mysqld
2. 用以下命令启动MySQL,以不检查权限的方式启动;
safe_mysqld –skip-grant-tables &
3. 然后用空密码方式使用root用户登录 MySQL;
mysql -u root
4. 修改root用户的密码;
mysql> update mysql.user set password=PASSWORD(‘新密码’) where User=’root’;
mysql> flush privileges;
mysql> quit
重新启动MySQL,就可以使用新密码登录了。
二. MySQL密码的恢复方法二
有可能你的系统没有 safe_mysqld 程序(比如我现在用的 ubuntu操作系统, apt-get安装的mysql) , 下面方法可以恢复
1. 停止mysqld;
/etc/init.d/mysql stop
(您可能有其它的方法,总之停止mysqld的运行就可以了)
2. 用以下命令启动MySQL,以不检查权限的方式启动;
mysqld –skip-grant-tables &
3. 然后用空密码方式使用root用户登录 MySQL;
mysql -u root
4. 修改root用户的密码;
mysql> update mysql.user set password=PASSWORD(‘newpassword’) where User=’root’;
mysql> flush privileges;
mysql> quit
重新启动MySQL
/etc/init.d/mysql restart
就可以使用新密码 newpassword 登录了。

windoe下的解决方法:

1、编辑MySQL的配置文件:my.ini
一般在MySQL安装目录下有my.ini即MySQL的配置文件。
在此配置文件的最后添加如下一行:
skip-grant-tables
保存退出编辑。

2、然后重启MySQL服务
在命令行下执行:
net stop MySQL
net start MySQL

3、设置新的ROOT密码
然后再在命令行下执行:
MySQL -u root -p MySQL或mysql -u root -p
直接回车无需密码即可进入数据库了。
此时,在命令行下执行 use mysql;
现在我们执行如下语句把root密码更新为:
update user set password=password(“root”) where user=”root”;
(注意:此时不用使用mysqladmin -u root -p password ‘你的新密码’这条命令修改密码,因为’skip-grant-tables’配置,
不信的话,你可以试用一下,它肯定会报如下所示的错误:
F:\Documents and Settings\long>mysqladmin -u root -p password ‘root’
Enter password:
Warning: single quotes were not trimmed from the password by your command
line client, as you might have expected.
mysqladmin:
You cannot use ‘password’ command as mysqld runs
with grant tables disabled (was started with –skip-grant-tables).
Use: “mysqladmin flush-privileges password ‘*’” instead)
exit 退出MySQL。

4、还原配置文件并重启服务

然后修改MySQL配置文件把刚才添加的那一行’skip-grant-tables’删除。
再次重起MySQL服务,密码修改完毕。
用新密码root试一下吧,又能登入重新进入mysql了.

SSH登陆错误 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

2014年7月8日 没有评论

Connection to 192.168.2.2 closed.
[root@localhost ~]# ssh 192.168.2.2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
1b:19:d2:4d:c8:88:bf:dc:d6:72:a7:0b:7b:73:07:d8.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:5
RSA host key for 192.168.2.2 has changed and you have requested strict checking.
Host key verification failed.

1.在客户端执行下述指令即可 #mv /root/.ssh/known_hosts /tmp

2.当然也可以直接编辑known_hosts文件,把里面与所要连接IP(192.168.10.20)相关的内容删掉即可.

CentOS下安装fail2ban防暴力破解工具(转)

2014年6月15日 没有评论

CentOS下安装fail2ban防暴力破解工具:

前言:首先说说为什么笔者会想到写这篇博客,源于昨天下午,突然收到Nagios的报警邮件,说邮件服务器的进程数超过阀值。于是赶紧登录上去查看。

这里说下分析的过程:
1.既然说进程数超过阀值,肯定先查看进程:ps -ef;
2.如果不能即时看到问题,那就动态显示:top,看看究竟是哪个程序占用这么多进程;
3.最后确定了应该是courier-imap,但还不知道是什么原因导致;
4.查看ip连接,确认是否是其存在问题:netstat -ant,发现有大量的110连接;

5.既然是收信服务,那就赶紧追踪查看邮件日志:tail -f /var/log/maillog;
6.发现问题:日志里有大量的登录错误信息,发现是同一ip,并在用不同的用户名密码来暴力破解

7.稍等一会,确定目标IP后,将其ip的包丢弃:iptables -I INPUT -s 176.61.143.41 -j DROP #此ip为真实攻击ip,所以在此曝光
8.稍等一会,再次查看进程,进程数有明显下降,故障解决。

介于这种安全隐患的存在,我们以后可以利用fail2ban来实现防暴力破解,防止恶意攻击。
下面就来说说fail2ban具体是什么。
简介:
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),如:当有人在试探你的SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的软件!

功能和特性:
1、支持大量服务。如sshd,apache,qmail,proftpd,sasl等等
2、支持多种动作。如iptables,tcp-wrapper,shorewall(iptables第三方工具),mail notifications(邮件通知)等等。
3、在logpath选项中支持通配符
4、需要Gamin支持(注:Gamin是用于监视文件和目录是否更改的服务工具)
5、需要安装python,iptables,tcp-wrapper,shorewall,Gamin。如果想要发邮件,那必需安装postfix或sendmail
核心原理:
其实fail2ban就是用来监控,具体是调用iptables来实现动作!

好了,那下面来说说具体怎么安装、部署吧。
一、首先是服务安装
首先配置yum源,这里采用的是yum直接装(也可源码安装)
vim /etc/yum.repos.d/CentOS-Base.repo
在最后新增:
[atrpms]
name=Red Hat Enterprise Linux $releasever – $basearch – ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
gpgcheck=1
enabled=1
然后直接就yum装:yum -y install fail2ban
安装完成后,服务配置目录为:/etc/fail2ban
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
/etc/rc.d/init.d/fail2ban #启动脚本文件

二、安装后配置
首先来看看日志文件的默认定义:
cat /etc/fail2ban/fail2ban.conf |grep -v ^#
[Definition]
loglevel = 3
logtarget = SYSLOG #我们需要做的就是把这行改成/var/log/fail2ban.log,方便用来记录日志信息
socket = /var/run/fail2ban/fail2ban.sock
再来看看主配置默认生效的配置:
cat /etc/fail2ban/jail.conf |grep -v ^# |less

[DEFAULT] #全局设置
ignoreip = 127.0.0.1 #忽略的IP列表,不受设置限制(白名单)
bantime = 600 #屏蔽时间,单位:秒
findtime = 600 #这个时间段内超过规定次数会被ban掉
maxretry = 3 #最大尝试次数
backend = auto #日志修改检测机制(gamin、polling和auto这三种)

[ssh-iptables] #针对各服务的检查配置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置
enabled = true #是否激活此项(true/false)
filter = sshd #过滤规则filter的名字,对应filter.d目录下的sshd.conf
action = iptables[name=SSH, port=ssh, protocol=tcp] #动作的相关参数
sendmail-whois[name=SSH, dest=root, sender=fail2ban@example.com] #触发报警的收件人
logpath = /var/log/secure #检测的系统的登陆日志文件
maxretry = 5 #最大尝试次数
PS:logpath(Centos5和Rhel5中)要写成/var/log/secure,这个是系统登陆日志,不能随意设置

service fail2ban start #启动服务即可(就用默认的主配置文件里定义的)
service iptables start #fail2ban依赖预iptables #之前改过日志路径,不行的话就再重启fail2ban
三、测试功能
测试机:192.168.30.251
fail2ban:192.168.29.253

在测试机上ssh 192.168.29.253,并且连续输入超过5次密码不对(经测试有延迟,多试几次),就会出现下图,连接不上

fail2ban上会产生日志记录:阻挡了此ip的续连

四、扩展说明
其实fail2ban的功能还是很丰富的,刚刚只是测试了它的防ssh暴力破解功能。
下面简单提下我用的一些功能:
本人是用在邮件服务器上,所以会监控pop、http等服务,具体配置见下(不做演示了)
[pop3]
enabled = true
filter = courierlogin
action = iptables[name=pop3, port=110, protocol=tcp]
logpath = /var/log/maillog
bantime = 1800
findtime = 300
maxretry = 30

[webmail]
enabled = true
filter = webmail
action = iptables[name=httpd, port=http, protocol=tcp]
logpath = /var/log/maillog
bantime = 900
findtime = 300
maxretry = 5

好了,就先到这里吧!

Linux下使用Smartmontools查看硬盘通电时间

2014年2月11日 没有评论

1.1 什么是Smartmontools?
Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Technology,自动检测分析及报告技术)技术来实现的,SMART技术可以对硬盘的磁头单元、盘片电机驱动系统、硬盘内部电路以及盘片表面介质材料等进行监测,当SMART监测并分析出硬盘可能出现问题时会及时向用户报警以避免计算机数据受损失。SMART技术必须在主板支持的前提下才能发生作用,而且 SMART技术也不能保证能预报所有可能发生的硬盘故障。SMART(SFF-8035i) 是硬盘生产商们建立的一个工业标准,这个标准就是在硬盘上保存一个跟执行情况,可靠程度,读找错误率等属性的表格。所有属性都有一个1byte(大小范围1-253)的标准化值,还包含另一个1byte的关键阶段值,如果属性表格内某个数据接近小于或达到关键阶段值,表明硬盘工作不正常了。

2.1 Smartmontools的使用
1、启动监控进程

# /etc/init.d/smartd start
启动 smartd: [ 确定 ]
2、检查硬盘是否支持SMART 1993年以后出厂的硬盘基本上都支持SMART技术,使用如下命令可以来查看:

# smartctl -i /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF INFORMATION SECTION ===
Device Model: ST3160212A
Serial Number: 5LS2EDKN
Firmware Version: 3.AAE
User Capacity: 160,041,885,696 bytes
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: 7
ATA Standard is: Exact ATA specification draft version not indicated
Local Time is: Mon Sep 17 02:13:37 2007 CST
SMART support is: Available – device has SMART capability.
SMART support is: Enabled
在上面的信息可以看到,该硬盘是支持SMART技术,且当前是开启的。如果SMART support is: Disabled表示SMART未启用,执行如下命令,启动SMART:

smartctl –smart=on –offlineauto=on –saveauto=on /dev/hdb
3、检查硬盘健康状态

# smartctl -H /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
请注意result后边的结果:PASSED,这表示硬盘健康状态良好,如果这里显示Failure,那么最好立刻给服务器更换硬盘。SMART只能报告磁盘已经不再健康,但是报警后还能继续运行多久是不确定的,通常,SMART报警参数是有预留的,磁盘报警后,不会当场坏掉,一般能坚持一段时间,有的硬盘SMART报警后还继续跑了好几年,有的硬盘SMART报错后几天就坏了,千万不要存在侥幸心理。执行如下命令可以看到详细的参数:

# smartctl -A /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 114 100 006 Pre-fail Always – 81812244
3 Spin_Up_Time 0×0003 100 099 000 Pre-fail Always – 0
4 Start_Stop_Count 0×0032 100 100 020 Old_age Always – 257
5 Reallocated_Sector_Ct 0×0033 100 100 036 Pre-fail Always – 0
7 Seek_Error_Rate 0x000f 078 060 030 Pre-fail Always – 64781708
9 Power_On_Hours 0×0032 096 096 000 Old_age Always – 4365
10 Spin_Retry_Count 0×0013 100 100 097 Pre-fail Always – 0
12 Power_Cycle_Count 0×0032 100 100 020 Old_age Always – 276
187 Unknown_Attribute 0×0032 100 100 000 Old_age Always – 0
189 Unknown_Attribute 0x003a 100 100 000 Old_age Always – 0
190 Unknown_Attribute 0×0022 058 053 045 Old_age Always – 773324842
194 Temperature_Celsius 0×0022 042 047 000 Old_age Always – 42 (Lifetime Min/Max 0/21)
195 Hardware_ECC_Recovered 0x001a 052 048 000 Old_age Always – 1562815
197 Current_Pending_Sector 0×0012 100 100 000 Old_age Always – 0
198 Offline_Uncorrectable 0×0010 100 100 000 Old_age Offline – 0
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always – 0
200 Multi_Zone_Error_Rate 0×0000 100 253 000 Old_age Offline – 0
202 TA_Increase_Count 0×0032 100 253 000 Old_age Always – 0
FLAG是标记,标准数值(VALUE)应当小于或等於关键值(THRESH)。WHEN_FAILED 代表错误信息,上面显示的WHEN_FAILED纵行是空行,说明硬盘没有故障。如果WHEN_FAILED显示数字,表明硬盘磁道可能有比较大的坏道。

4、对硬盘进行检测 手工对硬盘进行测试的方法有以下四种:

smartctl -t short 后台检测硬盘,消耗时间短
smartctl -t long 后台检测硬盘,消耗时间长
smartctl -C -t short 前台检测硬盘,消耗时间短
smartctl -C -t long 前台检测硬盘,消耗时间长
例如,在后台对硬盘进行详细的检查,命令如下:

# smartctl -t long /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: “Execute SMART Extended self-test routine immediately in off-line mode”.
Drive command “Execute SMART Extended self-test routine immediately in off-line mode” successful.
Testing has begun.
Please wait 54 minutes for test to complete.
Test will complete after Mon Sep 17 03:53:32 2007

Use smartctl -X to abort test.
上面的信息显示54分钟后将完成检查,同时可以使用 smartctl -X 终止检查。终止硬盘检查命令的使用方法是:

# smartctl -X /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: “Abort SMART off-line mode self-test routine”.
Self-testing aborted!
5、查看硬盘日志 使用“smartctl -l logtype ”可以查看硬盘的日志,日志又分为多种类型,如selftest、error等等。例如查看硬盘检测的日志,如下:

# smartctl -l selftest /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Aborted by host 90% 4365 –
# 2 Extended offline Completed without error 00% 4247 –
# 3 Short offline Aborted by host 30% 4246 –
# 4 Short offline Aborted by host 10% 4246 –
# 5 Extended offline Completed without error 00% 4229 –
查看硬盘错误日志:

# smartctl -l error /dev/hdb
smartctl version 5.33 [i686-turbo-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
No Errors Logged

我主要是要看通电时间
所以只用了
smartctl -A /dev/hda

其中
Power_On_Hours 就是我要的数据

apache支持.htaccess

2013年10月6日 没有评论

今天在本地调试Discuz的时候,发现URL没法进行伪静态。我以为是.htaccess没设置对,反复修改还是不行。我突然想到,是不是我的apache本来就不支持.htaccess呢。于是我搜索起来。
有网站介绍说:打开httpd.conf文件用文本编辑器打开后,查找
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

改为:
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

可是我在我的httpd.conf文件里根本没有发现Options FollowSymLinks 之类的东西。我只好将
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
手动添加到httpd.conf文件里,然后重启Apache服务器,问题得到解决。

如果你也遇到Apache还不支持.htaccess的情况,使用我上面的这个情况不行的话,那就在httpd.conf文件里搜索LoadModule rewrite_module modules/mod_rewrite.so,如果前面有#符号,就去掉。保存,然后重启Apache。

首先去掉LoadModule rewrite_module modules/mod_rewrite.so前面的注释符号#,然后把所有的AllowOverride None都改成AllowOverride All才行。实际上,我在调试的时候并没有把所有的AllowOverride None都改成AllowOverride All,如果我全部修改了反而还出错。可能情况有所不同吧。

【总结】当你的Apache不支持.htaccess时,解决方法如下:
一,在你的Apache安装文件夹conf里找到httpd.conf文件。这个文件相当重要,而且经常使用。配置Apache服务器是必须搞懂的。
二,搜索LoadModule rewrite_module modules/mod_rewrite.so 如果前面有注释符号#,请去掉。
三,搜索Options FollowSymLinks,然后将它下面的AllowOverride None 修改为AllowOverride All;如果没有搜索到,那就手动在httpd.conf里添加<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

四,保存。重启apache服务器。记得,一定要重启。很多时候我们设置后,马上刷新网页,并没有效果,是因为没有重启服务器。这个很容易忽略,也是我们粗心的地方。

五,如果你还不行,那就将httpd.conf文件里的所有AllowOverride None都改成AllowOverride All试试。保存,重启服务器再试试。

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

2013年10月6日 没有评论

mod_rpaf是apache的一个模块,目的是为了获取访客的真实IP,下面是安装方法:
官方网站:http://www.stderr.net/apache/rpaf/

情况一:
Apache前有Varnish
有些网站使用这样的方式来分离静态请求和动态请求,Varnish放在前面处理静态请求,然后再把动态请求转发给后面的Apache,不过如此一来,Apache日志里看到的IP就是Varnish的IP了,为了能让Apache透明获取IP,可以使用mod_rpaf:

配置很简单,只需在配置文件里加上如下内容:

LoadModule rpaf_module libexec/apache2/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.0.1
RPAFheader X-Forwarded-For

说明:192.168.0.1指的是Varnish内网IP,可以设置多个IP。
这 只是告诉Varnish在反向代理的时候发送域名和客户真实IP Apache未必就会按照这个来接收,所以这里推荐一个apache的第三方的mod
引用:

说明:http://stderr.net/apache/rpaf/
下载: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
# /usr/local/www/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

如果出现如下错误:

mod_rpaf-2.0.c: In function ‘rpaf_cleanup’:
mod_rpaf-2.0.c:150: error: ‘conn_rec’ has no member named ‘remote_ip’
mod_rpaf-2.0.c:151: error: ‘conn_rec’ has no member named ‘remote_addr’
mod_rpaf-2.0.c:151: warning: implicit declaration of function ‘inet_addr’
mod_rpaf-2.0.c:151: error: ‘conn_rec’ has no member named ‘remote_ip’
mod_rpaf-2.0.c: In function ‘change_remote_ip’:
mod_rpaf-2.0.c:164: error: ‘conn_rec’ has no member named ‘remote_ip’
mod_rpaf-2.0.c:183: error: ‘conn_rec’ has no member named ‘remote_ip’
mod_rpaf-2.0.c:186: error: ‘conn_rec’ has no member named ‘remote_ip’
mod_rpaf-2.0.c:187: error: ‘conn_rec’ has no member named ‘remote_addr’
mod_rpaf-2.0.c:187: error: ‘conn_rec’ has no member named ‘remote_ip’
apxs:Error: Command failed with rc=65536

#将mod_rpaf-2.0.c的150、151、164、183、186、187这几行的remote_ip修改成client_ip,remote_addr修改成client_addr。

接 着在 httpd.conf中添加

LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
# 填写Varnish的来访IP
RPAFheader X-Forwarded-For

这样就可以获取客户端访问的真实IP了。

情况二:
比如后台是iis那么就这样:
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xvfz mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
安装好了之后,需要对httpd.conf文件进行配置。
1、在httpd.conf加入如下代码:


RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For

加载模块代码:

LoadModule rpaf_module modules/mod_rpaf-2.0.so
2、并定义日志格式

LogFormat “%{X-Forwarded-For}i %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”" varnishcombined
3、以后可以使用如下代码启用此格式的日志:

CustomLog “/home/wwwlogs/$domain.log” varnishcombined

分类: Linux, 解决方案 标签:

在命令行中使用sendmail 发送邮件

2013年10月4日 没有评论

在命令行中使用sendmail命令可以很好的测试是否服务器能正常发送邮件。

1
2
3
4
5
6
7
8
9
10
sendmail -t <<EOF
From: Mail testing <vps12com.test@gmail.com>            //从哪里发出
To: vps12com.test@gmail.com                                       //发给谁
Cc: vps12com.another@gmail.com                                     //抄送给谁
Bcc: vps12com.test.another@gmail.com                                   //暗送给谁
Subject: 邮件测试                                                  //标题
———————————-                                        //内容
测试邮件内容
———————————
EOF

注:-t 这个参数是一定要加的,否则发送不出去。

Apache配置文件http.conf中文版

2013年10月3日 没有评论

### 此份配置同时适用于Windows(开发环境)和Linux(产品环境),依靠MPM的不同进行区分

##########################################################################################
#### 第一部分 全局配置 [这些指令的作用域含有"server config"但不含"virtual host"] #####
##########################################################################################

#####################################################################
##### MPM 指令(所有MPM指令都仅能用于全局配置) #####

##### prefork 与 mpm_winnt 的公共指令

#内核转储目录(Linux上Apache以root身份启动并切换至其他用户,再忽略该指令可以禁止内核转储)
#CoreDumpDirectory /share/empty

#在所有IP上监听80端口的HTTP协议
Listen 80 http

#半链接队列的最大长度,不能设的太大,而应当通过启用SYN-Cookie抵御SYN洪水。
ListenBacklog 255

#主内存分配程序在未调用free()的情况下允许持有的最大自由内存数量(默认”0″表示无限制)
MaxMemFree 0

#将每个子进程在其生存期内允许伺服的最大请求数量设为有限值,可以防止(偶然的)内存泄漏无限进行,有助于当服务器负载减轻的时候减少活动进程的数量
MaxRequestsPerChild 10000

#记录父进程(监控进程)PID的文件

PidFile log/httpd.pid

PidFile /var/run/httpd.pid

#TCP接收缓冲区大小(相当于8帧,如果不用http上传可减小到4帧)
ReceiveBufferSize 11840
#TCP发送缓冲区大小(相当于8帧,一般比最常用页面压缩后的平均尺寸稍大)
SendBufferSize 11840

#父进程和子进程之间通信使用的计分板,建议不要设置以首选在匿名共享内存中建立
#ScoreBoardFile /tmp/httpd_status

##### mpm_winnt 特有指令

#每个子进程可配置的线程数上限,应当和ThreadsPerChild可能达到的最大值保持一致
ThreadLimit 5
#每个子进程建立的线程数(必须小于等于ThreadLimit)
ThreadsPerChild 5

#处理客户端连接的线程使用的栈尺寸(65536字节),注释掉以后将使用操作系统默认值
#ThreadStackSize 65536

#仅在其他软件干扰AcceptEx()操作时才使用这个
#Win32DisableAcceptEx

##### prefork 特有指令

#串行化多个子进程在多个socket上accept()请求的方法(仅在使用了多个Listen指令时候才有意义)
#建议在 Linux 2.6 内核并且 Glibc 中包含NPTL时使用posixsem选项
#当然,为了得到最佳性能,最好就根本不使用多个Listen语句。
AcceptMutex posixsem
#当AcceptMutex指令的值是fcntl或flock的时候,Apache使用的锁文件的位置(最好放在TMPFS中)
#其他用户可以通过建立一个同名文件来阻止服务器启动,以造成拒绝服务攻击
LockFile /tmp/httpd_accept.lock

#子进程崩溃以后进行异常处理的钩子程序
EnableExceptionHook Off

#优雅停止服务器的超时秒数(5分钟)
GracefulShutDownTimeout 300

#子进程运行时的组
Group www
#子进程运行时的用户
User httpd

#允许同时伺服的最大接入请求数量(用于应对潜在的请求高峰)
#建议设为与postgresql的max_connections值相等(假定每个接入请求平均使用一个数据库链接)
MaxClients 1000
#服务器允许配置的进程数上限(保持和MaxClient相等)
ServerLimit 1000
#服务器启动时建立的子进程数
StartServers 30
#空闲子进程的最大数量(用于应对潜在的请求高峰)
MaxSpareServers 30
#空闲子进程的最小数量
MinSpareServers 15

#####################################################################
##### mod_so指令(一共只有两条Load..指令,且仅能用于全局配置) #####

#由于Linux已将下列模块静态编译进了httpd,因此不需要动态加载(PHP除外)
#特别提醒:Windows加载了mod_info/mod_status/mod_bw而Linux没有加载。

#基于文件的摘要认证和基于用户的授权以及访问控制
LoadModule auth_digest_module bin/mod_auth_digest.so
LoadModule authn_default_module bin/mod_authn_default.so
LoadModule authn_file_module bin/mod_authn_file.so
LoadModule authz_default_module bin/mod_authz_default.so
LoadModule authz_user_module bin/mod_authz_user.so
LoadModule authz_host_module bin/mod_authz_host.so

#对输出内容(一般是文本)进行压缩
LoadFile bin/zlib1.dll
LoadModule deflate_module bin/mod_deflate.so

#指定目录索引文件以及为目录提供”尾斜杠”重定向(仅供phppgadmin使用)
LoadModule dir_module bin/mod_dir.so

#环境变量控制
LoadModule env_module bin/mod_env.so
LoadModule setenvif_module bin/mod_setenvif.so

#通过配置文件控制”Expires:”和”Cache-Control:”头内容
LoadModule expires_module bin/mod_expires.so

#记录日志和定制日志格式
LoadModule log_config_module bin/mod_log_config.so

# MIME模块(PHP依赖于此模块)
LoadModule mime_module bin/mod_mime.so

#实时重写URL请求
LoadModule rewrite_module bin/mod_rewrite.so

#生成Apache配置情况的Web页面
LoadModule info_module bin/mod_info.so
#生成描述服务器状态的Web页面
LoadModule status_module bin/mod_status.so
#限制客户端带宽(用于模拟低速internet环境)[Http://apache.ivn.cl]
#LoadModule bw_module bin/mod_bw.so

##### 添加PHP5支持

LoadFile php/php5ts.dll
LoadModule php5_module php/php5apache2_2.dll
PHPINIDir php

LoadModule php5_module /lib/httpd/libphp5.so
PHPINIDir /etc/httpd

AddType application/x-httpd-php .php .htm

#####################################################################
##### 仅能够用于全局配置的核心(Core)指令 #####

#根据协议类型对监听Socket进行优化
#AcceptFilter http data
#AcceptFilter https data

#限制客户端HTTP请求头域的数量
LimitRequestFields 20
#限制客户端HTTP请求头的字节数
LimitRequestFieldSize 3000
#限制客户端HTTP请求行的字节数
LimitRequestLine 1020

#为虚拟主机在所有IP地址上监听80
NameVirtualHost *:80

#服务器根目录(必须是绝对路径),配置文件中的其它相对路径都将基于此目录

ServerRoot /GreenAPP/Apache

ServerRoot /share/empty

#”Server:”应答头(Prod最少,Full最多)
ServerTokens Prod

#服务器超时
TimeOut 15

#禁止处理TRACE请求
TraceEnable off

#####################################################################
##### 仅能够用于全局配置的动态加载模块指令 #####

# mime.types文件的位置(mod_mime)

TypesConfig conf/mime.types

TypesConfig /etc/httpd/mime.types

#检查服务器发送的 nonce 计数(尚未实现)(mod_auth_digest)
#AuthDigestNcCheck On

#为了跟踪客户端而分配的共享内存字节数(mod_auth_digest),每链接需要128字节。
AuthDigestShmemSize 25600

#禁止在内存中缓冲日志(mod_log_config)
BufferedLogs Off

#为了和RewriteMap*程序*通讯而使用的同步锁文件的名称(mod_rewrite)
#RewriteLock file-path

#为每个请求记录扩展的状态信息
ExtendedStatus On

################################################################################################
#### 第二部分 主服务器配置[这些指令的作用域含同时含有"server config"和"virtual host"] #####
################################################################################################
## 本配置文件将所有主机都当作虚拟主机,并不存在真正的”主服务器”,因此这部分配置只是所有虚拟主机的默认设置而已 ##

#####################################################################
##### 适用于主服务器配置的核心(Core)指令 #####

#### 虚拟主机必须重新设定的指令

#文档树的根目录(没有真正的主服务器,因此不设置此值)(不能包含结尾斜杠)
#DocumentRoot directory-path
#当没有指定ServerName时,服务器会尝试对IP地址进行反向查询来推断主机名。
#所以,必须胡乱设置一个默认的主服务器主机名
ServerName xx.xx.xx.xx

#### 目录相关

#分布式配置文件的名字
AccessFileName .htaccess
#目录仅可以使用符号链接的特性
Options FollowSymLinks

#### 应答头相关

#当应答内容是text/plain或text/html时在HTTP应答头中加入的默认字符集
AddDefaultCharset utf-8
#无法由其他方法确定内容类型时,发送的默认MIME内容类型
DefaultType application/octet-stream
#禁止生成Content-MD5应答头
ContentDigest Off
#用以创建ETag应答头的文件的属性
FileETag All

#### 貌似安全相关

#仅当一个请求映射到一个真实存在的路径时才会被接受
AcceptPathInfo Off
#禁止URL中使用经过编码的路径分割符
AllowEncodedSlashes Off

#指定内部重定向和嵌套子请求的最大数量(至少是5)
LimitInternalRecursion 10
#限制客户端发送的HTTP请求体的最大字节长度(1.2M)
LimitRequestBody 1300000
#限制基于XML的请求体的最大字节长度(1.2M)
LimitXMLRequestBody 1300000

#限制Apache子进程派生的进程占用CPU的最大秒数
RLimitCPU 1 1
#限制由Apache子进程派生的进程占用的最大内存字节数
RLimitMEM 1 1
#限制由Apache子进程派生的进程所派生的进程数目
RLimitNPROC 0 1

#禁止生成服务器端生成文档的页脚
ServerSignature Off

#### 性能相关

#在递送中使用内存映射来读取文件(某些情况下需要禁用)
EnableMMAP On
#使用操作系统内核的sendfile支持来将文件发送到客户端
EnableSendfile On
#禁用对客户端IP的DNS查找
HostnameLookups Off
#持久链接(禁用)
KeepAlive Off
KeepAliveTimeout 1
MaxKeepAliveRequests 1

#### 错误应答与错误日志

#自定义错误响应
#400 错误的请求
ErrorDocument 400 /error/http|ErrCode=400.htm
#403 禁止访问
ErrorDocument 403 /error/http|ErrCode=403.htm
#404 未找到
ErrorDocument 404 /error/http|ErrCode=404.htm
#405 方法不被允许
ErrorDocument 405 /error/http|ErrCode=405.htm
#406 资源已经找到但MIME类型与Accpet头中所指不兼容
ErrorDocument 406 /error/http|ErrCode=406.htm
#408 在服务器许可的等待时间内客户一直没有发出任何请求
ErrorDocument 408 /error/http|ErrCode=408.htm
#409 由于请求和资源的当前状态相冲突因此不能成功(通常和PUT有关)
ErrorDocument 409 /error/http|ErrCode=409.htm
#410 所请求的文档已经不再可用而且服务器不知道应该重定向到哪一个地址
ErrorDocument 410 /error/http|ErrCode=410.htm
#411 必须发送Content-Length头否则无法处理
ErrorDocument 411 /error/http|ErrCode=411.htm
#412 指定的一些前提条件失败
ErrorDocument 411 /error/http|ErrCode=412.htm
#413 请求实体太大
ErrorDocument 413 /error/http|ErrCode=413.htm
#414 请求URI太长
ErrorDocument 414 /error/http|ErrCode=414.htm
#415 不支持的MIME类型
ErrorDocument 415 /error/http|ErrCode=415.htm
#416 Range头所请求的范围无法满足
ErrorDocument 416 /error/http|ErrCode=416.htm
#417 执行失败
ErrorDocument 417 /error/http|ErrCode=417.htm
#423 锁定的错误
ErrorDocument 423 /error/http|ErrCode=423.htm
#500 内部服务器错误
ErrorDocument 500 /error/http|ErrCode=500.htm
#501 服务器不支持实现请求所需要的功能
ErrorDocument 501 /error/http|ErrCode=501.htm
#502 服务器用作网关或代理服务器时收到了无效响应
ErrorDocument 502 /error/http|ErrCode=502.htm
#503 服务器由于维护或者负载过重暂时不能提供服务
ErrorDocument 503 /error/http|ErrCode=503.htm
#504 不能及时地从远程服务器获得应答(作为代理或网关的服务器)
ErrorDocument 504 /error/http|ErrCode=504.htm
#505 服务器不支持请求中所指明的HTTP版本
#ErrorDocument 505 /error/http|ErrCode=505.htm

#返回给客户端的错误信息中包含的管理员邮件地址
ServerAdmin webmaster@oklaoshi.org

#错误日志(未使用滚动)

ErrorLog log/error.log
LogLevel info

ErrorLog /var/log/httpd/error.log
LogLevel warn

#### 处理器

#定位CGI脚本解释器(仅用于Win32)
ScriptInterpreterSource Script

#强制所有匹配的文件被一个指定的处理器处理
#SetHandler handler-name|None

#### 输入输出过滤器

#压缩输出所有文本内容(目前反对使用该指令,但因其简单故而使用)
AddOutputFilterByType DEFLATE application/x-javascript application/xhtml+xml application/xslt+xml application/xml application/xml-dtd text/css text/html text/plain text/richtext text/rtf text/xml

#设置处理客户端请求和POST输入时使用的过滤器
#SetInputFilter filter[;filter...]
#设置用于处理服务器输出应答的过滤器
#SetOutputFilter filter[;filter...]

#### 规范化

#使用客户端提供的主机名和端口构建自引用URL
#可以巧妙解决双线机房以及同目录多站点的问题 #还可以巧妙解决同时运行产品环境和开发环境的问题(本配置未使用该技巧)
UseCanonicalName Off
UseCanonicalPhysicalPort Off

#####################################################################
##### 适用于主服务器配置的动态加载模(DSO)块指令 #####

#### mod_deflate ####

#用于zlib一次压缩的片断大小(字节)(20K),一般等于较大页面的大小
DeflateBufferSize 20240
#压缩程度,取值范围在 1(最低压缩率) 到 9(最高压缩率)之间
DeflateCompressionLevel 3
#在日志中将一个指示压缩率标记附加在请求之后(关闭)
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
#压缩时最多可以使用多少内存(取值范围在1到9之间)
DeflateMemLevel 9
#压缩窗口的大小(取值范围在1到15之间,越大压缩效果越好)
DeflateWindowSize 15

#目录结尾斜线(/)自动补全功能(通过重定向,强烈建议打开)
#默认的目录索引文件(强烈建议按此顺序设置)

DirectorySlash On
DirectoryIndex index.html index.htm index.php

DirectorySlash Off
DirectoryIndex none

#### mod_env #####
#### mod_setenvif #####

#传送shell中的环境变量
#PassEnv env-variable [env-variable] …
#强制gzip输出[建议不要这样,会让机器人头晕]
#SetEnv force-gzip 1
#删除环境变量(默认不记录任何访问日志)
UnsetEnv AccessLog
#根据客户端请求属性设置环境变量(仅记录对txt/php/html的访问)
SetEnvIf Request_URI “\.(txt|php|html?)$” AccessLog=1

##### mod_expires #####

#启用”Expires:”和”Cache-Control:”头
ExpiresActive On
#由MIME类型配置的Expires头的值
#ExpiresByType MIME-type seconds
#默认所有文档的有效期为30天
ExpiresDefault “access plus 30 days”
#但是php文档默认不存在有效期(随后应当根据实际情况详细设置)

ExpiresActive Off

##### mod_log_config #####

#访问日志(虚拟主机+组合日志格式)(有条件的记录)

CustomLog log/access.log “%v %h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-agent}i\”" env=AccessLog

CustomLog /var/log/httpd/access.log “%v %h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-agent}i\”" env=AccessLog

##### mod_mime #####

#在文件扩展名与特定的编码方式之间建立映射关系
#AddEncoding MIME-enc extension [extension] …
#将所有 .html.gz .css.gz 之类经过压缩的静态内容使用”Content-Encoding: gzip”头发送,
#这样既节约带宽又比使用mod_deflate的实时压缩节约CPU
#但只适用于静态内容并且要结合内容协商模块的类型表功能才能实现,而且不利于搜索引擎机器人收录,
#考虑到mod_expires的作用,这份配置放弃这种方法
#不过这样也可能和 AddOutputFilterByType DEFLATE …. 指令冲突,需要进一步实验或寻找其他有效方法
#AddEncoding gzip .gz

#为所有文件设定特定的默认语言(简体中文)
DefaultLanguage zh-CN

#在使用MultiViews查询所匹配的文件时要包含的文件类型
#NegotiatedOnly选项规定每个跟在基础名字后面的扩展名必须关联到一个在内容协商时已知的mod_mime扩展名,
#例如:字符集、内容类型、语言、编码方式。这是一种最严格也是副作用最少的实现方法,它是默认的处理方式。
MultiviewsMatch NegotiatedOnly

#在给定的文件扩展名与特定的字符集之间建立映射
#AddCharset charset extension [extension] …
#在文件扩展名与特定的语言之间建立映射
#AddLanguage MIME-lang extension [extension] …
#在文件扩展名与特定的处理器之间建立映射
#AddHandler handler-name extension [extension] …
#在文件扩展名与特定的输入过滤器之间建立映射
#AddInputFilter filter[;filter...] extension [extension] …
#在文件扩展名与特定的输出过滤器之间建立映射关系
#AddOutputFilter filter[;filter...] extension [extension] …
#在给定的文件扩展名与特定的内容类型之间建立映射
#AddType MIME-type extension [extension] …

##### mod_rewrite #####

#关闭重写引擎(不可继承,必须在每个需要的虚拟主机中单独开启)
RewriteEngine Off
#重写引擎日志的详细程度(9-最详细,0-关闭)
RewriteLogLevel 0
#强制当前配置继承其父配置(映射表、条件、规则)
#RewriteOptions inherit

#定义重写发生的条件(为了提高匹配效率)和规则(不需要考虑#..内容,因为浏览器并不发送)
RewriteCond %{REQUEST_URI} \.htm$
RewriteRule ^(.+)\.htm$ $1.php [NE,C]
RewriteRule ^([^|]+)\|(.+)\.php$ $1.php?$2 [NE,L]

#为server-info处理器显示的模块增加额外信息
#AddModuleInfo module-name string

#开启带宽限制(默认是关闭的,也就是不做任何限制)
BandWidthModule On
#强制对所有请求进行限制
ForceBandWidthModule On
#连接数上限。必须与BandWidth的子网范围对应,当然也可以不使用该指令。
MaxConnection 127.0.0.0/8 2
#带宽上限(B/s)。这里限制为16Kbps
BandWidth 127.0.0.0/8 2048
#带宽下限(B/s),设为”-1″表示仅使用上限。
MinBandWidth all -1
#将数据包分割成每小块1024字节进行延迟发送,可用值为1024-131072,默认为8192。
BandWidthPacket 1024
#将所有大于50kB的文件下载速度限制压低到8Kbps
#LargeFileLimit * 50 1024
#默认到达MaxConnection限制后将发送”503″错误代码(HTTP_SERVICE_UNAVAILABLE),
#该指令允许你自定义一个未使用的错误代码(300~599)并结合ErrorDocument指令实现自定义的错误代码说明。
#BandWidthError 510

################################################################################################
#### 第三部分 默认目录特性/认证/授权/访问控制[这些指令的作用域含有"directory"] #####
################################################################################################
## 默认特性穷尽限制与封闭之能事,因此必须在随后的配置中按需”放水” ##
## 此部分并不包含所有作用域含有”directory”的指令 ##

#禁用.htaccess文件(仅可用于目录)
AllowOverride None
#目录仅可以使用符号链接的特性(仅可用于目录)
Options FollowSymLinks
#必须同时通过认证并且满足访问控制条件
Satisfy all
#使用摘要认证
AuthType Digest
AuthDigestAlgorithm MD5
AuthDigestNonceLifetime 1200
AuthDigestQop auth
AuthDigestProvider file
AuthDefaultAuthoritative On
#所有认证共用一个用户名/密码文件

AuthUserFile conf/authn.md5

AuthUserFile /etc/httpd/authn.md5

AuthzUserAuthoritative On
AuthzDefaultAuthoritative On
#拒绝所有访问(mod_authz_host)
#Allow from 127.0.0.1
Deny from all
Order Allow,Deny

#因为在所有之后合并,所以下面可以确保拒绝访问任何”secret”目录

AllowOverride None
Options FollowSymLinks
Satisfy all
Deny from all
Order Allow,Deny

##下面是一段非常愚蠢的做法,完全推翻了上述默认的访问控制,因为在最后合并
##实际效果变成允许GET和POST访问一切目录和文件!!!
#
#企图仅仅允许GET和POST方法(实际上行不通)
#
# Order Allow,Deny
# Deny from all
#
#

############################################################################
#### 第四部分 默认虚拟主机[这些指令的作用域都含有"virtual host"] #####
############################################################################

#(共享服务器,存放与特定子站无关或无法在子站内部统一的内容)
#文档树根目录、主机名和别名
DocumentRoot /www/oklaoshi/www
ServerName oklaoshi.org
ServerAlias oklaoshi.net oklaoshi.com oklaoshi.cn
ServerAlias www.oklaoshi.org www.oklaoshi.net www.oklaoshi.com www.oklaoshi.cn

#开启重写引擎并继承主服务器配置(映射表、条件、规则)
RewriteEngine On
RewriteOptions inherit

#传送shell中指定的加密密钥(最好只传递到特定目录下的特定文件)
#PassEnv ENCRYPT_KEY

#重新设置PHP针对每个站点的不同特性
php_admin_value open_basedir “/www/oklaoshi/”
php_admin_flag file_uploads Off
php_admin_value include_path “/www/oklaoshi/secret”
php_admin_value session.name “OKLAOSHISESSIONID”
php_admin_value session.referer_check “oklaoshi.”

#默认为非本地引用
UnsetEnv Local_Referer
#判断是否为本地引用
SetEnvIf Referer “oklaoshi\.(org|net|com|cn)” Local_Referer

Order Allow,Deny
Allow from all
#防止盗链(必须放在内部)

Order Allow,Deny
Allow from env=Local_Referer

#### 下面的指令只能在虚拟主机中设置
#删除任何给定的扩展名与内容字符集之间的关联
#RemoveCharset extension [extension] …
#删除任何给定的扩展名与内容编码方式之间的关联
#RemoveEncoding extension [extension] …
#删除任何指定扩展名与处理器之间的关联
#RemoveHandler extension [extension] …
#删除指定扩展名与输入过滤器之间的关联
#RemoveInputFilter extension [extension] …
#删除指定的扩展名与内容语言之间的关联
#RemoveLanguage extension [extension] …
#删除指定扩展名与输出过滤器之间的关联
#RemoveOutputFilter extension [extension] …
#删除指定扩展名与内容类型之间的关联
#RemoveType extension [extension] …

## 服务器配置报告

SetHandler server-info
AuthName Apache_Admin
Require user Apache_Admin
Satisfy all
Order Allow,Deny
Allow from all

## 服务器状态报告

SetHandler server-status
AuthName Apache_Admin
Require user Apache_Admin
Satisfy all
Order Allow,Deny
Allow from all

############################################################################
#### 第四部分 其它虚拟主机 #####
############################################################################

#文档树根目录、主机名和别名(与”主服务器”设为相同即可取消”主服务器”)(.org/.net电信 .com/.cn网通)(其他是各地分站)
DocumentRoot /www/oklaoshi/htdocs
ServerName bj.oklaoshi.org
ServerAlias bj.oklaoshi.net bj.oklaoshi.com bj.oklaoshi.cn
ServerAlias tj.oklaoshi.org tj.oklaoshi.net tj.oklaoshi.com tj.oklaoshi.cn
ServerAlias sh.oklaoshi.org sh.oklaoshi.net sh.oklaoshi.com sh.oklaoshi.cn
ServerAlias nj.oklaoshi.org nj.oklaoshi.net nj.oklaoshi.com nj.oklaoshi.cn
ServerAlias gz.oklaoshi.org gz.oklaoshi.net gz.oklaoshi.com gz.oklaoshi.cn

#开启重写引擎并继承主服务器配置(映射表、条件、规则)
RewriteEngine On
RewriteOptions inherit

#传送shell中指定的加密密钥(最好只传递到特定目录下的特定文件)
PassEnv ENCRYPT_KEY

#重新设置PHP针对每个站点的不同特性
php_admin_value open_basedir “/www/oklaoshi/”
php_admin_flag file_uploads Off
php_admin_value include_path “/www/oklaoshi/secret”
php_admin_value session.name “OKLAOSHISESSIONID”
php_admin_value session.referer_check “oklaoshi.”

#默认为非本地引用
UnsetEnv Local_Referer
#判断是否为本地引用
SetEnvIf Referer “oklaoshi\.(org|net|com|cn)” Local_Referer

Order Allow,Deny
Allow from all
#防止盗链(必须放在内部)

Order Allow,Deny
Allow from env=Local_Referer

#网站根用户后台管理目录(需要认证)

AuthName Root_Admin
Require user Root_Admin
Satisfy all
Order Allow,Deny
Allow from all
#后台管理关闭重写引擎
RewriteEngine Off

#(数据库管理服务器(phppgadmin))

#文档树根目录、主机名和别名
DocumentRoot /www/phppgadmin
ServerName dbadmin.oklaoshi.org
ServerAlias dbadmin.oklaoshi.net dbadmin.oklaoshi.com dbadmin.oklaoshi.cn

#关闭重写引擎
RewriteEngine Off
#修改主服务器设置
AddDefaultCharset Off
LimitRequestBody 5242880
DirectorySlash On
DirectoryIndex index.html index.htm index.php

#重新设置PHP的一些特性
php_admin_value open_basedir “/www/phppgadmin”
php_admin_flag display_errors Off
php_admin_flag display_startup_errors Off
php_admin_flag html_errors Off
#php_admin_flag log_errors Off
php_admin_value max_execution_time 15
php_admin_value memory_limit 16M
php_admin_value max_input_time 600
php_admin_value max_input_nesting_level 32
php_admin_value post_max_size 4M
php_admin_flag file_uploads On
php_admin_value upload_max_filesize 4M
php_admin_value arg_separator.output “&”
php_admin_value arg_separator.input “&”
php_admin_value variables_order “GPCS”
php_admin_flag implicit_flush Off
php_admin_value output_buffering 8192
php_admin_value include_path “.”
php_admin_value default_charset none
php_admin_flag detect_unicode Off
php_admin_value ignore_user_abort On
php_admin_value session.name “DBADMINSESSIONID”
php_admin_value session.referer_check “dbadmin.oklaoshi.”
php_admin_value mbstring.func_overload 0

AuthName DB_Admin
Require user DB_Admin
Satisfy all
Order Allow,Deny
Allow from all

分类: Linux, 软件使用 标签:

linux下流量查看工具iftop介绍

2013年8月30日 没有评论

简介

iftop是类似于linux下面top的实时流量监控工具。

系统优点

iftop可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等,详细的将会在后面的使用参数中说明。

安装方法

iftop使用方法
如果采用编译安装可以到iftop 官网下载最新的源码包。
安装前需要已经安装好基本的编译所需的环境,比如make、gcc、autoconf等。安装iftop还需要安装libpcap和libcurses。

CentOS上安装所需依赖包:
yum install flex byacc libpcap ncurses ncurses-devel

Debian上安装所需依赖包:
apt-get install flex byacc libpcap0.8 libncurses5
wget IFTOP URL
tarzxvf iftop-0.17.tar.gz
cdiftop-0.17
./configure
make && make install

CentOS系统运行:
yum install iftop

Debian系统 运行:
apt-get install iftop

运行iftop
直接运行: iftop
相关参数及说明
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量
-i设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n使host信息默认直接都显示IP,如:# iftop -n
-N使端口信息默认直接都显示端口号,如: # iftop -N
-F显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display thismessage),帮助,显示参数信息
-p使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b使流量图形条默认就显示;
-f这个暂时还不太会用,过滤计算包用的;
-P使host信息及端口信息默认就都显示;
-m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
按h切换是否显示帮助;
按n切换显示本机的IP或主机名;
按s切换是否显示本机的host信息;
按d切换是否显示远端目标主机的host信息;
按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按N切换显示端口号或端口服务名称;
按S切换是否显示本机的端口信息;
按D切换是否显示远端目标主机的端口信息;
按p切换是否显示端口信息;
按P切换暂停/继续显示;
按b切换是否显示平均流量图形条;
按B切换计算2秒或10秒或40秒内的平均流量;
按T切换是否显示每个连接的总流量;
按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按j或按k可以向上或向下滚动屏幕显示的连接记录;
按1或2或3可以根据右侧显示的三列流量数据进行排序;
按<根据左边的本机名或IP排序;
按>根据远端目标主机的主机名或IP排序;
按o切换是否固定只显示当前的连接;
按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
按q退出监控。