CentOS Linux中Samba文件共享服务器的构

前  言

在我们使用 Windows 作为客户机的时候,通常有文件、打印共享的需求。作为Windows 网络功能之一,通常可以在 Windows 客户机之间通过 Windows Network 固有的功能实现这些要求。然而,通过 Samba 我们也可以让一台 CentOS 主机来兼容 Windows 网络,实现同样的功能,进而充分发挥 CentOS 主机的可用性。

本篇文档主要介绍怎样通过 Samba 服务器的构建实现 Windows 网络中的文件共享。

安装 Samba

首先,通过 yum 来在线安装 Samba 。

[root@sample ~]# yum -y install samba  ← 安装 Samba

Setting up Install Process
Setting up repositories
update 100% |=========================| 951 B 00:00
base 100% |=========================| 1.1 kB 00:00
addons 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
primary.xml.gz 100% |=========================| 73 kB 00:00
update : ################################################## 212/212
Added 212 new packages, deleted 0 old in 4.94 seconds
primary.xml.gz 100% |=========================| 569 kB 00:00
base : ################################################## 1500/1500
Added 1500 new packages, deleted 0 old in 28.97 seconds
primary.xml.gz 100% |=========================| 157 B 00:00
Added 0 new packages, deleted 0 old in 0.03 seconds
primary.xml.gz 100% |=========================| 32 kB 00:00
extras : ################################################## 124/124
Added 124 new packages, deleted 0 old in 1.93 seconds
Parsing package install arguments
Resolving Dependencies
–> Populating transaction set with selected packages. Please wait.
—> Downloading header for samba to pack into transaction set.
samba-3.0.10-1.4E.9.i386. 100% |=========================| 101 kB 00:00
—> Package samba.i386 0:3.0.10-1.4E.9 set to be updated
–> Running transaction check
–> Processing Dependency: samba-common = 0:3.0.10 for package: samba
–> Restarting Dependency Resolution with new changes.
–> Populating transaction set with selected packages. Please wait.
—> Downloading header for samba-common to pack into transaction set.
samba-common-3.0.10-1.4E. 100% |=========================| 37 kB 00:00
—> Package samba-common.i386 0:3.0.10-1.4E.9 set to be updated
–> Running transaction check

Dependencies Resolved

=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
samba i386 3.0.10-1.4E.9 base 13 M
Installing for dependencies:
samba-common i386 3.0.10-1.4E.9 base 5.0 M

Transaction Summary
=============================================================================
Install 2 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 18 M
Downloading Packages:
(1/2): samba-common-3.0.1 100% |=========================| 5.0 MB 00:04
(2/2): samba-3.0.10-1.4E. 100% |=========================| 13 MB 00:11
warning: rpmts_HdrFromFdno: V3 DSA signature: NOKEY, key ID 443e1821
Public key for samba-common-3.0.10-1.4E.9.i386.rpm is not installed
Retrieving GPG key from http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
Importing GPG key 0x443E1821 “CentOS-4 key <centos-4key@centos.org>”
Key imported successfully
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: samba-common ######################### [1/2]
Installing: samba ######################### [2/2]
Installed: samba.i386 0:3.0.10-1.4E.9
Dependency Installed: samba-common.i386 0:3.0.10-1.4E.9
Complete!

配置 Samba

然后,通过编辑 /etc/samba/smb.conf ,根据需求配置 Samba。在这里,本文的原则是只将文件共享应用于内网,并让将要被共享的目录拥有充分的读写权限属性。
[root@sample ~]# vi /etc/samba/smb.conf  ← 编辑 Samba 的配置文件

#======================= Global Settings =====================================
[global]   ← 找到这一行(全局设置标签),在此行下面添加如下行:

dos charset = GB2312  ← 将 Windows 客户端的文字编码设置为简体中文 GB2312
unix charset = GB2312  ← 指定 Samba 所在的 CentOS 服务端新建文件或目录时的编码为 GB2312
display charset = GB2312  ← 指定使用 SWAT(一种通过浏览器控制Samba的工具)时页面的默认文字编码
directory mask = 0777  ← 指定新建目录的属性(以下4行)
force directory mode = 0777
directory security mask = 0777
force directory security mode = 0777
create mask = 0777  ← 指定新建文件的属性(以下4行)
force create mode = 0777
security mask = 0777
force security mode = 0777

workgroup = MYGROUP  ← 找到此行,将工作组名称改为 Windows 网络所定义的工作组名

workgroup = WORKGROUP  ← 变为此状态,这里以 Windows XP 默认的“WORKGROUP”为例

; hosts allow = 192.168.1. 192.168.2. 127.  ← 找到此行,去掉行首的“;”,并制定访问限制

hosts allow = 192.168.0. 127.  ← 变为此状态,指定内网IP地址及本地,只允许这两种情况的访问

然后在配置文件的末尾填如下几行,定义公众共享目录:

[public]
comment = Public Stuff
path = /home/samba  ← 指定共享目录位置
public = yes
writable = yes  ← 赋予共享目录写入权限的属性

接下来,创建将要通过 Samba 共享给 Windows 网络的专用目录。
[root@sample ~]# mkdir /home/samba  ← 建立共享文件专用目录

[root@sample ~]# chown -R nobody. /home/samba  ← 设置专用目录归属为 nobody

[root@sample ~]# chmod 777 /home/samba  ← 将专用目录属性设置为 777

在进行到服务端的连接之前,需要预先对用于登录 Samba 的用户进行设置。这里我们以 CentOS 中 Samba 标准的 Samba 用户数据库管理工具“smbpasswd”为例,创建用于登录 Samba 的用户数据。这里需要注意的一点:用 smbpasswd 创建用户的前提是,系统用户中存在该用户 — 在基于系统用户之上,才可以创建该用户在 Samba 用户数据库中的信息。

[root@sample ~]# smbpasswd -a centospub  ← 将系统用户 centospub(例)加入到 Samba 用户数据库

New SMB password:  ← 输入该用户用于登录 Samba 的密码
Retype new SMB password:  ← 再次确认输入该密码
Added user centospub.

启动 Samba 服务

在启动 Samba 服务之前,首先将防火墙设置中 Samba 所用到的端口进行开放。
[root@sample ~]# vi /etc/sysconfig/iptables  ← 编辑 iptables 配置文件

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT  ← 找到此行,在下面添加如下行:
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 445 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp –dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp –dport 138 -j ACCEPT

[root@sample ~]# /etc/rc.d/init.d/iptables restart  ← 重新启动 iptables ,使新的规则生效
Flushing firewall rules:          [ OK ]
Setting chains to policy ACCEPT: filter   [ OK ]
Unloading iptables modules:       [ OK ]
Applying iptables firewall rules:      [ OK ]

最后,启动 Samba 服务。
[root@sample ~]# chkconfig smb on  ← 设置 Samba 自启动

[root@sample ~]# chkconfig –list smb  ← 确认 Samba 启动标签,确认 2-5 为 on 的状态
smb 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@sample ~]# /etc/rc.d/init.d/smb start  ← 启动 Samba 服务
Starting SMB services:       [ OK ]
Starting NMB services:       [ OK ]

