Nginx + Mongrel Cluster 在 CentOS 上部署 ROR
第 I 搭建基本环境
一、 什么是 CentOS
CentOS 是 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,号称 100% 兼容的重新组建,并去掉了所有 Red Hat 和其他商业商标以完全符合 Red Hat 的再发行要求。CentOS 在 RHEL 的基础上修正了不少 Bug ,并且提供了一些 RHEL 因为商业原因所不能或不愿提供的属性,相对于其他 Linux 发行版,其稳定性值得信赖,而且具有超长的维护时间,和方便的升级服务。
二、 安装 CentOS
版本:CentOS 5.0。下面是需要注意的地方:
1) 硬盘分区
这个没有固定的分法,选择一个当前应用环境下合理的方案即可,但是将来可能会出现的问题还是要考虑的:
1、 服务器有几块硬盘
2、 需要安装哪些软件
3、 将来还会有其它应用吗
……
网上有很多这方面的方案,下面提供一个80G以上 HTTP 服务器的磁盘分区方案:
/ (2G)
/boot (100M)
Swap (4G) 1G以下为内存的1.5-2倍1G-2G等于内存
/home (5G) 存放本机登陆用户资料、文件
/tmp (3G) 会有大量的临时文件和碎片(定时清空)
/usr (10G) 安装了大部分的软件,所以要考虑需要安装的软件大小进行分区
/opt (10G) 附加应用软件包的子目录树的根目录(以前的 Linux 是安装在 /usr/local 目录下,其实都没差别,只是把 /opt 单独分出来可以方便 mount 别的磁盘上,有一定扩展和灵活性)
/var/log (10G) 会有许多系统日志(定时清空)
/var (剩余空间) HTTP服务和其它服务位于这个目录下
2) 自行设定 IP、网关和 DNS(暂时不需要支持 IPV6)
3) 只安装服务器上必须的软件,如编辑器、MySQL服务器、开发工具和相关类库,其它的视情况而定。
三、 安装软件
如果有最新的软件版本,请下载安装最新的,因为最新的版本会修正旧版本软件中一些 bug,对软件和系统的稳定性是有很大帮助的。
下面安装过程的内容大部分是参考了robbin “在Linux平台上安装和配置Ruby on Rails详解”这篇文章,我在安装过程中有些小问题出现没有记录其中,现总结如下:
1) 升级系统
在安装任何软件之前先升级系统到最近的版本,在执行下面的命令之前要修改一下源,编辑 /etc/ yum.repos.d / CentOS-Base.repo,贴粘以下内容:
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.be10.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
#released updates
[update]
name=CentOS-$releasever - Updates
baseurl=http://mirror.be10.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
baseurl=http://mirror.be10.com/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirror.be10.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirror.be10.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://mirror.be10.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-5
这是国内的源,修改源的目的是为了更快地从网上下载软件来更新到系统里,当然如果觉得不安全而要到官方网站上更新,那么直接执行命令即可。CentOS 需要在 root 权限用户执行命令:
$ yum update
Linux 下升级的概念不是 Windows 下的从 2000 升级到 XP,它是升级系统已经安装的软件版本和 Linux 内核到更高版本,也可以指定只升级内核或某个软件。
升级完重启机器,命令是 $ reboot。
2) 安装 ImageMagick 和 RMagick
安装 ImageMagick 和 RMagick 要很小心,因为有许多细节需要注意,所以搞不好就会是个痛苦漫长的过程,这一步走通了,下面的也就好办了。
搜索系统是否默认安装了 ImageMagick
$ rpm –qa | grep ImageMagick
如果安装了,就卸载掉,因为默认安装的 ImageMagick 缺少类库,然后还要删除默认的ImageMagic的lib 和链接
$ rpm –e –nodeps ImageMagick
搜索类库,有则删除
$ find / -type f -iname libmagic.*
$ rm -rf xxx
$ rm -f /etc/ld.so.cache
$ ldconfig
如果执行下面两条命令没有结果显示,则表示删除干净
$ find / -type f -iname libmagic.*(查不到任何结果为止)
$ strings ld.so.cache|grep libmagic*(查不到任何结果为止)
好,可以进行下面的步骤了:
1. 安装相关类库
$ yum install gd-devel (安装必要的开发类库)
FreeType
Ghostscript fonts
JPEG
PNG
WMF
上面是必须安装的,如果项目中需要支持其它图形,可以另行安装
TIFF to read and write TIFF images.
Ghostscript, to read and write PDF and Postscript files.
LCMS, to perform ICC CMS color management.
libexif, to handle EXIF tags
libxml, to read SVG images
the ZLIB library, to handle compressed PNG and MIFF images.
the BZIP library, to read and write bzip2-compressed MIFF images.
其中FreeType、Ghostscript fonts、Ghostscript最好删除系统默认安装的,自己动手编译安装
2. 编译安装 ImageMagick
$ ./configure --disable-openmp --prefix=/usr/local/ImageMagick --with-gs-font-dir=/usr/local/share/ghostscript/fonts
配置选项要加上参数 --disable-openmp,安装的路径可以自行设置,这里的路径是 /usr/local/ImageMagick,--with-gs-font-dir 指定了ghostscript 的字体路径,如果能自动识别则更好,如果 /usr/local/share/ghostscript 目录下没有 fonts 文件夹,下载相关的字体库并拷贝至目录即可。
$ make && make install
安装成功后,编辑 /etc/profile加入下面两句(把ruby的路径也加进来了,其实是后面安装ruby后做的事情)
export PATH=/usr/local/ruby/bin:/usr/local/ImageMagick/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/ImageMagick/lib
编辑 /etc/ld.so.conf,新增一行:
/usr/local/ImageMagick/lib
退出编辑,执行命令:
$ ldconfig
将ImageMagick的库加入系统联接库。然后重启系统以便生效。
3. 编译安装 Rmagick
$ ./configure
$ make
$ make install
上面的过程小心地完成后,一般情况下编译是不会出错的。如果编译出错,则可能是某个图形类库安装有问题,要卸载手动编译安装,也可能是Ghostscript fonts的问题,比如找不到字体库会有类似下面这样的错误:
unable to read font `/usr/local/share/ghostscript/fonts/n019003l.pfb'(Magick::ImageMagickError)
把ghostscript-fonts解压后拷贝fonts文件夹至/usr/local/share/ghostscript目录,然后重新编译安装就可以了。
$ cp -r fonts /usr/local/share/ghostscript
如果没有错误发生,还要在irb里输入require 'RMagick',如果返回true,表示安装成功,可以松一口气,继续往下走!
3) 安装 OpenSSH
安装 OpenSSH 是为了远程管理的方便。OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。CentOS5 上已经默认安装,如果没有安装可以执行下面命令:
$ yum install openssh-server openssh-client
4) Subversion
为了方便把最新的源码更新服务器上,Subversion 是个不错的选择。在服务器上只需要安装 Subversion 的客户端即可。如果不敢确定系统里是否安装了,可以用下面的命令查询:
$ rpm –qa | grep subversion
命令也支持模式匹配,如
$ rpm –qa | grep sub*
会列出所有安装的以 sub 字母开关的 rpm 软件包。如果没有安装,则可以执行下面的命令进行安装:
$ yum install subversion
要获取服务器上的源代码可用以下命令:
$ svn co svn://serverIP/trunk/www/xxx --username=xxx --password=xxx
注:如果是从源码服务器上获取一个新的工程,需要对一些配置文件做修改,不然运行起来会出现一些莫名其妙的错误,如工程目录下的 dispatch.fcgi 要有可执行权限,如果 ruby 运行环境不同,要修改 dispatch.fcgi 第一行的环境配置。
5) MySQL5 的安装
由于之前已经安装了 MySQL 服务器,还需要安装 MySQL 软件,这里安装的是较新的稳定版本 MySQL5。先到官网(http://dev.mysql.com/downloads/mysql/5.0.html)下载源码,然后编译安装。编译的相关参数请参考网上的资料
$ wget http://mysql.oss.eznetsols.org/Downloads/MySQL-5.0/mysql-5.0.45.tar.gz
$ tar zxvf mysql-5.0.45.tar.gz
$ cd mysql-5.0.45
$ CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3" ./configure --prefix=/usr/local/mysql5 --without-debug --with-unix-socket-path=/usr/local/mysql5/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-charset=utf8 --with-extra-charsets=gbk,gb2312,utf8 --without-isam --with-pthread --enable-thread-safe-client
$ make && make install
MySQL 的安装路径自定义在了 /usr/local/mysql5。
后续还有相关的优化配置。
6) Ruby, Gems, Rails
先安装 Ruby:
$ wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.6.tar.gz
$ tar zxvf ruby-1.8.6.tar.gz
$ cd ruby-1.8.6
$ ./configure –prefix=/usr/local/ruby
$ make && make install
安装好之后为了对于全局有效,要修改 /etc/profile 文件
$ vim /etc/profile
在文件最后面加上这句话就可以了
export PATH=/usr/local/ruby/bin:$PATH
如果 $ ruby –v 没有显示版本信息,则需要重启机器以便生效。
好了,下面是安装 gems,下载最新的安装包(0.9.4版本在当时来说是最新的)
$ wget http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
$ tar xvf rubygems-0.9.4.tgz
$ cd rubygems-0.9.4
$ ruby setup.rb
$ gem -v
然后用 gem install 来安装 rails 及其所有依赖包
$ gem install rails –y
7) 安装配置 Mongrel Cluster
gem install mongrel mongrel_cluster –include-dependencies
新增系统用户 mongrel,并把工程目录的权限赋予 mongrel
$ adduser -r mongrel
$ chown -R mongrel:mongrel /var/www/business
$ cd /var/www/business
$ mongrel_rails cluster::configure -e production -p 8001 -N 10 -c /var/www/business -a 127.0.0.1 --user mongrel --group mongrel
在当前工程的目录 config 下生成一个mongrel_cluster.yml 配置文件,执行下面命令就可以启动 Mongrel 集群:
$ mongrel_rails cluster::start
为了让 Mongrel 集群在每次开机都能自动启动,把 mongrel_cluster 作为服务
$ mkdir /etc/mongrel_cluster
$ ln -s /var/www/business/config/mongrel_cluster.yml /etc/mongrel_cluster/business.yml
$ cp /usr/local/ruby/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.2/resources/mongrel_cluster /etc/init.d
$ chmod +x /etc/init.d/mongrel_cluster
$ ln -s /usr/local/ruby /usr/bin/ruby
$ ln -s /usr/local/ruby/bin/mongrel_rails /usr/bin/mongrel_rails
$ ln -s /usr/local/ruby/bin/mongrel_cluster_ctl /usr/bin/mongrel_cluster_ctl
$ chkconfig --level 345 mongrel_cluster on
注:如果执行 service mongrel_cluster start 出现“/usr/bin/env: ruby: 权限不够”的错误,就要检查工程 public 下的 dispatch.* 文件用户是否有执行权限
$ chmod 755 /var/www/business/public/dispatch.cgi
$ chmod 755 /var/www/business/public/dispatch.fcgi
$ chmod 755 /var/www/business/public/dispatch.rb
将三个文件的第一行指向 ruby 的安装路径 #!/usr/local/ruby/bin/ruby
打开 /usr/bin/mongrel_cluster_ctl 文件,如果第一行代码为 #!/usr/bin/env ruby,改为 !/usr/local/ruby/bin/ruby,上面的链接已经建立后,也可以改为 #!/usr/bin/ruby
8) 安装 ruby 的数据库适配器
rails发行包中已经自带纯ruby的MySQL数据库适配器,然而对于生产环境来说,我们仍然应该下载安装C版本的数据库适配器,以达到更好的性能。
$ wget http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.7.3.tar.gz
$ tar xzvf mysql-ruby-2.7.3.tar.gz
$ cd mysql-ruby-2.7.3
$ ruby extconf.rb --with-mysql-dir=/usr/local/mysql5
$ make && make install
注意--with-mysql-dir应该指向MySQL数据库的安装路径(前面 MySQL 数据库的安装路径为 /usr/local/mysql5),如果数据库服务器和Web服务器不在同一台机器上,那么Web服务器上也必须安装MySQL软件,因为ruby的C版本MySQL适配器需要在编译的时候联接MySQL的系统库。
9) 安装 Nginx
在安装Nginx之前,应该先确认需要启用哪些模块,启用这些模块需要安装哪些软件,如启用 ngx_http_gzip_module 模块需要先安装 zlib,启用 ngx_http_rewrite_module 需要先安装 pcre 和 pcre-devel,即Perl兼容的正则表达式库和相关开发类库。
然后下载 Nginx:
$ wget http://sysoev.ru/nginx/nginx-0.5.31.tar.gz
$ tar zxvf nginx-0.5.31.tar.gz
$ cd nginx-0.5.31
$ ./configure -prefix=/usr/local/nginx
$ make && make install
编译后配置:
$ cp /usr/local/nginx/conf/ nginx.conf /etc/ nginx.conf
然后修改/etc/ nginx.conf
***********************************************************************
user www;
worker_processes 10;
events {
use epoll;
worker_connections 1024;
}
http {
include conf/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1024;
gzip_buffers 4 8k;
gzip_types text/plain application/x-javascript text/css text/html application/xml;
upstream mongrel {
server 127.0.0.1:8001;
...
server 127.0.0.1:8010;
}
server {
listen 80;
server_name 192.168.10.8 safore.com www.safore.com;
location / {
root /var/www/business/public;
index index.html index.htm;
}
location / {
proxy_pass http://mongrel;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)$ {
root /var/www/business/public;
}
}
}
***********************************************************************
如果你希望服务器启动的时候就启动nginx
$ touch /etc/init.d/nginx
$ vim /etc/init.d/nginx
***********************************************************************
#! /bin/sh
### BEGIN INIT INFO
# Provides: skeleton
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: Example initscript
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
#
# Author: Ryan Norbauer
#
set -e
PATH=/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
CONF=/etc/nginx.conf
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
#
# Function that starts the daemon/service.
#
d_start() {
$DAEMON -c $CONF
}
#
# Function that stops the daemon/service.
#
d_stop() {
if test -s "$PIDFILE"
then
pid=`cat $PIDFILE`
kill $pid
else
echo -n "$NAME not running"
fi
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DESC: $NAME"
d_stop
# One second might not be time enough for a daemon to stop,
# if this happens, d_start will fail (and dpkg will break if
# the package is being upgraded). Change the timeout if needed
# be, or change d_stop to have start-stop-daemon use --retry.
# Notice that using --retry slows down the shutdown process somewhat.
sleep 1
d_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
***********************************************************************
保存退出编辑后执行
$ chmod 750 /etc/init.d/nginx
$ chkconfig nginx on
也可以通过下面的命令来操作nginx了
$ /etc/init.d/nginx start
$ /etc/init.d/nginx stop
$ /etc/init.d/nginx restart
10) 安装花生壳
下载花生壳安装包
$ wget http://mdl1.mydown.com/soft/200608/phlinux10all.tar.gz
$ tar zvxf phlinux10all.tar.gz
解压后的文件夹名字是 phlinux_package
$ cd phlinux_package
phlinux_package 里面有几个是针对不同版本的 Linux 和 BSD 安装包,我们用的是 redhat 的压缩包,解压后的名字是 phlinux_install
$ tar zvxf phlinux-1.0-install.redhat.tar.gz
$ cd phlinux_install
$ ./install.sh
安装时出现了错误:error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
这是因为花生壳 For Linux 版本是 2005 年更新的版本,编译的类库也是比较旧的,所以要先安装旧的类库才能编译安装
$ yum install libstdc++.so.5
$ ./install.sh
安装成功后会有设置提示,除了用户名和密码必须输入外,其它都采用默认值即可,安装后程序即运行,可以访问 http://localhost:6160 查看花生壳运行状态。如果填写错误想手工修改的话,也可以修改 /etc/phlinux.conf 文件。
如果想每次开机时自动运行花生壳客户端,在 /etc/rc.d/rc.local(不同的系统路径不同) 文件中加入一行内容 /usr/local/phlinux/phlinux -d
注:以互动配置模式运行phlinux程序并配置完成后,如监视web页面显示花生壳的在线状态为 "离线 / 认证失败",可能是由于您输入的用户名或密码错误,请重新以互动设置模式运行程序配置
# /usr/local/phlinux/phlinux –i
当网络出现问题时,花生壳会自动退出。为了解决这个问题,可以使用crontab来定时运行phlinux
$ crontab –e
* * * * * /usr/local/phlinux/phlinux -d (把这行新建进去,每分钟运行)
:wq (保存退出)
$ /etc/rc.d/init.d/crond restart (重新启动计划任务器)
四、
第 II 配置、优化环境——才刚刚开始
五、 优化配置 MySQL
优化 MySQL 的路任重道远,不是一时半会能做好的,下面的优化过程也是在一步一步地积累中。
新建一个名为mysql的用户组
groupadd mysql
在mysql用户组下新建一个名为mysql的用户
useradd -g mysql mysql
CentOS5 系统已经存在 mysql 用户和组,因此上面两步是可以省略的,其它系统则要创建一个赋予操作 MySQL 权限的用户和组。
将mysql的配置文件copy到/etc目录下,并更名为my.cnf
cp support-files/my-medium.cnf /etc/my.cnf
/usr/local/mysql5下面有5个my-xxxx.cnf文件
my-small.cnf 最小配置安装,内存<=64M,数据数量最少
my-large.cnf 内存=512M
my-medium.cnf 32M<内存<64M,或者内存有128M,但是数据库与web服务器公用内存
my-huge.cnf 1G<内存<2G,服务器主要运行mysql
my-innodb-heavy-4G.cnf 最大配置安装,内存至少4G
cd /usr/local/mysql5
进入安装目录
bin/mysql_install_db --user=mysql
以mysql用户的身份建立数据表
chown -R mysql .
chown -R mysql var
将var目录的属主设为mysql用户
chgrp -R mysql .
将mysql的主目录的属主设为mysql用户组(注意:和前面的命令不一样,这个命令是对用户组进行赋权)
bin/mysqld_safe --user=mysql &
启动mysql,如果一切正常的话,运行此命令后,不会有任何提示。
bin/mysqladmin -u root password password
修改root用户的密码,这里的root用户指的是mysql的root用户,与Linux的root用户无关。绿色的password就是你需要设置的新密码,牢记!
bin/mysql -u root -p
如果正常的话,用这个名字可以登录,在输入密码后,出现mysql > 的提示符表明登录成功。用quit命令可退出
以下命令用于设置mysql开机自动运行
cd mysql-VERSION
再次进入解压后的目录,即源码目录。
cp support-files/mysql.server /etc/init.d/mysql
将mysql.server这个文件copy到/etc/init.d/目录下,并更名为mysql
chmod 755 /etc/init.d/mysql
给/etc/init.d/mysql这个文件赋予“执行”权限
chkconfig --level 345 mysql on
加入到开机自动运行,运行级别为3 4 5
service mysql restart
重启mysql服务
六、 调整MySQL参数
$ vim /etc/my.cnf
[mysqld]
port=3306
…
max_connections=32000
#把MySQL的最大允许连接数从默认的100调成32000,这样就不会出现连接过多的问题
skip-locking
# 避免MySQL的外部锁定,减少出错几率增强稳定性
skip-name-resolve
#禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
back_log = 384
# back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。
试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数
key_buffer_size = 256M
# key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。
对于内存在4GB左右的服务器该参数可设置为256M或384M。
注意:该参数值设置的过大反而会是服务器整体效率降低!
sort_buffer_size = 6M
# 查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。
read_buffer_size = 4M
# 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
join_buffer_size = 8M
# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
skip-networking
# 开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!
thread_concurrency = 8
# 该参数取值为服务器逻辑CPU数量×2,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8
wait_timeout = 10
# 指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10
保存退出,重启mysql服务
七、 管理 MySQL
在 Linux 下 MySQL 的 root 帐号只允许在本机器登录,是不允许远程地址连接登录管理的,在服务器的日常管理中经常要对服务器上的数据进行管理维护,这时就要有个途径连接到远程 Linux 服务器上的 MySQL 数据库,因此需要创建一个可以从任何IP地址远程连接的MySQL帐号,比如用户名为 safore,密码为111111。
首先在 Linux 下通过 MySQL 客户端登录添加帐号和密码:
A、登录使用默认3306 端口的 MySQL
$ mysql –u root –p (/usr/local/mysql5/bin/mysql –u –root -p)
B、通过 TCP 连接管理不同端口的多个 MySQL(注意:MySQL4.1以上版本才有此功能)
$ mysql –u root –p –protocol=tcp –host=localhost –port=3307
C、通过 socket 套接字管理不同端口的多个 MySQL
$ mysql –u root –p –socket=/usr/local/mysql5/tmp/mysql.sock
D、通过端口和IP管理不同端口的多个 MySQL
$ mysql –u root –p –P 3306 –h 127.0.0.1
然后显示 Enter password: (输入密码)
mysql>GRANT ALL PRIVILEGES ON *.* TO 'safore'@'%' IDENTIFIED BY '111111';
如果提示信息为Query OK, 0 rows affected (0.01 sec),表示执行成功。
最后就可以通过其它工具远程登录 MySQL。
第 III 系统安全配置
八、 删除不需要的用户和组
系统默认新建了缺省的用户和组,应该删除不用的
userdel adm
userdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel operator
userdel games
userdel gopher
userdel ftp #如果你不允许匿名FTP,就删掉这个用户帐号
groupdel adm
groupdel lp
groupdel news
groupdel uucp
groupdel games
groupdel dip
groupdel pppusers
九、 更改下列文件权限,使任何人没有更改账户权限和增加删除服务:
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow
chattr +i /etc/services
如果用以上设置,那么连root也不能改,也不能删,也不能加,如果需要加的话,要用
chattr -i /etc/passwd
chattr -i /etc/shadow
chattr -i /etc/group
chattr -i /etc/gshadow
chattr -i /etc/services
然后再增加或是删除
十、 Root 帐户
在unix系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户,系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。TMOUT按秒计算。编辑你的profile文件(vim /etc/profile),在"HISTFILESIZE="后面加入下面这行:TMOUT=600
600,表示600秒,也就是10分钟。这样,如果系统中登陆的用户在10分钟内都没有动作,那么系统会自动注销这个账户。你可以在个别用户的“.bashrc”文件中添加该值,以便系统对该用户实行特殊的自动注销时间。改变这项设置后,必须先注销用户,再用该用户登陆才能激活这个功能。
十一、 建立管理员组内一般用户管理系统
一般用户的建立与删除
$ useradd xxx
$ passwd xxx
$ userdel -r xxx
在一般情况下,一般用户通过执行“su -”命令、输入正确的root密码,可以登录为root用户来对系统进行管理员级别的配置。但是,为了更进一步加强系统的安全性,有必要建立一个管理员的组,只允许这个组的用户来执行“su -”命令登录为root用户,而让其他组的用户即使执行“su -”、输入了正确的root密码,也无法登录为root用户。在UNIX下,这个组的名称通常为“wheel”。
$ usermod -G wheel xxx #将一般用户 xxx 加在管理员组wheel组中
$ vim /etc/pam.d/su #编辑配置文件
找到 #auth required pam_wheel.so use_uid,去掉行首的“#”,退出编辑,执行命令
$ echo "SU_WHEEL_ONLY yes" >> /etc/login.defs #把 "SU_WHEEL_ONLY yes" 添加到 /etc/login.defs 文件最后一行
以上操作完成后,可以再建立一个新用户,然后用这个新建的用户测试会发现,没有加入到wheel组的用户,执行“su -”命令,即使输入了正确的root密码,也无法登录为root用户。
十二、 关闭不需要的服务
1) 停止ipv6
在CentOS默认的状态下,ipv6是被启用的状态。因为我们不使用ipv6,所以,停止ipv6,以最大限度保证安全和快速。
确认一下ipv6功能是不是被启动的状态。
$ ifconfig –a
sit0 Link encap:IPv6-in-IPv4 显示这一行确认ipv6是被启动的状态
$ vim /etc/modprobe.conf
添加两行至行尾
alias net-pf-10 off
alias ipv6 off
退出编辑,重新生效
2) 停止服务
$ ntsysv
下面列出需要打开的服务,其它关闭:
cpuspeed (提高系统运行效率)
crond
iptables
irqbalance (仅当服务器CPU为S.M.P架构或支持双核心、HT技术时,才需开启,否则关闭。)
kudzu (自动检测硬件的变更)
microcode_ctl
mongrel_cluster
mysql
network
nginx
random
sendmail
sshd
syslog
3) 对TCP/IP网络参数进行调整,加强抗SYN Flood能力
$ echo ‘net.ipv4.tcp_syncookies = 1’ >> /etc/sysctl.conf
$ sysctl –p
4) 修改命令history记录
Bash shell在“~/.bash_history”(“~/”表示用户目录)文件中保存了500条使用过的命令,这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。bash shell应该保存少量的命令,并且在每次用户注销时都把这些历史命令删除。
第一步:“/etc/profile”文件中的“HISTFILESIZE”和“HISTSIZE”行确定所有用户的“.bash_history”文件 中可以保存的旧命令条数。强烈建议把“/etc/profile”文件 中的“HISTFILESIZE”和“HISTSIZE”行的值设为一个较小的数,比如30。编辑profile文件(vi /etc/profile),把下面这行改为:
HISTFILESIZE=30
HISTSIZE=30
这表示每个用户的“.bash_history”文件只可以保存30条旧命令。
第二步:还应该在"/etc/skel/.bash_logout" 文件中添加下面这行 "rm -f $HOME/.bash_history" 。这样,当用户每次注销时,“.bash_history”文件都
会被删除。 编辑.bash_logout文件(vim /etc/skel/.bash_logout) ,添加下面这行:
rm -f $HOME/.bash_history
5) 定时校正服务器时间
$ yum install ntp
$ crontab -e
加入一行,意思是每2个小时执行一次校正程序:
0 */2 * * * ntpdate 210.72.145.44
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
## 210.72.145.44 为中国国家授时中心服务器地址
十三、 安全的 SSH 服务器
1) 配置 SSH
编辑 SSH 服务器配置文件
$ vim /etc/ssh/sshd_config
#Port 22 注释取消,把22改为另外的端口
#ServerKeyBits 768 注释取消,将768改为1024(如果使用密钥登录)
#PermitRootLogin yes 注释取消,将yes改为no 禁止root登录(如果只使用普通用户登录)
#PermitEmptyPasswords no 取消注释,禁止空密码登录
#PasswordAuthentication no 取消注释,禁止使用密码方式登录(如果使用密钥登录)
保存退出。
为了只允许内网链接 SSH,编辑 /etc/hosts.deny 文件
$ vim /etc/hosts.deny
加入一行:
ALL: ALL
如果只是想禁止SSH,可以写 sshd: ALL。80端口不会受ALL: ALL影响。保存退出。
编辑 /etc/hosts.allow 文件
$ vim /etc/hosts.allow
加入一行:sshd: 192.168.1. 192.168.10.
保存退出。
重启 SSH:service sshd start
定时关闭/启动SSH服务
$ crontab –e
加入两行:
50 7 * * * service sshd start
50 23 * * * service sshd stop
意思是每天7:50开启ssh服务、23:50关闭ssh服务
2) 制作密钥
先切换进入一个wheel组的普通用户,输入 ssh-keygen -t rsa
第一步会让你先确认钥匙的文件名。保持默认就可以了。然后输入这个密钥的口令,再确认一次就可以了。
然后cd ~/.ssh 查看一下钥匙是不是都已经建立了。将公钥更改名称后删除
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
rm -rf ~/.ssh/id_rsa.pub 别把密钥误删就行了。
将公钥文件属性更改为400禁止被篡改
chmod 400 ~/.ssh/authorized_keys
剩下的就没什么了,把密钥COPY到U盘还是FTP服务器再转移或者是复制到磁盘上就看你自己的需要了。
启动 PuTTY ,在左侧找到Auth(认证方式)一项,点击Browse,选择刚刚用PuTTYGen转换后的私钥。然后点击左侧的Session,回到主机连接信息的设置。
十四、 给"/etc/rc.d/init.d" 下script文件设置权限
给执行或关闭启动时执行的程序的script文件设置权限。
$ chmod -R 700 /etc/rc.d/init.d/*
表示只有root才允许读、写、执行该目录下的script文件。
十五、 防火墙——iptables
*filter
:RH-Firewall-1-INPUT - [0:0]
-A RH-Firewall-1-INPUT -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 2008 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -j DROP
-A RH-Firewall-1-INPUT -p udp -j DROP
COMMIT
第 IV 系统维护、备份策略
十六、 每日备份 MySQL 策略
十七、 系统维护利器