月度归档:2011年06月

保存iptables配置

刷了某个版本的openwrt,发现里面没有端口映射选项,只能通过命令行用iptables来设置端口映射。
保存iptables默认是这样的:/sbin/service iptables save
保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时被应用, 可是万一保存了错误的指令修改起来麻烦。
想了一下,干脆自己建个脚本,如:port-forwarding.sh
把该文件放在rc.local文件中,
如加:/etc/rc.d/port-forwarding.sh
这样可以自动运行。
停止port-forwarding.sh,也可以建个脚本,如:port-forwarding-stop.sh
在该脚本中设置默认允许,
运行它,就可以停止端口映射
脚本权限要chmod 777,否则会提示permission denied无法执行
 

从VPS上Tracert,发现一个秘密

从Versaweb的机器上分别Tracert电信和联通,都走He,先看Tracert.

先看联通:
[root@server ~]# traceroute 123.125.141.222
traceroute to 123.125.141.222 (123.125.141.222), 30 hops max, 40 byte packets
1  76.164.193.25 (76.164.193.25)  11.886 ms  11.928 ms  11.999 ms
2  v502.core1.lax2.he.net (216.218.223.233)  22.365 ms  22.500 ms  22.728 ms
3  chinaunicom.gigabitethernet2-14.core1.lax2.he.net (216.218.200.70)  8.065 ms  8.054 ms  8.037 ms
4  219.158.30.245 (219.158.30.245)  191.402 ms  191.375 ms  191.371 ms
5  219.158.96.193 (219.158.96.193)  204.004 ms  204.023 ms  204.002 ms
6  219.158.3.189 (219.158.3.189)  212.642 ms  212.043 ms  212.024 ms
7  219.158.14.53 (219.158.14.53)  258.848 ms  258.997 ms  260.806 ms
8  202.96.12.50 (202.96.12.50)  245.424 ms  247.916 ms  245.307 ms
9  61.148.157.254 (61.148.157.254)  225.744 ms  225.843 ms  225.239 ms
10  bt-229-122.bta.net.cn (202.106.229.122)  245.141 ms  245.157 ms  244.735 ms
11  61.49.41.142 (61.49.41.142)  245.458 ms  245.559 ms  246.224 ms
12  123.125.141.222 (123.125.141.222)  275.793 ms  275.357 ms  275.548 ms

再看电信:
[root@server ~]# traceroute www.online.sh.cn

traceroute to www.online.sh.cn
(218.1.64.33), 30 hops max, 40 byte packets
1  76.164.193.25 (76.164.193.25)  0.356 ms  0.434 ms  0.507 ms
2  v502.core1.lax2.he.net (216.218.223.233)  8.913 ms  9.069 ms  9.161 ms
3  10gigabitethernet2-1.core1.lax1.he.net (72.52.92.121)  7.740 ms  7.796 ms  7.866 ms
4  chinatelecom.10gigabitethernet6-1.core1.lax1.he.net (64.71.131.134)  8.561 ms  8.562 ms  8.562 ms
5  202.97.49.117 (202.97.49.117)  8.963 ms  8.960 ms  8.954 ms
6   (202.97.51.101)  172.520 ms  172.343 ms  172.302 ms
7   (202.97.34.45)  192.857 ms  192.838 ms  192.824 ms
8   (202.97.33.17)  192.917 ms  192.909 ms  192.897 ms
9  61.152.86.45 (61.152.86.45)  198.570 ms  198.616 ms  198.606 ms
10  124.74.210.210 (124.74.210.210)  193.222 ms  193.271 ms  193.261 ms
11  218.1.4.66 (218.1.4.66)  201.705 ms  201.770 ms  201.830 ms
12  218.1.64.33 (218.1.64.33)  175.887 ms  179.711 ms  176.642 ms

不难发现:
联通的He是 chinaunicom.gigabitethernet2-14.core1.lax2.he.net   也就是1G的带宽。

电信的He是 chinatelecom.10gigabitethernet6-1.core1.lax1.he.net  也就是10G的带宽。

