2009年10月 存档

Google Wave 邀请码

2009年10月31日,星期六

刚刚注册上Google Wave,现在有20个邀请名额,需要的给我发邮件,或留言。

不知道 Google Wave 的人请忽略这篇日志 :-)

Linux 和 Unix 系统中最常用的网络命令

2009年10月25日,星期天

1.ftp:将文件传输到另外一台主机(不太安全)。 
2.host:得到网络主机的有关信息。 
3.ifconfig:显示IP地址信息。 
4.netstat:显示路由信息和网络统计数字。 
5.ip:显示IP地址信息。 
6.ping:向其它主机发送应答请求。 
7.rdesktop:在linux Machine上显示MS Windows桌面。 
8.route:显示路由信息。 
9.scp:保障从主机复制文件或将文件复制到主机的安全。 
10.ssh:建立与另外一台主机的加密链接。 
11.sftp:安全地进行ftp传输。 
12.ssh-keygen:生成SSH的加密密钥 
13.telnet:建立与另外一台主机的不安全连接。 
14.tracepath/traceroute:显示数据包到达目的主机所经过的路由。 
15.whois:获得一个域名的有关信息。 
16.xclock:X Window时钟应用程序,用于测试远程显示。 
17.xhost:X Window访问控制工具。

Nginx403错误解决办法

2009年10月24日,星期六

当你安装好Nginx之后,如果你新建一个虚拟目录的话一般都会403的,可以按下面的方法解决

先cd到你的虚拟目录,然后执行

chmod -R 644 `find . -type f`
chmod -R 755 `find . -type d`

就解决了:)

在Linux服务器上开启安全的SNMP代理

2009年10月24日,星期六

 

我们知道,监控宝使用标准的SNMP协议来为用户提供服务器监控功能,这意味着被监控的服务器上必须运行SNMP代理程序(snmpd),接下来我们将详细介绍如何在Linux服务器上安装、开启Snmp代理,并且进行必要的安全配置,随后我们会在其它文章中介绍Windows服务器的配置方法。

关于SNMP协议的定义和描述,可以浏览RFC1157,这里还描述了SNMP的设计动机和原理,到目前为止,SNMP已经被无数的设备用来作为监控协议,并且工作得非常可靠,至于安全性和必要的安全配置,我们在随后会详细介绍,你完全可以让SNMP代理程序在你的服务器上安全的运行。

在各种Linux分发版中,大多数都已经默认集成了snmpd,比如在suse10中,你可以这样开启snmpd:

suse10:~ # /etc/init.d/snmpd start

如果没有默认安装,你要做的就是自己来编译snmpd,按照下边的步骤,非常简单。

编译和安装

对于Linux平台,我们推荐使用Net-SNMP,它实现了标准的SNMP协议,并且包括了代理程序以及各种SNMP工具。

http://net-snmp.sourceforge.net/

首先我们需要下载Net-SNMP的源代码,选择当前最新的版本5.4.2.1,地址如下:

http://sourceforge.net/projects/net-snmp/files/net-snmp/5.4.2.1/

接下来对下载的源代码包进行解压缩,如下

./configure –prefix=/usr/local/snmp –with-openssl=/usr/ –with-mib-modules=ucd-snmp/diskio

make

make install

suse10:~ # tar xzvf net-snmp-5.4.2.1.tar.gz

然后通过configure来生成编译规则,如下:

suse10:~ # cd net-snmp-5.4.2.1
suse10:~ # ./configure —-prefix=/usr/local/snmp —-with-openssl=/usr/ ––with-mib-modules=ucd-snmp/diskio

注意这里的—-with-mib-modules=ucd-snmp/diskio选项,它可以让服务器支持磁盘I/O监控。

接下来,开始编译和安装

suse10:~ # make
suse10:~ # make install

到现在为止,我们已经有了可以运行的SNMP代理程序,它位于/usr/local/snmp/sbin/snmpd,在启动它之前,我们还要进行一些必要的设置。

设置安全的验证方式

将SNMP代理程序暴露给网络上的所有主机是很危险的,为了防止其它主机访问你的SNMP代理程序,我们需要在SNMP代理程序上加入身份验证机制。SNMP支持不同的验证机制,这取决于不同的SNMP协议版本,监控宝目前支持v2c和v3两个版本,其中v2c版本的验证机制比较简单,它基于明文密码和授权IP来进行身份验证,而v3版本则通过用户名和密码的加密传输来实现身份验证,我们建议使用v3,当然,只要按照以下的介绍进行配置,不论是v2c版本还是v3版本,都可以保证一定的安全性,你可以根据情况来选择。

注意一点,SNMP协议版本和SNMP代理程序版本是两回事,刚才说的v2c和v3是指SNMP协议的版本,而Net-SNMP是用来实现SNMP协议的程序套件,目前它的最新版本是刚才提到的5.4.2.1。

v2c

先来看如何配置v2c版本的SNMP代理,我们来创建snmpd的配置文件,默认情况下它是不存在的,我们来创建它,如下:

suse10:~ # vi /usr/local/snmp/share/snmp/snmpd.conf

然后我们需要创建一个只读帐号,也就是read-only community,在snmpd.conf中添加以下内容:

rocommunity jiankongbao 125.76.229.215

注意,这里的“rocommunity”表示这是一个只读的访问权限,监控宝只可以从你的服务器上获取信息,而不能对服务器进行任何设置。

紧接着的“jiankongbao”相当于密码,很多平台喜欢使用“public”这个默认字符串。这里的“jiankongbao”只是一个例子,你可以设置其它字符串作为密码。

最右边的“125.76.229.215”代表指定的监控点IP,这个IP地址是监控宝专用的监控点,这意味着只有监控宝有权限来访问你的SNMP代理程序。

