ubuntu 下的lvs tunnel real server 配置注意

来个速记。

以前就因为一次内网调整,使用了一次lvs 的tunnel 模式,后来都没有配置过了,今天因为要配置外网的lvs ,再次弄了一下,才发现要注意一下了。

DR 模式下的rs 配置一般如下:

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
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
tunnel 的话,可以改成这样:
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up
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
直接执行的话,可能会出现以下错误(反正那个死人坑爹的ubuntu 出现了!!!还是得找机会换了它。。。)
SIOCSIFADDR: No such device
tunl0: ERROR while getting interface flags: No such device
SIOCSIFNETMASK: No such device
竟然不能建立tun 设备!!
好吧,tun 设备作为module 了,没有编译进去内核@@
modprobe ipip 即可。

haproxy 简单配置一个tcp 代理

haproxy 的tcp 应用,我实操过两次,一次是svn ,一次是openfile 。

最近一次就是openfire 了,因为忘了当时做svn tcp 代理时的配置,弄得焦头烂额的。。。mark 下,以免以后再次需要的时候忘记了。

global
log 127.0.0.1  local3 notice
ulimit-n 40960
maxconn 10240
user haproxy
group haproxy
nbproc  4
daemon
quiet
defaults
log     global
mode    tcp
option tcplog
listen mm
bind 0.0.0.0:5222
balance roundrobin
mode   tcp
server test 192.168.50.148:5222
当时的需求很简单,就是把访问到本机的5222 端口的所有请求代理到 148 的5222 。用iptables 其实也可以,却发现那台机器是openvz (BS 一下卖这个虚拟机给我朋友的某国内某大公司),用 iptables nat 的话,貌似要提权。

基于wp 的blog 遭遇一次自杀式攻击

微博的名人确实有杀伤力啊,周五的时候,Kaifu 老师的微博转了一下公司的博客地址,结果访问一下子涌过来了。5000 的访问里有3000+ 是访问 / ,wp 的 / 是动态的啊,难怪撑不住,load1m 飙到50 ,20 个php-fpm 忙得不行。我把这类都归结于自杀式攻击,其实,很多时候,弄死我们的,都是自己啊。

解决也不是很难,静态化吧。curl 一个首页放到wp 的文件夹里,命名为 index.htm ,顺便改改 nginx 的配置:

if ($uri = “/”){
rewrite “^/$” /index.htm break ;
}
完事,load1m 迅速下降到1 以下了。

处理这个事情的时候我正在打火锅呢,其实还想做得更完美一点的,静态化的首页,也能定时更新一下,但发现没那么简单,就放弃了。就放下去吃火锅了,天杀的谁想出来在这么热的天时吃火锅的!!

其实最好的做法就是,用 wp 的 wp super cache 插件。

tmux 下的vim 无法使用系统剪切板

Mac 下的vim 实在难用,连+python 都没有,自己重新编译是在所难免的了。最近使用中,发现,编译还得加上gtk 支持才行了。

vim 可以使用系统的剪切板,在vimrc 中加入

set clipboard=unnamed

即可。

但是,我发现,在 tmux 下的vim ,这个配置会导致,vim 完全不能复制粘贴,爆这个错:

E353: Nothing in register *

当前的vim :

$ vim –version | grep clipboard
-clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-xterm_clipboard -xterm_save
猜想,和 xterm_clipboard 有关吧,尝试把它编译进去。
port install vim +python27 +ruby +gtk2
编译需时间啊,gtk 啊!伤不起啊!!经过多个小时以后,才完成。。。当然也和我的烂网速有关。

好了,编译完成的vim 应该是以下这这样子:

$ vi –version | grep clipboard

+clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments

+xsmp_interact +xterm_clipboard -xterm_save

nginx+apache+dav_svn 的怪异问题

最近帮朋友的网站做个小优化,由apache 迁移到nginx ,结果问题多多,svn 在提交的时候竟然有这个错误:

$ svn ci -m”fix the mail problem “
Sending        util.php
svn: Commit failed (details follow):
svn: File ‘util.php’ is out of date
svn: ‘/svn/!svn/bc/496/trunk/util.php’ path not found
但是提交其它文件貌似没有问题。怪异到爆!!!

首先说说nginx 的配置。

svn 仍然使用 apache 的dav_svn ,只是端口由80 改为 1234,其它配置不改。

location  /svn {

proxy_pass http://127.0.0.1:1234 ;

proxy_set_header Host “svn.mysite.net” ;

}

