Skip to content


linux 下 lynx 安装

Lynx是一个基于文本的浏览器
下载地址
http://ftp.iasi.roedu.net/mirrors/lynx.isc.org/current/

lynx 依赖于openssl

安装lynx

运行下面的命令安装lynx:

./configure --prefix=/usr --libdir=/etc --with-ssl --with-zlib && make && make install && make DOCDIR=/usr/share/doc/lynx-2.8.4/lynx_doc \    HELPDIR=/usr/share/doc/lynx-2.8.4/lynx_help install-doc && make DOCDIR=/usr/share/doc/lynx-2.8.4/lynx_doc \    HELPDIR=/usr/share/doc/lynx-2.8.4/lynx_help install-help && sed s/"t\/etc"/"t\/usr\/share\/doc\/lynx\-2\.8\.4"/ \    /etc/lynx.cfg > /etc/lynx.bak && mv /etc/lynx.bak /etc/lynx.cfg

命令的解释

--libdir=/etc : For some reason, the 使 lynx 利用prefix 指出的目录作为库文件的目录。我们把它设为 /etc ,所以他的设置文件为 /etc/lynx.cfg.

--with-ssl : 使lynx具有SSL。

--with-zlib : 把zlib添加到lynx.

DOCDIR=... HELPDIR=... : 我们使用这些变量避免在/etc中生成帮助和文档。

sed... mv /etc/lynx.bak /etc/lynx.cfg : This sed 命令改变 /etc/lynx.cfg 文件使他看起来更像是在指定位置的帮助文档。

设置 lynx

设置文件

/etc/lynx.cfg

设置信息

很多设置(例如代理)可以在/etc/lynx.cfg文件中进行设置。

Posted in LINUX, 技术.


自动mount分区

fdisk -l 得到需挂载的硬盘/dev/sda1

先mount一下

mkdir /opt && chmod 0777 /opt

mount /dev/sda1 /opt

成功后改/etc/fstab里的LABEL名字的步骤如下:

e2label /dev/sda1 /opt

修改并写入/etc/fstab
例如:
LABEL=/opt          /opt                   ext3    defaults        1 2

重启

Posted in LINUX, 技术.


linux下安装lucene

apache+tomcat整合 
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html

 了解
KinoSearch
A Perl search engine library.
http://www.rectangular.com/kinosearch/
 

Plucene基于java lucene项目创建
安装方法:
perl -MCPAN -e “install Plucene”
perl -MCPAN -e “install Plucene::Simple”

Zend Framework
http://framework.zend.com/download

CLucene
CLucene是C++版的全文检索引擎,完全移植于Lucene,采用 STL 编写。有php扩展,对中文支持不是很好。
http://sourceforge.net/projects/clucene/

Lucene4c
The Lucene4c project is an implementation of the Lucene search engine in C, built on top of the Apache Portable Runtime.  
http://incubator.apache.org/lucene4c/

Nutch
Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
http://lucene.apache.org/nutch
http://nutch.sourceforge.net/docs/en/about.html
===============================================

jdk6 http://www.java.net/download/jdk6/6u10/promoted/b24/binaries/jdk-6u10-beta-bin-b24-linux-i586-14_may_2008-rpm.bin
ant http://apache.mirror.phpchina.com/ant/binaries/apache-ant-1.7.0-bin.tar.gz
lucene http://apache.mirror.phpchina.com/lucene/java/lucene-2.3.2.tar.gz
javac https://javacc.dev.java.net/files/documents/17/26776/javacc-4.0.tar.gz
php-java bridge http://nchc.dl.sourceforge.net/sourceforge/php-java-bridge/php-java-bridge_5.2.2.tar.gz
tomcat http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz

使用tomcat可以跳过第六步

一 安装java环境
[root@dev ~]# java -version
java version “1.4.2”
gcj (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)

[root@dev ~]# rpm -qa |grep java
java-1.4.2-gcj-compat-1.4.2.0-26jpp
注:通常,您不必使用 RPM 卸载 JRE,因为 RPM 可以在您安装新版本时自动卸载旧版本的 JRE!除非您准备永久删除 JRE,否则请跳过本节内容。

[root@dev ~]# rpm   -e   java-1.4.2-gcj-compat-1.4.2.0-26jpp

http://download.java.net/jdk6/
下载jdk包
[root@dev ~]#wget –limit-rate=20000 http://www.java.net/download/jdk6/6u10/promoted/b24/binaries/jdk-6u10-beta-bin-b24-linux-i586-14_may_2008-rpm.bin
限制20k