所以,以上这段配置中,只有“jiankongbao”是需要你进行修改的,同时在监控宝上添加服务器的时候,需要提供这个字符串。

v3c

当然,我们建议您使用v3c版本来进行身份验证。对于一些早期版本的Linux分发版,其内置的SNMP代理程序可能并不支持v3c,所以我们建议您按照前边介绍的方法,编译和安装最新的Net-Snmp。

v3c支持另一种验证方式,要创建一个v3c的帐号,我们同样修改以下配置文件:

suse10:~ # vi /usr/local/snmp/share/snmp/snmpd.conf

然后添加一个只读帐号,如下:

rouser jiankongbao auth

可以看到,在v3c中,“rouser”用于表示只读帐号类型,随后的“jiankongbao”是指定的用户名,后边的“auth”指明需要验证。

接下来,我们还要添加“jiankongbao”这个用户,这就是v3c中的特殊机制,我们打开以下配置文件:

suse10:~ # vi /var/net-snmp/snmpd.conf

这个文件会在snmpd启动的时候被自动调用,我们需要在它里边添加创建用户的指令,如下:

createUser jiankongbao MD5 mypassword

这行配置的意思是创建一个名为“jiankongbao”的用户,密码为“mypassword”,并且用MD5进行加密传输。这里要提醒的是,密码至少要有8个字节,这是SNMP协议的规定,如果小于8个字节,通信将无法进行。

值得注意的是,一旦snmpd启动后,出于安全考虑,以上这行配置会被snmpd自动删除,当然,snmpd会将这些配置以密文的形式记录在其它文件中,重新启动snmpd是不需要再次添加这些配置的,除非你希望创建新的用户。

以上配置中的用户名、密码和加密方式,在监控宝添加服务器的时候需要添加。

启动SNMP代理程序

经过配置后,现在可以启动snmpd,如下:

/usr/local/snmp/sbin/snmpd

如果要关闭,则可以直接kill这个进程,如下:

killall -9 snmpd

增强的安全机制

有了以上的验证机制,你就可以放心的使用SNMP代理了。但是,如果你的SNMP代理程序版本较低,可能会有一些别有用心的破坏者利用一些固有的漏洞进行破坏,比如发送较长的数据导致SNMP代理程序内存泄漏或者拒绝服务等,为此,你还可以使用防火墙(iptables)来进行增强的安全过滤。

在Linux中,我们用iptables来实现防火墙,一般情况下,除了流入指定端口的数据包以外,我们应该将其它流入的IP数据包抛弃。你可能已经配置了一定的防火墙规则,那么只要增加针对SNMP的规则即可。

SNMP代理程序默认监控在udp161端口,为你的iptables增加以下规则:

iptables -A INPUT -i eth0 -p udp -s 125.76.229.215 —-dport 161 -j ACCEPT

注意,在以上的dport选项之前,是两个“-”符号,由于排版显示的问题,这里可能会不正常。另外,在以上设置中,假

Linux系统如何批量修改用户密码

2009年10月24日,星期六

    对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect 这样的软件来实现,难道修改一下密码还需要单独安装一个软件包吗? 不,我们其实还有其他很多方法可以让我们避开交互的,下面具体写一下具体的实现方式:

第一种:
echo "123456" | passwd --stdin root
优点:方便快捷
缺点:如果你输入的指令能被别人通过history或者其他方式捕获,那么这样的方式是很不安全的,更重要的是如果密码同时含有单引号和双引号,那么则无法通过这种方法修改。

第二种:
a. 首先将用户名密码一起写入一个临时文件.
cat chpass.txt
root:123456
zhaohang:123456
b. 使用如下命令对用户口令进行修改:
chpasswd < chpass.txt
c. 可以使用 123456 来登录系统,密码修改完毕.
优点:可以很快速方便的修改多个用户密码
缺点:明文密码写在文件里仍然显得不够安全,但是避免了第一种修改方式不能有特殊字符串密码的情况.

第三种:
a. 用 openssl passwd -1 来生成用户口令,连同用户名一起写入文件.
cat chpass.txt
root:$1$ri2hceVU$WIf.firUBn97JKswK9ExO0
zhaohang:$1$i/Gou7.v$Bh2K6sXmxV6/UCxJz8N7b.
b. 使用如下命令对用户口令进行修改:
chpasswd -e < chpass.txt
c. 可以使用 123456 来登录系统,密码修改完毕.
优点:可以很快速方便的修改多个用户密码
缺点:和上面两种相比大大增强了安全性

SQL学习记录

2009年10月23日,星期五

1.4. SQL 语言

正如大多数现代的关系语言一样, SQL 是基于记录关系微积分(TRC)的。 结果是每个可以用记录关系微积分(TRC)表示的查询(相等地,或者是关系演算), 同样也可以用 SQL 表示。不过, 还有一些超出关系演算或者微积分的能力。 下面是一个 SQL 提供的并非关系演算或者关系微积分的内容的一个列表:

插入,删除或者更改数据的命令。

算术能力:在 SQL 里, 我们可以和比较功能一样进行算术运算, 例如

A < B + 3。
要注意 + 或者其他算术操作符从未在关系演算或者关系微积分里面出现过。
分配和打印命令: 我们可以打印一条查询构造的关系以及给一个被计算的关系分配关系名。

聚集函数:象 average,sum, max, 等操作符可以应用于一个关系的列以获取单一的量。

1.4.1. Select(选择)

SQL 里面最常用的命令是 SELECT 语句,用于检索数据。语法是:

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
[ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT [ ALL ] } select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
[ FOR UPDATE [ OF class_name [, ...] ] ]
[ LIMIT { count | ALL } [ { OFFSET | , } start ]]
现在我们将通过不同的例子演示 SELECT 语句复杂的语法。用于这些例子的表在 供应商和部件数据库 里定义。

