一、安装系统
因为业务系统的原因,只能采用CentOS5.X版本,这里采用的是5.8 x86_64版本
1)安装界面语言,选择英文,不选简体中文
2)分区,我不太喜欢用LVM,还是用基本文件系统

  • / 5G opt和home没有单独分区,都在/
  • /boot 128M 事实上即便是100M都用不完
  • /tmp 2G 临时文件,频繁读写,单独分个区
  • /usr 8G 这个并不需要很大,事实上8G已经太大了点
  • /var 40G 大量日志会频繁写到这里,单独分割区
  • swap 2G 2G足够,现在服务器内存都很大,并不需要按照2倍内存大小来分割这个区
  • /www 所有剩余的空间 WEB文件和一些应用全都会放在这里

3)安装类型,不选,选择现在定制,勾选Applications->Editors->VIM,勾选Base System->Base,勾选LANGUAGES->Chinese Support即可

系统安装完成后,第一件事,同步一下时间

ntpdate us.pool.ntp.org

我习惯用vim,不带代码高亮的vi用着很痛苦

shell> mv /bin/vi /bin/vi.bak
shell> ln -s /usr/bin/vim /bin/vi

二、配置YUM
1)备份初始的CentOS-Base.repo
2)关闭fastmirror
3)添加自定义镜像源源,南方电信用163,北方网通用搜狐;有必要的话再添加epel
4)修改yum.conf排除一些包的升级,如php*5.3、kernel*等

shell>mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
shell>vi /etc/yum/pluginconf.d/fastestmirror  -->enable = 0
shell>wget http://mirrors.163.com/.help/CentOS5-Base-163.repo
shell>vi /etc/yum.conf -->exclude=php*5.3* exclude=kernel*

三、设置Selinux、SSHD、iptables与其他服务
关闭selinux可以通过setup或者修改/etc/selinux/config来实现,记得重启

shell>vi /etc/selinux/config -->SELINUX=disabled

SSH服务,只允许使用SSH2协议,使用1024位加密,禁止root登录,禁止空密码

shell>vi /etc/ssh/sshd_config
port xxxx #最好指定一个10000以上的端口
Protocol 2 #只是用SSH2
ServerKeyBits 1024 #使用1024位加密
MaxAuthTries  x    #指定一个密码错误的最大重试次数
UseDNS no
PasswordAuthentication yes
PermitRootLogin no #禁止root登录

修改/etc/sysconfig/i18n解决中文乱码,关闭不必要的众多系统服务

  shell>vi /etc/sysconfig/i18n
  LANG="en_US.UTF-8" #指定系统使用的字符集
  LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN" #指定应用程序使用的字符集,这行可以不要,注销掉
  SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en" #系统支持的字符集,重要
  SYSFONT="latarcyrheb-sun16" 

使用Putty或SecureCRT等ssh客户端时,记得指定字符集为UTF8,与上面例子中的字符集对应。

四、修改系统时区,配置NTPD服务,严重不建议使用ntpdate这种断点式的时间更新方法,可能会引发很严重的问题

五、安装Apache+Mysql+PHP
通过Yum安装,过程很简单,安装之前记得yum list php mysql httpd,看看所获取的软件包版本是否是自己需要的

#安装/更新公用库和一些常用的RPM
yum -y install gcc gcc-c++ autoconf make libtool libXaw dialog expect ntp expat-devel libxml2-devel libevent libevent-devel screen

#安装/更新Apache/PHP/MySQL/MemCache
yum -y install httpd php php-devel mysql mysql-server mysql-devel memcached
yum -y install php-pecl-memcache

#安装常用PHP扩展
yum -y install php-mysql php-gd php-xml php-mcrypt php-mbstring php-pear php-snmp libdbi-dbd-mysql

#Zend和eacclerator如果能找rpm包,也可以通过这种方式安装

分别为apache和mysql建立用户,创建文档目录,日志目录,设置权限等等,日志和数据目录最好在不同的挂载点上

#创建一个脚本来完成目录的创建于权限设置

htdocs="/www/htdocs"
mysql="/data/mysql"
PHPLOG="/var/log/php"
MYSQLLOG="/var/log/mysql"

if [ ! -d $mysql ]; then
        mkdir -p $mysql
fi

chown -R mysql:mysql $mysql
chmod 700 $mysql

if [ ! -d $htdocs ]; then
        mkdir -p $htdocs
fi
chown -R apache:apache $htdocs

if [ ! -d $PHPLOG ]; then
        mkdir -p $PHPLOG
fi
chown -R apache:apache $PHPLOG

if [ ! -d $MYSQLLOG ]; then
        mkdir -p $MYSQLLOG
fi
chown -R mysql:mysql $MYSQLLOG
chmod 700 $MYSQLLOG
chown -R apache:apache /var/lib/php/session

六、配置Proftpd建立ftp服务
Purefptd和Proftpd都很不错,我是因为找不到Pureftpd的RPM包,而且越来越不愿意手动编译安装所以才选用了Proftpd,同样支持虚拟用户/mysql,使用ftpasswd的命令创建/修改/删除用户的时候要输入的参数是在比较多,我写过一个很烂但是可以很简单的执行这些操作的脚本,写的很丑,就不贴出来了:-)

