Destination host unreachable 一般解决办法

起因:

安装VC++重新启动计算机后,电脑上不去网

症状:

本机IP 192.168.0.99
子网掩码:255.255.255.0
网关:192.168.0.1
DNS:192.168.0.1
解决:
首先,把网线拔了重新插了数次,以防接触不良导致的。
把网线插上的一瞬间能够看到网卡指示灯迅速的闪了几下,证明此时有数据通过,物理上应该是没有问题的,检查软件原因。

ping 192.168.0.1,返回的结果是

Destination host unreachable.

翻译做中文,这一行字的意思是“目标主机不可达”,一般情况下,是因为IP地址配置出错,没有到达目标IP的路由

说白了,就是没有配置默认网关,因此,输入命令 ipconfig /all 看了一下,发现一点问题也没有

ping 127.0.0.1192.168.0.99正常,表示TCP/IP协议没错
网卡卸载后重装,禁用启用网卡数次,故障依旧,使用LSP的软件进行修复,发现ping 192.168.0.1之后依然提示“Destination host unreachable.”,可是这个时候输入命令arp -a可以看到网关的MAC地址已经正常解析了!

分析:

既然arp -a能够解析出MAC地址,说明网络是连接是正常的,那么问题一定出在电脑里,阻止了ICMP或者别的数据的连接。

检查进程和服务,瑞星防火墙并没有启动,系统自带的防火墙也没有打开。

百度搜索关键字“Destination host unreachable.”,很多人都提到了一个问题,是IPSeC安全策略阻止了数据的通过,在网卡属性里选TCP/IP协议,进“高级”,“选项”,没看到起用IPSeC,也没有做端口过滤

疑惑了,没招的时候总会想到去查查系统的日志,看看有没有出错的信息或记录,结果看到两条日志:

事件类型:    错误
事件来源
:    
Service Control Manager
事件种类
:    

事件 ID
:    
7023
日期
:    2007-2-
2
事件
:    11:48:
49
用户
:    N/
A
计算机
:    
SAGI
描述
:
IPSEC Services 服务因下列错误而停止
:
指定的标记无效。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

紧接着还有一条相关的

事件类型:    错误
事件来源
:    
IPSec
事件种类
:    

事件 ID
:    
4292
日期
:    2007-2-
2
事件
:    11:47:
21
用户
:    N/
A
计算机
:    
SAGI
描述
:
IPSec 驱动程序进入了阻止模式。IPSec 将丢弃所有未经启动时 IPSec 策略例外所允许的入站和出站 TCP/IP 网络通讯。 用户操作: 要恢复完全非安全的 TCP/
IP 连接,请禁用 IPSec 服务,然后重新启动计算机。 有关详细的疑难解答信息,请查阅在安全事件日志中的事件。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
数据
:
0000: 00 00 00 00 01 00 54 00     ......T
.
0008: 00 00 00 00 c4 10 00 c0     ....Ä..&Agrave
;
0010: 01 00

看到这里,大家明白了吧?重点就在于:

IPSec 驱动程序进入了阻止模式。IPSec 将丢弃所有未经启动时 IPSec 策略例外所允许的入站和出站 TCP/IP 网络通讯。 用户操作: 要恢复完全非安全的 TCP/IP 连接,请禁用 IPSec 服务,然后重新启动计算机。

照着这个提示,输入命令services.msc,进入服务控制面板,找到IPSec服务,禁用,重启,问题解决。

Linux操作系统修改时区的方法

Local vs. UTC
首先重要的问题是你使用utc还是local time.
UTC(Universal Time Coordinated)=GMT(Greenwich Mean Time)
Local time 是你手表上的时间
传统的POSIX计算机(Solaris,bsd,unix)使用UTC格式
linux可以处理UTC时间和蹩脚的Windows所使用的local time
到底是使用UTC还是local time可以这样来确定:
如果机器上同时安装有Linux和Windows,建议使用local time
如果机器上只安装有Linux,建议使用utc
确定后编辑/etc/sysconfig/clock, UTC=0 是local time; UTC=1 是UTC(GMT)
确定timezone
运行tzselect,回答问题后会告诉你时区的名称,比如”Asia/Shanghai”,把他记下来(后面我用$timezone代替)
设定timezone
# cp /usr/share/zoneinfo/$timezone /etc/localtime
重新启动或者运行时钟设置脚本使之发生作用
版本差异
由于发行版的差异,以上文件位置可能不同。
一般设置时钟所使用的启动脚本为/etc/rc.d/init.d/setclock
redhat是在/etc/rc.d/rc.sysinit中设置时钟,所以一般要重新启动。

Nginx 500的一种情况

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

国内巨快的Centos yum源

arbor找到的很快的国内yum 源:

CentOS USTC mirror

http://centos.ustc.edu.cn/centos/