1.4.1.1. 简单的 Select

这里是一些使用 SELECT 语句的简单例子:

Example 1-4. 带有条件的简单查询

要从表 PART 里面把字段 PRICE 大于 10 的所有记录找出来, 我们写出下面查询:

SELECT * FROM PART
WHERE PRICE > 10;
然后得到表:
PNO |  PNAME  |  PRICE
—–+———+——–
3  |  Bolt   |   15
4  |  Cam    |   25
在 SELECT语句里使用 “*” 将检索出表中的所有属性。 如果我们只希望从表 PART 中检索出属性 PNAME 和 PRICE, 我们使用下面的语句:

SELECT PNAME, PRICE
FROM PART
WHERE PRICE > 10;
这回我们的结果是:
PNAME  |  PRICE
——–+——–
Bolt   |   15
Cam    |   25
请注意 SQL 的 SELECT 语句对应关系演算里面的 “projection” (映射),而不是 “selection”(选择)(参阅 关系演算 获取详细信息)。
WHERE 子句里的条件也可以用关键字 OR,AND,和 NOT 逻辑地连接起来:

(全文…)

PHP学习记录

2009年10月23日,星期五

php常量输出

<?php
define(“C1″, “Hello world.\n”);                        //定义C1为常量
echo C1;                                        //输出C1
echo c1;                                        //变量C1拼写错误,这时不会输出C1的值
define(“C2″, “Hello world.\n”, TRUE);                    //设置case_insensitive为TRUE
echo C2;                                        //输出C2
echo c2;                                        //将C小写输出
?>

php传值赋值和传地址赋值

<?php
$name = ‘Simon’;       //对变量$name进行赋值(传值赋值)
$name_b = $name;       //对变量$name_b进行赋值(传值赋值)
$addr = &$name;        //对变量$addr进行赋值(传地址赋值)
$name = “Elaine”;         //改变$name的值
echo $name;        //输出$name,会发现$name的值发生了变化
echo $name_b;        //输出$name_b,会发现$name_b的值没有发生变化
echo $addr;        //输出$addr,会发现$addr的值发生了变化
$addr = “Helen”;       //改变$addr的值
echo $name;        //输出$name,会发现$name的值发生了变化
echo $addr;         //输出$addr,会发现$addr的值发生了变化
?>

php函数变量调用

<?php
$a = 1;
function func()                                        //函数func
{
echo “Variable a in func: “.$a.”<BR>”;                    //函数内部的变量调用
}
func();
echo “Variable a out of func: “.$a.”<BR>”;                    //函数外的变量调用
?>

<?php
$a = 1;
function func($a)                                    //函数func
{
echo “Variable a in func: “.$a.”<BR>”;                    //参数将被传入
}
func($a);
echo “Variable a out of func: “.$a.”<BR>”;                    //输出$a
?>

<?php
$a = 1;
function func()                                        //函数func
{
global $a;                                        //在函数内部标示$a为全局变量
echo “Variable a in func: “.$a.”<BR>”;                    //输出$a
}
func();
echo “Variable a out of func: “.$a.”<BR>”;                    //输出$a
?>

<?php
$a = 1;
function func()
{
echo “Variable a in func: “.$GLOBALS["a"].”<BR>”;        //使用$GLOBALS["a"]代替$a
}
func();
echo “Variable a out of func: “.$a.”<BR>”;
?>

php静态变量

<?php
function func()
{
static $a = 1;                                    //在函数内部标示$a为静态变量,初始值为1
echo “Variable a in func: “.$a.”<BR>”;
$a++;                                            //对变量$a执行了加1操作
}
func();
func();
?>

php动态变量

<?php
$var_name = “ic”;                //定义变量$var_name
$$var_name = “This is Simon”;        //使用$var_name的值作为这个变量的变量名
echo $var_name.”<BR>”;            //输出$var_name,即变量名
echo $$var_name.”<BR>”;        //输出变量的值
echo $ic.”<BR>”;                //使用这个方法可以实现同样的变量调用
?>

(全文…)

Nginx 0.8.x + PHP 5.2.10(FastCGI)[转载]

2009年10月22日,星期四

点击在新窗口中浏览此图片
Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。

安装步骤:
(系统要求:Linux 2.6+ 内核,本文中的Linux操作系统为CentOS 5.3,另在RedHat AS4上也安装成功)

一、获取相关开源程序:
1、【适用CentOS操作系统】利用CentOS Linux系统自带的yum命令安装、升级所需的程序库(RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包,进行安装):

sudo -s
LANG=C
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

2、【适用RedHat操作系统】RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包(事先可通过类似“rpm -qa | grep libjpeg”的命令查看所需的RPM包是否存在,通常是“xxx-devel”不存在,需要安装)。RedHat可以直接利用CentOS的RPM包安装,以下是RPM包下载网址:
①、RedHat AS4 & CentOS 4
http://mirrors.163.com/centos/4/os/i386/CentOS/RPMS/
http://mirrors.163.com/centos/4/os/x86_64/CentOS/RPMS/
②、RedHat AS5 & CentOS 5
http://mirrors.163.com/centos/5/os/i386/CentOS/
http://mirrors.163.com/centos/5/os/x86_64/CentOS/
③、RPM包搜索网站
http://rpm.pbone.net/
http://www.rpmfind.net/
④、RedHat AS4 系统环境,通常情况下缺少的支持包安装:
Ⅰ、i386 系统

wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/libjpeg-devel-6b-33.i386.rpm
rpm -ivh libjpeg-devel-6b-33.i386.rpm
wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/freetype-devel-2.1.9-1.i386.rpm
rpm -ivh freetype-devel-2.1.9-1.i386.rpm
wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/libpng-devel-1.2.7-1.i386.rpm
rpm -ivh libpng-devel-1.2.7-1.i386.rpm