终于在google 大神找到一篇俄文的mailing-list(http://www.lexa.ru/nginx-ru/msg39625.html),竟然有人和我同样的错误,也终于弄清楚什么事了。。。简直是自己白痴!!
我的php 的配置:
location ~ \.php$ {
root           /var/www/backend/  ;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
include        fastcgi.conf;
}
这个location 用了正则匹配,比svn 的普通location 优先级高,结果svn 提交util.php 的时候(会发送一堆svn 的指令如propfind , option 等),优先到php 的location 里,结果就出错了。。。
那svn 也用高优先级的location 匹配吧,修改一下,用前缀匹配:
location ^~ /svn
ok , 成功了。。。
事后我才看到,nginx 本身就有一个404 的log :
211.102.143.12 – hello [03/Jul/2011:15:34:53 +0800] “PROPFIND /svn/!svn/bc/496/trunk/util.php HTTP/1.1″ 404 31 “-” “SVN/1.6.15 (r1038135) neon/0.28.6″ “-”
唉。。。怪自己~~

一个无聊的故事

这是一篇无聊的blog ,那时候说起来有点搞笑,决定mark 下来。

以下一段是我同事的口述,但为了表述形象那么一点,我用第一人称。

话说前天,腹部突然来了感觉,然后就很自然地奔向WC 。刚进WC 看到Kaifu 老师正打开最外面那个蹲位的门,可能是我拖鞋声太响了。。。 他回头一看。。。微微一笑。。。就进去了。。。当时他一看,我一愣。。。。  想要不要说点啥,实在是想不出来说啥,他就已经进去了。然后我就进了他旁边的那个蹲位,从未离Kaifu 老师如此之近!!最深的一个印象是:Kaifu 老师好快啊,我第一波还没完,他就出去了⋯⋯

以下是我自己的口述。

话说昨天,我也在WC 遇到Kaifu 老师了,继在电梯,饭堂,又一次离Kaifu 老师如此的近了。这回,大家都只是来小的,我就站在他旁边。Kaifu 老师在小的方面似乎不够快啊,我完事了洗手走人了,他还没完⋯⋯

无聊,我真无聊~~~

一个关于cookie 的怪异登陆问题

近来有一些用户在某些网络环境下,登陆不了网站。通过详细的联系沟通,终于得出了结论。用户自己用http analyzer ,我在服务器端抓包。

用户端的请求头:

GET / HTTP/1.1
Accept:application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, /
Referer:http://www.zhihu.com/
Accept-Language:zh-CN
User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
UA-CPU:AMD64
Host:www.zhihu.com
Connection:Keep-Alive
Cache-Control:no-cache
Cookie:*****
我抓包得到的请求头:
GET / HTTP/1.1
Host: www.zhihu.com
Connection: keep-alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Qtnddkdrcx: zojajzrgfrdigltciezwhgoumzevhyzqexwfsgkkoyhpiyctzvwzbqzscjzqpuqrflttgfcuxuvzvfiurfjaojmgmenvrfgnqfolulvapnmnjhetvsmktvpdxxekebsrnnnzokqnyuesfldfpbgwcivwgmmjfkgtilacaixdlpibhhvckjbbsupufbjxbhuizwfuhfvyarrowwvipbzmvrh
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Cookie:
Cookie: *****

哇塞,基本全改了,除了cookie 也是那个,不过,多了一行空的cookie 。这是一个什么网络啊!!还加了一串不知道是什么的东西。

我测试了一下,nginx 是可以把 $http_cookie 正确读取出来的,但是后端的web 读取不了,读取了第一个空的cookie 。结果,一直认为用户没有cookie ,所以,用户就不能登陆了。

nginx 针对这种情况修复一下,在所有使用proxy_pass 的地方,加一行:

proxy_set_header Cookie $http_cookie ;

这样就把cookie 硬塞给后端了。

很不负责任地讲一句,我怀疑是运营商做的手脚。当然,也有可能是该用户的上网环境导致。

ubuntu server 下的syslog-ng

速写两篇blog ,最近忙死了。

将服务器的rsyslog 更改为 syslog-ng ,理论上syslog-ng 的配置应该是兼容syslog 的了,但无奈,发现不记录日志。

syslog-ng 的配置:/etc/syslog-ng/syslog-ng.conf 里

options { long_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
owner(“root”); group(“adm”); perm(0640); stats_freq(0);
bad_hostname(“^gconfd$”);
};

而因为使用了一段时间的rsyslog ,所以/var/log 目录下的一些文件,owner 都是 syslog ,难道因为这个原因!!

更改一下owner ,find /var/log/ -user syslog -exec chown root {} \;

搞掂,syslog-ng 工作了。

又是ubuntu server 的错!!!恨死了!!我一定要换了你!!!

tcp 内核参数对NAT 用户的影响

非原创,前同事参详出来的,我知道一下原因,但今天遇到了,决定mark 一下。

故障现象:

NAT 用户,也就是使用同一个出口ip 的那些用户,例如,使用办公网络的用户。NAT 用户访问网站时,表现为连接不上,技术一点说,就是建立不了tcp 握手。

很奇怪吧?同一个网络的用户,我可以访问,旁边的同学就不能访问。难道是RPWT 吗?

在网上可以搜到一个很普遍的系统优化方法,修改/etc/sysctl.conf ,添加

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

sysctl -p 让内核参数生效。

以前大家通常会遇到netstat 看到很多 TIME-WAIT 状态的连接,于是就会添加以上两句,加速回收TIME-WAIT 的资源。

但是这个优化现在已经行不通了。

为了提高TCP的性能,“RFC1323 – TCP Extensions for High Performance”提出了 一个机制(http://tools.ietf.org/html/rfc1323#page-29)来替代TIME- WAIT状 态的功能。linux 实现了它。这个机制通过记录来自每台主机的每个连接的分组时间戳来实现,要求 来自同一主机的同一连接的分组所携带的时间戳要比之前记录 的时间戳新,以便 “防止回绕的序号PAWS机制“ (http://tools.ietf.org/html/rfc1323#page-17) 丢弃接收属于旧连接的延时分组。这依赖于来自每个主机的每个 TCP连接分组所携 带的时间戳要单调递增才能实现。然而经过NAT的连接,其分组携带时间戳每个用户都不同的(甚至有人写了个论文,利用这个分组的时间戳来计算NAT 后端有多少台主机 http://phrack.org/issues.html?issue=63&id=3#article),也就是说同一个ip ,携带的时间戳不会单调递增。服务器端对同一个ip 过来的包的timestamp 做一个验证,导致这些连接分组被认为是属于旧 连接的延时分组而被丢弃。

具体有多少被drop 的包呢??请看 netstat -s 的其中一行

7439 packets rejects in established connections because of timestamp

为了防止这种情况呢,也很简单,修改一下内核参数,把 /proc/sys/net/ipv4/tcp_tw_{reuse,recycle} 的值都置为 0 吧。

为了纪念我连续工作超过24 小时

本周的第一天起床,多美好的一天啊,天清气爽的。9 点起床,10点半来到公司,恶梦才开始!!

服务器连续down 机,极其不稳定,由于各类服务我还没有上手,无奈,大部分情况下是眼睁睁地看着服务器down 的。晚上8 点到机房,12 点才把服务器装好上架。弄服务等东西,一直到了周二晚上的9 点左右,才把任务完成。服务器算是冷静下来了,算是过渡到一个较为稳定的状态了。打车回家,12 点躺下!共计39 小时,中间只是稍微趴了一下,大概就10+ 分钟。

为了纪念我连续工作超过24 小时,整整一天没有睡觉,我写下了这篇blog 。

虽然苦和累,但这段时间学习到的东西,在我旧东家可能得一个月了,因为时间都花费在和不懂技术的人的沟通去了,不错不错,哈哈。列几个遇到的问题和解决方案吧。

1,ubuntu server 的启动

装完以后,竟然开机启动后,载入到USB 的时候,会出现以下错误:

Gave up waiting for root device. Common problems:
-Boot args (cat /proc/cmdline)
-Check rootdelay= (did the system wait long enough?)
-Check root= (did the system wait for the right device?)
-Missing modules (cat /proc/modules; ls /dev)
/dev/disk/by-uuid/34e5c1 … does not exist …

然后就在 (initramfs) 这个提示符下了。

其实在这里,不算开不了机,exit 退出,就ok 了,继续linux 的启动过程,login 画面。

我的猜想嘛,内核没载入?也不是。不认 uuid ?也不是。本来不是大事情,exit 一下就好,但如果没有人在机器身边,那就无法重启了。

原因:initramfs 在载入到USB 驱动的时候,没载入完毕!必须等待其载入完毕,在内核里加一个rootdelay 就好了。

/boot/grub/grub.cfg 里,找到

linux   /vmlinuz-2.6.35-22-server root=UUID=541215f0-c868-40ec-b1d7-c7d083f18b80 ro   quiet

修改为
linux   /vmlinuz-2.6.35-22-server root=UUID=541215f0-c868-40ec-b1d7-c7d083f18b80 ro   quiet rootdelay=60
rootdelay 的时间,随意,30 或 60 应该都ok ,看自己机器的载入快慢吧,10 就太快了,呵呵。

2,ubuntu 的用户家目录加密

安装ubuntu 千万别加这个吧,哈哈。

encrypted home directory , 安装的时候,加上的话,用户的家目录就很安全了。会有以下情况出现。

/home/hello 是我的家目录,我没有登陆的话,如果有另一个用户想访问我的家目录,他会看不见我的家目录的所有被加密的所有文件,空空如也,简直好像被黑了!!

安全吧??但是,如果我有程序跑在我的家目录下呢??好吧,404 了,也爽歪歪了。

暂时没解决这个问题,因为太困了。也不敢贸然把 .Private 这类目录删了,以后在测试环境下弄。

3,DELL 的iDRAC6 远程控制卡

旧东家就是不帮我们弄一个远程控制卡,不搞无人值守机房。

我总算是玩到了这个东西了,不过因为连接的是内网,需要搭建一个vpn ,拨入vpn 以后,通过内网地址访问远程控制卡。

一个web 界面,我只是初玩,没时间细玩,have fun 。

4,DBA 了。

旧东家分工细了一点,有专门的DBA 。于是,我的DBA 技术到了09 年后,就没增长了。很多知识都落后了。

重新拾回来,实操了一下,充实!

5,nosql 了。

mongodb 更细致地看了一下,爽!

还有一些吧,忘了。第一次跨越一天的工作,累,但很爽,哈哈。