从 Windows 客户端连接到 Samba 服务器

在服务端启动 Samba 服务后,我们就可以从 Windows 客户端通过 Windows 网络连接到 Samba。这里以 Windows XP 为例,说明如下连接过程:

1、从桌面打开“网上邻居”,并点击“查看工作组计算机”选项;

2、确认出现 Samba 服务端的连接,并双击该连接;(本站文档的主机名以 Sample 为例)

3、输入在服务端预先设置好的 Samba 用户的用户名及密码;(用户名同系统用户名,密码需要输入在通过 smbpasswd 为该系统用户设置的 Samba 专用的密码。)

4、然后确认能够连接到 Samba 服务器,并出现根目录及 Samba 专用共享目录。

最后,在相应目录进行新建、修改以及删除文件的操作,测试相应权限的可操作性。

PHP负载均衡指南[转]

 过去当运行一个大的web应用时候意味着运行一个大型的web服务器。因为你的应用吸引了大量的用户,你将不得不在你的服务器里增加更多的内存和处理器。

今天,’大型服务器’模式已经过去,取而代之的是大量的小服务器,使用各种各样的负载均衡技术。这是一种更可行的方法,将使硬件成本降至最低。

‘更多小服务器’的优势超过过去的’大型服务器’模式体现在两个方面:

  1. 如果服务器宕机,那么负载均衡系统将停止请求到宕机的服务器,转而分发负载到其他正常运行的服务器上。
  2. 扩展你的服务器更加容易。你要做的仅仅是加入新的服务器到负载均衡系统。不需要中断你的应用运行。

所以,把握住这个机会:). 当然,代价就是这要求你的应用开发时增加一点复杂度。这就是本文要覆盖的内容。

这时你可能对自己说: ‘但是我怎么知道我正在使用负载均衡呢?’。最诚实的回答是,如果你正在问这个问题,那么答案是你多半没有在使用负载均衡系统并且你的系统不需要考虑这个 问题。大多数情况,当应用成长足够大的规模时,负载均衡就需要明确提出和设置了。然而,我也偶尔看见虚拟主机公司为客户的应用做这个负载均衡,或者像下面 描述的那样要自己来做。

在继续下面的内容之前,我要指出本文主要描述PHP的负载均衡。将来我可能会写有关数据负载均衡的文字,但是现在你必须等待。

注意,我一直提“web应用”而不是website,这是想区分’web应用’是那些复杂的站点往往涉及服务器端编程和数据库,而不是website那样只显示简单的静态内容。

1. PHP文件

第一个问题是,如果你有大量的小型服务器,你怎么把你的php文件上传到所有的服务器上?有如下的方法供你参考:


  1. 分别上传所有的文件到每一个服务器 , 这种方法带来的问题是:想像一下你有20个服务器,那么上传过程中这将很容易导致错误,并且更新时极有可能导致不同服务器上有不同版本的文件。
  2. 使用 ‘rsync ‘ (或类似的软件) . 这样的工具能同步本地目录和多个远程主机目录上的文件。
  3. 使用版本控制软件(如subversion ) . 这是我最喜欢的方法。用它可以很好地维护我得代码,当发布我的应用时,可以在每一个服务器上运行svn update命令同步。这种方法也使切换服务器得代码到过去的某一个版本更加容易。
  4. 使用一个文件服务器(你可能发现NFS 非常适合做这件事情). 这种方式是使用一个文件服务器来存放你的web应用. 当然,如果你的文件服务器宕机,那么多所有你的站点将不能使用。这时,你就需要花费更多的开支来恢复它。

选择哪种方式依赖于你的需求和你掌握的技能。如果你使用版本控制系统,那么你可能得计划一个方法如果同时执行一个更新命令更新所有服务器上的代码。然而,如果使用文件服务器,你就要实现一些失败恢复机制,防止万一服务器宕机导致请求失败。

2. 文件上传

当只有一台服务器时,文件上传不是一个问题。但是当我们有多台服务器时,那么上传的文件应该怎么存放呢?上传文件的问题和跨服务器php文件存储是类似的。下面是几种可能的方案:

  1. 把文件存储到数据库中 。大多数数据允许存储二进制数据。当你请求文件下载时,访问数据把二进制数据和相应的文件名和类型输出给用户。在使用这种方案前应该考虑数据库怎样存储你的文件。该方法的问题在于如果数据库服务器宕机将使文件不可用。
  2. 在一个文件服务器上存储上传的文件 . 与前面的介绍一样,你要安装一个文件服务器让所有web服务器共享,把所有上传的文件上传到这里,上传后所有的web服务器就都可以使用它。但是,如果文件服务器宕机,那么可能发生图像文件下载中断。
  3. 设计你自己的上传机制传输文件到服务器到每一个服务器 . 这个方法没有单个文件服务器或者数据库方案的缺陷,但是将增加你代码的复杂度。例如,如果上传到多个服务器过程中,服务器宕机,你要怎么处理?

用数据库存储上传文件但是设计一个文件缓存机制是一个不错的方案。当服务器接收一个文件下载请求时,首先检查缓存系统中是否有该文件,如果发现那么从缓存系统下载,否则从数据库读取并把它缓存到文件系统中。

3. 会话(Sessions)

如果你熟悉php的 session处理,你将可能知道默认情况下,它存储session数据在服务器的临时文件里。而且,这个文件仅仅在 你请求处理的那个服务器上,但是接下来的请求可能被另外一个服务器处理,这将在另一个服务器上生成新的session。这导致session频繁地不被识 别,如登录用户总是要求重新登录。

我推荐的方案是,要么重新php内建的session处理机制存储session数据到数据库,或者实现你自己的机制保证发送一个用户的请求到同一台服务器。

4. 配置(Configuration)

尽管这个话题不是和php特别相关,我感觉还是有必要提及。当运行集群服务器时,用某种方法保持服务器之间的配置文件同步是一个好主意。如果配置文件不一致,可能导致一些非常奇怪的断断续续的行为导致很难排查这些问题。

我推荐使用版本控制系统单独管理他们。这样你可以为不同的项目安装存储不同的php配置文件,也可以保持所有服务器配置文件同步。

5. 日志(Logging)

像配置问题一样,logging不是仅仅和php相关。但是对于保持服务器健康运行它仍然是非常重要的。没有正确的logging系统,你怎么知道如果PHP代码开始产生错误(在系统正式运行时,你总是关闭display_errors 设置,不是吗?)

有几种方法你可以实现logging:

  1. 在每一个服务器上记录日志。 这是最简单的方法。每一个机器仅仅记录一个文件。好处是简单,可能只要很少的配置。但是,随着服务器数量的增多,监控每台服务器上的日志文件将变得非常困难。
  2. 记录日志到一个共享 这种方法每一个服务器仍然有这个日志文件,但是他们通过共享机制被存储在一个中央文件服务器上,这将使监控日志变得更简单。该方案的问题在于,如果文件服务器不可用将导致一个简单的日志不能写入问题最终导致整个应用崩溃。
  3. 记录日志到logging服务器 你可以使用一个logging软件,如syslog 来把所有的日志写到一个中央服务器。尽管这个方法要求更多的配置,但是他也提供了最健壮的方案。