Ⅱ、x86_64 系统

wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/libjpeg-devel-6b-33.x86_64.rpm
rpm -ivh libjpeg-devel-6b-33.x86_64.rpm
wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/freetype-devel-2.1.9-1.x86_64.rpm
rpm -ivh freetype-devel-2.1.9-1.x86_64.rpm
wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/libpng-devel-1.2.7-1.x86_64.rpm
rpm -ivh libpng-devel-1.2.7-1.x86_64.rpm

3、【适用CentOS、RedHat及其它Linux操作系统】下载程序源码包:
本文中提到的所有开源软件为截止到2009年09月18日的最新稳定版。
①、从软件的官方网站下载:

mkdir -p /data0/software
cd /data0/software
wget http://sysoev.ru/nginx/nginx-0.8.15.tar.gz
wget http://www.php.net/get/php-5.2.10.tar.gz/from/this/mirror
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.38.tar.gz/from/http://mysql.he.net/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
wget “http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0″
wget “http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&big_mirror=0″
wget http://pecl.php.net/get/memcache-2.2.5.tgz
wget “http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0″
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz
wget http://pecl.php.net/get/imagick-2.2.2.tgz

②、从blog.s135.com下载(比较稳定,只允许在本站,或者在Linux/Unix下通过Wget、Curl等命令下载以下软件):

mkdir -p /data0/software
cd /data0/software
wget http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.8.15.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.10.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz
wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.38.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.13.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.5.tgz
wget http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.9.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.9.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.5.3.tar.bz2
wget http://blog.s135.com/soft/linux/nginx_php/pdo/PDO_MYSQL-1.0.2.tgz
wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/imagick/imagick-2.2.2.tgz


二、安装PHP 5.2.10(FastCGI模式)
1、编译安装PHP 5.2.10所需的支持库:

tar zxvf libiconv-1.13.tar.gz
cd libiconv-1.13/
./configure –prefix=/usr/local
make
make install
cd ../
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
./configure
make
make install
/sbin/ldconfig
cd libltdl/
./configure –enable-ltdl-install
make
make install
cd ../../
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9/
./configure
make
make install
cd ../
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
tar zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure
make
make install
cd ../


2、编译安装MySQL 5.1.38

/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql
tar zxvf mysql-5.1.38.tar.gz
cd mysql-5.1.38/
./configure –prefix=/usr/local/webserver/mysql/ –enable-assembler –with-extra-charsets=complex –enable-thread-safe-client –with-big-tables –with-readline –with-ssl –with-embedded-server –enable-local-infile –with-plugins=innobase
make && make install
chmod +w /usr/local/webserver/mysql
chown -R mysql:mysql /usr/local/webserver/mysql
cd ../


附:以下为附加步骤,如果你想在这台服务器上运行MySQL数据库,则执行以下两步。如果你只是希望让PHP支持MySQL扩展库,能够连接其他服务器上的MySQL数据库,那么,以下两步无需执行。
①、创建MySQL数据库存放目录

mkdir -p /data0/mysql/3306/data/
chown -R mysql:mysql /data0/mysql/

②、以mysql用户帐号的身份建立数据表:

/usr/local/webserver/mysql/bin/mysql_install_db –basedir=/usr/local/webserver/mysql –datadir=/data0/mysql/3306/data –user=mysql

③、创建my.cnf配置文件:

vi /data0/mysql/3306/my.cnf

输入以下内容:

引用

[client]
default-character-set = utf8
port    = 3306
socket  = /tmp/mysql.sock
[mysql]
prompt=”(\u:blog.s135.com:)[\d]> ”
no-auto-rehash
[mysqld]
#default-character-set = utf8
user    = mysql
port    = 3306
socket  = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /data0/mysql/3306/data
open_files_limit    = 10240
back_log = 600
max_connections = 3000
max_connect_errors = 6000
table_cache = 614
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 2M
join_buffer_size = 2M
thread_cache_size = 300
thread_concurrency = 8
query_cache_size = 32M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
default-storage-engine = MyISAM
default_table_type = MyISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 246M
max_heap_table_size = 246M
long_query_time = 1
log_long_format
log-bin = /data0/mysql/3306/binlog
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 8M
max_binlog_size = 512M
expire_logs_days = 7
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
skip-name-resolve
master-connect-retry = 10
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
server-id = 1
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 2048M
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16M
innodb_log_file_size = 128M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 32M

④、创建管理MySQL数据库的shell脚本:

vi /data0/mysql/3306/mysql

输入以下内容(这里的用户名admin和密码12345678接下来的步骤会创建):

view plainprint?

  1. #!/bin/sh
  2. mysql_port=3306
  3. mysql_username=”admin”
  4. mysql_password=”12345678″
  5. function_start_mysql()
  6. {
  7. printf “Starting MySQL…\n”
  8. /bin/sh /usr/local/webserver/mysql/bin/mysqld_safe –defaults-file=/data0/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null &
  9. }
  10. function_stop_mysql()
  11. {
  12. printf “Stoping MySQL…\n”
  13. /usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown
  14. }
  15. function_restart_mysql()
  16. {
  17. printf “Restarting MySQL…\n”
  18. function_stop_mysql
  19. sleep 5
  20. function_start_mysql
  21. }
  22. function_kill_mysql()
  23. {
  24. kill -9 $(ps -ef | grep ‘bin/mysqld_safe’ | grep ${mysql_port} | awk ‘{printf $2}’)
  25. kill -9 $(ps -ef | grep ‘libexec/mysqld’ | grep ${mysql_port} | awk ‘{printf $2}’)
  26. }
  27. if [ "$1" = "start" ]; then
  28. function_start_mysql
  29. elif [ "$1" = "stop" ]; then
  30. function_stop_mysql
  31. elif [ "$1" = "restart" ]; then
  32. function_restart_mysql
  33. elif [ "$1" = "kill" ]; then
  34. function_kill_mysql
  35. else
  36. printf “Usage: /data0/mysql/${mysql_port}/mysql {start|stop|restart|kill}\n”
  37. fi

