Apr
27
在微软Windows Server 2008中开始提供一个全新的Server Core模式,它是一个最小限度的系统安装选项,只包括安全、TCP/IP、文件系统、RPC等服务器核心子系统。在Server Core我们可以安装所需的服务器角色和特征,并且仅有非常少的GUI,像我们常见的IE、OE等应用在Server Core中是没有的,在Server Core中我们可以安装的服务器角色也只有DNS、DHCP、文件服务、活动目录、ADLDS(轻型目录服务)、打印、媒体、Web这几种,而其他角色是不能安装的。Windows Server 2008的Server Core是不支持asp.net和 .NET Framework的, Windows Server 2008 R2 Server Core有了改进,增加了对 .NET Framework子集、ASP.Net的支持,并提供对PowerShell的支持,可以配置更多的服务器角色。
在Windows Server 2008 R2 Server Core R2中Server Core提供了一些可选的特性:
•提供对 .NET Framework 2.0子集的支持
•提供对 .NET Framework 3.0和3.5子集的支持,包括WCF、WF、LINQ等开发工具
•提供对PowerShell的支持
•提供asp.Net支持,丰富了IIS的功能,除了不支持IIS的GUI管理界面,其他功能都是完全的。
•提供Active Directory Certificate Services服务器角色,即活动目录验证服务,可以成为CA服务器管理用户、计算机的公钥。
•Windows Server 2008 R2完全架构于64位,但其Server Core可以通过Windows on Windows(WOW)功能支持32位的应用程序,如果用户还需要运行32位程序的话,这个功能还是比较有用。
Server Core就是微软用命令行模式代替了图形界面,并且只有少数应用可以安装。Server Core安装完成后,我们首次登录后仅仅可以看到一个命令行窗口,看不到菜单、任务栏等GUI,服务器驱动的安装、TCP/IP设置、服务器角色的安装管理等操作均需要通过命令行来进行设置。
Server Core的常见部署主要应用做基础构架服务器,如DNS、DHCP、IIS等,或者作为分支机构的只读域控制器,除此之外,还可以作为Windows虚拟化宿主系统,可以运行微软虚拟化平台Hyper-V。
使用Server Core我们可以获得如下好处:
简化维护管理:在Server Core中我们安装的是所需的服务器角色和特征,其他的角色默认是不安装的,这样对于管理员来说可以专著于某一个应用,提高了工作效率,也降低了后期IT管理费用,总体降低了企业TCO成本。
减少攻击表面:Windows的图形界面虽然大大简化了操作,但是多个GUI也增加了出现漏洞的可能。Server Core中仅提供了系统更改时间等少数GUI,Windows中常见的GUI、Shell、IE、OE、Media等在Server Core中都被取消,这样就使服务器的攻击表面大大减少,提高了服务器的安全性。
高可用性:由于Server Core是一个最小的系统安装选项,安装的角色和特性降到了最低,省略了GUI,安装角色也不需要重启,这样就提高了系统的可用性,使系统工作更加稳定。
降低磁盘占用:Server Core去掉了Windows的外壳,也没有安装不必要的功能,所以使空间占用大大降低,Server Core安装成功后大概占用1GB的磁盘空间,随着应用的安装还需要大概2GB的空间,这比Windows Server 2008的磁盘占用要少得多。
较少的补丁安装:在Windows中我们需要经常安装各种补丁,对于不同组件需要安装不同的补丁。在Server Core中由于只具备少数组件,我们免去了安装大量补丁的麻烦。
Server Core的安装很简单,需要注意的是Server Core不能从原有的系统进行升级,只能进行全新安装。安装完成后,我们需要对Server Core进行一些初始化配置。首先我们需要做的是输入操作系统序列号并激活系统,并对系统激活状态进行验证。需要连接到网络,在命令提示符窗口中输入“Slmgr.vbs -ipk”来输入序列号,然后输入“Slmgr.vbs -ato”来激活系统。激活之后可以用“Slmgr.vbs -dli”来验证系统激活状态。
激活系统后还需要进行一些初始化设置,如设置静态IP、重命名服务器、加入域和配置防火墙。
•设置静态IP:如果服务器需要设置静态IP,可以用Netsh命令进行设置。首先需要用“Netsh interface ipv4 show interfaces”命令来查看服务器上网络适配器的状态,记下需要设置IP的网络适配器的名称,如“Local Area Connetion”。然后使用命令Netsh interface ipv4 set address name=“网络适配器名称” source=static address=静态IP地址 mask=子网掩码 gateway=默认网关 来设置静态IP地址。
•设置DNS可以用如下命令:Netsh interface ipv4 add dnsservername=“网络适配器名称” address=DNS服务器IP地址 index=1。如果设置多个DNS,只需重复输入此条命令,然后将index值递增即可。
•加入域:如果服务器需要加入域,可以利用如下命令:Netdom join 计算机名称 /domain:域名 /userd:有权限加入域的用户名 /passwordd:* ,回车后输入密码即可。
•配置防火墙:还需要进行防火墙的配置,因为防火墙默认是开启的,所以我们需要定义一些规则,如打开远程访问所需的3389端口等,否则会默认禁止应用所需的端口和协议。在系统调试阶段,我们可以暂时关闭防火墙,以消除影响,可利用如下命令:“netsh firewall set opmode disable”。创建防火墙规则可以使用命令“netsh firewall set portopening protocol=TCP|UDP port=端口号 name=名称”。此外如果需要进行一些高级设置可以使用“netsh advfirewall”命令。
•安装服务器角色:安装服务器角色我们需要利用Oclist命令,这个命令可以列出服务器所有安装的角色。安装各种角色可以利用如下命令,注意大小写是敏感的:
Start/w Ocsetup 角色包
DHCP服务器= DHCPServerCore
DNS 服务器= DNS-Server-Core-Role
文件复制服务= FRS-Infrastructure
分布式文件系统服务= DFSN-Server
分布式文件系统复制= DFSR-Infrastructure-ServerEdition
网络文件系统= ServerForNFS-Base
流媒体服务器= MediaServer
打印服务器= Printing-ServerCore-Role
LPD = Printing-LPDPrintService
常用命令汇总:对于之前没有接触过命令行操作的用户来说,一下子掌握Server Core的操作确实有些难度,Server Core中提供了一个常用的命令行汇总,可以为用户提供不少的便利:c:windowssystem32cscript scregedit.wsf /cli
管理功能:可以通过四种方式来管理Server Core,本地或者远程使用命令提示符;远程使用终端服务器;使用Windows远程命令提示符(WinRS);远程使用微软管理控制台(MMC)。
上述管理也可以通过一个图形工具进行参考:图形化的2008R2 Server Core 配置管理工具。
在Windows Server 2008 R2 Server Core R2中Server Core提供了一些可选的特性:
•提供对 .NET Framework 2.0子集的支持
•提供对 .NET Framework 3.0和3.5子集的支持,包括WCF、WF、LINQ等开发工具
•提供对PowerShell的支持
•提供asp.Net支持,丰富了IIS的功能,除了不支持IIS的GUI管理界面,其他功能都是完全的。
•提供Active Directory Certificate Services服务器角色,即活动目录验证服务,可以成为CA服务器管理用户、计算机的公钥。
•Windows Server 2008 R2完全架构于64位,但其Server Core可以通过Windows on Windows(WOW)功能支持32位的应用程序,如果用户还需要运行32位程序的话,这个功能还是比较有用。
Server Core就是微软用命令行模式代替了图形界面,并且只有少数应用可以安装。Server Core安装完成后,我们首次登录后仅仅可以看到一个命令行窗口,看不到菜单、任务栏等GUI,服务器驱动的安装、TCP/IP设置、服务器角色的安装管理等操作均需要通过命令行来进行设置。
Server Core的常见部署主要应用做基础构架服务器,如DNS、DHCP、IIS等,或者作为分支机构的只读域控制器,除此之外,还可以作为Windows虚拟化宿主系统,可以运行微软虚拟化平台Hyper-V。
使用Server Core我们可以获得如下好处:
简化维护管理:在Server Core中我们安装的是所需的服务器角色和特征,其他的角色默认是不安装的,这样对于管理员来说可以专著于某一个应用,提高了工作效率,也降低了后期IT管理费用,总体降低了企业TCO成本。
减少攻击表面:Windows的图形界面虽然大大简化了操作,但是多个GUI也增加了出现漏洞的可能。Server Core中仅提供了系统更改时间等少数GUI,Windows中常见的GUI、Shell、IE、OE、Media等在Server Core中都被取消,这样就使服务器的攻击表面大大减少,提高了服务器的安全性。
高可用性:由于Server Core是一个最小的系统安装选项,安装的角色和特性降到了最低,省略了GUI,安装角色也不需要重启,这样就提高了系统的可用性,使系统工作更加稳定。
降低磁盘占用:Server Core去掉了Windows的外壳,也没有安装不必要的功能,所以使空间占用大大降低,Server Core安装成功后大概占用1GB的磁盘空间,随着应用的安装还需要大概2GB的空间,这比Windows Server 2008的磁盘占用要少得多。
较少的补丁安装:在Windows中我们需要经常安装各种补丁,对于不同组件需要安装不同的补丁。在Server Core中由于只具备少数组件,我们免去了安装大量补丁的麻烦。
Server Core的安装很简单,需要注意的是Server Core不能从原有的系统进行升级,只能进行全新安装。安装完成后,我们需要对Server Core进行一些初始化配置。首先我们需要做的是输入操作系统序列号并激活系统,并对系统激活状态进行验证。需要连接到网络,在命令提示符窗口中输入“Slmgr.vbs -ipk
激活系统后还需要进行一些初始化设置,如设置静态IP、重命名服务器、加入域和配置防火墙。
•设置静态IP:如果服务器需要设置静态IP,可以用Netsh命令进行设置。首先需要用“Netsh interface ipv4 show interfaces”命令来查看服务器上网络适配器的状态,记下需要设置IP的网络适配器的名称,如“Local Area Connetion”。然后使用命令Netsh interface ipv4 set address name=“网络适配器名称” source=static address=静态IP地址 mask=子网掩码 gateway=默认网关 来设置静态IP地址。
•设置DNS可以用如下命令:Netsh interface ipv4 add dnsservername=“网络适配器名称” address=DNS服务器IP地址 index=1。如果设置多个DNS,只需重复输入此条命令,然后将index值递增即可。
•加入域:如果服务器需要加入域,可以利用如下命令:Netdom join 计算机名称 /domain:域名 /userd:有权限加入域的用户名 /passwordd:* ,回车后输入密码即可。
•配置防火墙:还需要进行防火墙的配置,因为防火墙默认是开启的,所以我们需要定义一些规则,如打开远程访问所需的3389端口等,否则会默认禁止应用所需的端口和协议。在系统调试阶段,我们可以暂时关闭防火墙,以消除影响,可利用如下命令:“netsh firewall set opmode disable”。创建防火墙规则可以使用命令“netsh firewall set portopening protocol=TCP|UDP port=端口号 name=名称”。此外如果需要进行一些高级设置可以使用“netsh advfirewall”命令。
•安装服务器角色:安装服务器角色我们需要利用Oclist命令,这个命令可以列出服务器所有安装的角色。安装各种角色可以利用如下命令,注意大小写是敏感的:
Start/w Ocsetup 角色包
DHCP服务器= DHCPServerCore
DNS 服务器= DNS-Server-Core-Role
文件复制服务= FRS-Infrastructure
分布式文件系统服务= DFSN-Server
分布式文件系统复制= DFSR-Infrastructure-ServerEdition
网络文件系统= ServerForNFS-Base
流媒体服务器= MediaServer
打印服务器= Printing-ServerCore-Role
LPD = Printing-LPDPrintService
常用命令汇总:对于之前没有接触过命令行操作的用户来说,一下子掌握Server Core的操作确实有些难度,Server Core中提供了一个常用的命令行汇总,可以为用户提供不少的便利:c:windowssystem32cscript scregedit.wsf /cli
管理功能:可以通过四种方式来管理Server Core,本地或者远程使用命令提示符;远程使用终端服务器;使用Windows远程命令提示符(WinRS);远程使用微软管理控制台(MMC)。
上述管理也可以通过一个图形工具进行参考:图形化的2008R2 Server Core 配置管理工具。
Apr
27
微软新一代企业级服务器操作系统平台 – Windows Server 2008 R2 系列中包含了一个全新操作体验的版本即 Server Core,包含在Windows Server 2008 R2 里的IIS 7.5 支持Server Core上的.NET。先前版本的Server 2008最大缺陷在于缺少对在基于 Server Core的 Web服务器上运行管理代码的支持。但是用惯了图形界面的Windows,对于Server Core 的 IT 朋友,可能在使用它时会感到非常迷茫。在codeplex上有个配置管理 Server Core 的小工具 – CoreConfigurator,目前最新版本是 v2.0.
CoreConfigurator 提供了如下的配置管理功能:
产品激活
配置显示属性
时间和时区的配置
远程桌面的配置
管理本地帐户
防火墙的配置
WinRM 的配置
IP 配置
计算机名和域/工作组的配置
安装 Server Core 的功能和角色
这个版本只能在2008 Server Core R2上运行,如果要在2008 Server Core上运行,则Core Configurator 1.1,可以在这里下载VisualCore11_Beta2_Refresh.html。
运行CoreConfigurator 2.0要求Powershell 2.0 and NetFx 2.0功能角色启用,可以使用命令行
dism /online /Enable-Feature /Featurename:NetFx2-ServerCore
dism /online /Enable-Feature /Featurename:MicrosoftWindowsPowerShell
把CoreConfigurator 2.0拷贝到Server Core的一个目录下,运行Start_CoreConfig.wsf。
运行后就可以看到上述管理界面了。
CoreConfigurator 提供了如下的配置管理功能:
产品激活
配置显示属性
时间和时区的配置
远程桌面的配置
管理本地帐户
防火墙的配置
WinRM 的配置
IP 配置
计算机名和域/工作组的配置
安装 Server Core 的功能和角色
这个版本只能在2008 Server Core R2上运行,如果要在2008 Server Core上运行,则Core Configurator 1.1,可以在这里下载VisualCore11_Beta2_Refresh.html。
运行CoreConfigurator 2.0要求Powershell 2.0 and NetFx 2.0功能角色启用,可以使用命令行
dism /online /Enable-Feature /Featurename:NetFx2-ServerCore
dism /online /Enable-Feature /Featurename:MicrosoftWindowsPowerShell
把CoreConfigurator 2.0拷贝到Server Core的一个目录下,运行Start_CoreConfig.wsf。
运行后就可以看到上述管理界面了。
Apr
27
编者按:系统架构师是许多程序员的梦想职业。今天的你也许已经掌握了各种开发工具,并且能够使用各种平台进行开发,但作为一个架构师的要求,也许还有很长的道路。邢波涛先生在LAMP架构上的造诣,让我邀请他撰写本文,也许这位架构师的建议能让你在未来的架构师之路上节省一点时间。
一个产品的经典开发步骤通常需要经过系统需求调研、系统分析、系统设计、开发、测试、部署实施等一系列的步骤,如下图所示:
而系统架构师,则在这个过程中,起到了承上(面对业务专家/系统分析员)和启下(面对软件工程师)的作用。所以说,系统架构师,在整个产品开发周期内是一个核心角色。如果说市场和销售决定一个产品是否好卖的话,系统架构师则直接决定着这个产品的开发是否成功。从某种意义上说,这也是众多程序员未来的梦想职业。
要想成为一个优秀的系统架构师,并非一朝一夕之功所能达到的,“冰冻三尺,非一日之寒”,除了要有很深的专业技能外,还需技术全面、成熟练达、洞察力强、经验丰富,具备战略性和前瞻性思维能力,善于把握全局,能够在更高抽象级别上进行思考。如果说系统分析员、业务专家只需要对一个产品的业务负责,可以不关心一个产品软件开发语言的话,而一个优秀的职业系统架构师,不仅要对产品背景和产品背后的业务逻辑熟悉,而且要对所用的软件开发语言(例如Java/C#/C/C++/J2EE),也要非常熟悉才可以,两者缺一不可。否则就起不到承上启下的作用,当然也设计不出良好的软件架构。在美国,一个合格的系统架构师的薪水甚至比部门经理或产品经理要高很多,这也是美国为什么三四十岁甚至五十岁的程序员也很常见的原因。
事实上,软件开发中碰到的很多问题,归结起来都可能和当初的架构设计有关,所以架构师要想不成为众矢之的,决不是件容易的事情。基于此,我认为,要想成为合格的系统架构师,首先要从程序员做起,只有有了多年的一线软件开发经验,深刻体会到了程序员的艰辛与不容易,才能设计出易于扩展、易于修改、易于维护、“不难为”程序员的架构出来。一个系统架构师,首先要能做出能够“自圆其说”的原型,才能跟程序员进行有效的沟通,而不是只是设计出来一个架构,就完全交给程序员来做了,这样,后期开发出来的产品风险很大。以我现在参与开发的产品为例,这个产品只是公司核心战略产品的很小的一部分,当然,虽然小,却是核心中的核心。这个产品配了3个系统架构师(年龄都在40岁以上,有数十年的软件开发经验),6个程序员、5个测试,还有一个负责产品打包的工程师。这3个系统架构师也都参与核心代码编写。
其次,合格的系统架构师,对所要开发的产品的业务背景,也要相当的熟悉才好,否则,设计出来的产品就不是客户想要的产品,当然也就不是成功的产品。还是以我现在参与的产品为例,这个产品是SCA规范的一个实现,3个系统架构师的其中一个,就是SCA标准规范的参与者与制定者,对SOA/SCA标准,有着相当的功底,否则,做出来的产品,就只能围着大公司,在他们屁股后面天天追了,别人做什么,自己也做什么,别人标准修改了,自己也赶快跟着修改。
第三,作为系统架构师,要经常阅读一些关于产品背景资料和系统架构设计方面的最新书籍。虽然现在技术方面的书籍,出得太滥,精品极少,大部分是从网上抄袭一些资料攒出来的,但是经常阅读一些国外大师的一些精品图书,还是能给自己带来一些新的思路和设计理念的。
第四,作为系统架构师,一定要有自信,既不要保守,也不要人云亦云,千万不要迷信于大师和大侠。别人说J2EE好,自己的产品就基于J2EE开发;别人说.NET容易开发,开发成本低,就转做.NET;别人说Ruby很敏捷,自己就说自己的产品是基于ROR开发的。一定要结合公司、市场和项目的实际情况,采用合适于自己的开发语言,设计出合适于自己的架构。比如,《J2EEWithoutEJB》那本书,提出了著名的“不要造新轮子”原则。如果大家都不要造轮子,都利用别人现有的框架和产品,怎么可能有技术的进步和百花齐放、欣欣向荣的景象呢?Spring的作者还不是看到经典J2EEEJB框架的诟病,才设计出来自己的Spring轮子了吗,为什么自己有了Spring轮子,就劝别人不要另造轮子了呢?GavinKing造出来了Hibenate这个轮子,为什么又参与EJB3.0的制定呢?并又参与设计出Seam这个轮子?我个人觉得,一个系统架构师,一定要造出自己的轮子,才算是真正的系统架构师,而不是拿着一大堆开源框架进行拼凑。
第五,对于开源的架构设计,要批判性地继承。要多阅读这些框架的源代码。以J2EE和Eclipse插件开发为例(因为我专注于这两个方面的开发),从前些年流行EJB,再到Struts→J2EEwithoutEJB→Spring/Hibernate→AJAX,每一个框架的流行,都有其深刻的历史背景,有一些现有框架解决不了的难题在里面,这些框架都是为了解决一些问题而出现的。我们经常阅读这些大师的源代码,精神上是一种享受,对锤炼自己的功底,也是大有好处的。例如,在做Eclipse插件开发的时候,常常会遇到一个问题,怎么才能监听到用户保存的事件,虽然Eclipse提供了资源变化监听机制,但是直接利用其机制,是很原始的,任何资源的变化,比如,添加/删除/移动一个图形,都会引起这个事件的调用,而我只想监听用户存盘的一刹那那个事件,以前在做项目的时候,想尽各种办法也没解决好。后来,在另外一个产品的源代码中,就看到了别人很好的解决方案,自己看到那段源代码,真的是领悟到很多。有时候,Eclipse的源代码和J2EE的源代码,在架构上是可以互相借鉴和补充的。比如,Eclipse的Adapter扩展机制和事件、资源监听机制,我们一样可以拿到J2EE框架中来,作为设计自己产品的设计模式蓝图。
第六,优秀的系统架构师还要拥有优秀的沟通能力,用以进行说服、鼓励和指导等活动,并赢得项目组成员的信任。一个系统架构师设计出一个良好的框架后,如果不能跟程序员进行有效的沟通,不能对程序员进行良好的指导,则这个良好的框架就不能很好的贯彻到产品开发的每个环节中去。有的程序员可能还是按照老经验对程序中的一些关键环节进行处理,等到这个架构师发现问题时,可能已经很晚了,说服、教育、培训和处罚到那时已经没有意义了。另外,如果一个系统架构师不能赢得项目组成员信任的话,那么他设计出来的架构就不具备说服力,程序员遇到困难,就会抱怨系统架构师设计的框架有问题,不能充分调动起来程序员的责任感和主观能动性。所以说,一个优秀的系统架构师,无论在精神上,还是技能上,都是一个程序员良好的导师。
第七,系统架构师要分清自己和系统分析员、项目经理或产品经理之间的角色和关系,不能负责一切,也不能只负责技术架构。由于系统架构师在整个产品开发周期内处于承上启下的中间地位,和程序员打交道的时间比系统分析员面向程序员的时间要长,有时候甚至比项目经理和程序员之间还熟悉,使得程序员很容易认为系统架构师对所有的需求和架构都负责,容易造成系统架构师职责过重。
成为优秀系统架构师的路,是一条漫长而任重道远的路。在这条道路上,要不断说服自己,不断抵制各种诱惑,要能在深夜无人的时候,挑灯阅读别人的源代码,还要有承受住各种压力的能力,能跟项目经理一起抵制住老板的无理工期要求,还要在困难的时候,鼓励项目组成员一起渡过难关。总之一句话,要想成为系统架构师,不是很容易。“路漫漫其修远兮,吾将上下而求索”。
作者简介:
邢波涛,11 年软件开发和管理经验,7 年的J2EE 开发经验, 资深J2EE 专家。对JSP/ Servlet /JavaBean/EJB 技术有深刻了解。熟悉Oracle、MS SQL Server、DB2,对Eclipse 平台开发,基于SWT/GEF/EMF 的Eclipse 插件开发有深入的实践基础。此外,熟悉UML、Rational Rose/ Rational Software Architecture 等面向对象分析技术和工具,熟悉WBI Modeler 等业务建模工具,从事过MDA/MDD 开发。
一个产品的经典开发步骤通常需要经过系统需求调研、系统分析、系统设计、开发、测试、部署实施等一系列的步骤,如下图所示:
而系统架构师,则在这个过程中,起到了承上(面对业务专家/系统分析员)和启下(面对软件工程师)的作用。所以说,系统架构师,在整个产品开发周期内是一个核心角色。如果说市场和销售决定一个产品是否好卖的话,系统架构师则直接决定着这个产品的开发是否成功。从某种意义上说,这也是众多程序员未来的梦想职业。
要想成为一个优秀的系统架构师,并非一朝一夕之功所能达到的,“冰冻三尺,非一日之寒”,除了要有很深的专业技能外,还需技术全面、成熟练达、洞察力强、经验丰富,具备战略性和前瞻性思维能力,善于把握全局,能够在更高抽象级别上进行思考。如果说系统分析员、业务专家只需要对一个产品的业务负责,可以不关心一个产品软件开发语言的话,而一个优秀的职业系统架构师,不仅要对产品背景和产品背后的业务逻辑熟悉,而且要对所用的软件开发语言(例如Java/C#/C/C++/J2EE),也要非常熟悉才可以,两者缺一不可。否则就起不到承上启下的作用,当然也设计不出良好的软件架构。在美国,一个合格的系统架构师的薪水甚至比部门经理或产品经理要高很多,这也是美国为什么三四十岁甚至五十岁的程序员也很常见的原因。
事实上,软件开发中碰到的很多问题,归结起来都可能和当初的架构设计有关,所以架构师要想不成为众矢之的,决不是件容易的事情。基于此,我认为,要想成为合格的系统架构师,首先要从程序员做起,只有有了多年的一线软件开发经验,深刻体会到了程序员的艰辛与不容易,才能设计出易于扩展、易于修改、易于维护、“不难为”程序员的架构出来。一个系统架构师,首先要能做出能够“自圆其说”的原型,才能跟程序员进行有效的沟通,而不是只是设计出来一个架构,就完全交给程序员来做了,这样,后期开发出来的产品风险很大。以我现在参与开发的产品为例,这个产品只是公司核心战略产品的很小的一部分,当然,虽然小,却是核心中的核心。这个产品配了3个系统架构师(年龄都在40岁以上,有数十年的软件开发经验),6个程序员、5个测试,还有一个负责产品打包的工程师。这3个系统架构师也都参与核心代码编写。
其次,合格的系统架构师,对所要开发的产品的业务背景,也要相当的熟悉才好,否则,设计出来的产品就不是客户想要的产品,当然也就不是成功的产品。还是以我现在参与的产品为例,这个产品是SCA规范的一个实现,3个系统架构师的其中一个,就是SCA标准规范的参与者与制定者,对SOA/SCA标准,有着相当的功底,否则,做出来的产品,就只能围着大公司,在他们屁股后面天天追了,别人做什么,自己也做什么,别人标准修改了,自己也赶快跟着修改。
第三,作为系统架构师,要经常阅读一些关于产品背景资料和系统架构设计方面的最新书籍。虽然现在技术方面的书籍,出得太滥,精品极少,大部分是从网上抄袭一些资料攒出来的,但是经常阅读一些国外大师的一些精品图书,还是能给自己带来一些新的思路和设计理念的。
第四,作为系统架构师,一定要有自信,既不要保守,也不要人云亦云,千万不要迷信于大师和大侠。别人说J2EE好,自己的产品就基于J2EE开发;别人说.NET容易开发,开发成本低,就转做.NET;别人说Ruby很敏捷,自己就说自己的产品是基于ROR开发的。一定要结合公司、市场和项目的实际情况,采用合适于自己的开发语言,设计出合适于自己的架构。比如,《J2EEWithoutEJB》那本书,提出了著名的“不要造新轮子”原则。如果大家都不要造轮子,都利用别人现有的框架和产品,怎么可能有技术的进步和百花齐放、欣欣向荣的景象呢?Spring的作者还不是看到经典J2EEEJB框架的诟病,才设计出来自己的Spring轮子了吗,为什么自己有了Spring轮子,就劝别人不要另造轮子了呢?GavinKing造出来了Hibenate这个轮子,为什么又参与EJB3.0的制定呢?并又参与设计出Seam这个轮子?我个人觉得,一个系统架构师,一定要造出自己的轮子,才算是真正的系统架构师,而不是拿着一大堆开源框架进行拼凑。
第五,对于开源的架构设计,要批判性地继承。要多阅读这些框架的源代码。以J2EE和Eclipse插件开发为例(因为我专注于这两个方面的开发),从前些年流行EJB,再到Struts→J2EEwithoutEJB→Spring/Hibernate→AJAX,每一个框架的流行,都有其深刻的历史背景,有一些现有框架解决不了的难题在里面,这些框架都是为了解决一些问题而出现的。我们经常阅读这些大师的源代码,精神上是一种享受,对锤炼自己的功底,也是大有好处的。例如,在做Eclipse插件开发的时候,常常会遇到一个问题,怎么才能监听到用户保存的事件,虽然Eclipse提供了资源变化监听机制,但是直接利用其机制,是很原始的,任何资源的变化,比如,添加/删除/移动一个图形,都会引起这个事件的调用,而我只想监听用户存盘的一刹那那个事件,以前在做项目的时候,想尽各种办法也没解决好。后来,在另外一个产品的源代码中,就看到了别人很好的解决方案,自己看到那段源代码,真的是领悟到很多。有时候,Eclipse的源代码和J2EE的源代码,在架构上是可以互相借鉴和补充的。比如,Eclipse的Adapter扩展机制和事件、资源监听机制,我们一样可以拿到J2EE框架中来,作为设计自己产品的设计模式蓝图。
第六,优秀的系统架构师还要拥有优秀的沟通能力,用以进行说服、鼓励和指导等活动,并赢得项目组成员的信任。一个系统架构师设计出一个良好的框架后,如果不能跟程序员进行有效的沟通,不能对程序员进行良好的指导,则这个良好的框架就不能很好的贯彻到产品开发的每个环节中去。有的程序员可能还是按照老经验对程序中的一些关键环节进行处理,等到这个架构师发现问题时,可能已经很晚了,说服、教育、培训和处罚到那时已经没有意义了。另外,如果一个系统架构师不能赢得项目组成员信任的话,那么他设计出来的架构就不具备说服力,程序员遇到困难,就会抱怨系统架构师设计的框架有问题,不能充分调动起来程序员的责任感和主观能动性。所以说,一个优秀的系统架构师,无论在精神上,还是技能上,都是一个程序员良好的导师。
第七,系统架构师要分清自己和系统分析员、项目经理或产品经理之间的角色和关系,不能负责一切,也不能只负责技术架构。由于系统架构师在整个产品开发周期内处于承上启下的中间地位,和程序员打交道的时间比系统分析员面向程序员的时间要长,有时候甚至比项目经理和程序员之间还熟悉,使得程序员很容易认为系统架构师对所有的需求和架构都负责,容易造成系统架构师职责过重。
成为优秀系统架构师的路,是一条漫长而任重道远的路。在这条道路上,要不断说服自己,不断抵制各种诱惑,要能在深夜无人的时候,挑灯阅读别人的源代码,还要有承受住各种压力的能力,能跟项目经理一起抵制住老板的无理工期要求,还要在困难的时候,鼓励项目组成员一起渡过难关。总之一句话,要想成为系统架构师,不是很容易。“路漫漫其修远兮,吾将上下而求索”。
作者简介:
邢波涛,11 年软件开发和管理经验,7 年的J2EE 开发经验, 资深J2EE 专家。对JSP/ Servlet /JavaBean/EJB 技术有深刻了解。熟悉Oracle、MS SQL Server、DB2,对Eclipse 平台开发,基于SWT/GEF/EMF 的Eclipse 插件开发有深入的实践基础。此外,熟悉UML、Rational Rose/ Rational Software Architecture 等面向对象分析技术和工具,熟悉WBI Modeler 等业务建模工具,从事过MDA/MDD 开发。
Apr
27
俗话说得好:会干的不如会说的。你想仅仅凭着熟练的技能和勤恳的工作,就在职场游刃有余、出人头地,未免有些天真了。虽然能力加勤奋很重要,但会说 话,却能让你工作起来更轻松,并且可能帮助你加薪、升职。
1、应答上司交代的工作:我立即去办。
冷静、迅速地做出这样的回应,会让上司直观地感觉你是一个工作讲效率、处理问题果断,并且服从领导的好下属。如果你犹豫不决,只会让上司不快,会给上司 留下优柔寡断的印象,下次重要的机会可能就轮不到你了。
2、传递坏消息时:我们似乎碰到一些情况……
一笔业 务出现麻烦,或市场出现危机,如果你立刻冲到上司的办公室报告这个坏消息,就算不关你的事,也会让上司怀疑你对待危机的能力,弄不好还会惹得上司的责骂, 成为出气筒。
正确的方式是你可以从容不迫地说:我们似乎碰到一些情况……千万不要乱了阵脚,要让上司觉得事情并没有到不可收拾的地 步,并且感到你会与他并肩作战,解决问题。
3、体现团队精神:XX的主意真不错!
小马的创意或设计得到了上 司的欣赏,虽然你心里为自己不成功的设计而难过,甚至有些妒忌,你还是要在上司的听力范围内夸夸小马:小马的主意真不错。在明争暗斗的职场,善于欣赏别 人,会让上司认为你本性善良,并富有团队精神,从而给你更多的信任。
4、如果你不知道某件事:让我再认真地想一想,2点前答复您好 吗?
上司问了你某个与业务有关的问题,你不知道如何作答,千万不要说“不知道”。而“让我再认真地想一想,2点前答复您好吗?”不 仅暂时让你解围,也让上司认为你不轻率行事,而是个三思而后行的人。当然,要记得按时给出答复。
5、请同事帮忙:这个策划没有你真 不行啊!
有个策划,你一个人搞不定,得找个比较内行的人帮忙,怎么开口呢?你可以诚恳地说:这个策划没有你真不行啊!同事为了不负 自己内行的形象,通常是不会拒绝的。当然,事后要记得感谢人家。
6、拒绝黄段子:这种话好像不适合在办公室讲哦!
男人有时总喜欢说些黄段子,并且不大注意场合。如果有男同事对你开“黄腔”,让你无法忍受,这句话可以让他们识趣地闭嘴。
7、减 轻工作量:我知道这件事很重要,我们不妨先排一排手头的工作,按重要性排出先后顺序。
首先,强调你了解这项工作的重要性,然后请求 上司指示,将这项工作与其它工作一起排出先后顺序,不露痕迹地让上司知道你的工作量其实很大,如果不是非你不可,有些事就可交给其他人或延期处理。
8、承认过失:是我一时疏忽,不过幸好……
犯错误在所难免,所以勇于承认自己的过失很重要,推卸责任只会使你错上加错。不过,承 认过失也有诀窍,就是不要让所有的错误都自己扛,这句话可以转移别人的注意力,淡化你的过失。
9、打破冷场的话题:我很想知道您对 这件事的看法……
当你与上司相处时,有时不得不找点话题,以打破冷场。不过,这正是你赢得上司青睐的好机会,最恰当的话题就是谈一 些与公司有关、上司很关心又熟悉的话题。当上司滔滔不绝地发表看法时,也会对你这样一个谦虚的听众欣赏有加。
10、面对批评:谢谢 你告诉我,我会仔细考虑你的建议的。
面对批评或责难,不管自己有没有不当之处,都不要将不满写在脸上,但要让对方知道,你已接受到 他的信息,不卑不亢让你看起来又自信又稳重,更值得敬重。
1、应答上司交代的工作:我立即去办。
冷静、迅速地做出这样的回应,会让上司直观地感觉你是一个工作讲效率、处理问题果断,并且服从领导的好下属。如果你犹豫不决,只会让上司不快,会给上司 留下优柔寡断的印象,下次重要的机会可能就轮不到你了。
2、传递坏消息时:我们似乎碰到一些情况……
一笔业 务出现麻烦,或市场出现危机,如果你立刻冲到上司的办公室报告这个坏消息,就算不关你的事,也会让上司怀疑你对待危机的能力,弄不好还会惹得上司的责骂, 成为出气筒。
正确的方式是你可以从容不迫地说:我们似乎碰到一些情况……千万不要乱了阵脚,要让上司觉得事情并没有到不可收拾的地 步,并且感到你会与他并肩作战,解决问题。
3、体现团队精神:XX的主意真不错!
小马的创意或设计得到了上 司的欣赏,虽然你心里为自己不成功的设计而难过,甚至有些妒忌,你还是要在上司的听力范围内夸夸小马:小马的主意真不错。在明争暗斗的职场,善于欣赏别 人,会让上司认为你本性善良,并富有团队精神,从而给你更多的信任。
4、如果你不知道某件事:让我再认真地想一想,2点前答复您好 吗?
上司问了你某个与业务有关的问题,你不知道如何作答,千万不要说“不知道”。而“让我再认真地想一想,2点前答复您好吗?”不 仅暂时让你解围,也让上司认为你不轻率行事,而是个三思而后行的人。当然,要记得按时给出答复。
5、请同事帮忙:这个策划没有你真 不行啊!
有个策划,你一个人搞不定,得找个比较内行的人帮忙,怎么开口呢?你可以诚恳地说:这个策划没有你真不行啊!同事为了不负 自己内行的形象,通常是不会拒绝的。当然,事后要记得感谢人家。
6、拒绝黄段子:这种话好像不适合在办公室讲哦!
男人有时总喜欢说些黄段子,并且不大注意场合。如果有男同事对你开“黄腔”,让你无法忍受,这句话可以让他们识趣地闭嘴。
7、减 轻工作量:我知道这件事很重要,我们不妨先排一排手头的工作,按重要性排出先后顺序。
首先,强调你了解这项工作的重要性,然后请求 上司指示,将这项工作与其它工作一起排出先后顺序,不露痕迹地让上司知道你的工作量其实很大,如果不是非你不可,有些事就可交给其他人或延期处理。
8、承认过失:是我一时疏忽,不过幸好……
犯错误在所难免,所以勇于承认自己的过失很重要,推卸责任只会使你错上加错。不过,承 认过失也有诀窍,就是不要让所有的错误都自己扛,这句话可以转移别人的注意力,淡化你的过失。
9、打破冷场的话题:我很想知道您对 这件事的看法……
当你与上司相处时,有时不得不找点话题,以打破冷场。不过,这正是你赢得上司青睐的好机会,最恰当的话题就是谈一 些与公司有关、上司很关心又熟悉的话题。当上司滔滔不绝地发表看法时,也会对你这样一个谦虚的听众欣赏有加。
10、面对批评:谢谢 你告诉我,我会仔细考虑你的建议的。
面对批评或责难,不管自己有没有不当之处,都不要将不满写在脸上,但要让对方知道,你已接受到 他的信息,不卑不亢让你看起来又自信又稳重,更值得敬重。
Apr
26
什么是 FastCGI
FastCGI 是一个可伸缩、高速的在web server和脚本语言间通迅的接口。关于FastCGI技术的更多信息可以在官方网站和Wikipedia看到。
FastCGI 被许多脚本语言所支持,包括 php,如果用 –enable-fastcgi 选项编译的话。
多数流行的web server都支持 FastCGI。包括Apache(mod_fastcgi和mod_fcgid),Zeus,nginx和lighttpd。
FastCGI 的主要优点是把动态语言和 web server 分离开来。这种技术允许 web server 和动态语言运行在不同的主机上。这可以改进可扩展性和安全性而没有大的效率损失。
php-fpm 可以和任何支持外部 FastCGI 技术的 web server 一起使用。
php-fpm是做啥用的
很不幸,官方网站 php.net 上的 php 在将 FastCGI SAPI 用于生产环境方面有许多已知的问题。
下面是关于启用 FastCGI SAPI 时的问题和 php-fpm 是如何解决他们的对比列表。
描述 php自带的 spawn-fcgi + spawn-php.sh + daemontools php-fpm
php守护进程化: pid file, log file, setsid(), setuid(), setgid(), chroot() (-) (+) (+)
进程管理。可以用 “graceful” 来停止并启动 php worker 进程而不会丢失请求。能够平滑地升级配置和二进制程序而不丢失任何请求。 php4 (-), php5 (只有 graceful) (-) (+)
严格限制来源请求的 web server 的 ip 地址 php4 (-) php5 (+) (从 5.2.2 开始) (-) (+)
根据负载动态调整进程数 (-) (-) Todo
用不同的 uid/gid/chroot/environment 和不同的 php.ini 选项启动 worder 进程。你不需要 safe mode 了! (-) (-) (+)
记录 worker 进程 stdout 和 stderr 日志 (-) (-) (+)
如果使用优化器,在共享内存意外破坏的情况下紧急重启所有的进程 (-) (-) (+)
如果 set_time_limit() 失败,确保进程会结束 (-) (-) (+)
特色功能 Error header、优化的上传支持、fastcgi_finish_request()
特色功能
所有这些特性都是“不打断”的方式实现的。也就是说,如果你不使用它们,它们的存在不会影响php的功能性——他们都是“透明”的。
Error header
范围:php.ini 选项
分类:便利性
默认情况下,如果被访问的php脚本包含语法错误,用户会收到一个空的“200 ok”页。这是不方便的。Error header 这个 php.ini 选项允许在这种情况下产生一个 HTTP 错误码,比如“HTTP/1.0 550 Server Made Big Boo”,从而中断web server请求并显示一个正确的错误页。
如果要实现这样的功能,需要在 php.ini 中添加一条 fastcgi.error_header = “HTTP/1.0 550 Server Made Big Boo”
在 php-5.2.4 中添加了类似,但不相同的功能:如果被访问的php脚本包含语法错误,并且 display_errors = off,会立刻返回“HTTP/1.0 500 Internal Server Error”。
如果你需要设定一个 503 错误,或者想要使这个行为独立于 display_errors 的设置,那么可以使用fastcgi.error_header。如果你在 php-5.2.5 或以上版本上启用 php-fpm,那么 fastcgi.error_header的优先级更高。
优化的上传支持
实质:web server 支持
类型:优化
这个特性正如名字那样,可以加速对大 POST 请求的处理速度,包括文件上传。优化是通过将请求体已写入一个临时文件,然后 fastcgi 协议传递文件名而不是请求体到来实现的。目前就我所知,只有 nginx0.5.9 以上才支持这个功能。显然,这种模式只在 php 和 web server 在一台机器上的时候才能用。
nginx 样例配置:
location ~ .php$ {
fastcgi_pass_request_body off;
client_body_in_file_only clean;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
…
fastcgi_pass …;
}
在php中不需要配置任何东西。如果php收到了参数REQUEST_BODY_FILE,就读取其中的请求体,如果没有,就自行从fastcgi 协议中读取请求体。
结合这个特性,可以考虑对临时文件使用内存文件系统,例如tmpfs(linux):
client_body_temp_path /dev/shm/client_body_temp;
fastcgi_finish_request()
范围:php 函数
类型:优化
这个特性可以提高一些 php 请求的处理速度。如果有些处理可以在页面生成完后进行,就可以使用这种优化。比如,在 memcached 中保存 session 就可以在页面交给 web server 后进行。fastcgi_finisth_request() ,这一特性可以结束响应输出,web server 可以立即开始交给等不及的客户端,而此刻,php 可以在请求的上下文环境中处理许多事情。比如保存session,转换上传的视频,处理统计等等。
fastcgi_finisth_request() 会触发 shutdown 函数运行。
request_slowlog_timeout
范围: php-fpm.conf 选项
分类: 方便
这个选项能让你跟踪执行缓慢的脚本并把他们连同调用栈一起记录再日志文件中。例如如下设置:
5s
logs/slow.log
记录的 slow.log 可能是这个样子:
Sep 21 16:22:19.399162 pid 29715 (pool default)
script_filename = /local/www/stable/www/catalogue.php
[0x00007fff23618120] mysql_query() /srv/stable/common/Database/class.MySQLRequest.php:20
[0x00007fff23618560] getResult() /srv/stable/common/Database/class.Facade.php:106
[0x00007fff23618aa0] query() /srv/stable/common/mysite.com/ORM/class.UsersMapper.php:99
[0x00007fff23618d60] resolveByID() /srv/stable/common/mysite.com/ORM/class.User.php:629
[0x00007fff236193b0] getData() /srv/stable/common/class.DataEntity.php:90
[0x00007fff236195d0] load() /srv/stable/common/mysite.com/ORM/class.User.php:587
[0x00007fff23619a00] getIsHidden() /srv/stable/common/mysite.com/class.User.php:42
[0x00007fff2361a470] getName() /local/www/stable/www/catalogue.php:41
同时,在 error.log 中保存了如下记录:
Sep 21 16:22:19.399031 [WARNING] fpm_request_check_timed_out(), line 135: child 29715, script ‘/local/www/stable/www/catalogue.php’ (pool default) executing too slow (5.018002 sec), logging
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 响应慢造成的(top backtrace)。
FAQ
Q:php-fpm 可以和 ZendOptimize 一起用吗?
A:完全可以。
Q:php-fpm 可以和 ZendPlatform、xcache、eAccelerator、APC 等的优化器一起用吗?
A:是的。php-fpm 的架构和任何一种用于高速 opcode 缓存的共享内存都适用。唯一的限制是:所有的 worker 进程只能适用一个缓存,即使它们用不同的 uid/gid 运行
Q:为什么我要给 php 打补丁呢?spawn-fcgi 不需要这样!
A:php-fpm 的创建是为了增强方便管理。没有打过补丁的 php 不能做到:
平滑重启 php 而不丢失请求,包括升级 php 二进制文件 以及/或者 扩展。
用不同的 uid / gid / chroot 环境运行 worker 进程
所有的设置只有一个配置文件
根据负载动态请求 (TODO)
对 php 请求实时统计性能 (TODO)
Q:为什么要用 root 运行 php-fpm 呢?这安全吗?
A:用 root 启动 php-fpm 只有在你打算用不同 uid/gid 的 php 来处理请求时才有意义。比如,在共享主机上的不同站点。因为只有在 master 进程用 root 运行的时候,才可以建立不同 uid/gid 的子进程。这是相当安全的。master 进程自己从来不会去处理请求。
在任何情况下,php- fpm 都不会用 root 身份来处理请求。
Q:php-fpm 可以加速 php 脚本处理速度吗?
A:不,它不会影响处理速度。不过,如果你使用一些特殊特性,对于一些特定的请求还是可以有性能提升的。
Q:如果我把我的网站从 mod_php 迁移到 php-fpm ,我会得到性能提升吗?
A:通常,当有服务器上有大量空闲内存可用时,能从迁移到 php-fpm 中得到的性能提升可能不大。但是如果内存并不充裕,性能提升还是很可观的,在某些情况下可以达到 300-500%。这可能是由于 nginx + php-fpm 一般会比 Apache + mod_php 使用更少的内存。而且 VFS 缓存会由于更多的空余内存而更有效地工作。
Q:php- fpm 将来会被官方的 php 包含吗?
A:我希望如此。目前,php-fpm 代码的协议是 GPL 。所以现在 php-fpm 的代码与 php 协议(类似 bsd)并不匹配。这是临时性措施。这样的选择是为了简化开发过程。一旦代码的功能完备,比如自适应生成子进程和其他一些东西,协议会改为一个相匹配的。之后,php-fpm 会正式发布给 php 开发团队,并被建议包含。
邮件列表
如果你有问题的话,请不要犹豫在邮件组里写邮件。
English: highload-php-en Russian: highload-php-ru
文档
php-fpm 已经在 Linux、MacOSX、Solaris 和 FreeBSD 上测试通过。
确信 libxml2(在某些系统上叫做libxml2-devel)已经安装。
下载最小的 php 和 php-fpm
$ bzip2 -cd php-5.2.5.tar.bz2 | tar xf -
$ gzip -cd php-5.2.5-fpm-0.5.7.diff.gz | patch -d php-5.2.5 -p1
$ cd php-5.2.5
$ ./configure –enable-fastcgi –enable-fpm
$ make all install
编辑
$prefix/etc/php-fpm.conf
运行
$prefix/bin/php-cgi –fpm
仔细检查
$prefix/logs/php-fpm.log
运行 phpinfo() 检查你的网站是否还正常运行
master 进程的 pid 被存放在
$prefix/logs/php-fpm.pid
master进程可以理解以下信号:
SIGINT, SIGTERM 立刻终止
SIGQUIT 平滑终止
SIGUSR1 重新打开日志文件
SIGUSR2 平滑重载所有worker进程并重新载入配置和二进制
关于
嗨,我的名字叫 Andrei Nigmatulin, 我是 php-fpm 的作者。
从 2004 年开始,我就在等有什么人让 PHP FastCGI 能满足产品环境,但我等不下去了。
php-fpm 是在数个项目种使用 PHP 的 FastCGI SAPI 中的知识、经验和想法的产物。
php-fpm 可以在 GPL 协议下用在公共用途。和 php-fpm 绑定的修改版的 libevent 是在 BSD 协议下发布的。
我需要得到您的反馈——新的想法和建议——来改进和优化 php FastCGI SAPI。 如果您有什么想法、意见、补充和建议,我会很高兴,很原意听取,也许还会实现他们。给给我发邮件吧。(地址在本页的末尾)。
如果你想支持 php-fpm 的开发,可以作一些捐赠: Paypal Yandex.Money
15/05/2007 – 第一次提交到 php-fpm.
andrei dot nigmatulin at gmail dot com
译注:
php-fpm还带有一个更方便的脚本,在$prefix/sbin/php-fpm。可以用php-fpm start|graceful|restart|stop来维护。稍编辑一下就可以让它使用配置文件。
后记:
最开始,php-fpm 只有俄文文档,弄的我很郁闷,于是我先用 google 翻译先弄成英文,然后再人工翻成中文。这当中会难免会在我自己的英文水平引起的错误之外,再多些错误出来。后来终于有了一个英文的 wiki,并邀请我提供中文翻译。同时,距上一次翻译(2008年5月)以后,原来的文档也已经有了更新。于是我就根据英文 wiki ,重新翻译了一遍。
原文链接:http://php-fpm.anight.org/
wiki:http://www.php-fpm.com/
翻译:http://syre.blogbus.com/logs/20092011.html
FastCGI 是一个可伸缩、高速的在web server和脚本语言间通迅的接口。关于FastCGI技术的更多信息可以在官方网站和Wikipedia看到。
FastCGI 被许多脚本语言所支持,包括 php,如果用 –enable-fastcgi 选项编译的话。
多数流行的web server都支持 FastCGI。包括Apache(mod_fastcgi和mod_fcgid),Zeus,nginx和lighttpd。
FastCGI 的主要优点是把动态语言和 web server 分离开来。这种技术允许 web server 和动态语言运行在不同的主机上。这可以改进可扩展性和安全性而没有大的效率损失。
php-fpm 可以和任何支持外部 FastCGI 技术的 web server 一起使用。
php-fpm是做啥用的
很不幸,官方网站 php.net 上的 php 在将 FastCGI SAPI 用于生产环境方面有许多已知的问题。
下面是关于启用 FastCGI SAPI 时的问题和 php-fpm 是如何解决他们的对比列表。
描述 php自带的 spawn-fcgi + spawn-php.sh + daemontools php-fpm
php守护进程化: pid file, log file, setsid(), setuid(), setgid(), chroot() (-) (+) (+)
进程管理。可以用 “graceful” 来停止并启动 php worker 进程而不会丢失请求。能够平滑地升级配置和二进制程序而不丢失任何请求。 php4 (-), php5 (只有 graceful) (-) (+)
严格限制来源请求的 web server 的 ip 地址 php4 (-) php5 (+) (从 5.2.2 开始) (-) (+)
根据负载动态调整进程数 (-) (-) Todo
用不同的 uid/gid/chroot/environment 和不同的 php.ini 选项启动 worder 进程。你不需要 safe mode 了! (-) (-) (+)
记录 worker 进程 stdout 和 stderr 日志 (-) (-) (+)
如果使用优化器,在共享内存意外破坏的情况下紧急重启所有的进程 (-) (-) (+)
如果 set_time_limit() 失败,确保进程会结束 (-) (-) (+)
特色功能 Error header、优化的上传支持、fastcgi_finish_request()
特色功能
所有这些特性都是“不打断”的方式实现的。也就是说,如果你不使用它们,它们的存在不会影响php的功能性——他们都是“透明”的。
Error header
范围:php.ini 选项
分类:便利性
默认情况下,如果被访问的php脚本包含语法错误,用户会收到一个空的“200 ok”页。这是不方便的。Error header 这个 php.ini 选项允许在这种情况下产生一个 HTTP 错误码,比如“HTTP/1.0 550 Server Made Big Boo”,从而中断web server请求并显示一个正确的错误页。
如果要实现这样的功能,需要在 php.ini 中添加一条 fastcgi.error_header = “HTTP/1.0 550 Server Made Big Boo”
在 php-5.2.4 中添加了类似,但不相同的功能:如果被访问的php脚本包含语法错误,并且 display_errors = off,会立刻返回“HTTP/1.0 500 Internal Server Error”。
如果你需要设定一个 503 错误,或者想要使这个行为独立于 display_errors 的设置,那么可以使用fastcgi.error_header。如果你在 php-5.2.5 或以上版本上启用 php-fpm,那么 fastcgi.error_header的优先级更高。
优化的上传支持
实质:web server 支持
类型:优化
这个特性正如名字那样,可以加速对大 POST 请求的处理速度,包括文件上传。优化是通过将请求体已写入一个临时文件,然后 fastcgi 协议传递文件名而不是请求体到来实现的。目前就我所知,只有 nginx0.5.9 以上才支持这个功能。显然,这种模式只在 php 和 web server 在一台机器上的时候才能用。
nginx 样例配置:
location ~ .php$ {
fastcgi_pass_request_body off;
client_body_in_file_only clean;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
…
fastcgi_pass …;
}
在php中不需要配置任何东西。如果php收到了参数REQUEST_BODY_FILE,就读取其中的请求体,如果没有,就自行从fastcgi 协议中读取请求体。
结合这个特性,可以考虑对临时文件使用内存文件系统,例如tmpfs(linux):
client_body_temp_path /dev/shm/client_body_temp;
fastcgi_finish_request()
范围:php 函数
类型:优化
这个特性可以提高一些 php 请求的处理速度。如果有些处理可以在页面生成完后进行,就可以使用这种优化。比如,在 memcached 中保存 session 就可以在页面交给 web server 后进行。fastcgi_finisth_request() ,这一特性可以结束响应输出,web server 可以立即开始交给等不及的客户端,而此刻,php 可以在请求的上下文环境中处理许多事情。比如保存session,转换上传的视频,处理统计等等。
fastcgi_finisth_request() 会触发 shutdown 函数运行。
request_slowlog_timeout
范围: php-fpm.conf 选项
分类: 方便
这个选项能让你跟踪执行缓慢的脚本并把他们连同调用栈一起记录再日志文件中。例如如下设置:
记录的 slow.log 可能是这个样子:
Sep 21 16:22:19.399162 pid 29715 (pool default)
script_filename = /local/www/stable/www/catalogue.php
[0x00007fff23618120] mysql_query() /srv/stable/common/Database/class.MySQLRequest.php:20
[0x00007fff23618560] getResult() /srv/stable/common/Database/class.Facade.php:106
[0x00007fff23618aa0] query() /srv/stable/common/mysite.com/ORM/class.UsersMapper.php:99
[0x00007fff23618d60] resolveByID() /srv/stable/common/mysite.com/ORM/class.User.php:629
[0x00007fff236193b0] getData() /srv/stable/common/class.DataEntity.php:90
[0x00007fff236195d0] load() /srv/stable/common/mysite.com/ORM/class.User.php:587
[0x00007fff23619a00] getIsHidden() /srv/stable/common/mysite.com/class.User.php:42
[0x00007fff2361a470] getName() /local/www/stable/www/catalogue.php:41
同时,在 error.log 中保存了如下记录:
Sep 21 16:22:19.399031 [WARNING] fpm_request_check_timed_out(), line 135: child 29715, script ‘/local/www/stable/www/catalogue.php’ (pool default) executing too slow (5.018002 sec), logging
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 响应慢造成的(top backtrace)。
FAQ
Q:php-fpm 可以和 ZendOptimize 一起用吗?
A:完全可以。
Q:php-fpm 可以和 ZendPlatform、xcache、eAccelerator、APC 等的优化器一起用吗?
A:是的。php-fpm 的架构和任何一种用于高速 opcode 缓存的共享内存都适用。唯一的限制是:所有的 worker 进程只能适用一个缓存,即使它们用不同的 uid/gid 运行
Q:为什么我要给 php 打补丁呢?spawn-fcgi 不需要这样!
A:php-fpm 的创建是为了增强方便管理。没有打过补丁的 php 不能做到:
平滑重启 php 而不丢失请求,包括升级 php 二进制文件 以及/或者 扩展。
用不同的 uid / gid / chroot 环境运行 worker 进程
所有的设置只有一个配置文件
根据负载动态请求 (TODO)
对 php 请求实时统计性能 (TODO)
Q:为什么要用 root 运行 php-fpm 呢?这安全吗?
A:用 root 启动 php-fpm 只有在你打算用不同 uid/gid 的 php 来处理请求时才有意义。比如,在共享主机上的不同站点。因为只有在 master 进程用 root 运行的时候,才可以建立不同 uid/gid 的子进程。这是相当安全的。master 进程自己从来不会去处理请求。
在任何情况下,php- fpm 都不会用 root 身份来处理请求。
Q:php-fpm 可以加速 php 脚本处理速度吗?
A:不,它不会影响处理速度。不过,如果你使用一些特殊特性,对于一些特定的请求还是可以有性能提升的。
Q:如果我把我的网站从 mod_php 迁移到 php-fpm ,我会得到性能提升吗?
A:通常,当有服务器上有大量空闲内存可用时,能从迁移到 php-fpm 中得到的性能提升可能不大。但是如果内存并不充裕,性能提升还是很可观的,在某些情况下可以达到 300-500%。这可能是由于 nginx + php-fpm 一般会比 Apache + mod_php 使用更少的内存。而且 VFS 缓存会由于更多的空余内存而更有效地工作。
Q:php- fpm 将来会被官方的 php 包含吗?
A:我希望如此。目前,php-fpm 代码的协议是 GPL 。所以现在 php-fpm 的代码与 php 协议(类似 bsd)并不匹配。这是临时性措施。这样的选择是为了简化开发过程。一旦代码的功能完备,比如自适应生成子进程和其他一些东西,协议会改为一个相匹配的。之后,php-fpm 会正式发布给 php 开发团队,并被建议包含。
邮件列表
如果你有问题的话,请不要犹豫在邮件组里写邮件。
English: highload-php-en Russian: highload-php-ru
文档
php-fpm 已经在 Linux、MacOSX、Solaris 和 FreeBSD 上测试通过。
确信 libxml2(在某些系统上叫做libxml2-devel)已经安装。
下载最小的 php 和 php-fpm
$ bzip2 -cd php-5.2.5.tar.bz2 | tar xf -
$ gzip -cd php-5.2.5-fpm-0.5.7.diff.gz | patch -d php-5.2.5 -p1
$ cd php-5.2.5
$ ./configure –enable-fastcgi –enable-fpm
$ make all install
编辑
$prefix/etc/php-fpm.conf
运行
$prefix/bin/php-cgi –fpm
仔细检查
$prefix/logs/php-fpm.log
运行 phpinfo() 检查你的网站是否还正常运行
master 进程的 pid 被存放在
$prefix/logs/php-fpm.pid
master进程可以理解以下信号:
SIGINT, SIGTERM 立刻终止
SIGQUIT 平滑终止
SIGUSR1 重新打开日志文件
SIGUSR2 平滑重载所有worker进程并重新载入配置和二进制
关于
嗨,我的名字叫 Andrei Nigmatulin, 我是 php-fpm 的作者。
从 2004 年开始,我就在等有什么人让 PHP FastCGI 能满足产品环境,但我等不下去了。
php-fpm 是在数个项目种使用 PHP 的 FastCGI SAPI 中的知识、经验和想法的产物。
php-fpm 可以在 GPL 协议下用在公共用途。和 php-fpm 绑定的修改版的 libevent 是在 BSD 协议下发布的。
我需要得到您的反馈——新的想法和建议——来改进和优化 php FastCGI SAPI。 如果您有什么想法、意见、补充和建议,我会很高兴,很原意听取,也许还会实现他们。给给我发邮件吧。(地址在本页的末尾)。
如果你想支持 php-fpm 的开发,可以作一些捐赠: Paypal Yandex.Money
15/05/2007 – 第一次提交到 php-fpm.
andrei dot nigmatulin at gmail dot com
译注:
php-fpm还带有一个更方便的脚本,在$prefix/sbin/php-fpm。可以用php-fpm start|graceful|restart|stop来维护。稍编辑一下就可以让它使用配置文件。
后记:
最开始,php-fpm 只有俄文文档,弄的我很郁闷,于是我先用 google 翻译先弄成英文,然后再人工翻成中文。这当中会难免会在我自己的英文水平引起的错误之外,再多些错误出来。后来终于有了一个英文的 wiki,并邀请我提供中文翻译。同时,距上一次翻译(2008年5月)以后,原来的文档也已经有了更新。于是我就根据英文 wiki ,重新翻译了一遍。
原文链接:http://php-fpm.anight.org/
wiki:http://www.php-fpm.com/
翻译:http://syre.blogbus.com/logs/20092011.html