安装后请按照以下步骤修改CenOS-Base.repo,以后就可以方便的用yum安装软件了.

cd /etc/yum.repos.d
mv CentOS-Base.repo  CentOS-Base.repo.save
wget http://centos.ustc.edu.cn/CentOS-Base.repo

修改以上文件后, 如需要安装gcc, 直接yum install gcc就可以了

还有一个:
http://www.shlug.org/

查看linux系统位数方法(32?64?)

1.直接看看有没有/lib64目目录的方法。64位的系统会有/lib64和/lib两个目录,32位只有/lib一个。

2.getconf LONG_BIT

(32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inux系统中可 用”getconf WORD_BIT”和”getconf LONG_BIT”获得word和long的位数。64位系统中应该分别得到32和64。)

Destination host unreachable 一般解决办法

症状:

本机IP 192.168.0.99
子网掩码:255.255.255.0
网关:192.168.0.1
DNS:192.168.0.1

解决:
首先,把网线拔了重新插了数次,以防接触不良导致的。
把网线插上的一瞬间能够看到网卡指示灯迅速的闪了几下,证明此时有数据通过,物理上应该是没有问题的,检查软件原因。

先ping 192.168.0.1,返回的结果是
Destination host unreachable.

翻译做中文,这一行字的意思是“目标主机不可达”,一般情况下,是因为IP地址配置出错,没有到达目标IP的路由

说白了,就是没有配置默认网关,因此,输入命令 ipconfig /all 看了一下,发现一点问题也没有

ping 127.0.0.1和192.168.0.99正常,表示TCP/IP协议没错
网卡卸载后重装,禁用启用网卡数次,故障依旧,使用LSP的软件进行修复,发现ping 192.168.0.1之后依然提示“Destination host unreachable.”,可是这个时候输入命令arp -a可以看到网关的MAC地址已经正常解析了!

分析:

既然arp -a能够解析出MAC地址,说明网络是连接是正常的,那么问题一定出在电脑里,阻止了ICMP或者别的数据的连接。

检查进程和服务,瑞星防火墙并没有启动,系统自带的防火墙也没有打开。

百度搜索关键字“Destination host unreachable.”,很多人都提到了一个问题,是IPSeC安全策略阻止了数据的通过,在网卡属性里选TCP/IP协议,进“高级”,“选项”,没看到起用IPSeC,也没有做端口过滤

疑惑了,没招的时候总会想到去查查系统的日志,看看有没有出错的信息或记录,结果看到两条日志:

事件类型:    错误
事件来源:    Service Control Manager
事件种类:    无
事件 ID:    7023
日期:    2007-2-2
事件:    11:48:49
用户:    N/A
计算机:    SAGI
描述:
IPSEC Services 服务因下列错误而停止:
指定的标记无效。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

紧接着还有一条相关的

事件类型:    错误
事件来源:    IPSec
事件种类:    无
事件 ID:    4292
日期:    2007-2-2
事件:    11:47:21
用户:    N/A
计算机:    SAGI
描述:
IPSec 驱动程序进入了阻止模式。IPSec 将丢弃所有未经启动时 IPSec 策略例外所允许的入站和出站 TCP/IP 网络通讯。 用户操作: 要恢复完全非安全的 TCP/IP 连接,请禁用 IPSec 服务,然后重新启动计算机。 有关详细的疑难解答信息,请查阅在安全事件日志中的事件。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
数据:
0000: 00 00 00 00 01 00 54 00     ……T.
0008: 00 00 00 00 c4 10 00 c0     ….&Auml;..&Agrave;
0010: 01 00

看到这里,大家明白了吧?重点就在于:

IPSec 驱动程序进入了阻止模式。IPSec 将丢弃所有未经启动时 IPSec 策略例外所允许的入站和出站 TCP/IP 网络通讯。 用户操作: 要恢复完全非安全的 TCP/IP 连接,请禁用 IPSec 服务,然后重新启动计算机。

照着这个提示,输入命令services.msc,进入服务控制面板,找到IPSec服务,禁用,重启,问题解决。

Nginx虚拟主机多server_name的顺序问题

在一个Nginx虚拟主机中,可以绑定多个server_name,而server_name的先后顺序的不同,对PHP程序中使用$_SERVER[“SERVER_NAME”]或getenv(‘SERVER_NAME’)获取服务器域名是有影响的。

$_SERVER[“SERVER_NAME”]或getenv(‘SERVER_NAME’)获取的始终将是Nginx server_name配置中的第一个域名,这一点在程序开发中需要注意。这第一个域名就相当于Apache虚拟主机配置中的ServerName,后面 的域名就相当于Apache的ServerAlias。

CentOs 默认服务解释

为了性能与安全,需要将部分服务关闭,标记蓝色为开启,其他为关闭