shell>yum install proftpd
shell>chkconfig –level 3 proftpd on
shell>vi /etc/proftpd.conf
#简单的配置文件修改
#添加下面代码进配置文件:
AuthUserFile /etc/ftpd.passwd
AuthGroupFile /etc/ftpd.group

#关闭检测/etc/shells:
RequireValidShell off

#设置仅使用虚拟用户认证:
AuthOrder mod_auth_file.c

#禁止PAM认证:
PersistentPasswd off
AuthPAM off

#限制改变根目录:
DefaulRoot ~

#结束

shell>cd /usr/sbin/
shell>wget http://www.castaglia.org/proftpd/contrib/ftpasswd
shell>chmod +x ftpasswd

ftpasswd工具的格式如下:

添加用户:
ftpasswd -passwd -file /etc/proftpd/ftpd.passwd -uid {uid} -gid {gid} -home {home} -shell /sbin/nologin -des -name {username}

更改密码: 
ftpasswd -passwd -change-password -file /etc/proftpd/ftpd.passwd -name {username}

删除用户: 
ftpasswd -passwd -delete-user -file /etc/proftpd/ftpd.passwd -name {username}

更多命令执行 ftpasswd -help或查看:http://www.castaglia.org/proftpd/contrib/ftpasswd.html

proftpd详细的配置文件说明在 这里,常见问题在 这里

七、配置Awstats流量统计
Awstats.org下载最新的RPM包安装即可,当然,按日统计的话,Apache里要配置Cronolog进行日志轮询

shell> yum -y install perl-libwww-perl.noarch
shell> wget http://prdownloads.sourceforge.net/awstats/awstats-7.0-1.noarch.rpm
shell> rpm -ivh awstats-7.0-1.noarch.rpm
shell> cd /usr/local/awstats/tools/
shell> ./awstats_configure.pl

八、配置服务器监测报告
1)配置Logwath进行系统监控,不支持Sendmail的话可以配置MSMTP使用SMTP发送邮件

shell>vi /usr/share/logwatch/default.conf/logwatch.conf
Mailto = logtome@domain.com #接受报告的邮箱
Range = yestoday  #报告的范围,默认昨天
Detail = 10 #报告内容的详细程度
Service = All #默认全部,可以单独指定
mailer="/usr/local/msmtp/bin/msmtp -t" #我机器上没有sendmail,使用的是msmtp

MSMTP我没有找到YUM安装包,开始手动编译安装

wget http://downloads.sourceforge.net/msmtp/msmtp-1.4.16.tar.bz2?modtime=1217206451&big_mirror=0
tar jxvf msmtp-1.4.16.tar.bz2
cd msmtp-1.4.16
./configure –prefix=/usr/local/msmtp
make && make install

配置MSMTP帐户

shell>cd /usr/local/msmtp
shell>mkdir etc
shell>vi etc/msmtprc

#示例
# Set default values for all following accounts.
defaults
logfile /var/log/msmtp.log
account srvlogwatch
# SMTP邮件服务器地址
host mail.xxx.com

# 发送的邮件Email
from log@abc.com
auth login

# 邮件服务器登录账号
user xxx@ab.com

# 邮件服务器登陆密码
password xxxxx
# Set a default account
account default : srvlogwatch

保存退出,然后

chmod 600 msmtprc

注:msmtprc设置属性为600后,如果web用户没有对这个文件的读取权限会导致无法在web或其他应用中使用

shell里执行:

/usr/local/msmtp/bin/msmtp youremail@test.com

输入任意字符,按Ctrl+D退出,看看是否能够收到邮件

还可以通过mutt发送(指定发件人/带附件/有抄送)

echo "邮件内容" | mutt -e "my_hdr from:kuka<lucky@crsay.com>" -a /root/file.txt.zip -s "邮件主题" "用户1<user1@gmail.com>" -c user2@gmail.com

2)配置服务器厂商的硬件检测软件,如戴尔的Dset等,如果有办法定时检测,通过邮件发送就好了,还没研究

九、系统流量监控
我用的是轻量级的Monitorix,感觉还行,其他的那些功能强悍的以后再说吧

十、优化内核,修改文件句柄数
1)修改sysctl.conf

shell>vi /etc/sysctl

net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768
net.ipv4.tcp_max_tw_buckets = 180000
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.ipv4.tcp_timestamps = 0
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_probes = 5
#net.ipv4.tcp_keepalive_intvl = 15
#net.ipv4.tcp_keepalive_time = 1800
#net.ipv4.ip_local_port_range = 1024  65535

net.nf_conntrack_max = 655360

net.netfilter.nf_conntrack_tcp_timeout_established = 1200

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.ipv6.conf.all.disable_ipv6 = 1

修改完成后sysctl -p立即生效

2)关于文件句柄
在Linux下,用ulimit -n 命令看到的是单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。

shell>vi /etc/security/limits.conf

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
*               -       nofile          65536

增加最后一行,修改句柄数量为65536
*表示针对所有用户
hard/soft分别是指硬性限制还是软性限制
65536是指句柄数量

补充:

采用rpm方式安装php/nginx/eacclerator/php-fpm时一定要注意一点,那就是一些rpm包内默认使用的用户是nobody,也有一些默认使用的是nginx或www之类的,安装完毕后需要检查确认保证使用的用户最好是一致的,避免出现因为帐户原因导致一些目录无法穿件或写入,这会导致运行时出错,但平常是隐形的无法发现