基于HTTP返回头信息的服务器时间同步

因为偶尔遇到由于各种原因,我们在使用ntpdate的时候无法成功的跟服务器同步时间的现象,而一般情况下我们对时间的精度要求都不是太高,所以想到可以使用根据HTTP头里面的信息来校时的做法。
之前看到一个使用php编写的脚本,但是考虑到很多机器是没有php环境的,因此选用shell来进行代码的编写,尽量保证通用。

PS:这篇文章正好测试一下Gist插件,看看效果如何。

使用Apache的mod_headers和mod_setenvif为静态文件取消Cookie

因为静态图片一般都不需要使用Cookie,因此,将静态文件的SetCookie头都去掉是一个很好的加快网站访问速度的办法。使用Apache的话,可以用mod_headers和mod_setenvif两个模块实现。

首先在httpd.conf中加载这两个模块,然后写上如下代码:
SetEnvIf mime image/.* unset-cookie
Header unset Set-Cookie env=unset-cookie

这样,当Apache再遇到类型为图片的文件时,就不会发送Set-Cookie头,自然可以减少一点流量的开销,加快网站的访问速度。

Ctrl与Caps Lock键的交换

Emacs和VIM之所以这样受程序员的喜爱,是因为两者都有高度的可定制性,以及丰富的快捷键组合。利用这些快捷键组合,让你能够手不离键盘,就能完成大多数的工作。其实,用鼠标操作神马的,效率是极其低下的……

话说Emacs中,用到最多的两个快捷键组合,就是Meta键和Ctrl键。对于我们普通的键盘,Meta键还好,离手很近。不过,对于Ctrl键,就离得比较远了…… 网上有网友推荐的做法,是用手掌去按Ctrl键,不过,这样的方法,对于普通键盘还不错,但是对于笔记本来说,也不太实用。

正规的Unix键盘的键位布局,Ctrl键应该是在现在标准键盘的Caps Lock位置的。这样,按起Ctrl键,就方便多了。

那要怎么交换这两个键的键位呢?重新买一个键盘? No!! 其实,也不用换键盘,我们完全可以用软件的方式来实现两个键位的交换。
下面是我从网上整理来的方法:

Win7下交换键位的设置

其实Win7下面,方法还比较多,一种是直接修改注册表,实现全局的替换,另外一种,是让两个键的交换,只在Emacs窗口激活的时候生效。至于哪个更好,完全根据你自己的需要。

局部替换大法

这种方法,需要用到一个辅助软件,那就是大名鼎鼎的Auto (更多…)

限制SSH的登录IP

为了保证服务器的安全,我们可以对SSH的登录IP进行限制。要实现这个功能,有两个方法:
1.IPTABLES大法
使用如下指令可以将1.2.3.4添加到可访问的IP列表内。如果要添加多个IP,只要多次执行第一句即可。第二句只需要执行一次。
# All connectsion from address 1.2.3.4 to SSH (port 22)
iptables -A INPUT -p tcp -m state --state NEW --source 1.2.3.4 --dport 22 -j ACCEPT

# Deny all other SSH connections
iptables -A INPUT -p tcp --dport 22 -j DROP

执行完了之后别忘了service iptables save保存修改
2.使用hosts.allow和hosts.deny
按照如下方式修改/etc/hosts.allow
# (更多…)

解决WordPress导致Apache的mod_status失效

今天申请了一个Linode账户,因为一直知道Linode的Longview很强大,于是准备体验一下。安装好之后发现自动检测到我运行了Apache,但是看不到具体的信息,因为我的Apache的Status页面没有配置好。
于是按照官方的教程进行配置,结果怎么访问都不成功。实验了多次并查找资料后发现,是我的Wordpress在捣鬼。
因为Wordpress启用了伪静态,所以所有的请求都会被重写向index.php,包括/server-status。于是直接导致了页面404。解决方法是在Wordpress的Rewrite规则中添加这一句:
RewriteRule ^(server-info|server-status) - [L]
这样如果Apache判断你的请求是server-info或server-status就会直接终止Rewrite,这样就不会将该请求重写到index.php,导致404了。

PS:在安装的时候还出现了一个小问题,就是发现在安装perl-DBD-MySQL的时候会失败,找不到依赖包。最后使用yum (更多…)

修复mod_spdy导致重定向循环

之前在别的服务器上做过一个测试网站,为了全部使用https就写了这么一个重定向规则在.htaccess中:
RewriteEngine On
RewriteCond %{HTTPS} off$ [NC]
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

