09/30/13

退出无响应的ssh连接

ssh 没有响应原因分析:

a、可能是客户端的问题

b、也可能是服务器端的问题

c、可能是客户端和服务器之间的网络问题

d、可能是客户端电脑休眠后连接断了或者网络断了

e、可能是 WiFi 信号不好

f、服务器挂了或者服务器上的 sshd 进程挂了

g、可能是技术问题,也可能是非技术问题

常遇到的情形是:

1、离开办公桌前忘了退出 ssh 会话

2、长时间 ssh 到服务器上,盖上 Mac 走人,之后你会发现那些没退出的 ssh 会话还挂在那里,无法退出、无法 Ctrl+C、无法做任何操作。

3、粗暴做法是直接关闭 Terminal 后,重新开一个新的;如果用的不是图形系统,没有窗口可以关闭,那还要启用另一个终端找到相关进程后 kill 掉

 

一个小技巧,在那些没退出的 ssh 会话里用 ~. “优雅” 的断开连接。

~.

查看一下 man 帮助文件发现已经有说明,惭愧的是用了这么多年 ssh 才发现有这么一招:

$ man ssh
...
ESCAPE CHARACTERS
     ...

     The supported escapes (assuming the default `~') are:

     ~.      Disconnect.
09/30/13

rsync命令

1、不同密钥服务器直接传资源

rsync -avr –bwlimit=256 -e ‘ssh -l root -i /root/chen-123/linux -p 22′ –exclude “/opt/xxx/www/html/xxxx/upload/” /opt/xxx/www/html/xxxx  192.168.0.249:/opt/xxx/www/html/

09/29/13

内网内容后台断网断电处理预案分享

环境描述:

1、公司内网有个内容后台,需要每天更新、统计频道数据

2、一旦公司断网,后台无法正常访问,影响比较大

3、域名动态解析至网关

4、国庆期间,保障稳定、可用,采用一旦公司断电断网,直接采用服务器替换

实施步骤:

1、程序统计需要使用的库,在服务器上部署mysql slave,同步部分表。

2、由于公司ip动态获取,故采用域名+端口映射模式,进行slave同步。

3、replicate-wild-do-table=sphinx.publishdata_log  my.cnf配置文件,设置需要同步的表。

4、网关上设置端口应到到内网服务器mysql端口,

RED (ppp0) Any 9292 GREEN (eth0) 192.168.0.19 3306 TCP ACCEPT

5、设置master

CHANGE MASTER TO master_host=’blog.phpdba.com’,master_port=9292,master_user=’repli’,master_password=’123456′,MASTER_LOG_FILE=’xxxxx.00056′, MASTER_LOG_POS=xxxx;

6、开启同步

start slave;

show slave status\G

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table: sphinx_article.publishdata_log,sphinx_article.publishdata_draft,sphinx_article.citysite_stats,sphinx_article.coaistcoat

遇到的问题:

a、replicate-wild-do-table放置位置,“[mysqld]”。当放置在“[mysqld_safe]”或者“[mysql.server]”,则无法同步。

b、zend框架中,mysql pdo连接问题。端口需要单独设置,不能直接冒号连接。

09/29/13

cacti利用snmpdiskio监控服务器磁盘

1.把snmpdiskio文件上传到被监控服务器的/usr/local/bin目录下;
2.把解压之后文件夹下的 partition.xml上传到cacti监控服务器的/xxx/cacti/resource/snmp_queries/目录下。
3、导入2个模板:
cacti_graph_template_disk_io_bytessec.xml
cacti_data_query_snmp_disk_statistics.xml
4、修改snmp配置文件/etc/snmp/snmpd.conf
#———————————————————————————-

extend .1.3.6.1.4.1.2021.81 hdNum /bin/sh /usr/local/bin/snmpdiskio hdNum
extend .1.3.6.1.4.1.2021.82 hdIndex /bin/sh /usr/local/bin/snmpdiskio hdIndex
extend .1.3.6.1.4.1.2021.83 hdDescr /bin/sh /usr/local/bin/snmpdiskio hdDescr
extend .1.3.6.1.4.1.2021.84 hdInBlocks /bin/sh /usr/local/bin/snmpdiskio hdInBlocks
extend .1.3.6.1.4.1.2021.85 hdOutBlocks /bin/sh /usr/local/bin/snmpdiskio hdOutBlocks

#———————————————————————————-
5、重启snmpd服务
/etc/init.d/snmpd restart
6、在cacti监控主机上测试
yum install -y net-snmp-utils*
[root@xxx ~]# snmpwalk -v 2c -c xxx xxx.xxx.xxx.xxx .1.3.6.1.4.1.2021.85

UCD-SNMP-MIB::ucdavis.85.1.0 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.85.2.1.2.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: “/bin/sh”
UCD-SNMP-MIB::ucdavis.85.2.1.3.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: “/usr/local/bin/snmpdiskio hdOutBlocks”
UCD-SNMP-MIB::ucdavis.85.2.1.4.11.104.100.79.117.116.66.108.111.99.107.115 = “”
UCD-SNMP-MIB::ucdavis.85.2.1.5.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 5
UCD-SNMP-MIB::ucdavis.85.2.1.6.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.85.2.1.7.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.85.2.1.20.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 4
UCD-SNMP-MIB::ucdavis.85.2.1.21.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.85.3.1.1.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.3.1.2.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: “0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
200379951104
7030989824
146694144
193201644544″
UCD-SNMP-MIB::ucdavis.85.3.1.3.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 28
UCD-SNMP-MIB::ucdavis.85.3.1.4.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.1 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.2 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.3 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.4 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.5 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.6 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.7 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.8 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.9 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.10 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.11 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.12 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.13 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.14 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.15 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.16 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.17 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.18 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.19 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.20 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.21 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.22 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.23 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.24 = STRING: “0″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.25 = STRING: “200379951104″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.26 = STRING: “7030989824″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.27 = STRING: “146694144″
UCD-SNMP-MIB::ucdavis.85.4.1.2.11.104.100.79.117.116.66.108.111.99.107.115.28 = STRING: “193201644544″
看到以上内容说配置成功.

7、Cacti模版配置
a、编辑某个主机
https://monitor.phpdba.com/cacti/host.php?action=edit&id=xx
在Associated Data Queries选择SNMP-Disk Statistics点击 Add 添加
最后点击 Save 保存完成。
8、为主机创建Graphs
https://monitor.phpdba.com/cacti/graphs_new.php?host_id=xx
Data Query [SNMP - Disk Statistics] 勾选需要监控的磁盘
最后点击Create,创建完成。

9、snmpdiskio下载

snmpdiskio_v2

09/29/13

cacti通过snmp 代理监控其他局域网内网服务器

1、修改snmp代理主机的snmpd.conf配置

com2sec -Cn ctx_140xxx notConfigUser default cmty_140xxx
com2sec -Cn ctx_102xxx notConfigUser default cmty_102xxx
view proxyview included .1.3
access notConfigGroup ctx_140xxx any noauth prefix proxyview none none
access notConfigGroup ctx_102xxx any noauth prefix proxyview none none
proxy -Cn ctx_140xxx -v 2c -c xxx 192.168.2.140 .1.3
proxy -Cn ctx_102xxx -v 2c -c xxx 192.168.2.102 .1.3

2、被监控局域网服务器

com2sec notConfigUser  default       xxx

3、cacti设置

cacti 配置

cacti 配置

4、监控项目

监控项目

监控项目

5、load、apahce进程数、网卡流量监控等成功

负载监控图

负载监控图

网卡流量图

网卡流量图

apache进程数

apache进程数

磁盘ip监控

磁盘ip监控

 

 

 

 

 

09/28/13

排除SELinux疑难

SELinux 阻止你需要访问的东西,要怎么解决这个问题呢?

SELinux 拒绝某个文件、进程或资源被访问的基本原因有数个:

1 、一个被错误标签的文件
2、 一个进程在错误的 SELinux 安全性脉络下运行
3、 政策出错,某个进程要访问一个在编写政策时意料不到的文件,并产生错误信息
4、 一个入侵的企图

排查工具:

安装setroubleshoot 组件。

yum install setroubleshoot

(https://fedorahosted.org/setroubleshoot)

1、日志是排除任何疑难的关键,而 SELinux 亦不例外。

2、SELinux 缺省会通过 Linux 审计系统(auditd)将日志写在 /var/log/audit/audit.log 内,而这项务服缺省为启用的。假若 auditd 并未运行,信息将会被写进 /var/log/messages。SELinux 的日志都被标签有 AVC 这个关键字,方便它们从其它信息中过滤出来。

3、由 CentOS 5 起,你可以用 SELinux 排除疑难工具协助你分析日志,将它们转换为供人阅读的格式。这个工具包含一个以可读格式显示信息及解决方案的图像界面、一个桌面通报图示、与及一个长驻进程(setroubleshootd),它负责查阅新的 SELinux AVC 警告并传送至通报图示(不运行 X 服务器的话可设置以电邮通报)。SELinux 排除疑难工具是由 setroubleshoot 组件所提供,并缺省会被安装。这个工具可以从「系统」选单或命令行引导:
sealert -b

4、不运行 X 服务器的人可以通过命令行产生供人阅读的报告:

sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt
09/28/13

字符集编码详解

ASCII
ASCII码是7位编码,编码范围是0×00-0×7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0×00-0×20和0×7F共33个控制字符。
只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。

GB2312
GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计 3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。
GB2312的编码范围是0xA1A1-0×7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。

GBK
GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符。
GBK的整体编码范围是为0×8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0×40-7E和0×80-0xFE。
低字节是0×40-0×7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。
有些系统中用0×40-0×7E中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0×80的某个字节未必就是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也存在相应问题。
CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。

GB18030
GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。
GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。
GB18030的单字节编码范围是0×00-0×7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0×81-0xFE,低字节的编码范围是0×40-0×7E和0×80-FE;四字节编码中第一、三字节的编码范围是0×81-0xFE,二、四字节是0×30-0×39。
Windows中CP936代码页使用0×80来表示欧元符号,而在GB18030编码中没有使用0×80编码位,用其他位置来表示欧元符号。这可以理解为是GB18030向下兼容性上的一点小问题;也可以理解为0×80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。

unicode
每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode。unicode为每个字符提供了唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。
Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache’s),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。
因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在 UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0×41.
UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。

UTF-8
Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。

09/27/13

apache 404处理机制

1、tail -f access.0927|awk -F ‘”‘ ‘{print $3″ “$2}’|awk ‘{if($1==404) print $0}’ >list.txt

2、list.txt

404 318 138  GET /app2/styles/gn/200/365.jpg HTTP/1.0
404 318 195  GET /app2/styles/gn/200/401.jpg HTTP/1.0
404 318 160  GET /app2/styles/gn/200/402.jpg HTTP/1.0
404 318 131  GET /app2/styles/gn/200/389.jpg HTTP/1.0
404 318 153  GET /app2/styles/gn/200/385.jpg HTTP/1.0
404 318 121  GET /app2/styles/gn/200/382.jpg HTTP/1.0
404 318 156  GET /app2/styles/gn/200/383.jpg HTTP/1.0
404 318 153  GET /app2/styles/gn/200/388.jpg HTTP/1.0
404 318 126  GET /app2/styles/gn/200/361.jpg HTTP/1.0
404 318 159  GET /app2/styles/gn/200/365.jpg HTTP/1.0
404 318 198  GET /app2/styles/gn/200/368.jpg HTTP/1.0
404 318 186  GET /app2/styles/gn/200/361.jpg HTTP/1.0
404 318 121  GET /app2/styles/gn/200/365.jpg HTTP/1.0
404 318 233  GET /app2/styles/gn/200/376.jpg HTTP/1.0
404 318 142  GET /app2/styles/gn/200/382.jpg HTTP/1.0
404 318 192  GET /app2/styles/gn/200/369.jpg HTTP/1.0
404 318 196  GET /app2/styles/gn/200/366.jpg HTTP/1.0
404 318 197  GET /app2/styles/gn/200/383.jpg HTTP/1.0
404 318 234  GET /app2/styles/gn/200/365.jpg HTTP/1.0
404 318 183  GET /app2/styles/gn/200/402.jpg HTTP/1.0

 

3、awk ‘{print $5}’ list.txt |awk -F ‘/’ ‘{print $NF}’|xargs -i touch {}

 

09/27/13

apache 配备规则

下列指令都起作用的话,则会按A > B > C > D > E的顺序依次生效。

<Location />
E
</Location>

<Files xxx.html>
D
</Files>

<VirtualHost *>
<Directory /a/b>
B
</Directory>
</VirtualHost>

<DirectoryMatch “^.*b$”>
C
</DirectoryMatch>

<Directory /a/b>
A
</Directory>

 

09/27/13

获取每小时访问量

1、按照访问量排序

cat access.xxxx|awk -F ‘[‘ ‘{print $2}’|awk -F ‘:’ ‘{print $1″:”$2}’|awk ‘{a[$1]++} END{for(i in a){print i,a[i]}}’|sort -k 2 -rn

2、按照时间排序

cat access.xxxx|awk -F ‘[‘ ‘{print $2}’|awk -F ‘:’ ‘{print $1″:”$2}’|awk ‘{a[$1]++} END{for(i in a){print i,a[i]}}’|sort -k 1 -rn

3、最耗时的前100个请求的php页面, 分别显示响应时间 IP来源 请求发生的时间、 请求页
具体的情况要看你记录日志的格式,思路就是按照$request_time和$upstream_response_time进行排序,然后打印出我们关心的内容。

cat access.xxxx |awk ‘($7~/.php/){print $NF ” ” $1 ” ” $4 ” ” $7}’|sort -nr|head -100