原VPS服务器挂掉了,现在搬迁到了新的服务器上,现在回档了一个月,而且自己做修改的模板也没有了,唉~世事难料。
最近一段时间我会争取把档给恢复了。请见谅!
“VPS”目录存档
vps挂掉
2010年01月27日,星期三rsync 的高级应用
2009年11月29日,星期天在过去 20 年间,计算机网络的使用量已经急剧增加了。Internet 的快速发展,国家和国际主干网络基础结构方面的大量投资,以及连网和计算硬件的价格下降,这些因素都促进了网络使用量的增加。目前,网络已经非常普及了,而且新的应用仍然在推动网络的规模和速度。Internet 最初出现在 几台小型工作站 上,但是现在连接着无数计算机。
|
与此同时,UNIX® 也在发展,连网软件的功能日益强大。FTP 属于第一批用于在系统之间共享文件的工具,目前仍然在广泛使用。rcp(“remote copy” 的简写)改进了 FTP,它具有与传统 cp 实用程序相似的功能,但是它在机器之间复制文件。rdist 基于 rcp,它自动地把文件从一台机器分布到许多系统。
现在,这些工具都过时了:rcp 和 rdist 过时了是因为它们不安全。scp 替代了它们。FTP 仍然在广泛使用,但是应该尽可能使用 FTP 的安全版本 Secure FTP (SFTP)。还有其他工具,比如 WebDAV 和 BitTorrent™ 等。当然,机器越多,保持所有机器同步(或者至少保持一种已知状态)就越困难,scp 和 WebDAV 无法解决这个问题,除非您自己编写解决方案。
最好的文件分布工具是 rsync。rsync 可以在中断之后恢复传输;它只传输源文件和目标文件之间不一致的部分;rsync 可以执行完整备份或增量备份。更棒的是,在所有风格的 UNIX 上都可以使用 rsync,包括 Mac OS X,所以很容易连接任何系统。
我们先来回顾一下 rsync 的一般用法,然后讨论更高级的应用。这里采用的演示系统是 Mac OS X version 10.5 Leopard(FreeBSD 的一种变体)和 Ubuntu Linux® version 8。如果您使用其他操作系统,这里的大多数示例很可能可以移植。请阅读您机器上的 rsync 手册页,了解正确的操作。
与 cp 一样,rsync 也把文件从源复制到目标。但是,与 cp 不同,rsync 操作的源和目标既可以是本地的,也可以是远程的。例如,清单 1 中的命令把 /tmp/photos 目录及其内容按原样复制到主目录。
$rsync -n -av /tmp/photos ~ building file list ... done photos/ photos/Photo 2.jpg photos/Photo 3.jpg photos/Photo 6.jpg photos/Photo 9.jpg sent 218 bytes received 56 bytes 548.00 bytes/sec total size is 375409 speedup is 1370.11 |
-v 选项启用详细消息。-a(a 代表存档)是 -rlptgoD 的简写(递归地复制,把符号链接复制为符号链接,保留权限,保留组,保留所有者,保留设备和特殊文件)。通常,-a 会生成文件的镜像;但是,在目标系统不支持相同的属性时会出现例外。例如,把 UNIX 中的目录复制到 Windows® 时无法准确地映射。下面会对一些不太常见的情况给出建议。
rsync 有许多选项。如果担心指定的选项或者源或目标不正确,可以使用 -n 执行试运行。试运行 会预览对每个文件的操作,但是不会实际复制数据。当确认所有设置是正确的之后,删除 -n 选项,再次运行命令。
清单 2 中的示例说明了使用 -n 选项的重要性。清单 1 中的命令和下面的命令会产生不同的结果。
$ rsync -av /tmp/photos/ ~ ./ Photo 2.jpg Photo 3.jpg Photo 6.jpg Photo 9.jpg sent 210 bytes received 56 bytes 532.00 bytes/sec total size is 375409 speedup is 1411.31 |
差异是什么?差异是源参数末尾的斜杠。如果源参数的末尾有斜杠,就会复制指定目录的内容,而不复制目录本身。目标参数末尾的斜杠没有作用。
清单 3 中的示例把同一个目录转移到另一个系统上。
$ rsync -av /tmp/photos example.com:album created directory album Photo 2.jpg Photo 3.jpg Photo 6.jpg Photo 9.jpg sent 210 bytes received 56 bytes 21.28 bytes/sec total size is 375409 speedup is 1411.31 |
假设您在远程机器上有相同的登录名,rsync 会提示输入密码。提供正确的凭证之后,它创建目录 album 并把图像复制到这个目录中。在默认情况下,rsync 使用 Secure Shell (SSH) 作为传输机制;可以在 rsync 中重用机器别名和公共密钥。
清单 2 和 清单 3 中的示例演示了 rsync 的四种模式中的两个。第一个示例是 shell 模式,也称为本地模式。第二个示例是远程 shell 模式,它使用 SSH 执行底层连接和传输。rsync 还有两种模式。列表模式 与 ls 相似:它列出源的内容,见 清单 4。
$ drwxr-xr-x 238 2009/08/22 18:49:50 photos -rw-r--r-- 6148 2008/07/03 01:36:18 photos/.DS_Store -rw-r--r-- 71202 2008/06/18 04:51:36 photos/Photo 2.jpg -rw-r--r-- 69632 2008/06/18 04:51:45 photos/Photo 3.jpg -rw-r--r-- 61046 2008/07/14 00:31:17 photos/Photo 6.jpg -rw-r--r-- 167381 2008/07/14 00:31:56 photos/Photo 9.jpg |
第四种模式是服务器模式。在这种模式下,rsync 守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。
远程 shell 模式和服务器模式的差异在于,后者在源和目标名中使用两个冒号 (:)。假设 whatever.example.com 存在,下面的命令把文件从源复制到一个本地目标:
$ rsync -av whatever.example.com::src /tmp |
src 究竟是什么?它是在守护进程的主机上定义和配置的一个 rsync 模块。模块有名称、路径(包含它的文件)和其他一些参数,比如 read only 禁止修改内容。
执行以下命令运行 rsync 守护进程:
$ sudo rsync --daemon |
不一定要作为超级用户(根用户)运行 rsync 守护进程,但是这种做法可以保护机器上的其他文件。在作为根用户运行时,rsync 通过使用 chroot 只访问模块的目录层次结构(路径)。执行 chroot 之后,其他所有文件和目录就看不到了。如果用自己的特权运行 rsync 守护进程,要选择未使用的套接字并确保它的模块有下载和/或上传所需的权限。清单 5 中的简单配置共享主目录中的一些文件,而不需要使用sudo。这些配置存储在 rsyncd.conf 文件中。
motd file = /home/strike/rsyncd/rsync.motd_file pid file = /home/strike/rsyncd/rsyncd.pid port = 7777 use chroot = no [demo] path = /home/strike comment = Martin home directory list = no [dropbox] path = /home/strike/public/dropbox comment = A place to leave things for Martin read only = no [pickup] path = /home/strike/public/pickup comment = Get your files here! |
这个文件分为两部分。第一部分(前四行)配置 rsync 守护进程的操作。(还可以使用其他选项)。第一行指定一个文件,文件包含指明服务器的消息。第二行指定另一个文件,它记录服务器的进程 ID。在必须手工杀死 rsync 守护进程时,可以使用这个文件:
kill -INT `cat /home/strike/rsyncd/rsyncd.pid` |
这两个文件放在主目录中,因为这个示例不使用超级用户特权运行软件。为这个守护进程选择大于 1000 的端口号,用户可以把这个范围的端口号分配给任何应用程序。第四行关闭 chroot。
第二部分分为几个小节,每个模块一小节。每个小节包含标题行和模块的选项(键-值对)列表。在默认情况下,所有模块都是只读的;设置 read only = no 允许写操作。另外,在默认情况下,所有模块在模块编目中列出;设置 list = no 隐藏模块。
运行以下命令启动守护进程:
$ rsync --daemon --config=rsyncd.conf |
现在,从另一台机器连接这个守护进程,省略模块名。应该会看到:
rsync --port=7777 mymachine.example.com:: Hello! Welcome to Martin's rsync server. dropbox A place to leave things for Martin pickup Get your files here! |
如果没有在冒号 (::) 后面指定模块,守护进程会返回可用模块的列表。如果指定了模块,但是没有指定模块中的文件或目录,守护进程会提供模块内容的编目,见 清单 6。
rsync --port=7777 mymachine.example.com::pickup Hello! Welcome to Martin's rsync server. drwxr-xr-x 4096 2009/08/23 08:56:19 . -rw-r--r-- 0 2009/08/23 08:56:19 article21.html -rw-r--r-- 0 2009/08/23 08:56:19 design.txt -rw-r--r-- 0 2009/08/23 08:56:19 figure1.png |
通过指定模块和文件本地复制文件,见 清单 7。
rsync --port=7777 mymachine.example.com::pickup/ Hello! Welcome to Martin's rsync server. drwxr-xr-x 4096 2009/08/23 08:56:19 . -rw-r--r-- 0 2009/08/23 08:56:19 article21.html -rw-r--r-- 0 2009/08/23 08:56:19 design.txt -rw-r--r-- 0 2009/08/23 08:56:19 figure1.png |
通过对掉源和目标目录,然后指定用于写操作的模块,可以执行上传,见 清单 8。
$ rsync -v --port=7777 application.js mymachine.example.com::dropbox Hello! Welcome to Martin's rsync server. application.js sent 245 bytes received 38 bytes 113.20 bytes/sec total size is 164 speedup is 0.58 |
快速回顾 rsync 之后,现在我们看看如何在日常任务中应用 rsync。rsync 对于备份尤其有用。另外,因为它可以同步本地文件及其远程副本(也可以对整个文件系统进行同步),它非常适合管理那些必须相同(至少是部分相同)的大型集群。
定期执行备份是一项重要的任务,但是常常被忽视。每天运行长时间的备份可能很无聊,或者需要大量外部介质来存储文件;但是,不要找借口,为了保证数据安全,应该坚持每天备份数据。
为了简化这个任务,可以使用 rsync 并指定一个远程服务器,这个服务器可以是服务提供商提供并备份的服务器。您的每台 UNIX 机器可以使用相同的技术,这非常适合保护笔记本计算机上的数据。
在远程机器上生成 SSH 密钥和 rsync 守护进程,创建一个允许写的备份模块。完成之后,运行 rsync 创建每日备份,这个备份几乎不占用任何空间,见 清单 9。
#!/bin/sh # This script based on work by Michael Jakl (jakl.michael AT gmail DOTCOM) and used # with express permission. HOST=mymachine.example.com SOURCE=$HOME PATHTOBACKUP=home-backup date=`date "+%Y-%m-%dT%H:%M:%S"` rsync -az --link-dest=$PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date ssh $HOST "rm $PATHTOBACKUP/current && ln -s back-$date $PATHTOBACKUP/current" |
把 HOST 替换为自己的备份主机名,把 SOURCE 替换为希望保存的目录。把 PATHTOBACKUP 改为自己的模块名。(还可以把脚本的最后三行嵌入一个循环,动态地修改 SOURCE,从而备份同一系统上的一系列目录)。备份的过程如下:
- 首先,把
date设置为当前日期和时间,产生2009-08-23T12:32:18这样的字符串,它惟一地标识备份。 rsync命令执行复制操作。-az保留所有文件信息并执行压缩。关键之处是--link-dest=$PATHTOBACKUP/current,它指定如果文件没有修改过,就不把它复制到新的备份。相反,在新备份中创建一个指向现有备份中同一文件的硬链接。换句话说,新备份只包含已经修改过的 文件;其他文件都是链接。具体地说(展开所有变量),
mymachine.example.com::home-backup/current是当前存档。/home/strike 的新存档是mymachine.example.com::home-backup/back-2009-08-23T12:32:18。如果 /home/strike 中的文件没有修改过,那么文件在新备份中表示为指向当前存档的硬链接。否则,把文件复制到新存档中。如果您每天只修改少量文件和目录,那么生成完整的备份实际上是没有意义的,这样做很浪费空间。另外,因为每个每日备份都非常小(除了第一个),可以保存长时间的文件历史。
- 最后一步是更改远程机器上备份的组织,让新创建的存档成为当前存档,这会减小下一次运行脚本时要记录的差异。最后一个命令删除当前存档(这只是符号链接),重新创建相同的符号链接,但是指向新的存档。
请记住,硬链接指向相同的文件。硬链接的创建和维护开销很低,所以只使用增量方案就可以模拟完整备份的效果。
开始在日常任务中应用远程 rsync 之后,很可能会发现有必要让守护进程一直运行。Linux 和 UNIX 都为 rsync 提供了启动脚本,通常在 /etc/init.d/rsync 中。请在自己的操作系统中查找启动脚本以及启用和禁用组件的实用程序。如果您要按自己的方式作为守护进程运行 rsync,或者无法访问启动脚本,那么可以用 cron 启动 rsync:
@reboot /usr/bin/rsync --daemon --port=7777 --config=/home/strike/rsyncd/rsyncd.conf |
这个命令在机器每次启动时启动守护进程。把这一行放在 crontab 文件中并保存文件。
前面演示了如何用 -n 预览 rsync 将执行的操作,发现可能存在的问题。还可以使用两个选项监视传输的状态:--progress 和 --stats。前者显示一个进度条。后者显示如何执行压缩和传输。可以使用 --compress 压缩两台机器之间传输的数据。在使用这个选项时并不发送原始数据,而是由发送方压缩数据,由接收方解压数据,这会加快传输速度 — 数据越少,花费的时间越少。
在默认情况下,rsync 会把源中的所有文件复制到目标。这就是复制。如果希望建立镜像(即目标是源的精确拷贝),那么应该指定 --delete。例如,如果源包含文件 A、B 和 C,标准的 rsync 会把 A、B 和 C 复制到目标。但是,如果在源中删除了 B,再次复制,目标就不再是源的镜像了:B 不再是有效的。--delete 选项建立镜像,从目标中删除源中不再存在的文件。
常常有一些文件不希望复制到备份或存档中。这些文件包括编辑器和其他实用程序创建的草稿文件(文件名常常以波浪线 [~] 结尾),以及许多不重要的文件,比如主目录中的 MP3 文件,如果需要的话,可以重新创建它们。可以使用模式排除某些文件。可以在命令行上指定模式,或者在文本文件中指定模式列表。还可以组合使用模式和 --delete-excluded 选项,从目标中删除这些文件。
要想通过命令行根据模式排除文件,应该使用 --exclude。请记住,如果模式中的任何字符对于 shell 有特殊含义,比如 *,那么应该把模式放在单引号中:
$ rsync -a --exclude='*~' /home/strike/data example.com::data |
假设文件 /home/strike/excludes 包含下面的模式列表:
*~ *.old *.mp3 tmp |
就可以排除与这些模式匹配的所有文件:
$ rsync -a --exclude-from=/home/strike/excludes /home/strike/data example.com::data |
既然了解了 rsync,您就无法为忽视备份找借口了。您还能有什么借口呢?只要适当地应用 rsync,您的数据就不会丢失了。
rackspace cloud 试用
2009年11月4日,星期三最近在网上闲逛的时候发现了rackspacecloud.com,提供了很便宜的云服务,0.015美元每小时合1毛钱一小时,于是我就想着试试。当然,主要是用来翻墙:)
先经过注册等一系列的过程终于得到了帐号。不过,rackspace只支持信用卡付款,不支持很流行的paypal什么的。
rackspacecloud.com提供三种云服务,cloudsite、cloudservers、cloudfiles,云网站、云服务器、云文件。其中云网站就相当于虚拟主机,当然是性能比较好的:),价格很高,100美元一个月。云服务器是Xen构架的VPS,我主要就是用的这个。云文件就是网络存储了,相当月亚马逊的s3,价格与亚马逊的相当。
说说cloudservers,注册了帐号之后进入后台,你可以看到右侧有hosting的图标,点击后会有cloudservers的图标,点cloudservers之后,点击右边的add new server,然后会让你选择 server size,有256MB、512MB一直到15872MB内存可以选择,价格也是2的倍数上升的。选好价格后你要给服务器取个名字,server name。然后就是选择镜像了,可供选择的不算太多,比起vps service少多了,只有CentOS、Gentoo、Debian、Fedora及Ubuntu。选好之后点Add cloud server,之后就看到你的服务器的ip地址等信息了。现在还是建立阶段,根据你选择的size不同,时间不同,我选择的256MB的2分钟就好了,大的我没试,建立完了他会给你邮箱发邮件,里面有root密码,ip等信息,你可以用putty等SSH工具登录进去了。
原始的镜像已经做过一些优化了,内存占用比较低,我试了试在里面安装pptpd,很简单就装上了,我用vpn用了一上午约4个小时,花了0.06美元,当然我的流量不到1G没收钱,很超值的服务,大家可以去尝试一下,如果有什么问题可以给我发邮件或者留言,我会尽量帮您的。:-)
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接下来的步骤会创建):
- #!/bin/sh
- mysql_port=3306
- mysql_username=”admin”
- mysql_password=”12345678″
- function_start_mysql()
- {
- printf “Starting MySQL…\n”
- /bin/sh /usr/local/webserver/mysql/bin/mysqld_safe –defaults-file=/data0/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null &
- }
- function_stop_mysql()
- {
- printf “Stoping MySQL…\n”
- /usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown
- }
- function_restart_mysql()
- {
- printf “Restarting MySQL…\n”
- function_stop_mysql
- sleep 5
- function_start_mysql
- }
- function_kill_mysql()
- {
- kill -9 $(ps -ef | grep ‘bin/mysqld_safe’ | grep ${mysql_port} | awk ‘{printf $2}’)
- kill -9 $(ps -ef | grep ‘libexec/mysqld’ | grep ${mysql_port} | awk ‘{printf $2}’)
- }
- if [ "$1" = "start" ]; then
- function_start_mysql
- elif [ "$1" = "stop" ]; then
- function_stop_mysql
- elif [ "$1" = "restart" ]; then
- function_restart_mysql
- elif [ "$1" = "kill" ]; then
- function_kill_mysql
- else
- printf “Usage: /data0/mysql/${mysql_port}/mysql {start|stop|restart|kill}\n”
- 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的空白错误页):
- <?xml version=”1.0″ ?>
- <configuration>
- All relative paths in this config are relative to php’s install prefix
- <section name=”global_options”>
- Pid file
- <value name=”pid_file”>/usr/local/webserver/php/logs/php-fpm.pid</value>
- Error log file
- <value name=”error_log”>/usr/local/webserver/php/logs/php-fpm.log</value>
- Log level
- <value name=”log_level”>notice</value>
- When this amount of php processes exited with SIGSEGV or SIGBUS …
- <value name=”emergency_restart_threshold”>10</value>
- … in a less than this interval of time, a graceful restart will be initiated.
- Useful to work around accidental curruptions in accelerator’s shared memory.
- <value name=”emergency_restart_interval”>1m</value>
- Time limit on waiting child’s reaction on signals from master
- <value name=”process_control_timeout”>5s</value>
- Set to ‘no’ to debug fpm
- <value name=”daemonize”>yes</value>
- </section>
- <workers>
- <section name=”pool”>
- Name of pool. Used in logs and stats.
- <value name=”name”>default</value>
- Address to accept fastcgi requests on.
- Valid syntax is ‘ip.ad.re.ss:port’ or just ‘port’ or ‘/path/to/unix/socket’
- <value name=”listen_address”>127.0.0.1:9000</value>
- <value name=”listen_options”>
- Set listen(2) backlog
- <value name=”backlog”>-1</value>
- Set permissions for unix socket, if one used.
- In Linux read/write permissions must be set in order to allow connections from web server.
- Many BSD-derrived systems allow connections regardless of permissions.
- <value name=”owner”></value>
- <value name=”group”></value>
- <value name=”mode”>0666</value>
- </value>
- Additional php.ini defines, specific to this pool of workers.
- <value name=”php_defines”>
- <value name=”sendmail_path”>/usr/sbin/sendmail -t -i</value>
- <value name=”display_errors”>1</value>
- </value>
- Unix user of processes
- <value name=”user”>www</value>
- Unix group of processes
- <value name=”group”>www</value>
- Process manager settings
- <value name=”pm”>
- Sets style of controling worker process count.
- Valid values are ’static’ and ‘apache-like’
- <value name=”style”>static</value>
- Sets the limit on the number of simultaneous requests that will be served.
- Equivalent to Apache MaxClients directive.
- Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
- Used with any pm_style.
- <value name=”max_children”>128</value>
- Settings group for ‘apache-like’ pm style
- <value name=”apache_like”>
- Sets the number of server processes created on startup.
- Used only when ‘apache-like’ pm_style is selected
- <value name=”StartServers”>20</value>
- Sets the desired minimum number of idle server processes.
- Used only when ‘apache-like’ pm_style is selected
- <value name=”MinSpareServers”>5</value>
- Sets the desired maximum number of idle server processes.
- Used only when ‘apache-like’ pm_style is selected
- <value name=”MaxSpareServers”>35</value>
- </value>
- </value>
- The timeout (in seconds) for serving a single request after which the worker process will be terminated
- Should be used when ‘max_execution_time’ ini option does not stop script execution for some reason
- ‘0s’ means ‘off’
- <value name=”request_terminate_timeout”>0s</value>
- The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
- ‘0s’ means ‘off’
- <value name=”request_slowlog_timeout”>0s</value>
- The log file for slow requests
- <value name=”slowlog”>logs/slow.log</value>
- Set open file desc rlimit
- <value name=”rlimit_files”>65535</value>
- Set max core size rlimit
- <value name=”rlimit_core”>0</value>
- Chroot to this directory at the start, absolute path
- <value name=”chroot”></value>
- Chdir to this directory at the start, absolute path
- <value name=”chdir”></value>
- Redirect workers’ stdout and stderr into main error log.
- If not set, they will be redirected to /dev/null, according to FastCGI specs
- <value name=”catch_workers_output”>yes</value>
- How much requests each process should execute before respawn.
- Useful to work around memory leaks in 3rd party libraries.
- For endless request processing please specify 0
- Equivalent to PHP_FCGI_MAX_REQUESTS
- <value name=”max_requests”>102400</value>
- Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
- Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
- Makes sense only with AF_INET listening socket.
- <value name=”allowed_clients”>127.0.0.1</value>
- Pass environment variables like LD_LIBRARY_PATH
- All $VARIABLEs are taken from current environment
- <value name=”environment”>
- <value name=”HOSTNAME”>$HOSTNAME</value>
- <value name=”PATH”>/usr/local/bin:/usr/bin:/bin</value>
- <value name=”TMP”>/tmp</value>
- <value name=”TMPDIR”>/tmp</value>
- <value name=”TEMP”>/tmp</value>
- <value name=”OSTYPE”>$OSTYPE</value>
- <value name=”MACHTYPE”>$MACHTYPE</value>
- <value name=”MALLOC_CHECK_”>2</value>
- </value>
- </section>
- </workers>
- </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