[root@dev ~]# chmod 755 jdk-6u10-beta-bin-b24-linux-i586-14_may_2008-rpm.bin\?e\=1212404509\&h\=a151b74ce54cda9cba81a7444944c0ba

[root@dev ~]#./jdk-6u10-beta-bin-b24-linux-i586-14_may_2008-rpm.bin\?e\=1212404509\&h\=a151b74ce54cda9cba81a7444944c0ba
一路空格后健入yes

[root@dev ~]# vi /etc/profile
set JAVA_HOME=/usr/java/jdk1.6.0_10
export JAVA_HOME
set PATH=$PATH:$JAVA_HOME/bin
export PATH
set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CLASSPATH

bourne shell家族中赋值不用set,这个郁闷了我好久没找到变量无效的原因。
[root@dev ~]# source /etc/profile 

用文本编辑器新建一个Test.java文件,在其中输入以下代码并保存:

    public class Test {
      public static void main(String args[]) {
        System.out.println(“A new jdk test !”);
      }
    }

编译:在shell终端执行命令 javac Test.java
如果出错可能是javac还没装,先接着下面安装javac后,再返回到这里测试。

运行:在shell终端执行命令 java Test

当shell下出现“A new jdk test !”字样则jdk运行正常。

二 安装ant
http://ant.apache.org/bindownload.cgi
ant是一个基于JAVA的自动化脚本引擎,脚本格式为XML。除了做JAVA编译相关任务外,ANT还可以通过插件实现很多应用的调用,比make脚本来说还要好维护一些。

[root@dev ~]# wget http://apache.mirror.phpchina.com/ant/binaries/apache-ant-1.7.0-bin.tar.gz

[root@dev ~]# tar zxvf apache-ant-1.7.0-bin.tar.gz

[root@dev ~]# mv apache-ant-1.7.0 /usr/local/

[root@dev ~]# vi /etc/profile

在JAVA_HOME前加上
ANT_HOME=/usr/local/apache-ant-1.7.0
export ANT_HOME
编辑
set PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin

[root@dev ~]# source /etc/profile 

三 安装lucene
wget http://apache.mirror.phpchina.com/lucene/java/lucene-2.3.2.tar.gz
不是lucene-2.3.2-src.tar.gz哦,这个无lucene-demos-2.3.2.jar
[root@dev ~]# tar zxvf lucene-2.3.2.tar.gz

[root@dev ~]# mv lucene-2.3.2 /usr/local

四 安装javac
https://javacc.dev.java.net/files/documents/17/26776/javacc-4.0.tar.gz
[root@dev ~]# wget https://javacc.dev.java.net/files/documents/17/26776/javacc-4.0.tar.gz

[root@dev ~]# gunzip javacc-4.0.tar.gz

[root@dev ~]# tar -xvf javacc-4.0.tar

[root@dev ~]# mv javacc-4.0 /usr/local/

[root@dev ~]# cd  /usr/local/lucene-2.3.2

[root@dev ~]# echo javacc.home=/usr/local/javacc-4.0 > ~/build.properties

[root@dev ~]# ant

五 测试lucene
再修改/etc/profile,在CLASSPATH前加上
LUCENE_HOME=/usr/local/lucene-2.3.2
修改变量
CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:${LUCENE_HOME}/lucene-core-2.3.2.jar:${LUCENE_HOME}/lucene-demos-2.3.2.jar

#source /etc/profile

生成索引

[root@dev ~]# cd ./src/demo

[root@dev demo]# java org.apache.lucene.demo.IndexFiles /usr/local/lucene-2.3.2/docs
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/lucene/demo/IndexFiles
Caused by: java.lang.ClassNotFoundException: org.apache.lucene.demo.IndexFiles
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: org.apache.lucene.demo.IndexFiles. Program will exit.

出现以上错误估计是CLASSPATH没写对。

搜索…,输入以下命令就会出现搜索提示符。
[root@dev demo]# java org.apache.lucene.demo.SearchFiles

六 安装php-java bridge
php/Java bridge
What is php/Java bridge?
The php/Java bridge is an optimized, XML-based network protocol, which can be used to connect a native script engine, PHP, with a Java or ECMA 335 virtual machine. It is more than 50 times faster than local RPC via SOAP, requires less resources on the web-server side, and it is faster and more reliable than direct communication via the Java Native Interface. read more…
http://php-java-bridge.sourceforge.net

[root@dev ~]# wget –limit-rate=15000 http://nchc.dl.sourceforge.net/sourceforge/php-java-bridge/php-java-bridge_5.2.2.tar.gz