之前工作的一直很好,直到我将apache的mod_spdy模块装上,准备给服务器部署上spdy支持。部署完spdy之后,该站的任何网页都打不开了,一直显示
This webpage has a redirect loop
但是使用IE浏览器的话还是正常的,可以正常的打开网页。于是查找资料,发现在启用了spdy协议之后,mod_rewrite就会获取不到正常的%{HTTPS}状态,从而导致无限的重定向,想让客户端使用https协议访问网站。在mod_spdy没有修复之前,有一个临时的解决办法,就是将重定向规则修改为如下这个样子:
RewriteEngine (更多…)

Linux Mount时遇到already mounted or busy

今天在处理服务器故障的时候遇到了一个奇怪的问题,在使用mount尝试挂载磁盘的时候,始终提示:
Mount: /dev/xxx already mounted or /mnt busy
奇怪的是,使用
df -h

lsof -n
都找不到任何相关信息,看起来这块磁盘既没有挂载,也没有进程在写目录。但是就是挂载不成功。
后来搜索了一下发现了一个解决办法:
首先使用
dmsetup ls
查看能否看到Device Mapper信息。如果显示类似:
[root@]# dmsetup ls
ddf1_44656c6c202020201028001510281f033832b7a2f6678dab (253, 0)
ddf1_44656c6c202020201028001510281f033832b7a2f6678dab1 (253, 1)
那么执行两次
dmsetup (更多…)

Linux挂载Windows共享文件夹或硬盘分区

好久没使用过samba了,刚刚需要在Fedora9下挂载Windows共享时,准备使用smbmount,执行smbmount的时候,提示没有这个命令,系统samba也安装了呀,为什么没有呢,google下才知道,从Fedora9以后就没有smbmount这个概念了,而是使用cifs (Common Internet File Systemcifs),也就是说在这以后的系统直接使用mount加参数cifs就可直接挂载Windows的共享了.

使用方法:

先在你的xp电脑里面添加一个共享的文件夹linux

#mount -t cifs -o username=fish,password=fish //192.168.1.10/linux /mnt/linux

这样就可以了很是方便

但是如果你要挂载你的硬盘分区的话,同样设置你的硬盘分区d为共享但是主要你的共享名称一定要是英文

#mount (更多…)

服务器批量执行工具 PSSH

操作一台服务器的时候可以 ssh,操作多台服务器可以开多个窗口多个 ssh,那操作很多台服务器呢?

我们的一个 Oracle Gird Engine 集群上大概有60多台 Ubuntu 服务器作执行节点,这些服务器操作系统和软件配置完全一样(上线后由 puppet 统一配置),有时候我们需要在这些服务器上做同样的操作,这个时候特别适合使用 PSSH 这种 ssh 批量操作工具。

当然,如果对 Python 不恐惧的话也可以用 Fabric 批量执行服务器任务。

下载和安装 pssh:

$ git clone http://code.google.com/p/parallel-ssh/
$ cd parallel-ssh/
$ sudo python setup.py install

批量执行

首先新建一个服务器列表文件,把需要操作的服务器的 hostname(或者 (更多…)

动态修改php的配置项

我们一般修改php的配置项都是在php.ini中修改。在php,ini中的修改会影响到所有使用php的程序。假如我想让修改只在某个域名下生效,该如何做呢?

使用ini_set()
首先想到的可能是使用ini_set()方法在脚本中修改。但是这个只能修改作用域为PHP_INI_USER和PHP_INI_ALL的配置项。具体配置项作用域说明请查看 PHP配置指令作用域说明

使用php_value
如果我访问wanke.etao.com下的url时,程序每次执行都自动加载一个header.php文件。但是,如果是通过shell脚本方式执行,就不要加载这个文件了。要实现这个需求,我们需要用到 auto_prepend_file 这个配置想。这个配置想的作用域是 PHP_INI_PERDIR 。 也就是说不能通过ini_set()方法设置。那我们可以通过php_value进行设置。

如果是apache+php的组合,我们可以在apache的配置文件中加入如下指令即可。

Php_value auto_prepend_file /home/www/wanke.etao.com/header.php

如果是nginx+php组合,可以加入如下指令

fastcgi_param PHP_VALUE “auto_prepend_file=/home/www/wanke.etao.com/header.php”;

注意,nginx中多次使用 PHP_VALUE时,最后的一个会覆盖之前的。如果想设置多个配置项,需要写在一起,然后用换行分割。如:

fastcgi_param PHP_VALUE “auto_prepend_file=/home/www/wanke.etao.com/header.php \n auto_append_file=/home/www/wanke.etao.com/external/footer.php”;

php官方对配置项设置的一些文档

php核心配置项说明
怎样修改配置设定
.user.ini 文件