所以 联通到He抽也就不难解释了

中奖骗局又出升级版

前几天一个同事接到一个短信:内容是你中了大奖,奖金20万现金,联系电话等等。同事没有理会,现在这事多了都知道是骗局。

过了一阵同事的手机响了,一个南方小姐问:先生你收到中奖通知了吗?同事说收到了,小姐又说:请把你的银行卡的帐户告诉我们,我们把奖金汇进你的卡里。同事一想给你个帐号看你玩什么把戏,同事在工商银行有个熟人,于是就给她一个工行一卡通的帐号,十分钟后,同事的手机又响了,南方小姐说:先生你的奖金已经存进你的帐户里了,请你查询一下,同事用电话银行查询,果然进了20万。 同事高兴极了,白捡20 万。

30分钟后南方小姐来电话,带着哭腔对这个同事说:先生对不起,由于我的疏忽忘了抵扣奖金的个人所得税了,20万的20%也就是4万元,现在公司让我个人赔偿,请您把4万所得税汇回来好吗,求您把4万所得税汇回来好吗,求求您了。

同事一想也有理,也有可怜小姐之心,一想卡里还有钱,于是就到工行汇款,忽然他想到工行的哥们,就找到在工行的熟人,让他查一下,工行的熟人一查,是用其它行的支票汇过来的,虽然钱到帐,但当天入不了帐,也就是说20万今天取不出来,如果对方今天撤票,20万就没了,这一说,个个同事一听吓的直吐舌头,差一点4万就没了。

果然下班前那笔汇票撤销了。如果没有银行的朋友,如果不是专业人士,如果怕别人知道中奖,这个骗局一定会成功。这是真人真事,引以为戒哦。

以后的骗局会比这还高明,看完了别忘转,让更多的人知道防范措施。。

安装VNStat监控服务器流量

使用Linux VPS的时候应该还是比较关注自己VPS的流量的,怕有盗链或者流量超标而被停等等。而且现在N多家卖XEN架构的VPS,都不提供流量查询面板,根本看不到用了多少流量及各个时段的网站流量状况,所以急需一个流量监控工具。

vnStat是一个应用于Linux或BSD平台,对网卡流量做监控。 因为并非是基于网络包嗅探的方式而是基于/proc的分析。现在vnStat已经有出vnstat PHP frontend 扩展了,可以以PHP脚本的形式直接调用vnStat监测的数据。

下载:
wget http://soft.vpser.net/status/vnstat/vnstat-1.10.tar.gz

解压:
tar xvzf vnstat-1.10.tar.gz
进入目录:
cd vnstat-1.10/
编译安装:
make
make install
如果64位平台上编译的话用make 64bit命令

这样vnstat 就安装好了。下面是vnstat的工作运行配置。

下载最新版vnstat PHP frontend,
地址:http://soft.vpser.net/status/vnstat/vnstat_php_frontend-1.5.1.tar.gz

解压文件,改名为vnstat,然后上传到某个网站根目录下,这样就可以以http://www.vpser.net/vnstat
来访问到,就出来页面了,但此时没有数据,因为还要使系统生成数据。

建立流量数据库:
ifconfig 指令查看需要监控的网卡,假设只有eth0
然后生成数据库:
/usr/bin/vnstat -u -i eth0
然后定时更新数据库,通过cron的方式:

实际上在安装vnstat时,已经在系统里安装好了vnstat的cron,crontab内容在/etc/cron.d/vnstat,如果没有使用命令touch /etc/cron.d/vnstat 创建。
内容为:
0-55/5 *        * * *   root   vnstat -u -i eth0
0-55/5 *        * * *   root   vnstat –dumpdb -i eth0 >/var/lib/vnstat/vnstat_dump_eth0

第一行为安装时自动指定的.

第二行是为了更新eth0的数据后,dump出来一个文件,给 php访问接口访问.

这里dump出来的vnstat_dump_eth0 文件名是有规定的。

然后crontab -u root /etc/cron.d/vnstat 加入定时任务。