[root@dev php-java-bridge-5.2.2]# /opt/lampp/bin/phpize && ./configure –disable-servlet –with-java=/usr/java/jdk1.6.0_10 && make CFLAGS=”-m32″ && make install
./configure: line 2969: php-config: command not found
./configure: line 2970: php-config: command not found
configure: error: Cannot find php-config. Please use –with-php-config=PATH

缺少xampp开发包和php-config 路径设置
http://sourceforge.net/project/showfiles.php?group_id=61776&package_id=60248

[root@dev ~]# tar -zxvf xampp-linux-devel-xxx.tar.gz

[root@dev ~]# mv lampp/* /opt/lampp/

mv: cannot overwrite directory `/opt/lampp/lib’
mv: cannot overwrite directory `/opt/lampp/modules’
mv: cannot overwrite directory `/opt/lampp/share’

手动一个个移啦

[root@dev php-java-bridge-5.2.2]# /opt/lampp/bin/phpize && ./configure –disable-servlet –with-php-config=/opt/lampp/bin/php-config –with-java=/usr/java/jdk1.6.0_10 && make CFLAGS=”-m32″ && make install

make[1]: *** [php/java/bridge/JavaBridgeIllegalStateException.o] Error 1
make[1]: Leaving directory `/root/php-java-bridge-5.2.2/server’
make: *** [/root/php-java-bridge-5.2.2/modules/stamp] Error 2
报两个错,不去理它

[root@dev php-java-bridge-5.2.2]# cp modules/java.so /opt/lampp/modules/

vi /opt/lampp/etc/php.ini
加上
extension=”java.so”

[root@dev php-java-bridge-5.2.2]# /opt/lampp/lampp start
Starting XAMPP for Linux 1.6.1…
PHP Warning: PHP Startup: Unable to load dynamic library ‘/opt/lampp/lib/php/extensions/no-debug-non-zts-20060613/java.so’ – /opt/lampp/lib/php/extensions/no-debug-non-zts-20060613/java.so: cannot open shared object file: No such file or directory in Unknown on line 0

[root@dev php-java-bridge-5.2.2]# cp modules/java.so /opt/lampp/lib/php/extensions/no-debug-non-zts-20060613/
[root@dev php-java-bridge-5.2.2]# /opt/lampp/lampp start
Starting XAMPP for Linux 1.6.1…
Exception in thread “main” java.lang.NoClassDefFoundError: php/java/bridge/Standalone
Caused by: java.lang.ClassNotFoundException: php.java.bridge.Standalone
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: php.java.bridge.Standalone. Program will exit.

不行咯,换成用tomcat
七 安装tomcat
http://tomcat.apache.org/tomcat-6.0-doc/setup.html
[root@dev ~]# wget –limit-rate=20000 http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz
[root@dev ~]# tar -zxvf apache-tomcat-6.0.16.tar.gz
[root@dev ~]# mv apache-tomcat-6.0.16 /usr/local/apache-tomcat

[root@dev ~]# vi /etc/profile
export JDK_HOME=${JAVA_HOME}

export CATALINA_BASE=/usr/local/apache-tomcat
export CATALINA_HOME=/usr/local/apache-tomcat
[root@dev ~]# source /etc/profile
[root@dev ~]# vi /etc/rc.d/rc.local
/usr/local/apache-tomcat/bin/startup.sh

测试
http://192.168.54.96:8080

 vi /usr/local/apache-tomcat/conf/server.xml

port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
URIEncoding=”UTF-8″#增加此行
redirectPort=”8443″>

<Host name=”localhost appBase=”webapps unpackWARs=”true autoDeploy=”true xmlValidation=”false xmlNamespaceAware=”false>

中增加以下内容,将weblucene设为根目录

  <Context path=” docBase=”/usr/local/apache-tomcat/webapps/weblucene reloadable=”true debug=”0 crossContext=”true />

server.xml默认有下面一行:

这样允许任何人只要telnet到服务器的8005端口,输入”SHUTDOWN”,然后回车,服务器立即就被关掉了。
从安全的角度上考虑,我们需要把这个shutdown指令改成一个别人不容易猜测的字符串。
例如修改如下:
,这样就只有在telnet到8006,并且输入”lizongbo”才能够关闭Tomcat.
注意:这个修改不影响shutdown.bat的执行。运行shutdown.bat一样可以关闭服务器。

参考Tomcat安全文档英文链接:http://jakarta.apache.org/tomcat/faq/security.html#8005
还有两个问题需要注意:
1、 对于tomcat3.1中,屏蔽目录文件自动列出的方法是什么?
缺省情况下,如果你访问tomcat下的一个web应用,那么如果你输入的是一个目录名,而且该目录下没有一个可用的welcome文件,那么tomcat会将该目录下的所有文件列出来,如果你想屏蔽这个缺省行为,那么可以修改conf/web.xml文件,将其中的:

default
org.apache.catalina.servlets.DefaultServlet

debug

0

listings

true
1修改为:

default
org.apache.catalina.servlets.DefaultServlet

debug

0

listings

false
1 默认的shutdown.sh一执行就死机,用网上的代替
http://noroot.info/node/16153

# cd /usr/local/apache-tomcat/bin
# mv shutdown.sh shutdown.sh.old
# vi /usr/local/apache-tomcat/bin/shutdown.sh //创建新的shutdown.sh关闭服务脚本

<coolcode>

#!/bin/sh
TOMCAT_PID=`/bin/netstat -anp|/bin/grep :8080 |/bin/gawk ‘{print $7}’ |/bin/gawk -F [/] ‘{print $1}’`
/bin/kill -9 $TOMCAT_PID 2>/dev/null
if [ $? -ne 0 ];then
echo ‘Tomcat is not running.’
else
echo “Succeed to shutdown tomcat.”
fi
</coolcode>
# chmod a+x shutdown.sh //为新建的脚本文件增加执行权限

八 apache整合

可以避免打8080
编辑apache http.conf
<virtualhost 192.168.54.96>
servername devs.c1gstudio.com

ProxyPass / balancer://cluster/
<Proxy balancer://cluster/>
BalancerMember http://192.168.54.96:8080/
</Proxy>

</virtualhost>

Posted in Lucene, Tomcat, 技术.

Tagged with , , .


Linux的时间设置与同步 (NTP)

http://x.86516.com/index.php/uid-69-action-viewspace-itemid-4537

http://www.pool.ntp.org是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTP Server. NTP建议我们为了保障时间的准确性,最少找两个个NTP Server
asia的服务器地址
http://support.ntp.org/bin/view/Servers/NTPPoolServers

ntp.api.bz
ntp.api.bz 是一组NTP服务器集群,目前有6台服务器,位于上海电信。这项服务是 api.bz 继 http://sms.api.bz 移动飞信免费短信发送接口之后的第二项免费 API 服务。

第二步要做的就是在打开NTP服务器之前先和这些服务器做一个同步,使得我们机器的时间尽量接近标准时间. 这里我们可以用ntpdate命令

代码:

# ntpdate 0.uk.pool.ntp.org
6 Jul 01:21:49 ntpdate[4528]: step time server 213.222.193.35 offset -38908.575181 sec # ntpdate 0.pool.ntp.org 6 Jul 01:21:56 ntpdate[4530]: adjust time server 213.222.193.35 offset -0.000065 sec

配置和运行NTP Server

现在我们就来创建NTP的配置文件了, 它就是/etc/ntp.conf. 我们只需要加入上面的NTP Server和一个driftfile就可以了

代码:

# vi /etc/ntp.conf
server 0.uk.pool.ntp.org
server 1.uk.pool.ntp.org
driftfile /var/lib/ntp/ntp.drift

 

非常的简单. 接下来我们就启动NTP Server,并且设置其在开机后自动运行

代码:

# /etc/init.d/ntpd/start

# chkconfig –level 35 ntpd on

 

ntpstat 和 ntpq -p 查看本机NTPD服务状态.

http://www.ntp.org/downloads.html

Guide to install NTP for Unix/Linux

  • gzip -d ntp-4.1.72.tar.gz
  • tar -xvf ntp-4.1.72.tar
  • cd ntp-4.1.72
  • ./configure
  • make
  • make check
  • make install

 

修改 Linux 系统时区
1. 查看当前时区

 # vi /etc/sysconfig/clock

2. 修改设置时区

  方法(1)
  # tzselect
  方法(2 仅限于RedHat Linux 和 CentOS)
  # timeconfig

3. 复制相应的时区文件,替换系统默认时区

  # cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
  对于中国服务器则执行:
  # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4. 将当前时间写入BIOS永久生效(避免重启后失效)

  # hwclock
参考:http://kb.discuz.net/index.php?title=%E4%BF%AE%E6%94%B9_Linux_%E7%B3%BB%E7%BB%9F%E6%97%B6%E5%8C%BA

有关ntpdate和ntpd

时钟的跃变,有时候会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。

不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:

第一,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。

第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。

第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。

因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。

NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

Posted in LINUX, 技术.

Tagged with , .


No space left on device

设置crontab 时提示No space left on device
用df -k 检查还有空间

用df -i  显示 /var 已占用100%,如果inode耗尽,则系统上将不能创建文件。