⑤、赋予shell脚本可执行权限:

chmod +x /data0/mysql/3306/mysql

⑥、启动MySQL:

/data0/mysql/3306/mysql start

⑦、通过命令行登录管理MySQL服务器(提示输入密码时直接回车):

/usr/local/webserver/mysql/bin/mysql -u root -p -S /tmp/mysql.sock

⑧、输入以下SQL语句,创建一个具有root权限的用户(admin)和密码(12345678):

GRANT ALL PRIVILEGES ON *.* TO ‘admin’@'localhost’ IDENTIFIED BY ‘12345678′;
GRANT ALL PRIVILEGES ON *.* TO ‘admin’@'127.0.0.1′ IDENTIFIED BY ‘12345678′;

⑨、(可选)停止MySQL:

/data0/mysql/3306/mysql stop


3、编译安装PHP(FastCGI模式)

tar zxvf php-5.2.10.tar.gz
gzip -cd php-5.2.10-fpm-0.5.11.diff.gz | patch -d php-5.2.10 -p1
cd php-5.2.10/
./configure –prefix=/usr/local/webserver/php –with-config-file-path=/usr/local/webserver/php/etc –with-mysql=/usr/local/webserver/mysql –with-mysqli=/usr/local/webserver/mysql/bin/mysql_config –with-iconv-dir=/usr/local –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir=/usr –enable-xml –disable-rpath –enable-discard-path –enable-safe-mode –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl –with-curlwrappers –enable-mbregex –enable-fastcgi –enable-fpm –enable-force-cgi-redirect –enable-mbstring –with-mcrypt –with-gd –enable-gd-native-ttf –with-openssl –with-mhash –enable-pcntl –enable-sockets –with-ldap –with-ldap-sasl –with-xmlrpc –enable-zip –enable-soap –without-pear
make ZEND_EXTRA_LIBS=’-liconv’
make install
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ../
curl http://pear.php.net/go-pear | /usr/local/webserver/php/bin/php


4、编译安装PHP5扩展模块

tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
cd ../
tar jxvf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3/
/usr/local/webserver/php/bin/phpize
./configure –enable-eaccelerator=shared –with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
cd ../
tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config –with-pdo-mysql=/usr/local/webserver/mysql
make
make install
cd ../
tar zxvf ImageMagick.tar.gz
cd ImageMagick-6.5.1-2/
./configure
make
make install
cd ../
tar zxvf imagick-2.2.2.tgz
cd imagick-2.2.2/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
cd ../

5、修改php.ini文件
手工修改:查找/usr/local/webserver/php/etc/php.ini中的extension_dir = “./”
修改为extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”
并在此行后增加以下几行,然后保存:
extension = “memcache.so”
extension = “pdo_mysql.so”
extension = “imagick.so”
再查找output_buffering = Off
修改为output_buffering = On
自动修改:若嫌手工修改麻烦,可执行以下shell命令,自动完成对php.ini文件的修改:

sed -i ’s#extension_dir = “./”#extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”\nextension = “memcache.so”\nextension = “pdo_mysql.so”\nextension = “imagick.so”\n#’ /usr/local/webserver/php/etc/php.ini
sed -i ’s#output_buffering = Off#output_buffering = On#’ /usr/local/webserver/php/etc/php.ini
sed -i “s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g” /usr/local/webserver/php/etc/php.ini

6、配置eAccelerator加速PHP:

mkdir -p /usr/local/webserver/eaccelerator_cache
vi /usr/local/webserver/php/etc/php.ini

按shift+g键跳到配置文件的最末尾,加上以下配置信息:

引用

[eaccelerator]
zend_extension=”/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”
eaccelerator.shm_size=”64″
eaccelerator.cache_dir=”/usr/local/webserver/eaccelerator_cache”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=”"
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”3600″
eaccelerator.shm_prune_period=”3600″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″


7、创建www用户和组,以及供blog.s135.com和www.s135.com两个虚拟主机使用的目录:

/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
mkdir -p /data0/htdocs/blog
chmod +w /data0/htdocs/blog
chown -R www:www /data0/htdocs/blog
mkdir -p /data0/htdocs/www
chmod +w /data0/htdocs/www
chown -R www:www /data0/htdocs/www

8、创建php-fpm配置文件(php-fpm是为PHP打的一个FastCGI管理补丁,可以平滑变更php.ini配置而无需重启php-cgi):
在/usr/local/webserver/php/etc/目录中创建php-fpm.conf文件:

rm -f /usr/local/webserver/php/etc/php-fpm.conf
vi /usr/local/webserver/php/etc/php-fpm.conf

输入以下内容(如果您安装 Nginx + PHP 用于程序调试,请将以下的<value name=”display_errors”>0</value>改为<value name=”display_errors”>1</value>,以便显示PHP错误信息,否则,Nginx 会报状态为500的空白错误页):