Debian下彻底删除Gnome和KDE的方法

删除KDE是

apt-get –purge remove libqt3c102-mt

删除Gnome是

apt-get –purge remove liborbit2

CentOS Vsftp支持虚拟用户[转]

很早就想写出这份内容了,由于最近事情实在太多一直迟迟拖到现在才写完,心里也终于舒了口气。

之 前在第8话就写过一篇关于Vsftpd的基础配置,今天也写一篇稍微高级点的Vsftpd配置心得和全部过程详解。还记得不久之前还写过一篇通过 Radius来对应用程序用户进行验证,这样一方面方便了应用程序用户多服务的整合,另一方面也大大减少了应用程序用户与系统用户的关联性,在其中PAM 扮演了重要的角色,也通过那次的经历,使我切实感受到了PAM的灵活性。在这里,Vsftp的虚拟用户支持,也就是说,这些Vsftp用户不再必须是系统 用户了,而且用户路径的定义、配置可以更加个性化,从而使得Vsftp也更加功能强大。而在这当中,PAM再次扮演了关键的角色。

环境:CentOS 5.0 操作系统
一.安装:
1.安装Vsftpd服务相关部件:
[root@KcentOS5 ~]# yum install vsftpd*
Dependencies Resolved

=============================================================================
Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
vsftpd                  i386       2.0.5-10.el5     base              137 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)  

2.确认安装PAM服务相关部件:
[root@KcentOS5 ~]# yum install pam*
Dependencies Resolved
=============================================================================
Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
pam-devel               i386       0.99.6.2-3.14.el5 base              186 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
开发包,其实不装也没有关系,主要的目的是确认PAM。

3.安装DB4部件包:
这里要特别安装一个db4的包,用来支持文件数据库。
[root@KcentOS5 ~]#
yum install db4*
Dependencies Resolved
=============================================================================
Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
db4-devel               i386       4.3.29-9.fc6     base              2.0 M
db4-java                i386       4.3.29-9.fc6     base              1.7 M
db4-tcl                 i386       4.3.29-9.fc6     base              1.0 M
db4-utils               i386       4.3.29-9.fc6     base              119 k

Transaction Summary
=============================================================================
Install      4 Package(s)
Update       0 Package(s)
Remove       0 Package(s)        

二.系统帐户
1.建立Vsftpd服务的宿主用户:
[root@KcentOS5 ~]# useradd vsftpd -s /sbin/nologin
默认的Vsftpd的服务宿主用户是root,但是这不符合安全性的需要。这里建立名字为vsftpd的用户,用他来作为支持Vsftpd的服务宿主用户。由于该用户仅用来支持Vsftpd服务用,因此没有许可他登陆系统的必要,并设定他为不能登陆系统的用户。

2.建立Vsftpd虚拟宿主用户:
[root@KcentOS5 nowhere]#
useradd overlord -s /sbin/nologin
本篇主要是介绍Vsftp的虚拟用户,虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。他们的总体权限其实是集中寄托在一个在系统 中的某一个用户身上的,所谓Vsftpd的虚拟宿主用户,就是这样一个支持着所有虚拟用户的宿主用户。由于他支撑了FTP的所有虚拟的用户,那么他本身的 权限将会影响着这些虚拟的用户,因此,处于安全性的考虑,也要非分注意对该用户的权限的控制,该用户也绝对没有登陆系统的必要,这里也设定他为不能登陆系 统的用户。