在/var/spoo/clientmqueue/下有超多的文件 ls 半天没反应
用rm -rf * 会自动跳出root,用xargs来解决。

# cd /var/spool/clientmqueue

# ls | xargs rm -f


原因分析:系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法:  将crontab里面的命令后面加上> /dev/null 2>&1

Posted in LINUX, 技术.


textarea在ie7存在自适应宽度bug

使用css width:99%控制宽度,当你从文本文件中粘贴一篇无换行的文章时,textarea的滚动条会自动跳至文本框顶部,影响输入。估计是ie7不能准确显示无换行内容的高度,在ie6,ff下无此问题。

解决方法是去掉css,在textarea中用cols=90 写死宽度,IE7宽屏显示效果会差点,在FF下由于外部套了table仍然会自适应宽度。

Posted in HTML/XHTML/CSS, 技术.


通过sendemail脚本发送smtp邮件

http://caspian.dotconf.net/menu/Software/SendEmail/

Posted in LINUX, 技术.

Tagged with .


linux下在线拼音输入法和在线英文字典

http://dict.cn/tools.html#hczs

在线拼音输入法
Online Chinese Input Method Editor (IME)

在线英文字典

如何在网页中使用划词助手:
打开任意一个网页,然后点击收藏夹中的”Dict”链接。
您的当前网页会在页面的左上角显示一个Dict.CN的划词助手控制面板。
此时划词助手已经激活,您可以在网页中用鼠标选中或双击要查看的单词,解释和例句会立刻出现在弹出窗口。

Posted in LINUX, 技术.


linux 磁盘空间监控脚本 smtp邮件通知

以下内容存成chkdesk.sh

<coolcode>

 

#!/bin/bash  DISKUSAGE=$(df -h |awk -F " " '{print $5}'|sort -n -r|sed -n '1s/[^0-9]//p') DIR=$(df -h |awk -F " " '{print $5,$1}' |sort -nr|awk -F " " 'NR==1 {print $2}') NUM=80 (定义的磁盘非分比)

function Send_Mail { (sleep 2;echo "helo localhost" sleep 1;echo "auth login" sleep 1;echo "YW5keQ==" (base64后的用户名) sleep 1;echo "MTIzNDU2"  (base64后的密码) sleep 1;echo "mail from:<[email protected]>" sleep 1;echo "rcpt to:<[email protected]>" sleep 1;echo "data" sleep 1;echo "From:"disk" <[email protected]>" sleep 1;echo "to:"admin" <[email protected]>" sleep 1;echo "Subject:your web01 disk directory $DIR is full" sleep 1;echo "Content-Type:text/plain;" sleep 1;echo "Content:" sleep 1;echo "web01 disk  directory $DIR is full" sleep 1;echo "." sleep 1;echo "quit")| telnet 192.168.1.1 25 >/dev/null 2>&1 }  if [ $DISKUSAGE -ge $NUM ] ; thengmail         Send_Mail         echo "already suuess send alert message" fi

</coolcode>

Posted in shell, 技术.

Tagged with , .


速效解决TIME_WAIT过多问题kernel: TCP: time wait bucket table overflow

#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

下面解释一下为啥要这样写:

一个简单的管道符连接了netstat和awk命令。

——————————————————————

先来看看netstat:

netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT

你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。

——————————————————————

再来看看awk:

/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。

state[]
相当于定义了一个名叫state的数组

NF
表示记录的字段数,如上所示的记录,NF等于6

$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT

state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数

++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一

END
表示在最后阶段要执行的命令

for(key in state)
遍历数组

print key,”\t”,state[key]
打印数组的键和值,中间用 制表符分割,美化一下。

如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效。

===========2014-11-13更新========================
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 35000
net.ipv4.tcp_timestamps = 1
#for centos6
net.ipv4.netfilter.ip_conntrack_max = 122104 # 64bit4G=131072,64bit8G=262144
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 36000

如果使用tcp_tw_reuse,必需设置tcp_timestamps=1,否则无效
===================================================

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭,需要tcp_timestamps在两边都被打开;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭,不要在NAT网络里使用
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

下面附上TIME_WAIT状态的意义:

客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT

是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?

主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。

也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的,除非受到攻击。

还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

附上centos5.8 64bit 16G内存web服务器的配置

net.ipv4.netfilter.ip_conntrack_max = 255128 # 64bit4G=131072,64bit8G=262144
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 36000

net.ipv4.tcp_max_tw_buckets = 35000
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.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 300
net.ipv4.ip_local_port_range = 1024 65000

kernel.shmmax=6662000256

参考:
http://coolshell.cn/articles/11564.html

Posted in linux 维护优化, 技术.

Tagged with , .