NetworkManager
自动在多种网络连接中进行转换,如果你的电脑有Wireless WiFi 和 Ethernet多种网络连接类型的话,可以选择开启。

NetworkManagerDispatcher

acpid
acpid(Advanced Configuration and Power Interface)是为替代传统的APM电源管理标准而推出的新型电源管理标准。通常笔记本电脑需要启动电源进行管理。

anacron
自动化运行任务守护进程。Red Hat Linux 随带四个自动化任务的工具:cron、anacron、at和 batc。当你的Linux服务器并不是全天运行,这个anacron就可以帮你执行在”crontab”设定的时间内没有执行的工作。

apmd
高级电源管理

atd
自动化运行任务守护进程。

auditd
审核信息,将消息写入控制台以及 audit_warn 电子邮件别名。用于存放内核生成的系统审查记录,这些记录会被一些程序使用。特别是对于SELinux用户来说。

autofs
自动安装管理进程automount,与NFS 相关,依赖于NIS

avahi-daemon

zeroconf配置的具体现实,对于没有DNS情况下的本地网络服务很有用,有点类似于mDNS,一般可以disable

avahi-dnsconfd

bluetooth
蓝牙

conman

console management

cpuspeed
监测系统空闲百分比,降低或加快CPU时钟速度和电压从而在系统空闲时将能源消耗降为最小,而在系统繁忙时最大化加快系统执行速度。

crond
自动计划任务

cups
cups(Common UNIX Printing System)是通用UNIX打印守护进程,为Linux提供第三代打印功能

dhcdbd
DHCP

dund
蓝牙拨号网络

firstboot
安装完之后的用户配置向导,用于第一次设置系统

gpm
(General Purpose Mouse Daemon )守护进程为文本模式下的Linux程序如mc(Midnight Commander)提供了鼠标的支持。它也支持控制台下鼠标的拷贝,粘贴操作以及弹出式菜单。

haldaemon
硬件监控系统

hidd
蓝牙H.I.D.服务器

ibmasm

ip6tables
ipv6 tables防火墙守护进程。

ipmi

iptables
iptables防火墙守护进程。

irda
红外端口守护进程。

irqbalance
对多个系统处理器环境下的系统中断请求进行负载平衡的守护程序。如果你只安装了一个CPU,就不需要加载这个守护程序。

kdump
初始化kdump的脚本

kudzu
硬件自动检测程序,会自动检测硬件是否发生变动,并相应进行硬件的添加、删除工作。如果你不打算增加新硬件,那么就可以关闭这个启动服务,以加快系统启动时间。

lvm2-monitor

mcstrans
主要用于SELinux

mdmonitor
mdmpd
RAID相关设备的守护程序。

messagebus
事件监控服务,在必要时向所有用户发送广播信息,如服务器将要重启。

microcode-ctl
可编码以及发送新的微代码到内核以更新Intel IA32系列处理器守护进程。

multipathd

netconsole

netfs
Network Filesystem Mounter,该进程安装和卸载NFS、SAMBA和NCP网络文件系统。

netplugd
网卡精灵进程,此服务监控网络界面,根据信号关闭或启动它,主要用于不经常连接的手提电脑。

network
激活已配置网络接口的脚本程序

nfs
网络文件系统守护进程。

nfslock
NFS是一个流行的通过TCP/IP网络共享文件的协议,此守护进程提供了NFS文件锁定功能。

nscd
密码与群查找服务,此服务用于减慢N.I.S/Y.P.nist,ldap和hesiod之类的服务.专门为这些服务提供更长的中断时间。NIS, NIS+, LDAP, or hesiod服务密码控制

ntpd
网络时间同步

oddjobd

pand
蓝牙个人区域网络,用于基于网络的家庭区域蓝牙技术

pcscd
智能卡支持

portmap
该守护进程用来支持RPC连接,RPC被用于NFS以及NIS 等服务。

psacct
进程审计守护进程

rdisc

readahed_early
readahead_later
开机内存载入优化

restrorecond
SELinux用于监控文件

rpcgssd
NFS支持

rpcidmapd

rpcsvcgssd

saslauthd
使用SASL的认证守护进程。

sendmail
邮件服务器sendmail守护进程。

setroubleshoot
SELinux Troubleshooting

smartd
Self Monitor Analysis and Reporting Technology System,监控你的硬盘是否出现故障。

sshd
OpenSSH服务器守护进程。

syslog
系统日志

winbind
用于Samba服务器

wpa_supplicant
无线设备支持

xfs
X Window字型服务器守护进程,为本地和远程X服务器提供字型集。

ypbind
为NIS(网络信息系统)客户机激活ypbind服务进程 。

yum-updatesd
RPM操作系统自动升级和软件包管理守护进程。

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 来把所有的日志写到一个中央服务器。尽管这个方法要求更多的配置,但是他也提供了最健壮的方案。