(这里插一句:原本在建立上面两个用户的时候,想连用户主路径也不打算给的。本来想加上 -d /home/nowhere 的,据man useradd手册上讲

述:“       -d, –home HOME_DIR
The new user will be created using HOME_DIR as the value for the
user鈙 login directory. The default is to append the LOGIN name to
BASE_DIR and use that as the login directory name. The directory
HOME_DIR does not have to exist but will not be created if it is
missing.
使用-d参数指定用户的主目录,用户主目录并不是必须存在的。如果没有存在指定的目录的话,那么它将不会被建立”。结果我尝试 -d
/home/nowhere 指定到一个并不存在的目录的时候,我KAO!竟然给我自己新建了一个= =#)

三.调整Vsftpd的配置文件:
1.编辑配置文件前先备份
[root@KcentOS5 ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup

2.编辑主配置文件Vsftpd.conf
[root@KcentOS5 ~]# vi /etc/vsftpd/vsftpd.conf
这里我将原配置文件的修改完全记录,凡是修改的地方我都会保留注释原来的配置。其中加入我对每条配置项的认识,对于一些比较关键的配
置项这里我做了我的观点,并且原本英语的说明我也不删除,供参考对比用。
——————————————————————————
# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd’s
# capabilities.
#
# Allow anonymous FTP? (Beware – allowed by default if you comment this out).
#anonymous_enable=YES
anonymous_enable=NO
设定不允许匿名访问
#
# Uncomment this to allow local users to log in.
local_enable=YES
设定本地用户可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
设定可以进行写操作。
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd’s)
local_umask=022
设定上传后文件的权限掩码。
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
anon_upload_enable=NO
禁止匿名用户上传。
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
anon_mkdir_write_enable=NO
禁止匿名用户建立目录。
#
# Activate directory messages – messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
设定开启目录标语功能。
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
设定开启日志记录功能。
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
设定端口20进行数据连接。
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using “root” for uploaded files is not
# recommended!
#chown_uploads=YES
chown_uploads=NO
设定禁止上传文件更改宿主。
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log
设定Vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来,并且由于这里更改了Vsftpd的服务宿主用户为手动建立的Vsftpd。必须注意给与该用户对日志的写入权限,否则服务将启动失败。
#
# If you want, you can have your log file in standard ftpd xferlog format
xferlog_std_format=YES
设定日志使用标准的记录格式。
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
设定空闲连接超时时间,这里使用默认。将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用这里的默认值600,单位秒。
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
设定单次最大连续传输时间,这里使用默认。将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用这里的默认值120,单位秒。
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
nopriv_user=vsftpd
设定支撑Vsftpd服务的宿主用户为手动建立的Vsftpd用户。注意,一旦做出更改宿主用户后,必须注意一起与该服务相关的读写文件的读写赋权问题。比如日志文件就必须给与该用户写入权限等。
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
async_abor_enable=YES
设定支持异步传输功能。
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command “SIZE /big/file” in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES
设定支持ASCII模式的上传和下载功能。
#
# You may fully customise the login banner string:
ftpd_banner=This Vsftp server supports virtual users ^_^
设定Vsftpd的登陆标语。
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_list_enable=YES
chroot_list_enable=NO
禁止用户登出自己的FTP主目录。
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
#
# You may activate the “-R” option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as “ncftp” and “mirror” assume
# the presence of the “-R” option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
ls_recurse_enable=NO
禁止用户登陆FTP后使用”ls -R”的命令。该命令会对服务器性能造成巨大开销。如果该项被允许,那么挡多用户同时使用该命令时将会对该服

务器造成威胁。
# When “listen” directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES
设定该Vsftpd服务工作在StandAlone模式下。顺便展开说明一下,所谓StandAlone模式就是该服务拥有自己的守护进程支持,在ps -A命令下我们将可用看到vsftpd的守护进程名。如果不想工作在StandAlone模式下,则可以选择SuperDaemon模式,在该模式下 vsftpd将没有自己的守护进程,而是由超级守护进程Xinetd全权代理,与此同时,Vsftp服务的许多功能将得不到实现。
#
# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
# sockets, you must run two copies of vsftpd whith two configuration files.
# Make sure, that one of the listen options is commented !!
#listen_ipv6=YES

pam_service_name=vsftpd
设定PAM服务下Vsftpd的验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置。
userlist_enable=YES
设定userlist_file中的用户将不得使用FTP。
tcp_wrappers=YES
设定支持TCP Wrappers。

#KC: The following entries are added for supporting virtual ftp users.
以下这些是关于Vsftpd虚拟用户支持的重要配置项目。默认Vsftpd.conf中不包含这些设定项目,需要自己手动添加配置。

guest_enable=YES
设定启用虚拟用户功能。
guest_username=overlord
指定虚拟用户的宿主用户。
virtual_use_local_privs=YES
设定虚拟用户的权限符合他们的宿主用户。
user_config_dir=/etc/vsftpd/vconf
设定虚拟用户个人Vsftp的配置文件存放路径。也就是说,这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件,一个需要注意的

地方就是这些配置文件名必须和虚拟用户名相同。
————————————————————————-
保存退出。

3.建立Vsftpd的日志文件,并更该属主为Vsftpd的服务宿主用户:
[root@KcentOS5 ~]# touch /var/log/vsftpd.log
[root@KcentOS5 ~]# chown vsftpd.vsftpd /var/log/vsftpd.log

4.建立虚拟用户配置文件存放路径:
[root@KcentOS5 ~]# mkdir /etc/vsftpd/vconf/

三.制作虚拟用户数据库文件
1.先建立虚拟用户名单文件:
[root@KcentOS5 ~]# touch /etc/vsftpd/virtusers
建立了一个虚拟用户名单文件,这个文件就是来记录vsftpd虚拟用户的用户名和口令的数据文件,我这里给它命名为virtusers。为了避免文件的混乱,我把这个名单文件就放置在/etc/vsftpd/下。

2.编辑虚拟用户名单文件:
[root@KcentOS5 ~]#
vi /etc/vsftpd/virtusers
—————————-
kanecruise
123456
near
123456near
mello
123456mello
—————————-
编辑这个虚拟用户名单文件,在其中加入用户的用户名和口令信息。格式很简单:“一行用户名,一行口令”。

3.生成虚拟用户数据文件:
[root@KcentOS5 ~]#
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
这里我顺便把这个命令简单说明一下
———————————————————————-
察看db4的db_load命令使用方法:
[root@KSRV2 vsftpd]# db_load
usage: db_load [-nTV] [-c name=value] [-f file]
[-h home] [-P password] [-t btree | hash | recno | queue] db_file
usage: db_load -r lsn | fileid [-h home] [-P password] db_file
解释在本篇中,db_load命令几个相关选项很参数

-T
The -T option allows non-Berkeley DB applications to easily load text files into databases.
If the database to be created is of type Btree or Hash, or the keyword keys is specified as set, the input must be paired

lines of text, where the first line of the pair is the key item, and the second line of the pair is its corresponding data

item. If the database to be created is of type Queue or Recno and the keywork keys is not set, the input must be lines of text, where each line is a new data item for the database.
选项-T允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个

应用程序能够通过文本来载入用户数据,必须要使用这个选项。

If the -T option is specified, the underlying access method type must be specified using the -t option.
如果指定了选项-T,那么一定要追跟子选项-t

-t
Specify the underlying access method. If no -t option is specified, the database will be loaded into a database of the same type as was dumped; for example, a Hash database will be created if a Hash database was dumped.
Btree and Hash databases may be converted from one to the other. Queue and Recno databases may be converted from one to the other. If the -k option was specified on the call to db_dump then Queue and Recno databases may be converted to Btree or Hash, with the key being the integer record number.
子选项-t,追加在在-T选项后,用来指定转译载入的数据库类型。扩展介绍下,-t可以指定的数据类型有Btree、Hash、Queue和Recon数据库。这里,接下来我们需要指定的是Hash型。
—————————————————————————-

4.察看生成的虚拟用户数据文件
[root@KcentOS5 ~]# ll /etc/vsftpd/virtusers.db
-rw-r–r– 1 root root 12288 Sep 16 03:51 /etc/vsftpd/virtusers.db
需要特别注意的是,以后再要添加虚拟用户的时候,只需要按照“一行用户名,一行口令”的格式将新用户名和口令添加进虚拟用户名单文件
。但是光这样做还不够,不会生效的哦!还要再执行一遍“ db_load -T -t hash -f 虚拟用户名单文件 虚拟用户数据库文件.db ”的命令使

其生效才可以!

四.设定PAM验证文件,并指定虚拟用户数据库文件进行读取
1.察看原来的Vsftp的PAM验证配置文件:
[root@KcentOS5 ~]# cat /etc/pam.d/vsftpd
—————————————————————-
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth
session    required     pam_loginuid.so
—————————————————————-

2.在编辑前做好备份:
[root@KcentOS5 ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup

3.编辑Vsftpd的PAM验证配置文件
[root@KcentOS5 ~]# vi /etc/pam.d/vsftpd
—————————————————————-
#%PAM-1.0
auth    sufficient      /lib/security/pam_userdb.so     db=/etc/vsftpd/virtusers
account sufficient      /lib/security/pam_userdb.so     db=/etc/vsftpd/virtusers
以上两条是手动添加的,内容是对虚拟用户的安全和帐户权限进行验证。
这里的auth是指对用户的用户名口令进行验证。
这里的accout是指对用户的帐户有哪些权限哪些限制进行验证。
其后的sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。相反,如果没有通过的话,
也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
再后面的/lib/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。
最后的db=/etc/vsftpd/virtusers则指定了验证库函数将到这个指定的数据库中调用数据进行验证。
#KC: The entries for Vsftpd-PAM are added above.

session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth
session    required     pam_loginuid.so
—————————————————————-

五.虚拟用户的配置
1.规划好虚拟用户的主路径:
[root@KcentOS5 ~]# mkdir /opt/vsftp/

2.建立测试用户的FTP用户目录:
[root@KcentOS5 ~]# mkdir /opt/vsftp/kanecruise/ /opt/vsftp/mello/ /opt/vsftp/near/

3.建立虚拟用户配置文件模版:

[root@KcentOS5 ~]# cp /etc/vsftpd/vsftpd.conf.backup /etc/vsftpd/vconf/vconf.tmp

4.定制虚拟用户模版配置文件:
[root@KcentOS5 ~]# vi /etc/vsftpd/vconf/vconf.tmp
——————————–
local_root=/opt/vsftp/virtuser
指定虚拟用户的具体主路径。
anonymous_enable=NO
设定不允许匿名用户访问。
write_enable=YES
设定允许写操作。
local_umask=022
设定上传文件权限掩码。
anon_upload_enable=NO
设定不允许匿名用户上传。
anon_mkdir_write_enable=NO
设定不允许匿名用户建立目录。
idle_session_timeout=600
设定空闲连接超时时间。
data_connection_timeout=120
设定单次连续传输最大时间。
max_clients=10
设定并发客户端访问个数。
max_per_ip=5
设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件。
local_max_rate=50000
设定该用户的最大传输速率,单位b/s。
——————————–
这里将原vsftpd.conf配置文件经过简化后保存作为虚拟用户配置文件的模版。这里将并不需要指定太多的配置内容,主要的框架和限制交由
Vsftpd 的主配置文件vsftpd.conf来定义,即虚拟用户配置文件当中没有提到的配置项目将参考主配置文件中的设定。而在这里作为虚拟用户的配置文件模版只 需要留一些和用户流量控制,访问方式控制的配置项目就可以了。这里的关键项是local_root这个配置,用来指定这个虚拟用户的FTP主路径。

5.更改虚拟用户的主目录的属主为虚拟宿主用户:
[root@KcentOS5 ~]# chown -R overlord.overlord /opt/vsftp/

6.检查权限:
[root@KcentOS5 ~]#
ll /opt/vsftp/
total 24
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:14 kanecruise
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:00 mello
drwxr-xr-x 2 overlord overlord 4096 Sep 16 05:00 near

六.给测试用户定制:
1.从虚拟用户模版配置文件复制:
[root@KcentOS5 ~]# cp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/kanecruise

2.针对具体用户进行定制:
[root@KcentOS5 ~]# vi /etc/vsftpd/vconf/kanecruise
———————————
local_root=/opt/vsftp/kanecruise
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=300
data_connection_timeout=90
max_clients=1
max_per_ip=1
local_max_rate=25000
———————————

七.启动服务:
[root@KcentOS5 ~]# service vsftpd start
Starting vsftpd for vsftpd:                                [ OK ]

八.测试:
1.在虚拟用户目录中预先放入文件:
[root@KcentOS5 ~]# touch /opt/vsftp/kanecruise/kc.test

2.从其他机器作为客户端登陆FTP:
[root@Yum ~]#
ftp
ftp> open 192.168.1.22
Connected to 192.168.1.22.
220 This Vsftp server supports virtual users ^_^
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.22:root): kanecruise
331 Please specify the password.
Password: 123456
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

3.测试列单操作
ftp> ls
227 Entering Passive Mode (192,168,1,22,220,24)
150 Here comes the directory listing.
-rw-r–r–    1 501      501             0 Sep 15 21:14 kc.test
226 Directory send OK.(目录列单成功)

4.测试上传操作:
ftp> put
(local-file) KC.repo
(remote-file) KC.repo
local: KC.repo remote: KC.repo
227 Entering Passive Mode (192,168,1,22,230,1)
150 Ok to send data.
226 File receive OK. (上传成功)
699 bytes sent in 0.024 seconds (29 Kbytes/s)
ftp>

5.测试建立目录操作:
ftp> mkdir test
257 “/opt/vsftp/kanecruise/test” created (目录建立成功)

6.测试下载操作:
ftp> get kc.test
local: kc.test remote: kc.test
227 Entering Passive Mode (192,168,1,22,164,178)
150 Opening BINARY mode data connection for kc.test (0 bytes).
226 File send OK.(下载成功)

7.测试超时:
ftp> dir
421 Timeout.(超时有效)
ftp> user
Not connected.

注意:
在/etc/vsftpd/vsftpd.conf中,local_enable的选项必须打开为Yes,使得虚拟用户的访问成为可能,否则会出现以下现象:
———————————-
[root@KcentOS5 ~]# ftp
ftp> open 192.168.1.22
Connected to 192.168.1.22.
500 OOPS: vsftpd: both local and anonymous access disabled!
———————————-
原因:虚拟用户再丰富,其实也是基于它们的宿主用户overlord的,如果overlord这个虚拟用户的宿主被限制住了,那么虚拟用户也将受到限
制。

backer补充:

500 OOPS:错误

有可能是你的vsftpd.con配置文件中有不能被实别的命令,还有一种可能是命令的YES 或 NO 后面有空格。

我遇到的是命令后面有空格。因为我是用GEDIT来编辑的配置文件。

Linux centos5.2 下安装花生壳出错的解决方案

一、花生壳For Linux安装步骤

1. 下载适合您的unix/linux版本的安装包文件,使用root身份解压缩安装包
# tar -zvxf phlinux-1.0-install.redhat.9.0.tar.gz

2. 安装包文件将解压缩至phlinux_install目录中
# cd phlinux_install

3. 执行安装脚本
# ./install.sh
报错:

/usr/local/phlinux/phlinux: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory

原来, CentOS所带的这个shared libraries是 6的版本(libstdc++.so.6), 所以需要再安装libstdc++.so.5. 网上推荐的做法是利用yum 直接执行 yum install libstdc++.so.5, 但是由于我的CentOS装在虚拟机中, 而且公司访问外网需要通过防火墙, 但CentOS中的代理设置我一直搞不定.
最后在centos的DVD光盘里面找到:
CentOS/compat-libstdc++-33-3.2.3-61.i386.rpm
CentOS/compat-libstdc++-296-2.96-138.i386.rpm

解压,然后:rpm -i compat-libstdc++-33-3.2.3-61.i386.rpm  rpm -i compat-libstdc++-296-2.96-138.i386.rpm 安装即可!

4. 执行安装脚本后,将自动以互动配置模式的phlinux程序

输入web服务的地址,直接回车
Runing phlinux for first configuration…
Peanuthull Linux-core 1.0 by oray.net, copyright 2005
No user configuration found, entering interactive mode automatically!

Peanuthull Linux-core Interactive startup.
Please input service address(press ENTER use phservice.oray.net):

输入花生壳服务器地址,直接回车
Please input server address(press ENTER use PH031.Oray.Net):

此处提示输入您的花生护照登陆名
Please input username(press ENTER use ):

此处提供输入花生护照登陆密码
Please input password:

系统提示是否保存配置文件,在这里输入yes回车.
Save to configuration file (/etc/phlinux.conf)?(yes/no):

以上操作完成,系统将自动登录花生壳服务器,用户可以通过web方式查看当前花生壳客户端的运行状态.
花生壳客户端使用 6160端口提供web检测服务,例如 http://192.168.0.1:6160/
此监测页面将完全的反应当前花生壳的运行状态.

putty 中文乱码解决方法

方法一:
打开putty主程序,选择window-〉Appearance-〉Font settings-〉Change…,选择Fixedsys字体,字符集选择CHINESE_GB2312。在window-〉Appearance -〉Translation中,Received data assumed to be in which character set 中,把Use font encoding改为UTF-8如果经常使用,把这些设置保存在session里面. 现在打开putty,登录成功后,在shell中输入:export LC_ALL=’zh_CN.utf8′

方法二:
编辑/etc/sysconfig/i18n
将第1句“LANG=”zh_CN.UTF-8″”改为“LANG=”zh_CN.GB18030″”,完成后保存重新登录就可以显示正常了

Linux清空内存和磁盘缓存

细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.

先来说说free命令

[root@server ~]# free -m
total       used       free     shared    buffers     cached
Mem:           249        163         86          0         10         94
-/+ buffers/cache:         58        191
Swap:          511          0        511

其中:

total 内存总数

used 已经使用的内存数

free 空闲的内存数

shared 多个进程共享的内存总额

buffers Buffer Cache和cached Page Cache 磁盘缓存的大小

-buffers/cache 的内存数:used – buffers – cached

+buffers/cache 的内存数:free + buffers + cached

可用的memory=free memory+buffers+cached

有了这个基础后,可以得知,我现在used为163MB,free为86,buffer和cached分别为10,94

那么我们来看看,如果我执行复制文件,内存会发生什么变化.

[root@server ~]# cp -r /etc ~/test/
[root@server ~]# free -m
total       used       free     shared    buffers     cached
Mem:           249        244          4          0          8        174
-/+ buffers/cache:         62        187
Swap:          511          0        511

在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.别紧张,这是为了提高文件读取效率的做法.

引用http://www.wujianrong.com/archives/2007/09/linux_free.html” 为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。”

那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放>?

[root@server test]# free -m
total       used       free     shared    buffers     cached
Mem:           249        244          5          0          8        174
-/+ buffers/cache:         61        188
Swap:          511          0        511

MS没有任何变化,那么我能否手动释放掉这些内存呢???回答是可以的!

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm /drop_caches来释放内存.操作如下:

[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默认为0

[root@server test]# sync

手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)

[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3

将/proc/sys/vm/drop_caches值设为3

[root@server test]# free -m
total       used       free     shared    buffers     cached
Mem:           249         66        182          0          0         11
-/+ buffers/cache:         55        194
Swap:          511          0        511

再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了buffer和cache.

有关/proc/sys/vm/drop_caches的用法在下面进行了说明

/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing  to  this  file  causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory  to  become
free.

To  free  pagecache,  use  echo 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to   free   pagecache,   dentries  and  inodes,  use  echo  3  >
/proc/sys/vm/drop_caches.
Because this is a non-destructive operation  and  dirty  objects
are not freeable, the user should run sync(8) first.

=======================================================

测试程序性能的时候,之前的时候需要不停的重启机器来进行测试,比较麻烦,想有什么办法可以清空磁盘缓存呢?

If you’re on OS X, the ‘purge’ command (part of the CHUD developer tools) will cause the disk caches to be purged. On Linux, with a 2.6.16 kernel or newer, ‘echo 3 > /proc/sys/vm/drop_caches’ will achieve the same effect. Another trick on Linux is to use a separate filesystem for the benchmark–if you perform a umount/mount cycle
after each run the kernel will drop any cached data that came from that filesystem.

两种方法:
echo 3 > /proc/sys/vm/drop_caches
umount /dev/sdx

参考:
http://www.gamedev.net/community/forums/topic.asp?topic_id=402069
http://blog.chinaunix.net/u/27173/showart_467689.html

Linux下的Memcached安装

最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程。

Linux下Memcache服务器端的安装
服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 。
下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.3。(如果你的系统已经安装了libevent,可以不用安装)
官网:http://www.monkey.org/~provos/libevent/
下载:http://www.monkey.org/~provos/libevent-1.3.tar.gz

用wget指令直接下载这两个东西.下载回源文件后。
1.先安装libevent。这个东西在配置时需要指定一个安装路径,即./configure –prefix=/usr;然后make;然后make install;
2.再安装memcached,只是需要在配置时需要指定libevent的安装路径即./configure –with-libevent=/usr;然后make;然后make install;
这样就完成了Linux下Memcache服务器端的安装。详细的方法如下:

1.分别把memcached和libevent下载回来,放到 /tmp 目录下:
# cd /tmp
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

2.先安装libevent:
# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install

3.测试libevent是否安装成功:
# ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3
还不错,都安装上了。

4.安装memcached,同时需要安装中指定libevent的安装位置:
# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/bin/memcached ,

5.测试是否成功安装memcached:
# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug

安装Memcache的PHP扩展
1.在http://pecl.php.net/package/memcache 选择相应想要下载的memcache版本。
2.安装PHP的memcache扩展

#tar vxzf memcache-2.2.1.tgz
#cd memcache-2.2.1
#/usr/local/php/bin/phpize
#./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir
#make
#make install

3.上述安装完后会有类似这样的提示:

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/

4.把php.ini中的extension_dir = “./”修改为

extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/”

5.添加一行来载入memcache扩展:extension=memcache.so

memcached的基本设置:
1.启动Memcache的服务器端:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2.如果要结束Memcache进程,执行:

# kill `cat /tmp/memcached.pid`

也可以启动多个守护进程,不过端口不能重复。

3.重启apache,service httpd restart

Memcache环境测试:
运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把!
< ?php
$mem = new Memcache;
$mem->connect(”127.0.0.1″, 11211);
$mem->set(’key’, ‘This is a test!’, 0, 60);
$val = $mem->get(’key’);
echo $val;
?>

参考资料:
对Memcached有疑问的朋友可以参考下列文章:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html
Memcache基础教程:http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
Memcache协议中文版:http://www.ccvita.com/306.html

Windows平台下使用XAMPP之Sendmail功能設定方法

Window本身沒有”sendmail”的功能,如果想用跟Unix-like中一樣Sendmail的功能,
XAMPP可以使用Fake-sendmail來替代,這必須準備一組SMTP來作為Sendmail發信用。

設定的方法如下:

1.修改 x:\xampp\sendmail\sendmail.ini 檔案,修改以下資料:

smtp_server=smtp.gmail.com
auth_username=pomailer@gmail.com
auth_password=abcde

2.修改 x:\xampp\apache\bin\php.ini 檔案,修改以下資料:

[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "E:\xampp\sendmail\sendmail.exe -t"
< ?php
$now = date("Y-m-d h:i:s");
$from_name = '測試寄件者';
$from_email = 'pomailer@gmail.com';
$headers = 'From: $from_name ';
$body = '嗨, \n 這是一封測試信件來自 $from_name < $from_email>.';
$subject = '[$now] 測試信件發送';
$to = 'offar@msn.com';
if (mail($to, $subject, $body, $headers)) {
    echo "success!";
} else {
    echo "fail…";
}
?>

从奥运订票系统瘫痪说起——谈FastCGI 与IT 架构

2008年,对于首都人民来说,没有什么比奥运会更大的事情了。如何买到一张称心如意的比赛门票,也成了很多人的一个梦想。然而,在奥运官网抢票购买的时 候,这个梦想却轻易地被网上购票系统的瘫痪击成碎片,很多充满热情的老百姓们也因此郁闷无比。由于搜狐承担了奥运的官网,我又在那里工作过相当长一段时 间,很多兄弟抢票失败,于是便认定是搜狐开发的系统太烂,而找我抱怨。其实当时我也很是郁闷:首先这个系统并非搜狐开发;其次我也不在搜狐了。虽然如此, 和我同行的一些朋友,又开始问我如何解决类似问题。我也反反复复讲了很多次,为了让广大读者能够深入了解背后的原因和机制,写出来,大家一起讨论可能效果 会更好。当然,这并不是我说的架构就一定能解决问题,仅仅是抛砖引玉而已。在说架构之前,我先说一个老的技术,FastCGI。因为这个技术在后面的结构阐述中将起到非常重要的用处,原以为应该会有不少人会知道,但后来发现好像并非如此。关于FastCGI的历史我就不再赘述,好像自1993年便有了。目前最热门的视频网站YouTube体系结构中,就有fast-cgi的模块。它支持很 多httpd服务器,在官方网站上列了很多,如apache,aXesW3 ,Microsoft IIS,Zeus,近几年才出的lighttpd没写,其实这个新的httpd也支持,但我个人觉得,支持最好的,可能还是Apache。先讲讲FastCGI的原理,它和现在常用的运行请求不同,维基百科上有一个术语形容它,这里借用一下:◆ 短生存期应用程序

◆ 长生存期应用程序

CGI技术的机制是:每次当客户请求一个CGI的时候,Web服务器就请求操作系统生成一个新的CGI进程;当CGI满足要求后,服务器就杀死这个进程。并且服务器对客户端的每个请求都要重复这样的过程。

而FastCGI技术的机制为:FastCGI程序一旦产生后,它可以持续工作,一直保持满足客户的请求直到自己被明确终止。如果你希望通过协同处理来提高程序的性能,你可以请求Web服务器运行多个FastCGI 应用程序。

由此CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。

由于FastCGI程序并不需要不断产生新进程,可以大大降低服务器的压力。并且产生较高的应用效率。如今,流行的Java语言Servlet技术,在设计上就是参考FastCGI技术。

FastCGI 配置运行一般来说分三种,这三种都需要Apache的mod_fastcgi 进行处理。

1、Standalone FastCGI Server, 应该是独立的服务器。首先是需要把fastcgi作为单独的守护进程:
$ script/myapp_fastcgi.pl -l /tmp/myapp.socket -n 5
以下是这个fastcgi的守护进程的参数:

-d -daemon #作为守护进程

-p -pidfile #管理进程的PID写入到到文件的名称

-l -listen #SOCKET的路径,机器名:端口, 或者端口

-n -nproc #起始接受请求的进程数

然后把下面的代码加入Apache的HTTPD.CONF:
FastCgiExternalServer /tmp/myapp -socket /tmp/myapp.socket

Alias /myapp/ /tmp/myapp/

# Or, 可以使用root的身份运行

Alias / /tmp/myapp/

# Optionally,(使用rewrite模块)

RewriteRule ^/myapp$ myapp/ [R]

然后重启Apache就OK了
2、Static mode:静态模式, 一般是用于单一确定的模式,就是在Apache 的httpd.conf 中间加上:
FastCgiServer /usr/local/apache/count/count.fcg -processes 1
Alias /c /usr/local/apache/count/count.fcg
此处建议再使用REWRITE的方式 重写整个的URL匹配, 使之看起来像一个静态页面。
RewriteRule read-(.+)-(.+)-(.+).html$ /c?id=$1&sid=$2&port=$3 [L]
3、Dynamic mode:动态模式,可以使用各种各样的fastcgi,加入到httpd.conf中间去,比如:

AddHandler fastcgi-script .fcgi

还有一个关键的设置:
<Directory /path/to/MyApp>

Options +ExecCGI

</Directory>
这个配置建议放在cgi-bin 这种类似的目录里面。

请注意第二种,服务器起几个进程,是由-processes 1 这个参数来控制的,所以起多少你可以自己来定,我们在下面的一个关键模块中将使用这个模式。

下面放一段FastCGI程序的C代码,来说明一下:
#include <fcgi_stdio.h>

#include <string.h>
void main(void){

int count = 0;

while(FCGI_Accept() >= 0) {

printf(“Content-type:text/html “);

printf(” “);

printf(“<HTML> ”

“<HEAD>

“<TITLE>FastCGI</TITLE> ”

“<META http-equiv=”Content-Type” ”

“content=”text/html;   charset=utf-8″> <body> ” “Hello world!<br> “);

printf(“Request number %d.”,count++);

printf(“</body></html> ”);

}

exit(0);

}
这是一个很简单的例子,就是简单的计数, 大家可以注意这一句:while(FCGI_Accept() >= 0)

这就是它和普通的短周期程序最大的不同,一般CGI都是运行完就退出了,这个FastCGI,在处理完一个请求完毕后,会回到初始状态等待下一次请求;如 果这个程序被设置成为只能启动一个,那么无论是否访问这个页面,都是在前一个的基础上加一,而不会又产生新的进程;从而后来者是从零开始。当然,很多人也 都注意到,此处就是一个死循环在不断处理;如果程序比较复杂,存在内存泄露的问题,此处产生的问题也要比普通CGI要严重得多,所以使用它对于程序员的要 求也更高。

上述方案应该是所有的Web应用解决方案中,执行效率和速度最高的。官方数据是说比一般的高15倍左右,在我的机器上测试,基本上每秒能够处理大概2400次请求。

再回到我们说的正题:奥运订票系统的瘫痪,关于访问量,当时的说法是800万/小时,那么平均到每秒就是超过2200次。这对于订票系统来说,确实是一个 非常大的考验。毕竟这种状况下,数据库是肯定承担不住这个量级的访问了。如何进行架构设计,是我们都需要面对的问题。

如果设计要应对这种高负载、高访问量的结构,首先考虑这个系统的需求。其实具体过程比较简单:

1.用户认证

2.查看所有可以订票的项目和票的数量

3.选择项目,放入购物车

4.确认并提交订单

5.订单成功扣款

过程虽然简单,但其实里面的东西也不少。

由于用户的数据量很大,注册用户数百万以上;而且这种系统,登录用户在操作时应该不存在普通应用的2/8原则。在抢票的当天,绝大部分注册用户都会登录, 而且时间会非常集中,所以并发会非常大。你如果预算充足,放一万台服务器来做这个事情,做一个分布算法,然后每台服务不超过十万个用户,这样你就能充分保 证你的用户感受和体验。可我想实际上没有哪个公司和系统会这么做,即使是财大气粗的奥组委。

这个时候,很多人可能会想:上面提到的FastCGI这种高效率的程序就是针对类似状况的解决方案,其实这是很常见的错误。我想这个订票之所以会瘫痪,就 是由于部分设计过于高效,而部分不可能那么高效的缘故。比如登录这个模块的效率估计就非常高,因为登录只是在数据库对比一下用户名和密码,而且数据更新也 不频繁,完全可以用分布式数据库来解决。但用户登录后,所有的压力会全部压在后面的功能上,从而造成系统的瘫痪。这个时候,由于人太多,你无论怎么高效, 在执行到后面复杂的购买功能时,都会出现瓶颈。而如果真的放一万台服务,你的数据如何分布同步,然后真的做到先来先得,会很难,如果设计的不好,和抽签也 就没什么两样了。

所以这个系统设计的策略应该是:如何做到在保证用户感受的情况下,合理控制进入系统的人数,这样你后面的设计和开发的压力会小的多,而且成本的控制非常清楚。

那么剩下的做法就很清晰了:系统的重点是用户登录,而不是一般理解的后面购票提交的系统功能。如何控制进入的人数,我觉得不妨参考银行的叫号方式来设计:系统先给用户发号,然后当了解到有资源空出来时,再让用户登录。
这个结构的重点就在呼号中心和序列号的分配上面。

1. 序列号分配中心,技术重点在于高效和唯一性。也就是说当用户访问数达到海量之后,你需要非常迅速地分配唯一的序列号给登录的用户。这种状况下,其他很多技 术无法承担这种需求。开始提到的FastCGI,就是这个模式下的唯一选择。我们在开始安装的时候,就可以使用这种只起单个进程的模式,所以分配用户的序 列号只会是唯一的。由于FastCGI的高效率,从而保证登录的用户可以迅速分配到一个号,然后离开。当然如果你还不放心的话,还可以在前面再加一个负载 均衡的设备,完成对几个不同服务器负载分配,然后每个机器加不同的步长,并且起始数字不一样。比如:如果你有2台机器做发号工作,第一台起始数字为1,第 二台为2,步长为二,就是每次累加2,这样用户在不同的机器上也会得到唯一的号,而效率就能提高两倍。

至于记录用户序列号的方式,可以用cookie记录在客户端,然后进行加密。用户记录后,进入呼号中心,比对手里的号和前面排队的人数,然后提示用户前面 排队人数。比方说,你上来就是排号在3千万以后了,前面有2千多万人,我想如果这个人头脑正常的话,就不会说这个系统太烂,只能说自己起晚了,然后感叹中 国人实在是太多,就不会再上去反复不停地登录。

2. 呼号中心,这里大概是最麻烦,也是最关键的地方。由于订票系统是B/S结构,服务器端有动作的时候,如何通知客户端是一个要点。也就是说,当有人订票完 毕,从系统中退出,此时,中控中心知道后,会通知呼号中心呼叫下一个。呼号中心如何找到应呼叫的号码,有两种解决方法,具体实现都不妨通过AJAX的局部 刷新达成。

第一种,和叫号系统的号进行比对,如果发现匹配成功,就通知客户端进入系统。

第二种,判断这个用户前面的排队数量,如果发现为零,就触发进入这个系统的动作。

还要注意一点,就是刷新时间长短和叫号的失效问题。时间太短,服务器压力会很大;时间太长又会容易造成这个用户感觉没有变化,从而感受很差。所以这个时间 的设置,个人觉得在5-15秒之间调整会比较合适。然后压力需要分摊,也就是叫号服务器需要设置多个。这样的话,用户刷新会命中不同的服务器,此时需要对 数据的同步进行特殊处理,其架构如下:

这个消息接受模块可以有两种模式取信息:短连接,每隔一段时间来传递信息;长连接,就是在消息接受和中控服务器中建立一个长效的消息通知机制。由于对于信息及时性的要求比较高,所以采用长连接比较合适。

消息接受模块和中控服务器之间需要进行序列号的交换。由于你不知道捏着这个号的用户命中哪台服务器,所以失效机制需要在几个服务器上同时进行。也就是说, 当一个用户退出,中控服务器知道后,开始确认最后一个登录号,然后发给所有前端,前端要能保证通知到用户,然后向用户发出通知,说明如果在给定次数内用户 还不进行登录或者认证,就提示后端此号失效,系统再分配下一个号给前端进行通知,

如果要设计得更加精巧,还可以建立前端服务器之间的消息通知机制。就是当一台服务器发现这个号在自己上面,就通知几个前端,不再对这个号进行判断,尽量节约资源。

3. 中控服务器。我在开发社区和直播间的时候,都用到了这种方式,此处也用到了。不过在这个系统中,中控服务器不必使用单独的物理服务器,这里可以只是一个模块,它的主要用途是通知这些叫号服务器。由于数据很简单,所以中控的分发比较容易,不用设计特别复杂的协议。

4. 认证中心:唯一需要改动的,就是判断用户的序列号是否可用并且是真正的号码。

5. 购票中心:此处有很多种分布的方法,有很多可以借鉴的结构,这里就不赘述了。在这个架构中,购票唯一需要确认的就是可以同时承担多少人同时在线购买
前三个部分是这个架构的核心部分,由于进入的人数可以控制,后面的系统就还可以使用老的订票系统,只用确认同时放进来多少人就可以,也就是窗口没变,只是大家不再一拥而上,都是文明人,请排队拿号。

当然后面的架构还可以重新进行优化和设计,从而尽可能提高放进来人的数量,在进行设计购票功能时还可以借鉴这方面的模式。比如:篮球是爱好观众比较多的运 动,大家都想到现场看看科比同学的扣篮,进来人后,可能大家都会一拥而上先抢这个,从而造成局部的数据瘫痪,影响整个系统。此时也可以在里面暗含这个模 块。买票的人少,拿号看不出来,拿了就能进去;一旦人数到了极限,对不起,也请排队。

限制人员进入后,未进入的人和购买的人不在同一个系统中,从而不会妨碍进入的人,买的人也会很快解决,他们可以迅速完成订单。提交后,系统发现这个人无法再订其他球票的时候,就可以认为再放一个人进来,或者干脆做绝一点,马上将其踢出去,以节约资源。

而且,由于你可以控制进入的用户数量,从而系统其他部分的设计简单多了。多大的钱办多少事,如果领导想快一点了事,预算充足,那么放入的人就多;如果心里 面没底,那么可以先放很少人进来,或者说大概估计一下,只放多少号,如就卖10万张票,那么只放50万个号,放完了就没有了。用户来晚了,连号都没有,也 只能慨叹自己不够及时,这样比系统瘫痪要好得多。

对于这个架构,其设计重点就是把系统整体的资源处于可控的状态。很多类似系统,如:报名,考试,短时间抢购等等实际应用系统,都可以采用类似的方式解决。好的架构,并不是说能解决所有的问题,而是很清楚自己能做什么,不能做什么。

文/钱宏武
(来自:《程序员》杂志 http://www.programmer.com.cn/)