查看一下:
root@ubuntu-pristine:/
# crontab -l
0-55/5 *        * * *   root   vnstat -u -i eth0
0-55/5 *        * * *   root   vnstat –dumpdb -i eth0 >/var/lib/vnstat/vnstat_dump_eth0

最后,编辑 vnstat/config.php 这个文件,将数据目录改为 /var/lib/vnstat/,如果不存在此目录,需要使用mkdir -p /var/lib/vnstat/ 创建此目录。
即:
$data_dir = '/var/lib/vnstat/';

指定显示标题

$iface_title['eth0'] = 'VPS';

下面设置以什么图片格式显示,可以是svg或png,一般选择png就可以,svg在IE下需要安装插件,Firefox不需要;如果用png在IE、Firefox下均能直接显示。

$graph_format='png';

指定vnstat的安装目录,如果是安装上述方法安装,直接按下面填写即可。

$vnstat_bin = '/usr/bin/vnstat';

这一切都搞好后,现在用 www.mydomain.com/vnstat/
访问,就会发现有流量统计了,统计的数据更新是5分钟刷新一次.

点击查看原图

Nginx的一些优化(突破十万并发)

nginx指令中的优化(配置文件)

worker_processes 8;

nginx进程数,建议按照cpu数目来指定,一般为它的倍数。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

worker_rlimit_nofile 102400;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

use epoll;

使用epoll的I/O模型,这个不用说了吧。

worker_connections 102400;

每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

keepalive_timeout 60;

keepalive超时时间。

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

open_file_cache max=102400 inactive=20s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 30s;

这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

内核参数的优化

net.ipv4.tcp_max_tw_buckets = 6000

timewait的数量,默认是180000。

net.ipv4.ip_local_port_range = 1024    65000

允许系统打开的端口范围。

net.ipv4.tcp_tw_recycle = 1

启用timewait快速回收。

net.ipv4.tcp_tw_reuse = 1

开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_syncookies = 1

开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

net.core.somaxconn = 262144

web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

net.core.netdev_max_backlog = 262144

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_max_syn_backlog = 262144

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_timestamps = 0

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries = 1

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 1

在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_fin_timeout = 1

如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30

当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

一个完整的内核优化配置

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024    65000

一个简单的nginx优化配置文件

user  www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log  /www/log/nginx_error.log  crit;
pid        /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;

events
{
  use epoll;
  worker_connections 204800;
}

http
{
  include       mime.types;
  default_type  application/octet-stream;

  charset  utf-8;

  server_names_hash_bucket_size 128;
  client_header_buffer_size 2k;
  large_client_header_buffers 4 4k;
  client_max_body_size 8m;

  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 60;

  fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
                keys_zone=TEST:10m
                inactive=5m;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 16k;
  fastcgi_buffers 16 16k;
  fastcgi_busy_buffers_size 16k;
  fastcgi_temp_file_write_size 16k;
  fastcgi_cache TEST;
  fastcgi_cache_valid 200 302 1h;
  fastcgi_cache_valid 301 1d;
  fastcgi_cache_valid any 1m;
  fastcgi_cache_min_uses 1;
  fastcgi_cache_use_stale error timeout invalid_header http_500;
  
  open_file_cache max=204800 inactive=20s;
  open_file_cache_min_uses 1;
  open_file_cache_valid 30s;
  


  tcp_nodelay on;
  
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;


  server
  {
    listen       8080;
    server_name  ad.test.com;
    index index.php index.htm;
    root  /www/html/;

    location /status
    {
        stub_status on;
    }

    location ~ .*\.(php|php5)?$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fcgi.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
      expires      30d;
    }

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  /www/log/access.log  access;
      }
}

关于FastCGI的几个指令

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

这个指令为FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。

fastcgi_connect_timeout 300;

指定连接到后端FastCGI的超时时间。

fastcgi_send_timeout 300;

向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

fastcgi_read_timeout 300;

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_buffer_size 16k;

指定读取FastCGI应答第一部分需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。

fastcgi_buffers 16 16k;