view plainprint?

  1. <?xml version=”1.0″ ?>
  2. <configuration>
  3. All relative paths in this config are relative to php’s install prefix
  4. <section name=”global_options”>
  5. Pid file
  6. <value name=”pid_file”>/usr/local/webserver/php/logs/php-fpm.pid</value>
  7. Error log file
  8. <value name=”error_log”>/usr/local/webserver/php/logs/php-fpm.log</value>
  9. Log level
  10. <value name=”log_level”>notice</value>
  11. When this amount of php processes exited with SIGSEGV or SIGBUS …
  12. <value name=”emergency_restart_threshold”>10</value>
  13. … in a less than this interval of time, a graceful restart will be initiated.
  14. Useful to work around accidental curruptions in accelerator’s shared memory.
  15. <value name=”emergency_restart_interval”>1m</value>
  16. Time limit on waiting child’s reaction on signals from master
  17. <value name=”process_control_timeout”>5s</value>
  18. Set to ‘no’ to debug fpm
  19. <value name=”daemonize”>yes</value>
  20. </section>
  21. <workers>
  22. <section name=”pool”>
  23. Name of pool. Used in logs and stats.
  24. <value name=”name”>default</value>
  25. Address to accept fastcgi requests on.
  26. Valid syntax is ‘ip.ad.re.ss:port’ or just ‘port’ or ‘/path/to/unix/socket’
  27. <value name=”listen_address”>127.0.0.1:9000</value>
  28. <value name=”listen_options”>
  29. Set listen(2) backlog
  30. <value name=”backlog”>-1</value>
  31. Set permissions for unix socket, if one used.
  32. In Linux read/write permissions must be set in order to allow connections from web server.
  33. Many BSD-derrived systems allow connections regardless of permissions.
  34. <value name=”owner”></value>
  35. <value name=”group”></value>
  36. <value name=”mode”>0666</value>
  37. </value>
  38. Additional php.ini defines, specific to this pool of workers.
  39. <value name=”php_defines”>
  40. <value name=”sendmail_path”>/usr/sbin/sendmail -t -i</value>
  41. <value name=”display_errors”>1</value>
  42. </value>
  43. Unix user of processes
  44. <value name=”user”>www</value>
  45. Unix group of processes
  46. <value name=”group”>www</value>
  47. Process manager settings
  48. <value name=”pm”>
  49. Sets style of controling worker process count.
  50. Valid values are ’static’ and ‘apache-like’
  51. <value name=”style”>static</value>
  52. Sets the limit on the number of simultaneous requests that will be served.
  53. Equivalent to Apache MaxClients directive.
  54. Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
  55. Used with any pm_style.
  56. <value name=”max_children”>128</value>
  57. Settings group for ‘apache-like’ pm style
  58. <value name=”apache_like”>
  59. Sets the number of server processes created on startup.
  60. Used only when ‘apache-like’ pm_style is selected
  61. <value name=”StartServers”>20</value>
  62. Sets the desired minimum number of idle server processes.
  63. Used only when ‘apache-like’ pm_style is selected
  64. <value name=”MinSpareServers”>5</value>
  65. Sets the desired maximum number of idle server processes.
  66. Used only when ‘apache-like’ pm_style is selected
  67. <value name=”MaxSpareServers”>35</value>
  68. </value>
  69. </value>
  70. The timeout (in seconds) for serving a single request after which the worker process will be terminated
  71. Should be used when ‘max_execution_time’ ini option does not stop script execution for some reason
  72. ‘0s’ means ‘off’
  73. <value name=”request_terminate_timeout”>0s</value>
  74. The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
  75. ‘0s’ means ‘off’
  76. <value name=”request_slowlog_timeout”>0s</value>
  77. The log file for slow requests
  78. <value name=”slowlog”>logs/slow.log</value>
  79. Set open file desc rlimit
  80. <value name=”rlimit_files”>65535</value>
  81. Set max core size rlimit
  82. <value name=”rlimit_core”>0</value>
  83. Chroot to this directory at the start, absolute path
  84. <value name=”chroot”></value>
  85. Chdir to this directory at the start, absolute path
  86. <value name=”chdir”></value>
  87. Redirect workers’ stdout and stderr into main error log.
  88. If not set, they will be redirected to /dev/null, according to FastCGI specs
  89. <value name=”catch_workers_output”>yes</value>
  90. How much requests each process should execute before respawn.
  91. Useful to work around memory leaks in 3rd party libraries.
  92. For endless request processing please specify 0
  93. Equivalent to PHP_FCGI_MAX_REQUESTS
  94. <value name=”max_requests”>102400</value>
  95. Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
  96. Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
  97. Makes sense only with AF_INET listening socket.
  98. <value name=”allowed_clients”>127.0.0.1</value>
  99. Pass environment variables like LD_LIBRARY_PATH
  100. All $VARIABLEs are taken from current environment
  101. <value name=”environment”>
  102. <value name=”HOSTNAME”>$HOSTNAME</value>
  103. <value name=”PATH”>/usr/local/bin:/usr/bin:/bin</value>
  104. <value name=”TMP”>/tmp</value>
  105. <value name=”TMPDIR”>/tmp</value>
  106. <value name=”TEMP”>/tmp</value>
  107. <value name=”OSTYPE”>$OSTYPE</value>
  108. <value name=”MACHTYPE”>$MACHTYPE</value>
  109. <value name=”MALLOC_CHECK_”>2</value>
  110. </value>
  111. </section>
  112. </workers>
  113. </configuration>

9、启动php-cgi进程,监听127.0.0.1的9000端口,进程数为200(如果服务器内存小于3GB,可以只开启64个进程),用户为www:

ulimit -SHn 65535
/usr/local/webserver/php/sbin/php-fpm start

注:/usr/local/webserver/php/sbin/php-fpm还有其他参数,包括:start|stop|quit|restart|reload|logrotate,修改php.ini后不重启php-cgi,重新加载配置文件使用reload。


三、安装Nginx 0.8.15
1、安装Nginx所需的pcre库:

tar zxvf pcre-7.9.tar.gz
cd pcre-7.9/
./configure
make && make install
cd ../

2、安装Nginx

