2009新概念
一个中心:一切以健康为中心。
两个基本点:遇事潇洒一点,看世糊涂一点。
三个忘记:
忘记年龄,
忘记过去,
忘记恩怨。
四个拥有:
无论你有多弱或多强,一定要
拥有真正爱你的人,
拥有知心的朋友,
拥有向上的事业,
拥有温暖的住所。
五个要:
要唱,
要跳,
要俏,
要笑,
要苗条。
六个不能:
不能饿了才吃,
不能渴了才喝,
不能困了才睡,
不能累了才歇,
不能病了才检查,
不能老了再后悔。
看到了,
给你每一个珍惜的朋友!元旦快乐!
2008年12月19日星期五
LAMP配置流程
LAMP 安装说明
php5.0 要求libxml2-2.6.0以上更高的版本,这一解析器提供php5.0 新的XML API
===============================================================================================================================================
安装 libxml2
tar -zxvf libxml2-2.6.19.tar.gz
cd libxml2-2.6.19
./configure --prefix=/usr/local/libxml2
make
make install
这一步结束时,libxml2被安装在/usr/local/下。
================================================================================================================================================
安装 zlib
tar -zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --prefix=/usr/local/zlib
make
make install
这一步结束时,zlib被安装在/usr/local/下。
===============================================================================================================================================
安装 libpng
tar -zxvf libpng-1.2.10.tar.gz
cd libpng-1.2.10
cp scripts/makefile.linux makefile
make
make install
注意:这里的makefile不是用./configure 生成的,而是直接从script/目录里拷一个
这一步结束时,zlib被安装在/usr/local/lib下
=============================================================================================================================================
安装 freetype
tar -zxvf freetype-2.2.1.tar.gz
cd freetype-2.2.1
./configure --prefix=/usr/local/freetype
make
make install
这一步结束时,freetype被安装在/usr/local/lib下
============================================================================================================================================
安装 jpeg6
建立目录
mkdir /usr/local/jpeg6
mkdir /usr/local/jpeg6/bin
mkdir /usr/local/jpeg6/lib
mkdir /usr/local/jpeg6/include
mkdir /usr/local/jpeg6/man
mkdir /usr/local/jpeg6/man/man1
tar -zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
make
make install
注意:这里./configure一定要带--enable-shared参数,不然,不会生成共享库
=============================================================================================================================================
安装 gd
tar -zxvf gd-2.0.33.tar.gz
cd gd-2.0.33
./configure --prefix=/usr/local/gd --with-png=/usr/local/lib --with-freetype=/usr/local/freetype --with-jpeg=/usr/local/jpeg6
make && make install
==============================================================================================================================================
安装 curl 支持ftp库函数
tar -zxvf curl-7.15.0.tar.gz
cd curl-7.15.0
./configure --prefix=/usr/local/curl
make && make install
===============================================================================================================================================
安装 Apache2
以Apache使用php有两种方式:作为动态模块,其在运行状态时可以载入到web服务器,
或者作为静态模块,其可直接编译到web服务器代码中。对于文本,我们着重于第一种方式。
为了能让Apache2.0模块使php动态载入,Apache服务器必须以动态共享对象(DSO,Dynamic Shared Object)编译。
可以通过传递 --enable-so 参数到 Apache 2
tar -jxvf httpd-2.2.2.tar.bz2
cd httpd-2.2.2
./configure --prefix=/usr/local/apache2 --enable-so --enable-dav --enable-rewrite make && make install
//切记要支持Zend Optimizer不可加 --with-mpm=worker选项
这一过程将会设置,编译,以及将服务器安装到/usr/local/下。
启动apache守护进程:
/usr/local/apache2/bin/apachectl start (开启 start 关闭 stop 重启 restart)
打开浏览器,输入http://localhost 就能看到一个apache的欢迎页面了,这表示我们已经成功的安装了apache2 。
==============================================================================================================================================
安装 Mysql5
groupadd mysql
useradd -g mysql mysql
tar -zxvf mysql-5.0.17.tar.gz
cd mysql-5.0.17
./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=all --with-big-tables --with-charset=utf8 --with-collation=utf8_unicode_ci
make
make install
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cd /usr/local/mysql/
bin/mysql_install_db --user=mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .
启动服务:
/usr/local/mysql/share/mysql/mysql.server start (启动start 关闭stop 重启restart)
键入mysql回车就可已看到欢迎界面。说明我们已成功安装了mysql
说明:
--with-extra-charsets=all 对多语言支持
--with-unix-socket-path=/usr/local/mysql/var/mysql.sock 这个是指定mysql服务启动后。联机套接字文件所处的位置和文件名,也就是说,如果mysql服务器成功启动后,就能在/usr/local /mysql/var.采用这一选项,通常会出错,建议不配置用默认的。默认会在/tmp/mysql.sock.
目录中看到mysql.sock文件。
如果编译时出现了以下错误:
checking for tgetent in -ltermcap... no
checking for termcap functions library... configure: error: No curses/termcap library found
说明 curses/termcap 库没有安装
去下载一个ncurses-5.6.tar.gz,
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz
tar zxvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/usr --with-shared --without-debug
make
make install clean
然后再重新编译Mysql进行安装。
1、
mysql的自启动我解决了,在/etc/rc.d/rc.local里加
/usr/local/mysql/bin/mysqld_safe -u mysql &
2、
cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig –level 345 mysql on
/etc/init.d/mysql start
==================================================================================
安装 php5
tar -zxvf php-5.1.6.tar.gz
cd php-5.1.6
./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs
--with-config-file-path=/etc --with-libxml-dir=/usr/local/libxml2
--with-zlib-dir=/usr/local/zlib --with-curl=/usr/local/curl
--with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg6
--with-png-dir=/usr/local/lib --with-freetype-dir=/usr/local/freetype
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config
--with-openssl --enable-gd-native-ttf --enable-mbstring --enable-ftp
--enable-bcmath --enable-sockets --enable-zip --enable-soap
--enable-calendar //切记要支持Zend Optimizer不可加 --enable-debug选项
make
make install
cp php.ini-dist /etc/php.ini
编译php时出现
./configure: /usr/local/apache2/bin/apxs: /replace/with/path/to/perl/interpreter:
bad interpreter: No such file or directory
这是找不到perl解释器的缘故。
修改/usr/local/apache2/bin/apxs文件中:
/replace/with/path/to/perl/interpreter
把他替换成perl所在的路径如/opt/ActivePerl-5.8/bin/perl,
(如果你下载的是active perl5.8的rpm,他默认安装路径是/opt/ActivePerl-5.8/bin/perl)
=============================================
整合apache2和php5
apache 配置文件及目录是:
/usr/local/apache2/conf/httpd.conf
apache 默认存放主页的位置是:
/usr/local/apache2/htdocs
以下是配置文件里面的信息:(有的地方要做修改)
ServerRoot "/usr/local/apache2"
这是指定apache程序所在的目录,比如日志文件、配置文件等目录。
DocumentRoot "/usr/local/apache2/htdocs"
这个是存放网页的目录
这一句应该和DocumentRoot的目录保持一致。
找到 DirectoryIndex index.html
改为 DirectoryIndex index.html index.html.var index.htm index.php
找到 AddType application/x-gzip .gz .tgz
加 AddType application/x-httpd-php .php (注意空格)
AddType application/x-httpd-php-source .phps
添加 AddDefaultCharset utf8 使apache默认支持utf8字符集
保存配置文件就重启apache 的守护进程。
/usr/local/apache2/bin/apachectl restart
下载源码包 make && make install 之后, apache 并不会自动往 init.d 里面添加自己的 httpd service。需要手工把 apache 安装目录的 bin/apachectl 拷贝一份到 /etc/init.d/httpd 。如果想让 httpd service 能够在不同的运行级别下都能自动启动,还需要 vi /etc/init.d/httpd ,在 #!/bin/sh 下面增加几行 chkconfig 需要的内容:
# chkconfig: 2345 70 30
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
关键是 chkconfig: 2345 70 30 这一行,第一个数字 2345 表示让 apache 在 2345 这四个级别都自动运行;第二个数字 70 表示进程启动的优先级;第三个数字 30 表示进程停止的优先级。修改保存之后执行 /sbin/chkconfig httpd reset ,chkconfig 就自动在各个级别的 rc*.d 中增加 httpd 的 link 。要查看 chkconfig 是否 reset 正确,通过命令 /sbin/chkconfig --list httpd 就可以查看当前 httpd service 被配置在哪几个运行级别自启动。
注意:
每次更改配置文件。要重启服务。
对存放网页的目录执行:命令chmod 755 目录名 或者 chmod -R 755 目录名
编辑php.ini文件,找到
;default_charset="iso-8859-1"
增加一行:default_charset="utf8"
以上步骤都执行完后。在/usr/local/apache2/htdocs/里编辑文件进行测试。
phpinfo.php
里面的内容:
phpinfo();
?>
在浏览器地址栏中输入:
http://localhost/phpinfo.php
出现php说明页面说明安装成功。
安装过程相当简单,网上很多这种文档,整理的也很详细,我就不多废话了。就具体就在fedora6下碰到的问题说明一下: 接下: ===========================================================================================
安装时的问题及解决方法
安装php5的过程中会自动在/usr/local/apache2/conf/httpd.conf里添加:
LoadModule php5_module modules/libphp5.so
重新启动apache报如下错误:
httpd: Syntax error on line 53 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied
解决办法:
chcon /usr/local/apache/modules/libphp5.so -t shlib_t
原因是Linux有一个SELinux保护模式引起的。
关闭SELINUX的方法:
vi /etc/selinux/config 将SELINUX=enforcing 改成SELINUX=disabled
保存,重起电脑即可.
FC5 中的SELinux 代表了用户,程序以及进程间相互交流的主要变化。
=============================================
安装phpMyAdmin2.8.1
unzip phpMyAdmin2.8.1.zip
cp -r phpMyAdmin2.8.1 /usr/local/apache2/htdocs
cd /usr/local/apache2/htdocs/phpMyAdmin2.8.1/libraries
cp config.default.php ../config.inc.php
gedit config.inc.php
找到$cfg['Servers'][$i]['auth_type'] = 'config'; // Authentication method (config, http or cookie based)?一行(大概在71行)将值改为http 或 cookie,随自己喜欢
==================================================================================
安装Zend optimizer3.2.8
这可能是最简单也是最容易出问题的地方(我在此吃尽苦头)
tar -zxvf ZendOptimizer-3.2.8-linux-glibc21-i386.tar.gz
cd ZendOptimizer-3.2.8-linux-glibc21-i386
./install
安装完后重启apache,在phpinfo.php的欢迎页面第二个域你会看到:
---------------------------------------------------------------------------------------------------------------------------------------------------
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.2.8, Copyright (c) 1998-2007, by Zend Technologies
Zend logo
执行 /usr/local/php5/bin/php -v 应该看到:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.2.8, Copyright (c) 1998-2007, by Zend Technologies
否则就是安张出问题了。可能是编译apache画蛇添足添加了--with-mpm=worker 没有用默认的prefork模块
另一中可能就是编译php是加入了--enable-debug
zend optimizer 需要apache(perfork only) php(no debug Mod)这些在Zend optimizer User`Gurde上有说明需特别注意了
over
由于本人水平有限,遗漏 过错之处欢迎大家指正
让APACHE MYSQL 随系统启动:
编辑/etc/rc.local文件
# vi /etc/rc.local
在文件中写入
# 启动APACHE
/usr/local/apache2/bin/httpd -k start
# 启动MYSQL
/usr/local/mysql/bin/mysqld_safe --user=mysql &
php5.0 要求libxml2-2.6.0以上更高的版本,这一解析器提供php5.0 新的XML API
===============================================================================================================================================
安装 libxml2
tar -zxvf libxml2-2.6.19.tar.gz
cd libxml2-2.6.19
./configure --prefix=/usr/local/libxml2
make
make install
这一步结束时,libxml2被安装在/usr/local/下。
================================================================================================================================================
安装 zlib
tar -zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --prefix=/usr/local/zlib
make
make install
这一步结束时,zlib被安装在/usr/local/下。
===============================================================================================================================================
安装 libpng
tar -zxvf libpng-1.2.10.tar.gz
cd libpng-1.2.10
cp scripts/makefile.linux makefile
make
make install
注意:这里的makefile不是用./configure 生成的,而是直接从script/目录里拷一个
这一步结束时,zlib被安装在/usr/local/lib下
=============================================================================================================================================
安装 freetype
tar -zxvf freetype-2.2.1.tar.gz
cd freetype-2.2.1
./configure --prefix=/usr/local/freetype
make
make install
这一步结束时,freetype被安装在/usr/local/lib下
============================================================================================================================================
安装 jpeg6
建立目录
mkdir /usr/local/jpeg6
mkdir /usr/local/jpeg6/bin
mkdir /usr/local/jpeg6/lib
mkdir /usr/local/jpeg6/include
mkdir /usr/local/jpeg6/man
mkdir /usr/local/jpeg6/man/man1
tar -zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
make
make install
注意:这里./configure一定要带--enable-shared参数,不然,不会生成共享库
=============================================================================================================================================
安装 gd
tar -zxvf gd-2.0.33.tar.gz
cd gd-2.0.33
./configure --prefix=/usr/local/gd --with-png=/usr/local/lib --with-freetype=/usr/local/freetype --with-jpeg=/usr/local/jpeg6
make && make install
==============================================================================================================================================
安装 curl 支持ftp库函数
tar -zxvf curl-7.15.0.tar.gz
cd curl-7.15.0
./configure --prefix=/usr/local/curl
make && make install
===============================================================================================================================================
安装 Apache2
以Apache使用php有两种方式:作为动态模块,其在运行状态时可以载入到web服务器,
或者作为静态模块,其可直接编译到web服务器代码中。对于文本,我们着重于第一种方式。
为了能让Apache2.0模块使php动态载入,Apache服务器必须以动态共享对象(DSO,Dynamic Shared Object)编译。
可以通过传递 --enable-so 参数到 Apache 2
tar -jxvf httpd-2.2.2.tar.bz2
cd httpd-2.2.2
./configure --prefix=/usr/local/apache2 --enable-so --enable-dav --enable-rewrite make && make install
//切记要支持Zend Optimizer不可加 --with-mpm=worker选项
这一过程将会设置,编译,以及将服务器安装到/usr/local/下。
启动apache守护进程:
/usr/local/apache2/bin/apachectl start (开启 start 关闭 stop 重启 restart)
打开浏览器,输入http://localhost 就能看到一个apache的欢迎页面了,这表示我们已经成功的安装了apache2 。
==============================================================================================================================================
安装 Mysql5
groupadd mysql
useradd -g mysql mysql
tar -zxvf mysql-5.0.17.tar.gz
cd mysql-5.0.17
./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=all --with-big-tables --with-charset=utf8 --with-collation=utf8_unicode_ci
make
make install
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cd /usr/local/mysql/
bin/mysql_install_db --user=mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .
启动服务:
/usr/local/mysql/share/mysql/mysql.server start (启动start 关闭stop 重启restart)
键入mysql回车就可已看到欢迎界面。说明我们已成功安装了mysql
说明:
--with-extra-charsets=all 对多语言支持
--with-unix-socket-path=/usr/local/mysql/var/mysql.sock 这个是指定mysql服务启动后。联机套接字文件所处的位置和文件名,也就是说,如果mysql服务器成功启动后,就能在/usr/local /mysql/var.采用这一选项,通常会出错,建议不配置用默认的。默认会在/tmp/mysql.sock.
目录中看到mysql.sock文件。
如果编译时出现了以下错误:
checking for tgetent in -ltermcap... no
checking for termcap functions library... configure: error: No curses/termcap library found
说明 curses/termcap 库没有安装
去下载一个ncurses-5.6.tar.gz,
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz
tar zxvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/usr --with-shared --without-debug
make
make install clean
然后再重新编译Mysql进行安装。
1、
mysql的自启动我解决了,在/etc/rc.d/rc.local里加
/usr/local/mysql/bin/mysqld_safe -u mysql &
2、
cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig –level 345 mysql on
/etc/init.d/mysql start
==================================================================================
安装 php5
tar -zxvf php-5.1.6.tar.gz
cd php-5.1.6
./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs
--with-config-file-path=/etc --with-libxml-dir=/usr/local/libxml2
--with-zlib-dir=/usr/local/zlib --with-curl=/usr/local/curl
--with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg6
--with-png-dir=/usr/local/lib --with-freetype-dir=/usr/local/freetype
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config
--with-openssl --enable-gd-native-ttf --enable-mbstring --enable-ftp
--enable-bcmath --enable-sockets --enable-zip --enable-soap
--enable-calendar //切记要支持Zend Optimizer不可加 --enable-debug选项
make
make install
cp php.ini-dist /etc/php.ini
编译php时出现
./configure: /usr/local/apache2/bin/apxs: /replace/with/path/to/perl/interpreter:
bad interpreter: No such file or directory
这是找不到perl解释器的缘故。
修改/usr/local/apache2/bin/apxs文件中:
/replace/with/path/to/perl/interpreter
把他替换成perl所在的路径如/opt/ActivePerl-5.8/bin/perl,
(如果你下载的是active perl5.8的rpm,他默认安装路径是/opt/ActivePerl-5.8/bin/perl)
=============================================
整合apache2和php5
apache 配置文件及目录是:
/usr/local/apache2/conf/httpd.conf
apache 默认存放主页的位置是:
/usr/local/apache2/htdocs
以下是配置文件里面的信息:(有的地方要做修改)
ServerRoot "/usr/local/apache2"
这是指定apache程序所在的目录,比如日志文件、配置文件等目录。
DocumentRoot "/usr/local/apache2/htdocs"
这个是存放网页的目录
这一句应该和DocumentRoot的目录保持一致。
找到 DirectoryIndex index.html
改为 DirectoryIndex index.html index.html.var index.htm index.php
找到 AddType application/x-gzip .gz .tgz
加 AddType application/x-httpd-php .php (注意空格)
AddType application/x-httpd-php-source .phps
添加 AddDefaultCharset utf8 使apache默认支持utf8字符集
保存配置文件就重启apache 的守护进程。
/usr/local/apache2/bin/apachectl restart
下载源码包 make && make install 之后, apache 并不会自动往 init.d 里面添加自己的 httpd service。需要手工把 apache 安装目录的 bin/apachectl 拷贝一份到 /etc/init.d/httpd 。如果想让 httpd service 能够在不同的运行级别下都能自动启动,还需要 vi /etc/init.d/httpd ,在 #!/bin/sh 下面增加几行 chkconfig 需要的内容:
# chkconfig: 2345 70 30
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
关键是 chkconfig: 2345 70 30 这一行,第一个数字 2345 表示让 apache 在 2345 这四个级别都自动运行;第二个数字 70 表示进程启动的优先级;第三个数字 30 表示进程停止的优先级。修改保存之后执行 /sbin/chkconfig httpd reset ,chkconfig 就自动在各个级别的 rc*.d 中增加 httpd 的 link 。要查看 chkconfig 是否 reset 正确,通过命令 /sbin/chkconfig --list httpd 就可以查看当前 httpd service 被配置在哪几个运行级别自启动。
注意:
每次更改配置文件。要重启服务。
对存放网页的目录执行:命令chmod 755 目录名 或者 chmod -R 755 目录名
编辑php.ini文件,找到
;default_charset="iso-8859-1"
增加一行:default_charset="utf8"
以上步骤都执行完后。在/usr/local/apache2/htdocs/里编辑文件进行测试。
phpinfo.php
里面的内容:
phpinfo();
?>
在浏览器地址栏中输入:
http://localhost/phpinfo.php
出现php说明页面说明安装成功。
安装过程相当简单,网上很多这种文档,整理的也很详细,我就不多废话了。就具体就在fedora6下碰到的问题说明一下: 接下: ===========================================================================================
安装时的问题及解决方法
安装php5的过程中会自动在/usr/local/apache2/conf/httpd.conf里添加:
LoadModule php5_module modules/libphp5.so
重新启动apache报如下错误:
httpd: Syntax error on line 53 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied
解决办法:
chcon /usr/local/apache/modules/libphp5.so -t shlib_t
原因是Linux有一个SELinux保护模式引起的。
关闭SELINUX的方法:
vi /etc/selinux/config 将SELINUX=enforcing 改成SELINUX=disabled
保存,重起电脑即可.
FC5 中的SELinux 代表了用户,程序以及进程间相互交流的主要变化。
=============================================
安装phpMyAdmin2.8.1
unzip phpMyAdmin2.8.1.zip
cp -r phpMyAdmin2.8.1 /usr/local/apache2/htdocs
cd /usr/local/apache2/htdocs/phpMyAdmin2.8.1/libraries
cp config.default.php ../config.inc.php
gedit config.inc.php
找到$cfg['Servers'][$i]['auth_type'] = 'config'; // Authentication method (config, http or cookie based)?一行(大概在71行)将值改为http 或 cookie,随自己喜欢
==================================================================================
安装Zend optimizer3.2.8
这可能是最简单也是最容易出问题的地方(我在此吃尽苦头)
tar -zxvf ZendOptimizer-3.2.8-linux-glibc21-i386.tar.gz
cd ZendOptimizer-3.2.8-linux-glibc21-i386
./install
安装完后重启apache,在phpinfo.php的欢迎页面第二个域你会看到:
---------------------------------------------------------------------------------------------------------------------------------------------------
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.2.8, Copyright (c) 1998-2007, by Zend Technologies
Zend logo
执行 /usr/local/php5/bin/php -v 应该看到:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.2.8, Copyright (c) 1998-2007, by Zend Technologies
否则就是安张出问题了。可能是编译apache画蛇添足添加了--with-mpm=worker 没有用默认的prefork模块
另一中可能就是编译php是加入了--enable-debug
zend optimizer 需要apache(perfork only) php(no debug Mod)这些在Zend optimizer User`Gurde上有说明需特别注意了
over
由于本人水平有限,遗漏 过错之处欢迎大家指正
让APACHE MYSQL 随系统启动:
编辑/etc/rc.local文件
# vi /etc/rc.local
在文件中写入
# 启动APACHE
/usr/local/apache2/bin/httpd -k start
# 启动MYSQL
/usr/local/mysql/bin/mysqld_safe --user=mysql &
2008年12月11日星期四
元旦快乐!
1、当今三大扯蛋:
靠工资买的起房那是扯蛋;
靠努力工作能升官那更是扯蛋;
说你没外遇那也绝对是扯蛋。
2、当今四大怪事:
做人的不如做狗的受宠爱;
做事的不如告密的受信赖;
在行的不如外行的提的快;
忽悠的比敬业的更豪迈。
3、当今五大谎言:
中石化说亏损;
警察说保护百姓;
小姐说俺是第一次;
老板说我亏不了你;
领导说好好干有机会。
4、现代人的五大悲哀:
一手好字被电脑废了;
一个好胃被酒废了;
一个好家被情人废了;
一个好官被人民币废了;
一个石油把大盘废了!
5、改革六大成绩:
房产改革口袋掏空;
教育改革父母逼疯;
医疗改革提前送终;
企业改革下岗停工;
政府改革机构臃肿;
婚姻改革同居成风
值此元旦即将来临之际。
并送朋友们一副对联:
上联:该吃吃,该喝喝,遇事别往心里搁;
下联:泡泡澡,看著表,舒服一秒是一秒;
横批:元旦快乐!
靠工资买的起房那是扯蛋;
靠努力工作能升官那更是扯蛋;
说你没外遇那也绝对是扯蛋。
2、当今四大怪事:
做人的不如做狗的受宠爱;
做事的不如告密的受信赖;
在行的不如外行的提的快;
忽悠的比敬业的更豪迈。
3、当今五大谎言:
中石化说亏损;
警察说保护百姓;
小姐说俺是第一次;
老板说我亏不了你;
领导说好好干有机会。
4、现代人的五大悲哀:
一手好字被电脑废了;
一个好胃被酒废了;
一个好家被情人废了;
一个好官被人民币废了;
一个石油把大盘废了!
5、改革六大成绩:
房产改革口袋掏空;
教育改革父母逼疯;
医疗改革提前送终;
企业改革下岗停工;
政府改革机构臃肿;
婚姻改革同居成风
值此元旦即将来临之际。
并送朋友们一副对联:
上联:该吃吃,该喝喝,遇事别往心里搁;
下联:泡泡澡,看著表,舒服一秒是一秒;
横批:元旦快乐!
2008年12月5日星期五
fdisk 删除操作
fdisk 对硬盘及分区的操作,进入fdisk 对硬盘操作阶段
我们可以对硬盘进行分区操作,前提是您把fdisk -l 弄明白了;通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称;比如上面的例子,我们会看到两个设备一个是/dev/hda ,另一个是/dev/sda ;
fdisk 操作硬盘的命令格式如下:
[root@localhost beinan]# fdisk 设备
比如我们通过 fdisk -l 得知 /dev/hda 或者 /dev/sda设备;我们如果想再添加或者删除一些分区,可以用
[root@localhost beinan]# fdisk /dev/hda
或
[root@localhost beinan]# fdisk /dev/sda
注 在以后的例子中,我们要以 /dev/sda设备为例,来讲解如何用fdisk 来操作添加、删除分区等动作;
1、fdisk 的说明;
当我们通过 fdisk 设备,进入相应设备的操作时,会发现有如下的提示;以 fdisk /dev/sda 设备为例,以下同;
[root@localhost beinan]# fdisk /dev/sda
Command (m for help): 在这里按m ,就会输出帮助;
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition 注:这是删除一个分区的动作;
l list known partition types 注:l是列出分区类型,以供我们设置相应分区的类型;
m print this menu 注:m 是列出帮助信息;
n add a new partition 注:添加一个分区;
o create a new empty DOS partition table
p print the partition table 注:p列出分区表;
q quit without saving changes 注:不保存退出;
s create a new empty Sun disklabel
t change a partition's system id 注:t 改变分区类型;
u change display/entry units
v verify the partition table
w write table to disk and exit 注:把分区表写入硬盘并退出;
x extra functionality (experts only) 注:扩展应用,专家功能;
其实我们常用的只有注有中文的,其它的功能我们不常用(呵,主要是我不会用,否则早会卖弄一下了);x扩展功能,也不是常用的;一般的情况下只要懂得 d l m p q t w 就行了;
下面以实例操作来详述,没有例子没有办法就,新手也看不懂;
2、列出当前操作硬盘的分区情况,用p
Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
3、通过fdisk的d指令来删除一个分区
Command (m for help): p 注:列出分区情况;
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
Command (m for help): d 注:执行删除分区指定;
Partition number (1-6): 6 注:我想删除 sda6 ,就在这里输入 6 ;
Command (m for help): p 注:再查看一下硬盘分区情况,看是否删除了?
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
Command (m for help):
警告:删除分区时要小心,请看好分区的序号,如果您删除了扩展分区,扩展分区之下的逻辑分区都会删除;所以操作时一定要小心;如果知道自己操作错了,请不要惊慌,用q不保存退出;切记切记!!!!在分区操作错了之时,千万不要输入w保存退出!!!
我们可以对硬盘进行分区操作,前提是您把fdisk -l 弄明白了;通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称;比如上面的例子,我们会看到两个设备一个是/dev/hda ,另一个是/dev/sda ;
fdisk 操作硬盘的命令格式如下:
[root@localhost beinan]# fdisk 设备
比如我们通过 fdisk -l 得知 /dev/hda 或者 /dev/sda设备;我们如果想再添加或者删除一些分区,可以用
[root@localhost beinan]# fdisk /dev/hda
或
[root@localhost beinan]# fdisk /dev/sda
注 在以后的例子中,我们要以 /dev/sda设备为例,来讲解如何用fdisk 来操作添加、删除分区等动作;
1、fdisk 的说明;
当我们通过 fdisk 设备,进入相应设备的操作时,会发现有如下的提示;以 fdisk /dev/sda 设备为例,以下同;
[root@localhost beinan]# fdisk /dev/sda
Command (m for help): 在这里按m ,就会输出帮助;
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition 注:这是删除一个分区的动作;
l list known partition types 注:l是列出分区类型,以供我们设置相应分区的类型;
m print this menu 注:m 是列出帮助信息;
n add a new partition 注:添加一个分区;
o create a new empty DOS partition table
p print the partition table 注:p列出分区表;
q quit without saving changes 注:不保存退出;
s create a new empty Sun disklabel
t change a partition's system id 注:t 改变分区类型;
u change display/entry units
v verify the partition table
w write table to disk and exit 注:把分区表写入硬盘并退出;
x extra functionality (experts only) 注:扩展应用,专家功能;
其实我们常用的只有注有中文的,其它的功能我们不常用(呵,主要是我不会用,否则早会卖弄一下了);x扩展功能,也不是常用的;一般的情况下只要懂得 d l m p q t w 就行了;
下面以实例操作来详述,没有例子没有办法就,新手也看不懂;
2、列出当前操作硬盘的分区情况,用p
Command (m for help): p
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
3、通过fdisk的d指令来删除一个分区
Command (m for help): p 注:列出分区情况;
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
Command (m for help): d 注:执行删除分区指定;
Partition number (1-6): 6 注:我想删除 sda6 ,就在这里输入 6 ;
Command (m for help): p 注:再查看一下硬盘分区情况,看是否删除了?
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ c W95 FAT32 (LBA)
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
Command (m for help):
警告:删除分区时要小心,请看好分区的序号,如果您删除了扩展分区,扩展分区之下的逻辑分区都会删除;所以操作时一定要小心;如果知道自己操作错了,请不要惊慌,用q不保存退出;切记切记!!!!在分区操作错了之时,千万不要输入w保存退出!!!
2008年11月25日星期二
LVM 实例操作 备忘一下
最近因客户环境需要,一直在研究有关VMware server 虚拟机下的多分区增加的问题,今天有了一些好消息故
做个备忘,主要以流程和实例为主,希望文章能起到抛砖引玉的效果,呵呵
前言介绍
LVM=(Logical Volume Mamager)逻辑卷管理器,LVM最先是用在IBM AIX系统上,它的最大作用是可以动态分
配磁盘分区,并且可以让多个分区或者物理硬盘作为一个逻辑卷(相当于一个逻辑硬盘).这种机制可以让磁
盘分区容量划分变得很灵活.
我们先举个简单例子.比如我们有一个硬盘/dev/hda,分了3个主分区:hda1,hda2,hda3,后面磁盘空间没有
划分,分别对应的挂载点是/boot,/,/home,如果我们的/home空间不够了,怎么办?传统的方法是在未划分的
空间中分割一个分区,挂载到/home下,并且把hda3的内容复制到这个新分区上.或者把这个新分区挂载到另
外的挂载点上,然后在/home下创建链接,链接到这个新挂载点.
这两种方法都不大好,第一种方法浪费了hda3,并且如果后面的分区容量小于hda3怎么办?第二种方法不大
浪费容量,但是每次要额外创建链接,比较麻烦.那么,如果用lvm呢?lvm的好处在于,可以动态放大一个逻辑
卷(相当于一个逻辑分区),也就是说,hda3如果是一个逻辑分区,比如/dev/rootvg/lv3,那么lv3可以被动态
放大.这样就解决了动态容量调整的问题.当然,前提是系统已设定好lvm支持,并且需要动态缩放的挂载点
对应的设备是逻辑卷.
在这里,我的环境都是基于虚拟机上的 RHEL 5/CentOS 5.2和LVM2的。
lvm是否已经在系统中安装,通过如下命令查询,以下便是系统中已经安装有lvm,而且其版本为lvm2(目前是比较新的版本啦)
[root@localhost soft]# rpm -qa |grep lvm
system-config-lvm-1.1.3-2.0.el5
lvm2-2.02.32-4.el5
默认分区 就会默认产生lvm
通常不建议这么做
#######################################
[root@testmailserver ~]# fdisk -l
Disk /dev/hda: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hda doesn't contain a valid partition table
Disk /dev/hdb: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hdb doesn't contain a valid partition table
Disk /dev/hdd: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hdd doesn't contain a valid partition table
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 652 5132767+ 8e Linux LVM
#########################################
[root@testmailserver ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "VolGroup00" using metadata type lvm2
########################################
[root@testmailserver ~]# lvscan
ACTIVE '/dev/VolGroup00/LogVol00' [4.31 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [576.00 MB] inherit
###############################
fdisk /dev/hda (fdisk /dev/hdb , fdisk /dev/hdd)
n p t 8e(lvm分区的格式) w
1.创建物理卷
[root@localhost ~]# pvcreate /dev/hda1 /dev/hdb1 /dev/hdd1
Physical volume "/dev/hda1" successfully created
Physical volume "/dev/hdb1" successfully created
Physical volume "/dev/hdd1" successfully created
2.创建卷组并将其物理卷加入到卷组中
[root@localhost ~]# vgcreate fengvg /dev/hda1 /dev/hdb1 /dev/hdd1
Volume group "fengvg" successfully created
3.查看卷组的大小
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name fengvg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 2.99 GB
PE Size 4.00 MB
Total PE 766
Alloc PE / Size 743 / 2.90 GB
Free PE / Size 23 / 92.00 MB
VG UUID Syo8t6-9QKW-Uijz-3iUb-eNyu-tKgV-UIUWWm
4.创建逻辑卷并将大小分配给卷组(注:其大小要小于查看到的大小,否则提示不成功)
[root@localhost ~]# lvcreate -L 8.90G -n lv1 fengvg
Rounding up size to full physical extent 8.90 GB
Logical volume "lv1" created
5.以ext3的形式 格式化逻辑卷
[root@localhost ~]# mkfs.ext3 /dev/fengvg/lv1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1168128 inodes, 2333696 blocks
116684 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2390753280
72 block groups
32768 blocks per group, 32768 fragments per group
16224 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
6.创建挂载点惊醒挂载逻辑卷分区
cd /mnt
mkdir gualvm
mount /dev/fengvg/lv1 /gualvm
7.查看挂载的分区大小供以后使用
df -h 即可看到新增加的空间大小
以上步骤简单,供以后查询方便.先简单到这里,以后有时间再总结呗,^_^
做个备忘,主要以流程和实例为主,希望文章能起到抛砖引玉的效果,呵呵
前言介绍
LVM=(Logical Volume Mamager)逻辑卷管理器,LVM最先是用在IBM AIX系统上,它的最大作用是可以动态分
配磁盘分区,并且可以让多个分区或者物理硬盘作为一个逻辑卷(相当于一个逻辑硬盘).这种机制可以让磁
盘分区容量划分变得很灵活.
我们先举个简单例子.比如我们有一个硬盘/dev/hda,分了3个主分区:hda1,hda2,hda3,后面磁盘空间没有
划分,分别对应的挂载点是/boot,/,/home,如果我们的/home空间不够了,怎么办?传统的方法是在未划分的
空间中分割一个分区,挂载到/home下,并且把hda3的内容复制到这个新分区上.或者把这个新分区挂载到另
外的挂载点上,然后在/home下创建链接,链接到这个新挂载点.
这两种方法都不大好,第一种方法浪费了hda3,并且如果后面的分区容量小于hda3怎么办?第二种方法不大
浪费容量,但是每次要额外创建链接,比较麻烦.那么,如果用lvm呢?lvm的好处在于,可以动态放大一个逻辑
卷(相当于一个逻辑分区),也就是说,hda3如果是一个逻辑分区,比如/dev/rootvg/lv3,那么lv3可以被动态
放大.这样就解决了动态容量调整的问题.当然,前提是系统已设定好lvm支持,并且需要动态缩放的挂载点
对应的设备是逻辑卷.
在这里,我的环境都是基于虚拟机上的 RHEL 5/CentOS 5.2和LVM2的。
lvm是否已经在系统中安装,通过如下命令查询,以下便是系统中已经安装有lvm,而且其版本为lvm2(目前是比较新的版本啦)
[root@localhost soft]# rpm -qa |grep lvm
system-config-lvm-1.1.3-2.0.el5
lvm2-2.02.32-4.el5
默认分区 就会默认产生lvm
通常不建议这么做
#######################################
[root@testmailserver ~]# fdisk -l
Disk /dev/hda: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hda doesn't contain a valid partition table
Disk /dev/hdb: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hdb doesn't contain a valid partition table
Disk /dev/hdd: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hdd doesn't contain a valid partition table
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 652 5132767+ 8e Linux LVM
#########################################
[root@testmailserver ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "VolGroup00" using metadata type lvm2
########################################
[root@testmailserver ~]# lvscan
ACTIVE '/dev/VolGroup00/LogVol00' [4.31 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [576.00 MB] inherit
###############################
fdisk /dev/hda (fdisk /dev/hdb , fdisk /dev/hdd)
n p t 8e(lvm分区的格式) w
1.创建物理卷
[root@localhost ~]# pvcreate /dev/hda1 /dev/hdb1 /dev/hdd1
Physical volume "/dev/hda1" successfully created
Physical volume "/dev/hdb1" successfully created
Physical volume "/dev/hdd1" successfully created
2.创建卷组并将其物理卷加入到卷组中
[root@localhost ~]# vgcreate fengvg /dev/hda1 /dev/hdb1 /dev/hdd1
Volume group "fengvg" successfully created
3.查看卷组的大小
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name fengvg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 2.99 GB
PE Size 4.00 MB
Total PE 766
Alloc PE / Size 743 / 2.90 GB
Free PE / Size 23 / 92.00 MB
VG UUID Syo8t6-9QKW-Uijz-3iUb-eNyu-tKgV-UIUWWm
4.创建逻辑卷并将大小分配给卷组(注:其大小要小于查看到的大小,否则提示不成功)
[root@localhost ~]# lvcreate -L 8.90G -n lv1 fengvg
Rounding up size to full physical extent 8.90 GB
Logical volume "lv1" created
5.以ext3的形式 格式化逻辑卷
[root@localhost ~]# mkfs.ext3 /dev/fengvg/lv1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1168128 inodes, 2333696 blocks
116684 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2390753280
72 block groups
32768 blocks per group, 32768 fragments per group
16224 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
6.创建挂载点惊醒挂载逻辑卷分区
cd /mnt
mkdir gualvm
mount /dev/fengvg/lv1 /gualvm
7.查看挂载的分区大小供以后使用
df -h 即可看到新增加的空间大小
以上步骤简单,供以后查询方便.先简单到这里,以后有时间再总结呗,^_^
2008年11月21日星期五
LVM命令列表
所有命令列表:
1.extendfs 扩展一个离线文件系统
2.lvchange 改变一个逻辑卷的的属性
3.lvcreate 在卷组中创建一个逻辑卷
4.lvdisplay 显示逻辑卷的信息
5.lvextend 增加分配给逻辑卷的物理区域数
6.lvlnboot 将逻辑卷设为启动,交换或内存映像卷
7.lvmerge 将以前镜像的卷合并成一个逻辑镜像卷
8.lvreduce 减少分配给逻辑卷的物理区域数
9.lvremove 从卷组中删除一个或多个逻辑卷
10.lvrmboot 删除联接到启动,交换或内存映像卷的逻辑卷
11.lvsplit 将镜像的逻辑卷分成两个逻辑卷
12.lvsync 同步在一个或多少失效逻辑卷上的逻辑卷镜像
13.pvchange 改变卷组中的物理卷的属性
14.pvcreate 创建一个可以被卷组使用的物理卷
15.pvdisplay 显示卷组中一个或多个物理卷的信息
16.pvmove 将分配的物理区域从一个物理卷转移鲐其他物理卷
17.vgcfgbackup 保存卷组LVM配置
18.vgcfgrestore 将LVM配置恢复 到卷组
19.vgchange 开关卷组的一些状态
20.vgcreate 创建一个卷组
21.vgdisplay 显示卷组信息
22.vgextend 通过添加物理卷扩展一个卷组
23.vgexport 从系统输出一个卷组
24.vgimport 向系统输入一个卷组
25.vgscan 扫描卷组的系统物理卷
26.vgreduce 通过删除一个或多个物理卷减小卷组
27.vgremove 从系统上删除一个或多个卷组的定义
28.vgsync 同步在一个或多个失效卷组上的逻辑镜像
1.extendfs 扩展一个离线文件系统
2.lvchange 改变一个逻辑卷的的属性
3.lvcreate 在卷组中创建一个逻辑卷
4.lvdisplay 显示逻辑卷的信息
5.lvextend 增加分配给逻辑卷的物理区域数
6.lvlnboot 将逻辑卷设为启动,交换或内存映像卷
7.lvmerge 将以前镜像的卷合并成一个逻辑镜像卷
8.lvreduce 减少分配给逻辑卷的物理区域数
9.lvremove 从卷组中删除一个或多个逻辑卷
10.lvrmboot 删除联接到启动,交换或内存映像卷的逻辑卷
11.lvsplit 将镜像的逻辑卷分成两个逻辑卷
12.lvsync 同步在一个或多少失效逻辑卷上的逻辑卷镜像
13.pvchange 改变卷组中的物理卷的属性
14.pvcreate 创建一个可以被卷组使用的物理卷
15.pvdisplay 显示卷组中一个或多个物理卷的信息
16.pvmove 将分配的物理区域从一个物理卷转移鲐其他物理卷
17.vgcfgbackup 保存卷组LVM配置
18.vgcfgrestore 将LVM配置恢复 到卷组
19.vgchange 开关卷组的一些状态
20.vgcreate 创建一个卷组
21.vgdisplay 显示卷组信息
22.vgextend 通过添加物理卷扩展一个卷组
23.vgexport 从系统输出一个卷组
24.vgimport 向系统输入一个卷组
25.vgscan 扫描卷组的系统物理卷
26.vgreduce 通过删除一个或多个物理卷减小卷组
27.vgremove 从系统上删除一个或多个卷组的定义
28.vgsync 同步在一个或多个失效卷组上的逻辑镜像
LVM磁盘管理
如何挂载一块从别的机器上取下的做了LVM的硬盘:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.vgscan //扫描LVM卷
3.vgchange -ay
4.lvscan //如果正常则会显示出硬盘的LV状态都是 active
5.mount -t ext3 /dev/VGname/LVname /mnt/lvmdisk/
-------------------------------------------------------------------------------------------
如何将一块新硬盘添加到现有的LVM中,以达到扩容目的:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.fdisk /dev/sdb //创建一个新的分区sdb1,并使用t参数标记为8e(即Linux LVM)
>n
>t
>8e
3.pvcreate //建立物理卷
4.vgextend VolGroup00 /dev/sdb1 //将新增的屋里卷加入到卷组中去
5.lvextend -L +800G /dev/VolGroup00/LogVol00 //将新增的80G硬盘的所有空间都加到逻辑卷中去
6.RHEL4: ext2online /dev/VolGroup00/LogVol00
RHEL5: resize2fs -p /dev/VolGroup00/LogVol00
//激活新增的空间
7.df -h //此时便可以看到新增的空间了
-------------------------------------------------------------------------------------------
如何删除一个现有的LVM:
1.umount 所有vg0下的lv
2.lvremove /dev/vg0/lv0
3.vgchange -an /dev/vg0 (休眠vg0,-ay是激活)
4.vgremove vg0 //移除vg0
-------------------------------------------------------------------------------------------
如何删除一个现有LVM中的物理卷,以取出新增的硬盘:
1.转移数据 pvmove /dev/sdb1 [sdc1] //如果想指定转移的物理卷则在后面输入,默认是其它地方
2.pvreduce vg0 /dev/sdb1 把sdb1从卷组中删除
-------------------------------------------------------------------------------------------
一些常用的LVM管理命令:
扩展VG: vgextend vg0(卷组名) /dev/sdb1(PV名)
扩展LV: lvextend -L +10G(空间大小) /dev/vg0/lv0(LV名)
查看信息: vgdisplay /dev/vg0 , lvdisplay /dev/vg0/lv0
数据迁移: pvmove /dev/sdb1 /dev/sdc1
-------------------------------------------------------------------------------------------
1.fdisk -l //查看新增的硬盘是否已经被识别
2.vgscan //扫描LVM卷
3.vgchange -ay
4.lvscan //如果正常则会显示出硬盘的LV状态都是 active
5.mount -t ext3 /dev/VGname/LVname /mnt/lvmdisk/
-------------------------------------------------------------------------------------------
如何将一块新硬盘添加到现有的LVM中,以达到扩容目的:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.fdisk /dev/sdb //创建一个新的分区sdb1,并使用t参数标记为8e(即Linux LVM)
>n
>t
>8e
3.pvcreate //建立物理卷
4.vgextend VolGroup00 /dev/sdb1 //将新增的屋里卷加入到卷组中去
5.lvextend -L +800G /dev/VolGroup00/LogVol00 //将新增的80G硬盘的所有空间都加到逻辑卷中去
6.RHEL4: ext2online /dev/VolGroup00/LogVol00
RHEL5: resize2fs -p /dev/VolGroup00/LogVol00
//激活新增的空间
7.df -h //此时便可以看到新增的空间了
-------------------------------------------------------------------------------------------
如何删除一个现有的LVM:
1.umount 所有vg0下的lv
2.lvremove /dev/vg0/lv0
3.vgchange -an /dev/vg0 (休眠vg0,-ay是激活)
4.vgremove vg0 //移除vg0
-------------------------------------------------------------------------------------------
如何删除一个现有LVM中的物理卷,以取出新增的硬盘:
1.转移数据 pvmove /dev/sdb1 [sdc1] //如果想指定转移的物理卷则在后面输入,默认是其它地方
2.pvreduce vg0 /dev/sdb1 把sdb1从卷组中删除
-------------------------------------------------------------------------------------------
一些常用的LVM管理命令:
扩展VG: vgextend vg0(卷组名) /dev/sdb1(PV名)
扩展LV: lvextend -L +10G(空间大小) /dev/vg0/lv0(LV名)
查看信息: vgdisplay /dev/vg0 , lvdisplay /dev/vg0/lv0
数据迁移: pvmove /dev/sdb1 /dev/sdc1
-------------------------------------------------------------------------------------------
2008年11月14日星期五
apache和IIS的优劣比较
apache和IIS的优劣比较
摘要:目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
一、免费与收费之争:
虽然很多用户都使用IIS建立网站,他是集成于Windows操作系统中的组件。不过要想合法使用IIS就要购买正版Windows操作系统。
反观Apache,他是完全免费的。不需要支付任何费用就可以免费下载并使用了。
结论——Apache免费,IIS收费,前者占优。
二、稳定性:
接下来要比较的就是稳定性了,WWW服务要随时运转正常,一个网站也需要一天24小时,一周七天为公众开放。所以稳定性是IIS和APACHE比较的重点。
IIS在实际使用中经常出现500错误,而且有的时候还会出现莫名其妙的假死现象。用户需要不定期的重新启动IIS服务才能保证网站的正常。
Apache在配置上比IIS要复杂,不过一经设置完毕就可以长期的工作了。大型网站都使用APACHE作为自己的WWW服务提供工具。APACHE的所有配置都保存在配置文件中,使用时完全按照配置文件中记录的信息执行。一般不会发生莫名其妙的假死情况。
小提示:在windows2003系统下使用IIS比用APACHE性能要好。
结论——APACHE稳定,IIS有时假死,前者占优。
三、扩展性:
扩展性是指WWW服务提供工具是否可以应用于多种场合,多种网络情况,多种操作系统。
IIS只能在微软公司的windows操作系统下使用,离开了windows他将一事无成。无法移植到其他类型的操作系统中。
APACHE是个多面手,他不仅仅应用于windows,对于unix,linux以及freebsd等多种操作系统来说他都可以胜任工作。而且不同操作系统的配置步骤基本类似,可移植性非常高。
结论——IIS只能在windows下运行,apache应用范围广。apache获胜。
四、安全性:
经常看到某某网站被黑客攻击或者某某网站被非法用户上传病毒的消息,对于为其他人提供服务的站点来说,安全性是最重要的。如果一个网站连自身安全都没有保证的话,谁愿意浏览和使用呢。
早期的IIS在安全性方面存在着很大的问题,如果使用默认设置的话黑客可以轻松趁虚而入。不过在IIS6中微软公司对安全方面进行了大幅改进。只要保证操作系统补丁更新及时,就可以将网站安全系数尽可能的提高。特别是IIS6与.net平台相互倚靠,使安全性几乎完美。
APACHE在安全方面一直做的不错,因为很多用户都是在linux下使用apache,所以操作系统的特点使得linux下的apache具有先天的保护伞,安全性自然没得说。
结论——IIS6以前的版本有安全隐患,IIS6和APACHE一样安全可靠。IIS6与APACHE打个平手。
五、开放性:
所谓开放性就是指是否开放了程序的源代码,众所周知IIS是WINDOWS系统的一部分,所以他的源代码是没有开放的。而apache则不同,最早他是为了类unix系统服务的,所以完全对外开放源代码。任何人都可以分析他的代码,发现其中的漏洞,并发布补丁来弥补该漏洞。
正因为APACHE的这种开放性,也使其安全性大大提高。
结论——IIS不开放代码,APACHE开放源代码。后者获得胜利。
六、难易性:
一个工具使用的难易程度直接影响其用户的多少,特别是网页发布工具。毕竟很多公司希望有自己的网站,但又不希望聘请高薪的网络管理员来维护。因此必然找上手相对容易的工具来搭建自己的站点。
IIS开起来比较简单,很容易就可能让IIS工作,对外发布网站。不过管理员很容易出现错误配置和误操作问题。不过总体说来IIS还是非常容易学的,但要学好他恐怕是件非常困难的事。
APACHE的使用比IIS要难,需要有一定计算机及网络基础的人才可以使用。他的配置也不是图形化的,需要我们通过编辑配置文件来实现。但是单从APACHE的设置上讲,只要我们严格按照帮助文件进行参数设置的话还是没有什么难度的。
结论——IIS容易安装但难精通,APACHE安装相对困难,要想精通也不是一件容易的事。IIS略占优势。
七、编程性:
为了让网页更加丰富多采,更加美观,互动性更好,高手为我们开发了多种组件与控件,那么这些控件在IIS或APACHE下是否正常运行呢?
APACHE下的Mod Rewrite功能非常强大,而IIS中的ISAPI的Rewrite需要专门开发,一般初学者是不能够实现的。APACHE可以使用 Subversion WebDev以及.htaccess功能,还可以使用ForceType。另外IIS对FastCGI的支持也不是很好,所以一些CGI、PHP程序运行起来速度很慢,远不如apache。
结论——不同的环境下使用不同的组件,因为选择IIS还是APACHE由工作环境所决定,这点两者不分高下。
八、支持语言方面:
由于目前建立网站和论坛的语言多种多样,例如ASP,PHP,JSP等语言。那么IIS和APACHE对他们都支持吗?
IIS对ASP特别是.net运行很稳定,不过对于PHP和JSP就比较麻烦了。PHP需要经过反复配置才能在windows2003上支持。APACHE则能够很好的支持上面提到的几种语言,运行ASP,PHP,JSP都没有任何问题。
结论——APACHE支持语言比较多,IIS支持PHP和JSP时有点麻烦,需要经过一定的配置。APACHE获胜。
九、待遇方面:
提到待遇方面可能很多读者会比较纳闷,怎么IIS和APACHE还存在待遇问题呢?其实我们这里要讨论的是网络管理员的待遇。一个会IIS的网络管理员与一个会APACHE的网络管理员,他们的薪水是不一样的。
APACHE最大的好处就是配置参数多,如果要精通APACHE需要很高的水平。所以同等水平的网络管理员会APACHE的要比会IIS的待遇更好。[linuxman说:嘿嘿,就凭这一条,赶紧学好apache吧:-)]
结论——钱多是获胜的唯一标准,APACHE占优。
总结:
其实今天我们在这里争论IIS好还是APACHE好是没有很大意义的,本文所进行的比较也只是给那些徘徊在网络管理员路口,不知道学习哪个工具来建立网站的读者一点参考。只有你对IIS和APACHE有了一个大概的了解之后,才能为自己的未来进行规划。
总的来说Apache的优点在于在各种开源的WWW服务提供工具中特性最全,支持最广,相对比较稳定的,而且扩展性丰富。不过正因为要考虑扩展性,性能就肯定不会太高,只能保持一个中等的水平。而IIS6在处理连接及事件性能方面还是很强大的,超过了APACHE。另外安全方面IIS6也有了质的飞跃,弥补了以往IIS漏洞漫天的缺陷。如果你的公司网络环境不负责,没有涉及太多的开发的话建议仍然使用IIS6。当然如果是建立在WWW上的开发和调试还是使用APACHE更加顺手。
摘要:目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
一、免费与收费之争:
虽然很多用户都使用IIS建立网站,他是集成于Windows操作系统中的组件。不过要想合法使用IIS就要购买正版Windows操作系统。
反观Apache,他是完全免费的。不需要支付任何费用就可以免费下载并使用了。
结论——Apache免费,IIS收费,前者占优。
二、稳定性:
接下来要比较的就是稳定性了,WWW服务要随时运转正常,一个网站也需要一天24小时,一周七天为公众开放。所以稳定性是IIS和APACHE比较的重点。
IIS在实际使用中经常出现500错误,而且有的时候还会出现莫名其妙的假死现象。用户需要不定期的重新启动IIS服务才能保证网站的正常。
Apache在配置上比IIS要复杂,不过一经设置完毕就可以长期的工作了。大型网站都使用APACHE作为自己的WWW服务提供工具。APACHE的所有配置都保存在配置文件中,使用时完全按照配置文件中记录的信息执行。一般不会发生莫名其妙的假死情况。
小提示:在windows2003系统下使用IIS比用APACHE性能要好。
结论——APACHE稳定,IIS有时假死,前者占优。
三、扩展性:
扩展性是指WWW服务提供工具是否可以应用于多种场合,多种网络情况,多种操作系统。
IIS只能在微软公司的windows操作系统下使用,离开了windows他将一事无成。无法移植到其他类型的操作系统中。
APACHE是个多面手,他不仅仅应用于windows,对于unix,linux以及freebsd等多种操作系统来说他都可以胜任工作。而且不同操作系统的配置步骤基本类似,可移植性非常高。
结论——IIS只能在windows下运行,apache应用范围广。apache获胜。
四、安全性:
经常看到某某网站被黑客攻击或者某某网站被非法用户上传病毒的消息,对于为其他人提供服务的站点来说,安全性是最重要的。如果一个网站连自身安全都没有保证的话,谁愿意浏览和使用呢。
早期的IIS在安全性方面存在着很大的问题,如果使用默认设置的话黑客可以轻松趁虚而入。不过在IIS6中微软公司对安全方面进行了大幅改进。只要保证操作系统补丁更新及时,就可以将网站安全系数尽可能的提高。特别是IIS6与.net平台相互倚靠,使安全性几乎完美。
APACHE在安全方面一直做的不错,因为很多用户都是在linux下使用apache,所以操作系统的特点使得linux下的apache具有先天的保护伞,安全性自然没得说。
结论——IIS6以前的版本有安全隐患,IIS6和APACHE一样安全可靠。IIS6与APACHE打个平手。
五、开放性:
所谓开放性就是指是否开放了程序的源代码,众所周知IIS是WINDOWS系统的一部分,所以他的源代码是没有开放的。而apache则不同,最早他是为了类unix系统服务的,所以完全对外开放源代码。任何人都可以分析他的代码,发现其中的漏洞,并发布补丁来弥补该漏洞。
正因为APACHE的这种开放性,也使其安全性大大提高。
结论——IIS不开放代码,APACHE开放源代码。后者获得胜利。
六、难易性:
一个工具使用的难易程度直接影响其用户的多少,特别是网页发布工具。毕竟很多公司希望有自己的网站,但又不希望聘请高薪的网络管理员来维护。因此必然找上手相对容易的工具来搭建自己的站点。
IIS开起来比较简单,很容易就可能让IIS工作,对外发布网站。不过管理员很容易出现错误配置和误操作问题。不过总体说来IIS还是非常容易学的,但要学好他恐怕是件非常困难的事。
APACHE的使用比IIS要难,需要有一定计算机及网络基础的人才可以使用。他的配置也不是图形化的,需要我们通过编辑配置文件来实现。但是单从APACHE的设置上讲,只要我们严格按照帮助文件进行参数设置的话还是没有什么难度的。
结论——IIS容易安装但难精通,APACHE安装相对困难,要想精通也不是一件容易的事。IIS略占优势。
七、编程性:
为了让网页更加丰富多采,更加美观,互动性更好,高手为我们开发了多种组件与控件,那么这些控件在IIS或APACHE下是否正常运行呢?
APACHE下的Mod Rewrite功能非常强大,而IIS中的ISAPI的Rewrite需要专门开发,一般初学者是不能够实现的。APACHE可以使用 Subversion WebDev以及.htaccess功能,还可以使用ForceType。另外IIS对FastCGI的支持也不是很好,所以一些CGI、PHP程序运行起来速度很慢,远不如apache。
结论——不同的环境下使用不同的组件,因为选择IIS还是APACHE由工作环境所决定,这点两者不分高下。
八、支持语言方面:
由于目前建立网站和论坛的语言多种多样,例如ASP,PHP,JSP等语言。那么IIS和APACHE对他们都支持吗?
IIS对ASP特别是.net运行很稳定,不过对于PHP和JSP就比较麻烦了。PHP需要经过反复配置才能在windows2003上支持。APACHE则能够很好的支持上面提到的几种语言,运行ASP,PHP,JSP都没有任何问题。
结论——APACHE支持语言比较多,IIS支持PHP和JSP时有点麻烦,需要经过一定的配置。APACHE获胜。
九、待遇方面:
提到待遇方面可能很多读者会比较纳闷,怎么IIS和APACHE还存在待遇问题呢?其实我们这里要讨论的是网络管理员的待遇。一个会IIS的网络管理员与一个会APACHE的网络管理员,他们的薪水是不一样的。
APACHE最大的好处就是配置参数多,如果要精通APACHE需要很高的水平。所以同等水平的网络管理员会APACHE的要比会IIS的待遇更好。[linuxman说:嘿嘿,就凭这一条,赶紧学好apache吧:-)]
结论——钱多是获胜的唯一标准,APACHE占优。
总结:
其实今天我们在这里争论IIS好还是APACHE好是没有很大意义的,本文所进行的比较也只是给那些徘徊在网络管理员路口,不知道学习哪个工具来建立网站的读者一点参考。只有你对IIS和APACHE有了一个大概的了解之后,才能为自己的未来进行规划。
总的来说Apache的优点在于在各种开源的WWW服务提供工具中特性最全,支持最广,相对比较稳定的,而且扩展性丰富。不过正因为要考虑扩展性,性能就肯定不会太高,只能保持一个中等的水平。而IIS6在处理连接及事件性能方面还是很强大的,超过了APACHE。另外安全方面IIS6也有了质的飞跃,弥补了以往IIS漏洞漫天的缺陷。如果你的公司网络环境不负责,没有涉及太多的开发的话建议仍然使用IIS6。当然如果是建立在WWW上的开发和调试还是使用APACHE更加顺手。
2008年11月5日星期三
Postfix邮件系统的安装与配置
一、 postfix概述 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。下面一段话摘自postfix的官方站点(http://www.postfix.org): “postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真实一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与 sendmail保持足够的兼容性。” 1.1 postfix的特点 1. postfix是免费的: postfix想要作用的范围是广大的Internet用户,试图影响大多数的Internet上的电子邮件系统,因此它是免费的。 2. 更快: postfix在性能上大约比sendmail快三倍。一部运行postfix的台式PC每天可以收发上百万封邮件。 3. 兼容性好: postfix是sendmail兼容的,从而使sendmail用户可以很方便地迁移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。 4. 更健壮: postfix被设计成在重负荷之下仍然可以正常工作。当系统运行超出了可用的内存或磁盘空间时,postfix会自动减少运行进程的数目。当处理的邮件数目增长时,postfix运行的进程不会跟着增加。 5. 更灵活: postfix是由超过一打的小程序组成的,每个程序完成特定的功能。你可以 通过配置文件设置每个程序的运行参数。 6. 安全性 postfix具有多层防御结构,可以有效地抵御恶意入侵者。如大多数的postfix程序可以运行在较低的权限之下,不可以通过网络访问安全性相关的本地投递程序等等。 1.2 postfix的总体结构 postfix由十几个具有不同功能的半驻留进程组成,并且在这些进程中并无特定的进程间父子关系。某一个特定的进程可以为其他进程提供特定的服务。 大多数的postfix进程由一个进程统一进行管理,该进程负责在需要的时候调用其他进程,这个管理进程就是master进程。该进程也是一个后台程序。 这些postfix进程是可以配置的,我们可以配置每个进程运行的数目,可重用的次数,生存的时间等等。通过灵活的配置特性可以使整个系统的运行成本大大降低。 1.2.1 postfix的邮件队列(mail queues) postfix有四种不同的邮件队列,并且由队列管理进程统一进行管理: 1. maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中。 2. incoming:放置正在到达或队列管理进程尚未发现的邮件。 3. active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有 长度的限制。 4. deferred:放置不能被投递的邮件。 队列管理进程仅仅在内存中保留active队列,并且对该队列的长度进行限 制,这样做的目的是为了避免进程运行内存超过系统的可用内存。 1.2.2 postfix对邮件风暴的处理 当有新的邮件到达时,postfix进行初始化,初始化时postfix同时只接受两个并发的连接请求。当邮件投递成功后,可以同时接受的并发连接的数目就会缓慢地增长至一个可以配置的值。当然,如果这时系统的消耗已到达系统不能承受的负载就会停止增长。还有一种情况时,如果postfix在处理邮件过程中遇到了问题,则该值会开始降低。 当接收到的新邮件的数量超过postfix的投递能力时,postfix会暂时停止投递 deferred队列中的邮件而去处理新接收到的邮件。这是因为处理新邮件的延迟要小于处理deferred队列中的邮件。Postfix会在空闲时处理 deferred中的邮件。 1.2.3 postfix对无法投递的邮件的处理 当一封邮件第一次不能成功投递时,postfix会给该邮件贴上一个将来的时间邮票。邮件队列管理程序会忽略贴有将来时间邮票的邮件。时间邮票到期时,postfix会尝试再对该邮件进行一次投递,如果这次投递再次失败,postfix就给该邮件贴上一个两倍于上次时间邮票的时间邮票,等时间邮票到期时再次进行投递,依此类推。当然,经过一定次数的尝试之后,postfix会放弃对该邮件的投递,返回一个错误信息给该邮件的发件人。 1.2.4 postfix对不可到达的目的地邮件的处理 postfix会在内存中保存一个有长度限制的当前不可到达的地址列表。这样就避免了对那些目的地为当前不可到达地址的邮件的投递尝试。从而大大提高了系统的性能。 1.2.5 postfix的安全性 postfix通过一系列的措施来提高系统的安全性,这些措施包括: 1. 动态分配内存,从而防止系统缓冲区溢出; 2. 把大邮件分割成几块进行处理,投递时再重组; 3. Postfix的各种进程不在其他用户进程的控制之下运行,而是运行在驻留 主进程master的控制之下,与其他用户进程无父子关系,所有有很好的 绝缘性。 4. Postfix的队列文件有其特殊的格式,只能被postfix本身识别;
二、 postfix对邮件的处理过程 2.1 接收邮件的过程 当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理: 1.对于来自于本地的邮件:sendmail进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测。maildrop目录的权限必须设置为某一用户不能删除其他用户的邮件。 2.对于来自于网络的邮件:smtpd进程负责接收来自于网络的邮件,并且进行安全性检测。可以通过UCE(unsolicited commercial email)控制smtpd的行为。 3.由postfix进程产生的邮件:这是为了将不可投递的信息返回给发件人。这些邮件是由bounce后台程序产生的。 5. 由postfix自己产生的邮件:提示postmaster(也即postfix管理员)postfix 运行过程中出现的问题。(如SMTP协议问题,违反UCE规则的记录等等。) 关于cleanup后台程序的说明:cleanup是对新邮件进行处理的最后一道工序 它对新邮件进行以下的处理:添加信头中丢失的Form信息;为将地址重写成标准的user@fully.qualified.domain格式进行排列;重信头中抽出收件人的地址;将邮件投入incoming队列中,并请求邮件队列管理进程处理该邮件;请求trivial-rewrite进程将地址转换成标准的user@fully.qualified.domain格式。 2.2 投递邮件的过程 新邮件一旦到达incoming队列,下一步就是开始投递邮件,postfix投递邮件时的处理过程如图三所示。相关的说明如下: 邮件队列管理进程是整个postfix邮件系统的心脏。它和local、smtp、pipe等投递代理相联系,将包含有队列文件路径信息、邮件发件人地址、邮件收件人地址的投递请求发送给投递代理。队列管理进程维护着一个deferred队列,那些无法投递的邮件被投递到该队列中。除此之外,队列管理进程还维护着一个active队列,该队列中的邮件数目是有限制的,这是为了防止在负载太大时内存溢出。邮件队列管理程序还负责将收件人地址在 relocated表中列出的邮件返回给发件人,该表包含无效的收件人地址。 如果邮件队列管理进程请求,rewrite后台程序对收件人地址进行解析。但是缺省地,rewrite只对邮件收件人是本地的还是远程的进行区别。 如果邮件对你管理进程请求,bounce后台程序可以生成一个邮件不可投递的报告。 本地投递代理local进程可以理解类似UNIX风格的邮箱,sendmail风格的系统别名数据库和sendmail风格的.forward文件。可以同时运行多个local进程,但是对同一个用户的并发投递进程数目是有限制的。你可以配置local将邮件投递到用户的宿主目录,也可以配置local 将邮件发送给一个外部命令,如流行的本地投递代理procmail。在流行的linux发行版本RedHat中,我们就使用procmail作为最终的本地投递代理。 远程投递代理SMTP进程根据收件人地址查询一个SMTP服务器列表,按照顺序连接每一个SMTP服务器,根据性能对该表进行排序。在系统负载太大时,可以有数个并发的SMTP进程同时运行。 pipe是用于UUCP协议的投递代理。 三、 postfix的安装过程 3.1源代码包的安装 1. 获取postfix的源代码包 从postfix官方站点www.postfix.org取得postfix的源代码包postfix-19991231-pl08.tar.gz。将其拷贝到/tmp 2.解开源代码包,将生成/tmp/ postfix-19991231-pl08目录。 tar xvzf postfix-19991231-pl08.tar.gz 3.编译源代码包 cd /tmp/ postfix-19991231-pl08 make 4.建立一个新用户“postfix”,该用户必须具有唯一的用户id和组id号,同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主目录。我们可以先用adduser postfix 添加用户再编辑/etc/passwd文件中的相关条目如下所示: postfix:*:12345:12345:postfix:/no/where:/no/shell 5.确定/etc/aliases文件中包含如下的条目: postfix: root 6. 以root用户登录,在/tmp/ postfix-19991231-pl08目录下执行命令: ./INSTALL.sh 7. 启动postfix # postfix start 8.关于maildrop目录权限的说明: postfix可以使用一个所有用户都可写的(也即目录权限为1773)的maildrop目录来让本地用户提交邮件。这种方法避免了使用set- uid 或 set-gid 软件,并且在邮件系统不可用时,用户仍然可以提交邮件。其他用户没有访问该目录中的队列文件的权限。接收来自网络的邮件时postfix不使用 maildrop目录。但是,由于该目录的权限是733,其他用户可以建立一个硬连接到该目录中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致安全性问题。如果你想要使用这种方式来让用户提交邮件,就要在INSTALL.sh 脚本问你是否需要set-gid 时回答no。 如果你的系统有多个用户的话,最好取消以上的方式而采用利用set-gid 用户权限提交邮件的方式。这时,我们首先需要建立一个组id唯一的组'maildrop' 并且确定该组中没有用户成员。然后在INSTALL.sh 问你是否需要set-gid 时指定'maildrop'。 提示:在安装postfix之前,请删除已经安装的sendmail。 3.2 rpm包的安装 1. 获取postfix的rpm软件包。 我们可以从http://www.alltrading.es/postfix/RPMS/i386/ 获得postfix的rpm软件包。当前的最新版本是postfix-20000531-2.i386.rpm。 2. 备份你的/etc/aliases和/etc/aliases.db,因为postfix要使用该别名数据库。 3. 用以下命令查看系统是否安装了sendmail: [root@mail /root]# rpm -qa grep sendmail sendmail-doc-8.9.3-15 sendmail-8.9.3-15 sendmail-cf-8.9.3-15 4. 用以下命令强行卸载sendmail: [root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps 5. 用以下命令杀死运行中的sendmail进程: [root@mail /root]# killall sendmail 6. 安装postfix: [root@mail /root]# rpm -Uvh postfix-20000531-2.i386.rpm postfix ################################################## postfix-script: warning: creating missing Postfix pid directory postfix-script: warning: creating missing Postfix incoming directory postfix-script: warning: creating missing Postfix active directory postfix-script: warning: creating missing Postfix bounce directory postfix-script: warning: creating missing Postfix defer directory postfix-script: warning: creating missing Postfix deferred directory postfix-script: warning: creating missing Postfix saved directory postfix-script: warning: creating missing Postfix corrupt directory postfix-script: warning: creating missing Postfix public directory postfix-script: warning: creating missing Postfix private directory [root@mail /root]# 7. 启动postfix [root@mail /root]# /etc/rc.d/init.d/postfix start 3.3 配置系统每次启动时自动启动postfix 1.如果你安装的是postfix的源代码包,可以在/etc/rc.d/rc.local文件中加入如下的语句让系统每次启动时自动启动postfix: if [ -f /usr/libexec/postfix ]; then /usr/libexec/postfix start fi 2.如果你安装的是postfix的rpm包,可以通过setup命令来设置在系统启动时启动postfix。
但是我们也可以通过下面的规则来实现更强大的控制功能。 1. 信头过滤 通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如: header_checks = regexp:/etc/postfix/header_checks header_checks = pcre:/etc/postfix/header_checks 缺省地,postfix不进行信头过滤。 2.客户端主机名/地址限制 通过smtpd_client_restrictions参数限制可以向postfix发起SMTP 连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接请求。可以用 unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如果你有用户没有作DNS记录则不要启用该选项。 permit_mynetworks:如果客户端的ip地址符合$mynetworks参数定义的范围则接受该客户端的连接请求,并转发该邮件。 check_client_access maptype:mapname:根据客户端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为 554)。 reject_maps_rbl:如果客户端的网络地址符合$maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl smtpd_client_restrictions = permit_mynetworks, reject_unknown_client 该参数的缺省值为: smtpd_client_restrictions = 也即接收来自任何客户端的SMTP连接。 3. 是否请求HELO命令 可以通过smtpd_helo_required参数指定客户端在SMTP会话的开始是否发送一个HELO命令。你可以指定该参数的值为yes或no。缺省值为: smtpd_helo_required = no 4. HELO主机名限制 可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺省地,postfix接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)。 permit_naked_ip_address:RFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。 reject_unknown_hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)。 check_helo_access maptype:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname 5. RFC 821信头限制 RFC 821对邮件的信头做了严格的规定,但是广泛使用的sendmail并不支 持该规定,所以对于该参数我们只能说不,即: strict_rfc821_envelopes = no 6. 通过发件人地址进行限制 可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_sender_domain:如果MAIL FROM命令提供的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 check_sender_access maptype:mapname:根据MAIL FROM命令提供的主机名、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。 reject_non_fqdn_sender:如果MAIL FROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 缺省地,postfix接受来自任何发件人的邮件。 示例: smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain 7. 通过收件人地址进行过滤 可以用smtpd_recipient_restrictions参数通过发件人在执行RCPT TO命令时提供的地址进行限制。缺省值为: smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains 可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接,可以用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 * 客户端主机名符合$relay_domains及其子域 * 目的地为$inet_interfaces、$mydestination或$virtual_maps permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就 接受SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_recipient:如果发件人在执行RCPT TO命令时提供的地址 不是完整的域名则拒绝其SMTP连接请求。可以用The non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。 4.4 posftfix的性能控制 之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常,我们可以通过对下列postfix参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfix reload命令来使配置生效。 1. 进程数限制 可以通过default_process_limit 参数来控制postfix系统同时可以运行的最大进程数目。缺省值是50个。 2. 对同一目标主机的并发连接限制 当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过以下的参数对同一目标主机的并发连接进行控制: * initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。 * default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。 * local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。 3. 对同一封邮件的收件人数目限制 通过default_destination_recipient_limit参数来控制postfix的投递代理(如 smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000。 4. 推迟投递控制 通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一个例子: 有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这时我们可以这样指定该参数的值: defer_transports = smtp 该语句表示postfix推迟投递所有的邮件直到执行sendmail -q命令,这样我们就可以在ppp的脚本中加上sendmail -q,以便在拨号成功后让postfix开始投递邮件。
二、 postfix对邮件的处理过程 2.1 接收邮件的过程 当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理: 1.对于来自于本地的邮件:sendmail进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测。maildrop目录的权限必须设置为某一用户不能删除其他用户的邮件。 2.对于来自于网络的邮件:smtpd进程负责接收来自于网络的邮件,并且进行安全性检测。可以通过UCE(unsolicited commercial email)控制smtpd的行为。 3.由postfix进程产生的邮件:这是为了将不可投递的信息返回给发件人。这些邮件是由bounce后台程序产生的。 5. 由postfix自己产生的邮件:提示postmaster(也即postfix管理员)postfix 运行过程中出现的问题。(如SMTP协议问题,违反UCE规则的记录等等。) 关于cleanup后台程序的说明:cleanup是对新邮件进行处理的最后一道工序 它对新邮件进行以下的处理:添加信头中丢失的Form信息;为将地址重写成标准的user@fully.qualified.domain格式进行排列;重信头中抽出收件人的地址;将邮件投入incoming队列中,并请求邮件队列管理进程处理该邮件;请求trivial-rewrite进程将地址转换成标准的user@fully.qualified.domain格式。 2.2 投递邮件的过程 新邮件一旦到达incoming队列,下一步就是开始投递邮件,postfix投递邮件时的处理过程如图三所示。相关的说明如下: 邮件队列管理进程是整个postfix邮件系统的心脏。它和local、smtp、pipe等投递代理相联系,将包含有队列文件路径信息、邮件发件人地址、邮件收件人地址的投递请求发送给投递代理。队列管理进程维护着一个deferred队列,那些无法投递的邮件被投递到该队列中。除此之外,队列管理进程还维护着一个active队列,该队列中的邮件数目是有限制的,这是为了防止在负载太大时内存溢出。邮件队列管理程序还负责将收件人地址在 relocated表中列出的邮件返回给发件人,该表包含无效的收件人地址。 如果邮件队列管理进程请求,rewrite后台程序对收件人地址进行解析。但是缺省地,rewrite只对邮件收件人是本地的还是远程的进行区别。 如果邮件对你管理进程请求,bounce后台程序可以生成一个邮件不可投递的报告。 本地投递代理local进程可以理解类似UNIX风格的邮箱,sendmail风格的系统别名数据库和sendmail风格的.forward文件。可以同时运行多个local进程,但是对同一个用户的并发投递进程数目是有限制的。你可以配置local将邮件投递到用户的宿主目录,也可以配置local 将邮件发送给一个外部命令,如流行的本地投递代理procmail。在流行的linux发行版本RedHat中,我们就使用procmail作为最终的本地投递代理。 远程投递代理SMTP进程根据收件人地址查询一个SMTP服务器列表,按照顺序连接每一个SMTP服务器,根据性能对该表进行排序。在系统负载太大时,可以有数个并发的SMTP进程同时运行。 pipe是用于UUCP协议的投递代理。 三、 postfix的安装过程 3.1源代码包的安装 1. 获取postfix的源代码包 从postfix官方站点www.postfix.org取得postfix的源代码包postfix-19991231-pl08.tar.gz。将其拷贝到/tmp 2.解开源代码包,将生成/tmp/ postfix-19991231-pl08目录。 tar xvzf postfix-19991231-pl08.tar.gz 3.编译源代码包 cd /tmp/ postfix-19991231-pl08 make 4.建立一个新用户“postfix”,该用户必须具有唯一的用户id和组id号,同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主目录。我们可以先用adduser postfix 添加用户再编辑/etc/passwd文件中的相关条目如下所示: postfix:*:12345:12345:postfix:/no/where:/no/shell 5.确定/etc/aliases文件中包含如下的条目: postfix: root 6. 以root用户登录,在/tmp/ postfix-19991231-pl08目录下执行命令: ./INSTALL.sh 7. 启动postfix # postfix start 8.关于maildrop目录权限的说明: postfix可以使用一个所有用户都可写的(也即目录权限为1773)的maildrop目录来让本地用户提交邮件。这种方法避免了使用set- uid 或 set-gid 软件,并且在邮件系统不可用时,用户仍然可以提交邮件。其他用户没有访问该目录中的队列文件的权限。接收来自网络的邮件时postfix不使用 maildrop目录。但是,由于该目录的权限是733,其他用户可以建立一个硬连接到该目录中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致安全性问题。如果你想要使用这种方式来让用户提交邮件,就要在INSTALL.sh 脚本问你是否需要set-gid 时回答no。 如果你的系统有多个用户的话,最好取消以上的方式而采用利用set-gid 用户权限提交邮件的方式。这时,我们首先需要建立一个组id唯一的组'maildrop' 并且确定该组中没有用户成员。然后在INSTALL.sh 问你是否需要set-gid 时指定'maildrop'。 提示:在安装postfix之前,请删除已经安装的sendmail。 3.2 rpm包的安装 1. 获取postfix的rpm软件包。 我们可以从http://www.alltrading.es/postfix/RPMS/i386/ 获得postfix的rpm软件包。当前的最新版本是postfix-20000531-2.i386.rpm。 2. 备份你的/etc/aliases和/etc/aliases.db,因为postfix要使用该别名数据库。 3. 用以下命令查看系统是否安装了sendmail: [root@mail /root]# rpm -qa grep sendmail sendmail-doc-8.9.3-15 sendmail-8.9.3-15 sendmail-cf-8.9.3-15 4. 用以下命令强行卸载sendmail: [root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps 5. 用以下命令杀死运行中的sendmail进程: [root@mail /root]# killall sendmail 6. 安装postfix: [root@mail /root]# rpm -Uvh postfix-20000531-2.i386.rpm postfix ################################################## postfix-script: warning: creating missing Postfix pid directory postfix-script: warning: creating missing Postfix incoming directory postfix-script: warning: creating missing Postfix active directory postfix-script: warning: creating missing Postfix bounce directory postfix-script: warning: creating missing Postfix defer directory postfix-script: warning: creating missing Postfix deferred directory postfix-script: warning: creating missing Postfix saved directory postfix-script: warning: creating missing Postfix corrupt directory postfix-script: warning: creating missing Postfix public directory postfix-script: warning: creating missing Postfix private directory [root@mail /root]# 7. 启动postfix [root@mail /root]# /etc/rc.d/init.d/postfix start 3.3 配置系统每次启动时自动启动postfix 1.如果你安装的是postfix的源代码包,可以在/etc/rc.d/rc.local文件中加入如下的语句让系统每次启动时自动启动postfix: if [ -f /usr/libexec/postfix ]; then /usr/libexec/postfix start fi 2.如果你安装的是postfix的rpm包,可以通过setup命令来设置在系统启动时启动postfix。
但是我们也可以通过下面的规则来实现更强大的控制功能。 1. 信头过滤 通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如: header_checks = regexp:/etc/postfix/header_checks header_checks = pcre:/etc/postfix/header_checks 缺省地,postfix不进行信头过滤。 2.客户端主机名/地址限制 通过smtpd_client_restrictions参数限制可以向postfix发起SMTP 连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接请求。可以用 unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如果你有用户没有作DNS记录则不要启用该选项。 permit_mynetworks:如果客户端的ip地址符合$mynetworks参数定义的范围则接受该客户端的连接请求,并转发该邮件。 check_client_access maptype:mapname:根据客户端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为 554)。 reject_maps_rbl:如果客户端的网络地址符合$maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl smtpd_client_restrictions = permit_mynetworks, reject_unknown_client 该参数的缺省值为: smtpd_client_restrictions = 也即接收来自任何客户端的SMTP连接。 3. 是否请求HELO命令 可以通过smtpd_helo_required参数指定客户端在SMTP会话的开始是否发送一个HELO命令。你可以指定该参数的值为yes或no。缺省值为: smtpd_helo_required = no 4. HELO主机名限制 可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺省地,postfix接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)。 permit_naked_ip_address:RFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。 reject_unknown_hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)。 check_helo_access maptype:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname 5. RFC 821信头限制 RFC 821对邮件的信头做了严格的规定,但是广泛使用的sendmail并不支 持该规定,所以对于该参数我们只能说不,即: strict_rfc821_envelopes = no 6. 通过发件人地址进行限制 可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_sender_domain:如果MAIL FROM命令提供的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 check_sender_access maptype:mapname:根据MAIL FROM命令提供的主机名、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。 reject_non_fqdn_sender:如果MAIL FROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 缺省地,postfix接受来自任何发件人的邮件。 示例: smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain 7. 通过收件人地址进行过滤 可以用smtpd_recipient_restrictions参数通过发件人在执行RCPT TO命令时提供的地址进行限制。缺省值为: smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains 可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接,可以用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 * 客户端主机名符合$relay_domains及其子域 * 目的地为$inet_interfaces、$mydestination或$virtual_maps permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就 接受SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_recipient:如果发件人在执行RCPT TO命令时提供的地址 不是完整的域名则拒绝其SMTP连接请求。可以用The non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。 4.4 posftfix的性能控制 之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常,我们可以通过对下列postfix参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfix reload命令来使配置生效。 1. 进程数限制 可以通过default_process_limit 参数来控制postfix系统同时可以运行的最大进程数目。缺省值是50个。 2. 对同一目标主机的并发连接限制 当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过以下的参数对同一目标主机的并发连接进行控制: * initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。 * default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。 * local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。 3. 对同一封邮件的收件人数目限制 通过default_destination_recipient_limit参数来控制postfix的投递代理(如 smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000。 4. 推迟投递控制 通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一个例子: 有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这时我们可以这样指定该参数的值: defer_transports = smtp 该语句表示postfix推迟投递所有的邮件直到执行sendmail -q命令,这样我们就可以在ppp的脚本中加上sendmail -q,以便在拨号成功后让postfix开始投递邮件。
2008年10月28日星期二
VMware构建真实的虚拟网络
VMware网络基础我们以前的文章里,曾经介绍过简单的 VMware网络,VMWare提供了三种工作模式,它们是bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。这三种模式主要是为了用户建立虚拟机后可以根据现实网络情况方便的把虚拟机接入网络。我们理解了这三种网络的工作原理,就可以用VMware任意定制自己网络结构。当我们安装完成VMware Workstation后,我们会发现在网络连接里将多出两块块虚拟网卡(如下图),新增了两块虚拟网卡用ipconfig命令查看新增加的网卡的属性可以发现,这两块网卡分别属于不同的子网(见下图)。新增的虚拟网卡的信息在前面的文章里我们介绍过三种典型的VMware网络,桥接模式是把虚拟机的网卡直接桥接在你的真实网卡上,并不会在你的系统中生成一块独立的网卡。桥接模式组成的网络在VMware中以VMnet0表示,实际上可以看成你本机所在的真实局域网在虚拟机网络中映射,通过VMnet0也即桥接模式接入网络的虚拟机相当于通过一个交换机和你的真实机器一起接入了你实际所在的局域网。如果你的局域网提供了DHCP服务,那么你的桥接网络机器可以自动获得局域网的 IP。如果你在通过桥接网络接入网的虚拟机上运行ipconfig命令,可以看到虚拟机的IP地址在在现实的局域网段内。对于网上的其它机器而言,就如同本网段新增了一台真实的机器一样。再来看新增的两块网卡:“Ethernet adapter VMware Network Adapter VMnet1”用于本机与使用NAT网络模式的虚拟机相连,使用这种模式建立的虚拟机所于虚拟机的VMnet1子网内,在这个子网中,VMware还提供了DHCP服务让子网的虚拟机可以方便的获得IP地址。当然,你也可以为处于此子网的虚拟机手动设置IP,不过一定要注意地址要VMnet1设定的网段内。这时,你的真实主机将做为VMnet1的网关,也即虚拟网络VMnet1与现实局域网之间的路由器在两个网段间转发数据。VMnet1的特殊之处在于 VMware为这个网段默认启用了NAT服务(如下图),在虚拟子网中启用NAT“VMware Network Adapter VMnet8”这块网卡主要用于真实主机与处于host-only(主机模式)的虚拟机相连,处于这种模式的虚拟机位于VMware虚拟网络的 VMnet8子网内,这个子网除了IP段不同和没有提供NAT服务外,与VMnet1也就是NAT模式组成的虚拟子网没有什么不同。如果你喜欢你完全可以激活VMnet8子网的NAT服务,这样VMnet8就成为了另一个NAT模式的子网。如果在默认的不激活NAT的情况下,该子网的虚拟机将只能与 VMnet8网内的其它虚拟机以及真实主机通信,这就是“host-only”名称的由来。 打开VMware的网络设置界面你可以对VMware网络模式有更深刻的理解(见下图),VMware中的各个子网与主机中网卡的对应关系在VMware 里最多可以有9个不同的虚拟子网(有三个在软件装好后已经启用了,它们是VMnet0,VMnet1,VMnet8),你可以在这里点击每个字网后的 “>”按纽设置该子网的IP地址和是否启用DHCP等。在“Host Virtual Adapers”标签页里(如下图)可以添加更多的虚拟网卡并把这些网卡通过如上面的图所示界面接入相应的虚拟网络。向真实主机中新增虚拟网卡综上所述,我们可以看到,VMware中的三种网络模式只是为了方便快速将虚拟机加入现实网络的一种预定义模式而已,当你安装好VMware Workstaion后,软件会预先设置好三个虚拟子网以对应三种基本模式。我们完全可以通过定制这些网络的属性改变它的默认行为,例如让host- only模式转变为NAT模式或反之亦然。也可以向真实主机添加更多的虚拟网卡从而启用更多的虚拟子网(虚拟子网数最多可以有9个)。真实的主机是所有虚拟子网的中心,连接着全部虚拟子网。同事,你可以向一台虚拟机中加入多块分属不同虚拟网络的网卡,让一台虚拟机连接不同的虚拟子网(如下图,在虚拟机中添加虚拟网卡),这样,由连接全部虚拟子网与现实网络的主机,与多台属于一个或多个虚拟子网的虚拟机就可以共同组建复杂的虚拟与现实混合网络。我们可以在这个真实的虚拟网络中实际各种网络技巧。之所以在这个虚拟网络前面加上“真实”两个字,是因为在这个虚拟网络中做任何操作的方法与在现实网络中是一致的,虚拟机上安装的全是真实的操作系统,除了你不用与交换机网线等硬件设备打交道外,与现实网络没有任何区别。你完全可以把这个虚拟网络接入现实网络并与现实网络中的其它系统通讯,此时,对于现实网络中的客户机而言,与之通信的虚拟机与其它任何现实网络系统中的终端没有任何区别。在虚拟机中新增虚拟网卡一个定制的VMware虚拟网络结构拓扑图以上对VMware中的网络实现方法做了简单的分析,在以后的文章里,我们将实际构建一个这种虚拟网络并用之完成各种现实局域网环境中常见的网管任务。我们重点介绍了VMware虚拟网络的基础知识,从本篇文章开始,我们将实际建立并设置一个虚拟网络。实验目标 这里首先说一下我们准备构建的网络拓扑。我们的目标是建立两个定制的子网VMnet2和VMnet3,这两个网络与真实主机是不直接相连的(真实主机中我并不添加连接到这两个网络的虚拟网卡),而是通过一台以桥接模式创建的属于VMnet0的虚拟机连接VMnet0,真实的局域网也即VMnet0通过本地的网关连接internet,我们将VMnet2的虚拟机称为VMnet2PC,VMnet3的虚拟机称为VMnet3PC,VMnet0的PC称为 VMnet0PC,现在把VMnet3PC作为域控制器,VMnet0PC作为路由器和DNS服务器,要求PC和VMnet0PC都加入VMnet3PC 建立的域,三个网段要求互联互通,并都可以访问internet。网络拓扑图如下:目标网络拓扑图 本例中需要建立3台虚拟机,而真实的PC也处于VMnet0子网中,再次强调一下,VMnet0实际上是现实局域网在虚拟网络中的映射。 下面,让我们首先来构建这个基础的网络架构——建立起各台虚拟机并分别为它们添加所需的虚拟网卡然后将之接入指定的网络。构建“物理”网络 首先,我们建立第一台虚拟机VMnet0PC,建立时在连接模式选择处我们选择桥接网络如下图(这里我们并没有修改默认的虚拟网络行为),这样,这台虚拟机会有一块连接到VMnet0的虚拟网卡,与真实PC处于同一个网段内。新增虚拟机时选择网络模式 我们在前面的网络拓扑图中看到,VMnet0PC应该有三块不同的网卡分别接入三个不同的虚拟网络,在建立虚拟机机,VMware已经自动添加了一块接连到VMnet0的虚拟网卡,现在我们为它更添加两块分别连接到VMnet2和VMnet3的网卡。打开虚拟机的属性点“hardware”标签下面的“add”按钮(如下图)。向虚拟机增加新网卡 在弹出的硬件添加向导中选择添加网卡,随后弹出如下所示的对话框,在里面选择网卡装要连接的网络。分别添加两块网卡连接到VMnet2和VMnet3。然后在虚拟机中安装Windows server 2003专业版操作系统并设置好桥接网卡以连接到internet打好必要的服务器补丁。至此,第一台服务器VMnet0PC设置基本完成并接入了目标网络。选择新网卡接入的网络在第一台机器设置完成后,关闭虚拟机,点窗口左侧上的“clone virtual machine”命令,对第一台虚拟机进行复制(如下图),将新虚拟机命名为VMnet2PC,因为VMnet2PC仅需一块网卡,因此,需要在虚拟机硬件属性中删除多余的两块网卡并把剩余那块网卡接入VMnet2。重复以上步骤建立虚拟机VMnet3PC并将之连入网络。复制虚拟机 至此,“硬件”的建立与连接已经完成。下面对各虚拟机网卡的TCP/IP属性分别进行设置,让VMnet2PC和VMnet3PC分别可以与 VMnet0PC互联(跨网的互联这里先不涉及,那将是下一篇文章的内容)。这里简述一下各个子网的设置。VMnet0PC三块网卡中,一块用真实局域网的IP地址,一块用VMnet2子网的地址192.168.2.1/255.255.255.0,一块用VMnet3子网的地址 192.168.3.1/255.255.255.0,位于VMnet2的VMnet2PC使用 IP192.168.2.2/255.255.255.0,网关和DNS为192.168.2.1。位于VMnet3的VMnet3PCIP为 192.168.3.2/,网关和DNS设为192.168.3.1。 到目前为止,仅有VMnet0PC可以连接internet并访问所有的网段。在下一篇文章里,我们将让这个“物理上”已经连接的虚拟机网络的各网段互联互通,并都可以访问internet。. 小知识: 在VMware5.0以前版本没有提供虚拟机复制命令,不过可以通过对虚拟机文件夹的复杂方便的达到同样的目的。但新版本中的虚拟机复制不是简单的文件复制,而是提供了很多增强,新虚拟机可以来源与源虚拟机的一个快照,还可以与源虚拟机关联起来以减少存储所需空间。在第一台用于试验的虚拟机建立以后,最好保存一个此时状态的快照,在试验完成以后可以随时还原到系统刚安装完成时的状态,这将为今后的实验节省大量的时间。
2008年10月16日星期四
《想要做好老板先要懂得怎样留住员工》
一天,一只兔子在山洞前写文章,
一只狼走了过来,问:“兔子啊,你在干什么?”
答曰:“写文章。”问:“什么题目?”答曰:“《浅谈兔子是怎样吃掉狼的》。”
狼哈哈大笑,表示不信,于是兔子把狼领进山洞。
过了一会,兔子独自走出山洞,继续写文章。
一只野猪走了过来,问:“兔子你在写什么?”答:“文 章。”问:“题目是什么?”
答:“《浅谈兔子是如何把野猪吃掉的》。”野猪不信,于是同样的事情发生。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章,
题目:“《一只动物,能力大小关键要看你的老板是谁》。”
这只兔子有次不小心告诉了他的一个兔子朋友,这消息逐渐在森林中传播;
狮子知道后非常生气,他告诉兔子:“如果这个星期没有食物进洞,我就吃你。”
于是兔子继续在洞口写文章
一只小鹿走过来,“兔子,你在干什么啊?”
“写文章”“什么题目”““《浅谈兔子是怎样吃掉狼的》”
“哈哈,这个事情全森林都知道啊,你别胡弄我了,我是不会进洞的”
“我马上要退休了,狮子说要找个人顶替我,难道你不想这篇文章的兔子变成小鹿么”
小鹿想了想,终于忍不住诱惑,跟随兔子走进洞里。
过了一会,兔子独自走出山洞,继续写文章
一只小马走过来,同样是事情发生了。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章
题目是:如何发展下线动物为老板提供食物
随着时间的推移,狮子越长越大,兔子的食物已远远不能填饱肚子。
一日,他告诉兔子:“我的食物量要加倍,例如:原来4天一只小鹿,现在要2天一只,如果一周之内改变不了局面
我就吃你。
于是,兔子离开洞口,跑进森林深处,他见到一只狼
“你相信兔子能轻松吃掉狼吗”
狼哈哈大笑,表示不信,于是兔子把狼领进山洞。
过了一会,兔子独自走出山洞,继续进入森林深处
这回他碰到一只野猪――――“你相信兔子能轻松吃掉野猪吗”
野猪不信,于是同样的事情发生了。
原来森林深处的动物并不知道兔子和狮子的故事
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章
题目是:如何实现由坐商到行商的转型为老板提供更多的食物
时间飞快,转眼之间,兔子在森林里的名气越来越大
因为大家都知道它有一个很历害的老板
这只小兔开始横行霸道,欺上欺下,没有动物敢惹
它时时想起和乌龟赛跑的羞辱
它找到乌龟说:“三天之内,见我老板!”扬长而去
乌龟难过的哭了
这时却碰到了一位猎人
乌龟把这事告诉了他
猎人哈哈大笑
于是森林里发生了一件重大事情
猎人披着狮子皮和乌龟一起在吃兔子火锅
地下丢了半张纸片歪歪扭扭的写着:山外青山楼外楼,强中还有强中手啊!!
在很长一段时间里森林里恢复了往日的宁静,兔子吃狼的故事似乎快要被大家忘记了
不过一只年轻的老虎在听说了这个故事后,被激发了灵感
于是他抓住了一只羚羊,对羚羊说,如果你可以象以前的兔子那样为我带来食物那我就不吃你。
于是,羚羊无奈的答应了老虎,而老虎也悠然自得的进了山洞。
可是三天过去了,也没有见羚羊领一只动物进洞。他实在憋不住了,想出来看看情况。
羚羊早已不在了,他异常愤怒。正在他暴跳如雷的时候突然发现了羚羊写的一篇文章
题目是:《想要做好老板先要懂得怎样留住员工》
一只狼走了过来,问:“兔子啊,你在干什么?”
答曰:“写文章。”问:“什么题目?”答曰:“《浅谈兔子是怎样吃掉狼的》。”
狼哈哈大笑,表示不信,于是兔子把狼领进山洞。
过了一会,兔子独自走出山洞,继续写文章。
一只野猪走了过来,问:“兔子你在写什么?”答:“文 章。”问:“题目是什么?”
答:“《浅谈兔子是如何把野猪吃掉的》。”野猪不信,于是同样的事情发生。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章,
题目:“《一只动物,能力大小关键要看你的老板是谁》。”
这只兔子有次不小心告诉了他的一个兔子朋友,这消息逐渐在森林中传播;
狮子知道后非常生气,他告诉兔子:“如果这个星期没有食物进洞,我就吃你。”
于是兔子继续在洞口写文章
一只小鹿走过来,“兔子,你在干什么啊?”
“写文章”“什么题目”““《浅谈兔子是怎样吃掉狼的》”
“哈哈,这个事情全森林都知道啊,你别胡弄我了,我是不会进洞的”
“我马上要退休了,狮子说要找个人顶替我,难道你不想这篇文章的兔子变成小鹿么”
小鹿想了想,终于忍不住诱惑,跟随兔子走进洞里。
过了一会,兔子独自走出山洞,继续写文章
一只小马走过来,同样是事情发生了。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章
题目是:如何发展下线动物为老板提供食物
随着时间的推移,狮子越长越大,兔子的食物已远远不能填饱肚子。
一日,他告诉兔子:“我的食物量要加倍,例如:原来4天一只小鹿,现在要2天一只,如果一周之内改变不了局面
我就吃你。
于是,兔子离开洞口,跑进森林深处,他见到一只狼
“你相信兔子能轻松吃掉狼吗”
狼哈哈大笑,表示不信,于是兔子把狼领进山洞。
过了一会,兔子独自走出山洞,继续进入森林深处
这回他碰到一只野猪――――“你相信兔子能轻松吃掉野猪吗”
野猪不信,于是同样的事情发生了。
原来森林深处的动物并不知道兔子和狮子的故事
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章
题目是:如何实现由坐商到行商的转型为老板提供更多的食物
时间飞快,转眼之间,兔子在森林里的名气越来越大
因为大家都知道它有一个很历害的老板
这只小兔开始横行霸道,欺上欺下,没有动物敢惹
它时时想起和乌龟赛跑的羞辱
它找到乌龟说:“三天之内,见我老板!”扬长而去
乌龟难过的哭了
这时却碰到了一位猎人
乌龟把这事告诉了他
猎人哈哈大笑
于是森林里发生了一件重大事情
猎人披着狮子皮和乌龟一起在吃兔子火锅
地下丢了半张纸片歪歪扭扭的写着:山外青山楼外楼,强中还有强中手啊!!
在很长一段时间里森林里恢复了往日的宁静,兔子吃狼的故事似乎快要被大家忘记了
不过一只年轻的老虎在听说了这个故事后,被激发了灵感
于是他抓住了一只羚羊,对羚羊说,如果你可以象以前的兔子那样为我带来食物那我就不吃你。
于是,羚羊无奈的答应了老虎,而老虎也悠然自得的进了山洞。
可是三天过去了,也没有见羚羊领一只动物进洞。他实在憋不住了,想出来看看情况。
羚羊早已不在了,他异常愤怒。正在他暴跳如雷的时候突然发现了羚羊写的一篇文章
题目是:《想要做好老板先要懂得怎样留住员工》
订阅:
博文 (Atom)