指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大于256k的部分会缓存到fastcgi_temp指定的路径中,当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。

fastcgi_busy_buffers_size 32k;

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 32k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_cache TEST

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

fastcgi_cache_min_uses 1;

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_use_stale error timeout invalid_header http_500;

不知道这个参数的作用,猜想应该是让nginx知道哪些类型的缓存是没用的。以上为nginx中FastCGI相关参数,另外,FastCGI自身也有一些配置需要进行优化,如果你使用php-fpm来管理FastCGI,可以修改配置文件中的以下值:

<value name="max_children">60</value>

同时处理的并发请求数,即它将开启最多60个子线程来处理并发连接。

<value name="rlimit_files">102400</value>

最多打开文件数。

<value name="max_requests">204800</value>

每个进程在重置之前能够执行的最多请求数。

公交车上,前面一个年轻的妈妈给宝宝喂奶……

 

公交车上,前面一个年轻的妈妈给宝宝喂奶(母乳喂养哦),可能宝宝吃得不老实,年轻的妈妈威胁孩子:“吃不吃?不吃我给旁边的叔叔吃了啊!”说了几次,两站过后,旁边的叔叔说:“小朋友,你不吃就说一声啊,叔叔还有两站就下车了!”
 

解决phpmyadmin链接表”附加功能尚未激活”

phpmyadmin一直有“链接表的附加功能尚未激活”的问题,登陆phpmyadmin后,会在底部显示“链接表的附加功能尚未激活。要查出原因,请点击此处。”的提示。
第一步:使用Mysql管理员帐号通过phpmyadmin登陆,然后点击“导入”,然后点击“浏览”按钮,找到phpmyadmin文件夹下的scripts文件夹里的一个名为create_tables.sql的文件。把它导入就OK了。
第二步:打开phpmyadmin文件夹下的libraries文件夹,找到名为config.default.php的文件,使用文本编辑工具(不推荐使用记事本,建议使用Dreamweaver之类的工具)打开该文件。对其进行修改。
修改的内容并非连续的,请手动进行修改,请勿复制。
修改前的内容:
 $cfg['Servers'][$i]['pmadb'] = ”;
$cfg['Servers'][$i]['bookmarktable'] = ”;
$cfg['Servers'][$i]['relation'] = ”;
$cfg['Servers'][$i]['table_info'] = ”;
$cfg['Servers'][$i]['table_coords'] = ”;
$cfg['Servers'][$i]['pdf_pages'] = ”;
$cfg['Servers'][$i]['column_info'] = ”;
$cfg['Servers'][$i]['history'] = ”;
$cfg['Servers'][$i]['designer_coords'] = ”;
$cfg['Servers'][$i]['tracking'] = ”;

修改后的内容:

$cfg['Servers'][$i]['pmadb'] = ‘phpmyadmin’;
$cfg['Servers'][$i]['bookmarktable'] = ‘pma_bookmark’;
$cfg['Servers'][$i]['relation'] = ‘pma_relation’;
$cfg['Servers'][$i]['table_info'] = ‘pma_table_info’;
$cfg['Servers'][$i]['table_coords'] = ‘pma_table_coords’;
$cfg['Servers'][$i]['pdf_pages'] = ‘pma_pdf_pages’;
$cfg['Servers'][$i]['column_info'] = ‘pma_column_info’;
$cfg['Servers'][$i]['history'] = ‘pma_history’;
$cfg['Servers'][$i]['designer_coords'] = ‘pma_designer_coords’;
$cfg['Servers'][$i]['tracking'] = ‘pma_tracking’;

第三步:注销phpmyadmin之后并重新登录。大功告成!
 

亲,我怀孕了

一天晚上在家里上网,旺旺突然跳了出来窗口来对我说:“亲,我怀孕了”哥顿时一惊,心说自己没闯什么祸吧? 正发愣,那人又说:“明天去医院检查。” 心想你丫到底是谁,难道还要我陪你去检查,想讹我不成?正琢磨着,那人又说:“只能后天给你发货了”。