tar zxvf nginx-0.8.15.tar.gz
cd nginx-0.8.15/
./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module
make && make install
cd ../

3、创建Nginx日志目录

mkdir -p /data1/logs
chmod +w /data1/logs
chown -R www:www /data1/logs

4、创建Nginx配置文件
①、在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件:

rm -f /usr/local/webserver/nginx/conf/nginx.conf
vi /usr/local/webserver/nginx/conf/nginx.conf

输入以下内容:

引用

user  www www;
worker_processes 8;
error_log  /data1/logs/nginx_error.log  crit;
pid        /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include       mime.types;
default_type  application/octet-stream;
#charset  gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush     on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types       text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone  crawler  $binary_remote_addr  10m;
server
{
listen       80;
server_name  blog.s135.com;
index index.html index.htm index.php;
root  /data0/htdocs/blog;
#limit_conn   crawler  20;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires      30d;
}
location ~ .*\.(js|css)?$
{
expires      1h;
}
log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
access_log  /data1/logs/access.log  access;
}
server
{
listen       80;
server_name  www.s135.com;
index index.html index.htm index.php;
root  /data0/htdocs/www;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
log_format  wwwlogs  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
access_log  /data1/logs/wwwlogs.log  wwwlogs;
}
server
{
listen  80;
server_name  status.blog.s135.com;
location / {
stub_status on;
access_log   off;
}
}
}

②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件:

vi /usr/local/webserver/nginx/conf/fcgi.conf

输入以下内容:

引用

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

5、启动Nginx

ulimit -SHn 65535
/usr/local/webserver/nginx/sbin/nginx


四、配置开机自动启动Nginx + PHP

vi /etc/rc.local

在末尾增加以下内容:

引用

ulimit -SHn 65535
/usr/local/webserver/php/sbin/php-fpm start
/usr/local/webserver/nginx/sbin/nginx


五、优化Linux内核参数

vi /etc/sysctl.conf

在末尾增加以下内容:

引用

# Add
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024  65535

使配置立即生效:

/sbin/sysctl -p


六、在不停止Nginx服务的情况下平滑变更Nginx配置
1、修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确:

/usr/local/webserver/nginx/sbin/nginx -t

如果屏幕显示以下两行信息,说明配置文件正确:
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully
2、这时,输入以下命令查看Nginx主进程号:

ps -ef | grep “nginx: master process” | grep -v “grep” | awk -F ‘ ‘ ‘{print $2}’

屏幕显示的即为Nginx主进程号,例如:
6302
这时,执行以下命令即可使修改过的Nginx配置文件生效:

kill -HUP 6302

或者无需这么麻烦,找到Nginx的Pid文件:

kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`


七、编写每天定时切割Nginx日志的脚本
1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh

vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

输入以下内容:

引用

#!/bin/bash
# This script run at 00:00
# The Nginx logs path
logs_path=”/usr/local/webserver/nginx/logs/”
mkdir -p ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/
mv ${logs_path}access.log ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access_$(date -d “yesterday” +”%Y%m%d”).log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`

2、设置crontab,每天凌晨00:00切割nginx访问日志

crontab -e

输入以下内容:

引用

00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

小内存vps上优化Nginx

2009年10月22日,星期四

Nginx 小巧,高效,稳定等优点非常适合配置不高,内存小的 VPS。这里的优化策略不是让nginx每秒能处理更多的请求,那是一个繁忙网站要做的。记住,这是一个只有 64MB 的 VPS,对于架设一个访问量不大的网站/博客来说,尽可能减少 Nginx 的内存占用率是最重要的,用尽量小的 Nginx 占用内存去满足不大的访问量。

优化 nginx.conf

Nginx 运行的进程数,一般设置成和 CPU 的核数相同。

worker_processes  1;

使用 epoll,Linux 内核2.6版本以上支持 epoll(eventport支持 Soaris,kqueue 支持 BSD系列),worker_connections 每个 Nginx 进程所允许的最大的连接数,max_clients = worker_processes * worker_connections。

events {    use epoll;    worker_connections  128; }

设置连接的超时时间。

keepalive_timeout  5;

Linux内核相关,用 kernel file buffer 直接发送数据给 network interface,不需要另用 buffer 中转,通过调用内核级 sendfile() 来提高性能。tcp_nopush 这个参数只有 sendfile on 的时候才有用。tcp_nodelay 只在 keepalive 连接状态中使用。

sendfile     on;tcp_nopush   on;tcp_nodelay  on;

gzip 压缩方面的参数,分别是:支持 gzip 压缩,回送给客户端最小的 gzip 压缩大小,gzip 压缩缓存,要 gzip 压缩的文件类型,压缩程度,vary header 支持,gzip http 版本默认是1.1,如果前端是 squid2.5 则使用1.0。

gzip              on;gzip_min_length   1000;gzip_buffers      4 8k;gzip_types    text/* text/css application/javascript application/x-javascript;gzip_comp_level   5;gzip_vary         on;gzip_http_version 1.1;

128MB VPS 上优化 CentOS 5

2009年10月22日,星期四

centos

CentOS 是一个构建在Red Hat Enterprise Linux (RHEL) 源代码上的 Linux 发行版,并且从二进制的角度100%兼容 RHEL 软件包,简单的说 RHEL上 可以运行的软件包在 CentOS 上不需要编译就可以直接安装运行。除了少量的版权信息外,CentOS 和 RHE L基本上一样。CentOS 是免费的,并且有着 RHEL 的稳定,因此深受各大 hosting 服务商支持,几乎所有 Linux VPS 都支持 CentOS。

一般来说如果 VPS 配置较高我会选 CentOS,配置低的话就选 Debian,当然这是个人偏好,大多数 Linux VPS 服务商也会提供 Gentoo,不过每次安装程序,升级都要编译会消耗很多资源,耗时,而且性能没有明显提高,不推荐给配置低的 VPS。

VPS 服务商一般给的操作系统版本都是最小安装版本,或者优化过的版本。每个VPS服务商提供的版本都可能不同,安装 CentOS 的系统最低要求至少 64MB 内存(纯文字界面),1GB 硬盘空间。

安装和升级系统

1、登录 VPS 安装 CentOS 5。
2、安装完毕后马上升级整个系统。

yum update

有了一个干净的系统以后,剩下来就是加强和优化 Linux。

删除不必要的软件包,服务,用户,文件等

3、删除不需要的软件包。

yum remove Deployment_Guide-en-US finger cups-libs cups
bluez-libs desktop-file-utils ppp rp-pppoe wireless-tools irda-utils
nfs-utils nfs-utils-lib rdate fetchmail eject ksh mkbootdisk mtools
syslinux tcsh startup-notification talk apmd rmt dump setserial portmap yp-tools
ypbind

rpm -qa (列出所有安装了的包)

rpm -e package (删除某个包)

rpm -qi package (查询某个包)

rpm -qf command (根据程序查询包的名字)

rpm -ql package (查询某个包所有的安装文件)

4、删除一些不安全的软件包,并且用相应安全的软件替代,如: ssh/sftp/scp 替代 telnet, rsh, ftp, rcp

注意系统需要一个默认的 MAT,删除 Sendmail MAT 之前必须先安装一个,如: Postfix。

yum remove telnet rsh ftp rcp
yum install postfix
yum remove sendmail
/sbin/chkconfig postfix off

5、停掉并且删除一些不需要的 xinetd 服务。

/sbin/service xinetd stop; /sbin/chkconfig xinetd off
rm -rf /etc/xinetd.d

6、禁止一些 /etc/init.d/ 下面不需要的服务,更多信息请参考 “Understanding your (Red Hat Enterprise Linux) daemons, by Len DiMaggio”。

/sbin/chkconfig --list

for a in acpid anacron apmd atd autofs bluetooth cpuspeed cups gpm
hidd ip6tables irqbalance messagebus microcode_ctl netfs nfs nfslock
pcscd portmap readahead_early readahead_later rpcgssd rpcidmapd
sendmail smartd xinetd yum-updatesd; do /sbin/chkconfig $a off; done

7、重启系统后,检查一下正在运行中的服务,看看是不是都是必须的。

netstat -an | grep LISTEN
netstat -atunp

8、为了安全起见,删除一些不需要的用户。

cp /etc/passwd /etc/passwd.sav
cp /etc/group /etc/group.sav
for a in adm lp sync news uucp operator games gopher mailnull nscd rpc;
do /usr/sbin/userdel $a -f; done
for a in lp news uucp games gopher users floopy nscd rpc rpcuser nfsnobody;
do /usr/sbin/groupdel $a -f; done

加固和优化系统

9、打开防火墙。

system-config-securitylevel-tui

10、检查和禁止全局可写的 SUID 文件。

find / -perm +4000 -user root -type f -print
find / -perm +2000 -group root -type f -print
chmod u-s /full/path/to/filename
chmod g-s /full/path/to/filename

11、只允许 root 在一个 terminal 上登录,如: tty1。

vi /etc/securetty

12、避免其他用户按 Ctrl+Alt+Del 重启。

vi /etc/inittab

注释掉

#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

13、/etc/security/console.apps/ 下面有 root 用户登录 console 后可以运行的程序,全部删除。

rm -f /etc/security/console.apps/*

14、删除一些登录信息。

vi /etc/issue (warning at login prompt)
vi /etc/motd (warning after successful login)

15、只运行一个 virtual terminal,如果是 VPS 的话,自己不可能物理登录终端,可以全部禁止掉。

vi /etc/inittab
# Run gettys in standard runlevels
#1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
...

16、加固 SSH 安全。

vi /etc/ssh/sshd_config
Port 2222
Protocol 2
PermitRootLogin no
PermitEmptyPasswords no
X11Forwarding no
UsePAM no
UseDNS no
AllowUsers vpsee
Banner /etc/issue

17、安装 Bastille 软件包帮助加固。

rpm -Uvh perl-Curses-1.15-1.el5.rf.i386.rpm
rpm -ivh Bastille-3.0.9-1.0.noarch.rpm
/usr/sbin/bastille -c

18、优化 Linux 内核。

vi /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0

定制 Linux 内核

19、定制,编译,安装 Linux 内核。

yum install rpm-build ncurses ncurses-devel
rpm -ivh kernel-2.6.18-8.1.1.el5.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild -bp --target i686 kernel-2.6.spec
cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686
sed -i 's/EXTRAVERSION = -prep/EXTRAVERSION = -8.1.1.custom.el5/' Makefile
make menuconfig
make rpm
cd /usr/src/redhat/RPMS/i686
rpm -ivh kernel-2.6.18prep-1.rpm
/sbin/mkinitrd /boot/initrd-2.6.18-prep.img 2.6.18-prep (2.6.18-prep -> /lib/modules)
vi /boot/grub/menu.1st

20、修改 iptables,只允许 ssh,http 和 https 端口打开。

/sbin/iptables -F
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -j REJECT
/sbin/iptables -A FORWARD -j REJECT

然后查看一下 iptables:

iptables -L

更多信息

10 Realistic Steps to a Faster Web Site

Understanding your (Red Hat Enterprise Linux) daemons, by Len DiMaggio

Linux Server Security (2nd Edition), by Michael D. Bauer, O’Reilly

Hardening Linux, by James Turnbull, Apress

RHEL 5.0 Deployment Guide, by RedHat

RHEL 5.0 Installation Guide, by RedHat