Nov
28
Posted (xurenlu) in 未分类 on 11月-28-2007

FastCGI 伪指令

FastCgiAccessChecker

  • 缺省 - 目录
  • 语法 - FastCgiAccessChecker 文件名 [-compat]

FastCgiAccessChecker 伪指令用于将 FastCGI 应用程序定义为每个目录的访问验证器。Apache 访问阶段在用户认证之前,并且是否允许对所请求资源进行访问的决策取决于随此请求提交的 HTTP 头。当访问验证决策存在动态组件(如一天中的时间,或者域计数是否最新)时,基于 FastCGI 的授权程序十分有用。

如果 FastCGI 应用程序文件名不具备相应的静态或外部服务器定义,则此应用程序将作为动态 FastCGI 应用程序启动。如果文件名不是以斜杠 (/) 开头,则假设此文件名相对于 ServerRoot。

FastCgiAccessChecker 是在 DirectoryLocation 容器中使用的。

<Directory htdocs/protected>
FastCgiAccessChecker fcgi-bin/access-checker
</Directory>

Mod_fastcgi 几乎发送所有标准环境变量,这些环境变量通常可用于 CGI/FastCGI 请求处理程序。所有由 FastCGI access-checker 应用程序以成功响应(状态:200)返回的头都将作为环境变量传递给子进程(CGI/FastCGI 调用)。所有以不成功响应返回的头将传递给客户机。遵从 FastCGI 规范的行为可通过使用 “-compat” 选项获得。

Mod_fastcgi 将环境变量 “FCGI_APACHE_ROLE” 设置成 “ACCESS_CHECKER”,以表明所执行的(Apache 特定的)授权程序阶段。

不支持从 FastCGI 授权应用程序中定制故障响应。请参阅 ErrorDocument 伪指令以了解替代办法(可处理此文档的 FastCGI 应用程序)。

FastCgiAccessCheckerAuthoritative

  • 上下文 - 目录
  • 缺省 - FastCgiAccessCheckerAuthoritative On
  • 语法 - FastCgiAccessCheckerAuthoritative On | Off

如果 FastCGI 应用程序允许访问失败,则将 FastCgiAccessCheckerAuthoritative 伪指令明确设置成 Off,将使访问检查可传递给较低级的模块(如 Configuration 和 module.c 文件中定义的)。

缺省情况下,不传递控制,并且失败的访问检查将导致一个禁用的回答。在禁用该缺省前,建议您仔细考虑。

FastCgiAuthenticator

  • 上下文 - 目录
  • 语法 - FastCgiAuthenticator 文件名 [-compat]

FastCgiAuthenticator 伪指令用于将 FastCGI 应用程序定义为每个目录的认证器。认证器通过将所提供的用户名和密码与已知用户和密码数据库或列表进行匹配,以验证请求者的身份。当用户数据库是在现有的独立程序中进行维护时,或者当它驻留在除 Web 服务器外的其它机器上时,基于 FastCGI 的认证器十分有用。

如果 FastCGI 应用程序文件名不具备相应的静态或外部服务器定义,则此应用程序将作为动态 FastCGI 应用程序启动。如果文件名不是以斜杠 (/) 开头,则假设此文件名相对于 ServerRoot

FastCgiAuthenticator 是在 DirectoryLocation 容器中使用的,且它必须包含 AuthType 和 AuthName 伪指令。仅支持“基本”用户认证类型。此类型需要一个 require 或 FastCgiAuthorizer 伪指令才能正常运作。

<Directory htdocs/protected>
AuthType Basic
AuthName ProtectedRealm
FastCgiAuthenticator fcgi-bin/authenticator
require valid-user
</Directory>

Mod_fastcgi 几乎发送所有标准环境变量,这些环境变量通常可用于 CGI/FastCGI 请求处理程序。所有由 FastCGI 认证应用程序以成功响应(状态:200)返回的头都将作为环境变量传递给子处理程序(CGI/FastCGI 调用)。所有以不成功响应返回的头将传递给客户机。遵从 FastCGI 规范的行为可通过使用 “-compat” 选项获得。

Mod_fastcgi 将环境变量 “FCGI_APACHE_ROLE” 设置成 “AUTHENTICATOR”,以表明要执行哪个(Apache 特定的)授权程序阶段。

不支持从 FastCGI 授权应用程序中定制故障响应。请参阅 ErrorDocument 伪指令以获得替代办法(可处理此文档的 FastCGI 应用程序)。

FastCgiAuthenticatorAuthoritative

  • 上下文 - 目录
  • 缺省 - FastCgiAuthenticatorAuthoritative On
  • 语法 - FastCgiAuthenticatorAuthoritative On | Off

如果 FastCGI 应用程序认证用户失败,则将 FastCgiAuthenticatorAuthoritative 伪指令明确设置成 Off 将使认证能传递给较低级的模块(如 Configuration 和 modules.c 文件中定义的)。

此伪指令的常见用法是与受良好保护的 AuthUserFile 结合使用,此 AuthUserFile 中包含一些(与管理相关的)用户。

缺省情况下,不传递控制,且未知用户将导致产生一个“需要授权”回答。在禁用缺省前,建议您仔细考虑。

FastCgiAuthorizer

  • 上下文 - 目录
  • 语法 - FastCgiAuthorizer 文件名 [-compat]

FastCgiAuthorizer 伪指令用于将 FastCGI 应用程序定义为每个目录的授权程序。授权程序将验证是否允许经认证的用户访问请求的资源。当授权决策中存在动态组件(如一天中的时间,或者用户是否已支付其帐单)时,基于 FastCGI 的授权程序十分有用。

如果 FastCGI 应用程序文件名不具备相应的静态或外部服务器定义,则此应用程序将作为动态 FastCGI 应用程序启动。如果文件名不是以斜杠 (/) 开头的,则假设此文件名相对于 ServerRoot

FastCgiAuthorizer 是在 DirectoryLocation 容器内使用的,且必须包含 AuthType 和 AuthName 伪指令。此伪指令需要一条认证伪指令,如 FastCgiAuthenticator、AuthUserFile、AuthDBUserFile 或 AuthDBMUserFile 才能正常运作。

.<Directory htdocs/protected>
AuthType Basic
AuthName ProtectedRealm
AuthDBMUserFile conf/authentication-database
FastCgiAuthorizer fcgi-bin/authorizer
</Directory>

Mod_fastcgi 几乎发送所有标准环境变量,这些环境变量通常可用于 CGI/FastCGI 请求处理程序。所有由 FastCGI 认证应用程序以成功响应(状态:200)返回的头都将作为环境变量传递给子进程(CGI/FastCGI 调用)。所有以不成功响应返回的头将传递给客户机。遵从 FastCGI 规范的行为是通过使用 “-compat” 选项获得的。

Mod_fastcgi 将环境变量 “FCGI_APACHE_ROLE” 设置成 “AUTHORIZER”,以表明要执行哪个(Apache 特定的)授权程序阶段。

不支持从 FastCGI 授权应用程序中定制故障响应。请参阅 ErrorDocument 伪指令以获得替代办法(可处理此文档的 FastCGI 应用程序)。

FastCgiAuthorizerAuthoritative

  • 上下文 - 目录
  • 缺省 - FastCgiAuthorizerAuthoritative On
  • 语法 - FastCgiAuthorizerAuthoritative On | Off

如果 FastCGI 应用程序认证用户失败,则将 FastCgiAuthenticatorAuthoritative 伪指令明确设置成 Off 将使认证能传递给较低级的模块(如 Configuration 和 modules.c 文件中定义的)。

此伪指令的常见用法是与受良好保护的 AuthUserFile 结合使用,此 AuthUserFile 中包含一些(与管理相关的)用户。

缺省情况下,不传递控制,且未知用户将导致产生一个“需要授权”回答。在禁用缺省前,建议您仔细考虑。

FastCgiConfig

  • 上下文 - 服务器配置
  • 语法 - FastCgiConfig 选项 选项 …

FastCgiConfig 伪指令定义了所有动态 FastCGI 应用程序的缺省参数。此伪指令不会影响静态或外部应用程序。

动态应用程序是根据需求而启动的。如果需求很大,则将启动其它应用程序实例。当需求减弱时,将杀死应用程序实例。有许多选项可控制此进程。

选项可以包含下列任意一项(不区分大小写): appConnTimeout n (0 秒) 等待与 FastCGI 应用程序的连接完成的秒数,或者 0 表明使用阻塞 connect()。如果超时到期,则将导致 SERVER_ERROR。对于非零值,这表示 select() 中用于写入由非阻塞 connect() 返回的文件描述符的时间量。在许多平台上,非阻塞 connect() 很容易产生问题。另见 -idle-timeout;此选项将产生类似的结果,但其方式更为简便。 idle-timeout n (30 秒) 在请求异常终止并且事件记录(错误日志级别)之前,允许 FastCGI 保持不活动的秒数。只有当与 FastCGI 应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。 autoUpdate 无 此选项使得 mod_fastcgi 在处理每个请求之前,检查磁盘上应用程序的寿命。如果此应用程序的版本更加新,则通知进程管理器,并杀死所有正在运行的此应用程序的实例。最好将这一类型的功能内置到应用程序中(例如,每隔 100 个请求检查磁盘上是否有更新的版本,如果有就退出)。当此选项与 -restart 一起使用时,可能存在一个明显的问题(错误)。 gainValue n (0.5) 一个 0 至 1 间的浮点值,它在当前运行的动态 FastCGI 应用程序的指数衰减连接次数负载因子计算中用作指数。旧值通过 (1 - gainValue) 进行调节的,所以当与当前值(通过 gainValue 调节)比较时,该值越小,其权值就越重。 initial-env 名称[=值] 无 当应用程序的实例产生时,在初始环境中传递的“名称-值”对。要传递来自 Apache 环境的变量,请不要提供 “=”(如果变量实际不在此环境中,则其定义不带值)。要定义不带值的变量,提供不带任何值的 “=”。此选项可重复使用。 init-start-delay n (1 秒) 此应用程序各实例产生之间的最小秒数。此延迟减少了服务器初始化时系统发出的需求。 killInterval n(300 秒) killInterval 确定了进程管理器内动态应用程序实例杀死策略的实现频率。该数值越低,策略就越活跃;相反该数值越高,则策略越不活跃。 listen-queue-depth n (100) 由此应用程序的所有实例共享的 listen() 队列的深度(也称为累积)。深度较大的侦听队列使服务器能在不拒绝请求的情况下,应付瞬时负载波动;它不会增加吞吐量。添加附加应用程序实例会增加吞吐量及执行,这取决于应用程序和主机。 maxClassProcesses n (10) 允许任何一个 FastCGI 应用程序运行的最大动态 FastCGI 应用程序实例数。 maxProcesses n (50) 在任何时候允许运行的最大动态 FastCGI 应用程序实例数。 minProcesses n (5) 任何时候允许运行,且无须由进程管理器(因没有需求)杀死的最小动态 FastCGI 应用程序实例数。 multiThreshhold n (50) 一个 0 至 100 间的整数,用于确定是否终止任一 FastCGI 应用程序实例。如果应用程序当前有多个实例在运行,则此属性用于决定是否终止其中一个实例。如果只保留有一个实例,则替代使用 singleThreshhold。 pass-header header 无 请求环境中传递的 HTTP 请求头的名称。此选项使得头的内容(例如 Authorization)可用于 CGI 环境。 priority n (0) 为应用程序实例指定的进程优先级(使用 setpriority())。 processSlack n(5 秒) 如果当前正在运行的所有动态 FastCGI 应用程序数总和超过了 maxProcesses - processSlack,则进程管理器将调用杀死策略。此操作可通过在不活动的应用程序实例数到达 maxProcesses 之前杀死一些活动最不频繁的应用程序实例,从而改善高负载时的性能。 restart 无 此选项使进程管理器能在发生故障时重新启动动态应用程序(与静态应用程序类似)。 restart-delay n (5 秒) 重新产生此应用程序失败实例之间的最小秒数。此延迟避免了中断应用程序占用过多的系统资源。 singleThreshhold n (0) 一个 0 至 100 间的整数,用于确定是否可终止 FastCGI 应用程序的最后一个实例。如果进程管理器计算出应用程序的负载因子低于指定的阈值,则将终止最后一个实例。指定一个接近 1 的值,以使您的可执行程序以 “idle” 方式长时间运行。如果内存或 CPU 时间是主要因素,则接近 100 的值更为适用。值 为 0 将阻止终止应用程序的最后一个实例;该值也是缺省值。建议不要更改此缺省值(尤其在设置了 -appConnTimeout 的情况下)。 is set). startDelay n(3 秒) 尝试连接到动态 FastCGI 应用程序时,Web 服务器等待的秒数。如果此间隔到期,则将通知进程管理器希望启动应用程序的另一个实例。startDelay 必须小于 appConnTimeout 才有效。 updateInterval n (300 秒) updateInterval 确定了执行统计信息分析,以确定动态 FastCGI 应用程序结果的频率。 FastCgiExternalServer

  • 上下文 - 服务器配置
  • 语法 - FastCgiExternalServer 文件名 -host 主机名端口 [-appConnTimeout n]
    FastCgiExternalServer 文件名 -socket 文件名 [-appConnTimeout n]

appConnTimeout n (0 秒) 等待到 FastCGI 应用程序的连接完成的秒数,0 表明使用阻塞 connect()。如果此超时到期,则将导致 SERVER_ERROR。对于非零值,这是指 select() 中用于写入由非阻塞 connect() 返回的文件描述符的时间量。在许多平台上,非阻塞 connect() 很容易产生问题。请参阅 -idle-timeout;此选项将产生类似的结果,但其方式更为简便。 idle-timeout n (30 秒) 在请求异常终止,并且事件记录(错误日志级别)之前,允许 FastCGI 应用程序保持不活动的秒数。只有当与 FastCGI 应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。 flush 无 当从应用程序接收到数据时将其强制写入客户机。缺省情况下,mod_fastcgi 将对数据高速缓存,以快速释放此应用程序。 host 主机名:端口 无 应用程序用于与 Web 服务器通信的主机名或 IP 地址和 TCP 端口号 (1-65535)。-socket 和 -host 选项是互斥的。 Pass-header header 无 请求环境中传递的 HTTP 请求头的名称。此选项使头的内容成为可用,通常头的内容(例如 Authorization)不可用于 CGI 环境。 socket 文件名 无 UNIX:应用程序用于与 Web 服务器通信的 UNIX 域套接字的文件名。此文件名相对于 FastCgiIpcDir。-socket 和 -port 选项是互斥的。 Windows NT:应用程序用于与 Web 服务器通信的管道名。此名称相对于 FastCgiIpcDir。-socket 和 -port 选项是互斥的。 FastCgiIpcDir

  • 上下文 - 服务器配置
  • 缺省 - UNIX - FastCgiIpcDir /tmp/fcgi, Windows NT - FastCgiIpcDir \\.\pipe\ModFastCgi\
  • 语法 - UNIX - FastCgiIpcDir 目录,Windows NT - FastCgiIpcDir 名称

UNIX:FastCgiIpcDir 伪指令指定了作为 UNIX 套接字文件存储(在外部 FastCGI 应用程序中为查找)位置的目录,该套接字文件用于应用程序和 Web 服务器之间的通信。如果此目录不是以斜杠 (/) 开头的,则假设它相对于 ServerRoot。如果此目录不存在,则假设以相应的许可权创建它。不要指定非本地文件系统中的目录。如果您使用缺省目录(或 /tmp 中的另一个目录),则如果您的系统定期从 /tmp 删除文件,mod_fastcgi 将中断。

Windows NT:FastCgiIpcDir 伪指令指定了作为命名管道根的名称,该管道用于应用程序和 Web 服务器之间的通信。此名称的格式为 \\.\pipe\管道名。管道名部分可以包含除反斜杠外的任何字符。

FastCgiIpcDir 伪指令必须在任何 FastCgiServerFastCgiExternalServer 伪指令(它利用 UNIX 套接字)之前。确保此目录对于 Web 服务器来说是可读、可写并可执行(可搜索)的;应该没有人能访问此目录。 FastCgiServer

  • 上下文 - 服务器配置
  • 语法 - FastCgiServer 文件名 选项 选项 …

FastCgiServer 伪指令定义了作为静态 FastCGI 应用程序的文件名。如果文件名不是以斜杠 (/) 开头的,则假设此文件名相对于 ServerRoot

缺省情况下,进程管理器会使用下面指定的缺省配置(圆括号中)启动应用程序的一个实例。如果由于某些原因致使静态应用程序实例失效,mod_fastcgi 将产生另一个实例以进行替换,并记录此事件(警告日志级别)。

选项可为下列之一(不区分大小写): appConnTimeout n (0 秒) 等待到 FastCGI 应用程序的连接完成的秒数,0 表明使用阻塞 connect()。如果此超时到期,则将导致 SERVER_ERROR。对于非零值,这是指 select() 中用于写入由非阻塞 connect() 返回的文件描述符的时间量。在许多平台上,非阻塞 connect() 很容易产生问题。请参阅 idle-timeout, 它将产生类似的结果,但其方式更为简便。 idle-timeout n (30 秒) 在请求异常终止并且事件记录(错误日志级别)之前,允许 FastCGI 保持不活动的秒数。只有当与 FatCGI 应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。 initial-env 名称[=值] 无] 无 在 FastCGI 应用程序初始环境中传递的“名称-值”对。要传递来自 Apache 环境的变量,请不要提供 “=”(变量实际不在环境中,其定义不带值)。要定义不带值的变量,提供不带值的 “=”。此选项可重复使用。 init-start-delay n(1 秒) 此应用程序各实例产生之间的最小秒数。此延迟减少了服务器初始化时系统发出的需求。 Flush 无 当从应用程序接收到数据时将其强制写入客户机。缺省情况下,mod_fastcgi 将对数据高速缓存,以快速释放此应用程序。 Listen-queue-depth n (100) 此应用程序的所有实例共享的 listen() 队列的深度(也称为累积)。较深的侦听队列使服务器能在不拒绝请求的情况下,应付瞬时负载波动。此选项不会增加吞吐量。添加附加应用程序实例会增加吞吐量及执行,这取决于应用程序和主机。 Pass-header header 无 请求环境中传递的 HTTP 请求头的名称。此选项使得头的内容(例如 Authorization)可用于 CGI 环境。 processes n (1) 服务器初始化时产生的应用程序实例数。 Priority n (0) 为应用程序实例指定的进程优先级(使用 setpriority())。 port n 无 应用程序用于与 Web 服务器通信的 TCP 端口号 (1-65535)。此选项使得能从网络上的其它机器访问此应用程序。-socket 和 -port 选项是互斥的。 Restart-delay n (5 秒) 重新产生此应用程序失败实例之间的最小秒数。此延迟避免了中断应用程序占用过多的系统资源。 Socket 文件名 (gen’d) UNIX:应用程序用于与 Web 服务器通信的 UNIX 域套接字的文件名。此模块在 FastCgiIpcDir 所指定的目录中创建套接字。该选项使得同一机器上的其它应用程序(例如 cgi-fcgi)能够访问此应用程序,或通过外部 FastCGI 应用程序定义 (FastCgiExternalServer) 对此应用程序进行访问。如果 -socket 和 -port 选项都没有指定,则此模块将生成一个 UNIX 域套接字文件名。-socket 和 -port 选项是互斥的。 Windows NT:应用程序应该用于与 Web 服务器通信的管道名。此模块创建了由 FastCgiIpcDir 指定的命名管道根的命名管道。该选项使得同一机器上的其它应用程序(如 cgi-fcgi)也能访问此应用程序,或者能够通过外部 FastCGI 应用程序定义 (FastCgiExternalServer) 对其进行访问。如果 -socket 和 -port 选项都没有指定,则此模块将为命名管道生成一个名称。-socket 和 -port 选项是互斥的。 FastCgiSuexec

  • 上下文 - 服务器配置
  • 缺省 - FastCgiSuexec Off
  • 语法 - FastCgiSuexec On | Off | 文件名

FastCgiSuexec 伪指令用于启用对 suexec-wrapper 的支持。FastCgiSuexec 要求在 Apache 中启用(对于 CGI)。要使用 Apache 所使用的同一个 suexec-wrapper,将 FastCgiSuexec 设置成 On。要使用不同的 suexec-wrapper,指定 suexec-wrapper 的文件名。如果此文件名不是斜杠 (/) 开头的,则假设此文件名相对于 ServerRoot

当启用 FastCgiSuexec 时,静态或外部 FastCGI 应用程序定义的位置十分重要。它们从定义它们的虚拟服务器中的 User 和 Group 伪指令继承了它们的用户和组。User 和 Group 伪指令应在 FastCGI 应用程序之前进行定义。此功能不会将 FastCGI 应用程序限制在定义它的虚拟服务器中,允许此应用程序对任何来自同一用户和组的虚拟服务器的请求进行服务。如果接收到的是对 FastCGI 应用程序的请求,而又不存在以此正确用户和组运行的现有匹配定义,则将用正确的用户和组启动此应用程序的动态实例。该操作将导致以不同用户/组运行同一应用程序的多个副本。如果这是问题,请从其它虚拟服务器中排除到此应用程序的导航,或者使用相同的用户和组来配置虚拟服务器。

请参阅 Apache 文档以获得更多有关 suexec 的信息(确保您已完全理解安全性含义)。


Tag:
相关文章


     
    Jun
    30
    Posted (xurenlu) in 未分类 on 06月-30-2007


    前提:
    Lamp架构(原理上虽然jsp,.net等都一样,但我现在只懂php了)

    1.用户对准确度的要求是不一样的.银行会要求客户帐上的钱的数目永远是精确的,但是论坛的在线人数,贴子数没这个必要.每天有成千上成的贴子发表。谁会去对质?我们只半个小时算一个甚至每天算一次就行了.所以,应用中要是没加Cron,那就肯定不是一个好应用.想象一下awstats,每当你的老板让你给演示一下前一周的访问周数据时,它就嘎吱嘎吱地算上老半天,然后在你的老板快要睡着时IE终于弹出一个页:服务器超时…. 你就知道要把一些服务设为定时跑一次,而不是时时保持最新最准确了
    2.瓶颈永远是先在CPU/内存/磁盘IO中的一个出现.他们很少是同时告急的.因此,针对这个设计一个.比如:某台服务器上CPU占用平均为60%左右,而内存占用是5%左右。那么我们可以预先猜测,CPU资源会首先占尽。由于日志显示占用CPU最多的是mysqld进程,说明mysql查询耗尽了CPU.再查之,原来是贴子主题太多,一个表有上G大小,索引不当.
    找到问题,于是马上做出改进.原来的URL已经优化成***.com/topic/10/10001.html,***.com/topic/12/12001.html…这样的了,但其实后台是用rewrite的.而id从1到100,000的主题都因为已经太老,无人参与回复了,所以没必要每次都查库.马上写个脚本,将***.com/topic/1.html….***.com/topic/10/10001.html…这些页面都读下来,保存为web根下/topic/***/***.html文件。现在这些文件是实际存在的了,Apache会优先读这个静态文件,而不是适用rewriterule了.
    (注:我的apache 的rewrite规则是这样写的,这样文件找不到的时候会交给index.php来处理.

    rewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    rewriterule . /index.php [L]

    )
    现在再看一看,mysqld占CPU是少了不了.但还是不够啊.咱们的内存还没有用上呢。才10%,不行.于是又有了办法:架上squid或是类似缓存服务,大量起用内存缓存,现在就好多了.内存,CPU都用上了.如果这时CPU使用率仍然领先内存,那咱们再启用mem_cache,不过启用mem_cache后要改程序,改得好才能真正提交效率.
    3.同是数据,用户名跟用户发的贴子内容这两个数据就不一样.一个咱们用varchar存在库中,另一个咱们得用text来存.这两个占用资源也大不一样啊.而且,贴子主题和发表用户名的读取的次数远大于贴子内容读取次数.这也是一个不均衡。于是基于这样的考虑,我把存储贴子数据表分开了。
    现在的表是这样的:一个表存储用户名,发表时间,贴子标题等信息.另外建10个表,专门用来存储发贴内容.具体存在哪一个表,由这个主题贴ID的最后一位来定.
    好了,由于发贴内容比较长,我把它分表(为了简化模型,是分表。实际有可能是分库,分服务器)了.而贴子主题由于要进行列表显示,搜索等操作,就没有分表.内容的查询效率是提高了。可是由于贴子主题要进行大量列表显示和搜索,且都在一个表中,还是慢啊.
    不急,咱再分析.
    a:这个表中存储的数据都比较短小.
    b:这个表中常用来做列表显示,用户往往在论坛中是看了第一页标题,可能没什么吸引人的,于是又点了下一页…部分贴子会进去看一下内容.但是你见过用户一直点到第100页吗?而且,用户看贴子的量也绝对大于发贴子….除非他是供职于某论坛的版主….
    好了,又总结出不均衡性来了.大多数情况下用户只看前100页,那咱们就把这100页数据拿出来,建一个内存表,再放一份.Mysql内存表有一个限制,就是字段不能超过255字节,但咱们的这个表刚好符合.现在咱们写数据时主题表和存主题的内存表中都写入一次,读数据的时候,就从内存表中读…这样是不是快很多了?

    参考:

    把握web 开发的平衡与不平衡,
    http://www.162cm.com/archives/388.html


    Tag:
    相关文章


       
      Jun
      16
      Posted (xurenlu) in 未分类 on 06月-16-2007

      千辛万苦,终于将博客搬家了。原来是用的edong.com的主机,现在转到了lighttpd+fastcgi上面。

      第一步:导出原空间的数据。这个得用phpmyadmin来进行。注意的时,在导出数据时,由于导出来的中文有乱码,故而我先将所有text,varchar类型数据转成了blob类型 ,然后选中将“二进制区域使用十六进制显示”这一项,这样,导出的数据中就不会有显示不了的乱码什么的,有文字的地方都是0xf535acd….这样的东东。

      第二步:自然是在新服务器上用mysql -u *** -p newdatabasename < export.sql 将数据库导入进去。

      第三步:修改wp-config.php中数据库连接信息。

      第四步:如果这时你访问时,能直接用原密码直接进入数据库,那么很幸运,你直接登陆就是了!

      如果能登陆,但进入后台时,提示你无权限进入本页面,那么也很幸运,你又可以再熟悉一次安装流程了。这时很简单,把wp-config.php中的表示数据表前缀的改掉,然后再走流程安装一次。安装完后之后,记得登陆phpmyadmin把你需要的表比如wp_posts改成新的前缀名(之前你当然得删除wordpress的安装流程为你生成的对应的表)。比如,本来我的表都是带wp_的前缀,现在将table_prefix改为wp_2然后进行了安装,那么您应该把wp2_posts表删掉,然后把wp_posts改名为wp2_posts.同理,其他需要转移的表比如comments,categories等 等也要转移地过来。

      在安装时,我遇到了一点小麻烦:当输入我的email进行下一步时,系统提示这是第二步,并告诉我将要进行一些建表,加载数据操作。但是不幸地是,没有告诉我新生成的密码!我找到了这一行:

      1. </p>
      2. <p>$random_password = substr(md5(uniqid(microtime())), 0, 6);</p>
      3. <p>

      改成为

      1. </p>
      2. <p>$random_password="123456";<br />

      然后将

      1. </p>
      2. <p>@wp_mail($admin_email,_("New wordpress blog",....)</p>
      3. <p>

      注释掉。现在没有什么拦住我了。我猜想是因为新的机器上没有sendmail服务,所以导致安装进程不能进行下去。现在安装成功能,默认密码就是:123456.

      最后一步:太重要了:修改永久链接,以保持和原来的url一致。如果你的博客pr不高,访问量不怎么高,那么做不做无所谓。但是从SEO角度讲,最好还是保持一致。我原来的博客的链接设置的是:

      1. </p>
      2. <p>/archives/%post_id%.html</p>
      3. <p>

      但是现在是lighttpd做server,它不支持apache的.htaccess文件里写mod_rewrite规则,怎么办?

      我google了一下,找到一段巨复杂的正则表达式,却仍 不管用。自己看了一下.htaccess:

      1. </p>
      2. <p>RewriteCond %{REQUEST_FILENAME} !-f<br />
      3. RewriteCond %{REQUEST_FILENAME} !-d<br />
      4. RewriteRule . /index.php [L]<br />

      就是指当请求的地址不是一个文件也不是一个目录时,转向到index.php这个文件来处理,由index.php来判断、处理。okay,现在好办了,我马上在lighttpd里加了这么一段:

      1. </p>
      2. <p>server.error-handler-404= "/index.php"</p>
      3. <p>

      .okay,现在重启lighttpd,一切完美!现在你的wordpress又可以像在apache下拥有mod_rewrite一样可以随意设置永久链接了!

      特别感谢老覃同志的帮忙.


      Tag:数据库 但是 密码 那么 index.php 然后 进行 数据 现在 安装 
      相关文章


         
        Apr
        29
        Posted (xurenlu) in 未分类 on 04月-29-2007
        modrewrite配置文档学习笔记:
        
        1.环境变量:
        
        	例子:
        
        	SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
        	SCRIPT_FILENAME=/u/rse/.www/index.html
        	SCRIPT_URL=/u/rse/
        	SCRIPT_URI=http://en1.engelschall.com/u/rse/
        
        2:RewriteBase
        	描述:设定基于目录的重写规则的Base url.
        	Syntax:	RewriteBase URL-path
        	Context:	directory, .htaccess
        	Override:	FileInfo
        	Status:	Extension
        	Module:	mod_rewrite
        	这个一般不太需要管它.
        3.RewriteCond
        	用法:	RewriteCond Teststring Pattern
        	这里是Teststring里用到的一些内置变量.
        	HTTP headers:	connection & request:
        	HTTP_USER_AGENT
        	HTTP_REFERER
        	HTTP_COOKIE
        	HTTP_FORWARDED
        	HTTP_HOST
        	HTTP_PROXY_CONNECTION
        	HTTP_ACCEPT
        	REMOTE_ADDR
        	REMOTE_HOST
        	REMOTE_PORT
        	REMOTE_USER
        	REMOTE_IDENT
        	REQUEST_METHOD
        	SCRIPT_FILENAME
        	PATH_INFO
        	QUERY_STRING
        	AUTH_TYPE
        
        	DOCUMENT_ROOT
        	SERVER_ADMIN
        	SERVER_NAME
        	SERVER_ADDR
        	SERVER_PORT
        	SERVER_PROTOCOL
        	SERVER_SOFTWARE
        	TIME_YEAR
        	TIME_MON
        	TIME_DAY
        	TIME_HOUR
        	TIME_MIN
        	TIME_SEC
        	TIME_WDAY
        	TIME
        	API_VERSION
        	THE_REQUEST
        	REQUEST_URI
        	REQUEST_FILENAME
        	IS_SUBREQ
        	HTTPS
        
        	#你可以在规则前加"!"取反.
        	#这是一些常见的特殊的规则。你可以使用他们来取代一些表达式:
        
        	* 'CondPattern’ (lexicographically follows)
            * ‘=CondPattern’ (lexicographically equal)
            * ‘-d’ (is directory)  测试是否是目录.
            * ‘-f’ (is regular file) 测试是否是常规文件.
            * ‘-s’ (is regular file, with size)
            * ‘-l’ (is symbolic link)
            * ‘-F’ (is existing file, via subrequest)
            * ‘-U’ (is existing URL, via subrequest)
        
        	你可以为规则后设置[flags]选项作为第三个参数.常见的有:
        	You can also set special flags for CondPattern by appending [flags]  as the third argument to the RewriteCond  directive, where flags is a comma-separated list of any of the following flags:
        
        	# ‘nocase|NC’ (no case)
        	# ‘ornext|OR’ (or next condition)
        	例如:
        	RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
        	RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
        	RewriteCond %{REMOTE_HOST}  ^host3.*
        	RewriteRule …some special stuff for any of these hosts…
        
        	如下例:
        	RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
        	RewriteRule  ^/$                 /homepage.max.html  [L]
        
        	RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
        	RewriteRule  ^/$                 /homepage.min.html  [L]
        
        	RewriteRule  ^/$                 /homepage.std.html  [L]
        	用Mozilla类的浏览器访问时会带你到homepage.max.html,这里支持所有特性。用Lynx来浏览时,带你到纯文本页(homepage.min.html),默认情况下会访问一个叫homepage.std.html的页.
        
        4.RewriteEngine:
        	使用:
        	RewriteEngine On|Off
        	如果存在.htaccess的文件,应当显式地指明RewriteEngine On.
        	因为默认情况下.htaccess的RewriteEngine项是Off的。因此如果想用.htaccess来设置rewrite,文件头一行一般都需要RewriteEngine On
        
        5.RewriteLock:
        	供rewrite-mapping程序同步使用的锁文件。
        	使用:
        	RewriteLock file-path
        
        6.RewriteLog:
        	设定日志文件.如果不是以”/”开头,则是指相对ServerRoot的相对路径.
        	使用:
        	RewriteLog	file-path
        
        7.RewriteLogLevel:
        	设定日志记录级别。
        	使用:
        	RewriteLogLevel level
        	默认:
        
        8.RewriteMap:
        	使用Mapping.
        	它的上下文是Server config 和Virtual host
        	使用:
        	RewriteMap Mapname MapType:Mapsource
        	例如:
        	在httpd.conf中配置:
        	#RewriteMap exampleMap txt:/path/to/file/map.txt
        	#RewriteRule ^/ex/(.*)	${exampleMap:$1}
        	而map文件的格式有这个几个:
        	1.txt类型的map文件:
        		#Standard Plain	 txt:
        		#map.txt
        		#maptype:txt
        		Ralf.S.Engelschall    rse   # Bastard Operator From Hell
        		Mr.Joe.Average        joe   # Mr. Average
        
        	2.Randomized Plain Text
        		#maptyp:rnd
        		static	www1|www2|www3|www4
        		dynamic	www5|www6
        
        		配置:
        		RewriteMap servers	rnd:/path/to/mapfile/map.txt
        		RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1	[NC,P,L]
        		RewriteRule ^/(.*)	http://${servers:dynamic}/$1	[P,L]
        
        	3.dbm
        		这里提供了一个txt2dmb程序。
        		!/path/to/bin/perl
        		##
        		##  txt2dbm — convert txt map to dbm format
        		##
        
        		use NDBM_File;
        		use Fcntl;
        
        		($txtmap, $dbmmap) = @ARGV;
        
        		open(TXT, “<$txtmap") or die "Couldn't open $txtmap!\n";
        		tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
        		  or die "Couldn't create $dbmmap!\n";
        
        		while () {
        		  next if (/^\s*#/ or /^\s*$/);
        		  $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
        		}
        
        		untie %DB;
        		close(TXT);
        
        		用法:
        		$ txt2dbm map.txt map.db 
        
        	4.内置函数:
        		map:int map-source:internal apache functions
        		functions有:toupper,tolower,escape,unescape
        
        	5.外部程序:
        		maptyp:prg map source:外部程序的路径.
        		示例:
        		#!/usr/bin/perl
        		$| = 1;
        		while () {
        			# …put here any transformations or lookups…
        			print $_;
        		}
        
        9.RewriteOptions
        	用法:
        	RewriteOptions rewriteoptions
        	default	:
        	rewriteoptions	maxRedirects=10
        	上下文:
        	server config,virtual host,.htaccess directory
        	rewriteoptions可以是下面两个值:
        	inherit:从上一级配置继承.
        	MaxRedirects=num(10,15,,,,,等等)
        
        10.RewriteRule:
        	这是mod_rewrite中用得最多的语句了(”the real rewriting workhorse”);
        	用法:
        	RewriteRule pattern Substitution [Flags]
        
        	Quantifiers:
        	  ?           0 or 1 occurrences of the preceding text
        	  *           0 or N occurrences of the preceding text (N > 0)
        	  +           1 or N occurrences of the preceding text (N > 1)
        
        	Grouping:
        	  (text)      Grouping of text
        				  (used either to set the borders of an alternative as above, or
        				  to make backreferences, where the Nth group can
        				  be referred to on the RHS of a RewriteRule as $N)
        
        	Anchors:
        	  ^           Start-of-line anchor
        	  $           End-of-line anchor
        
        	Escaping:
        	  \char       escape the given char
        				  (for instance, to specify the chars “.[]()” etc.)
        
        	一些技巧:
           1.  back-references ($N) to the RewriteRule pattern
           2. back-references (%N) to the last matched RewriteCond pattern
           3. server-variables as in rule condition test-strings (%{VARNAME})
           4. mapping-function calls (${mapname:key|default})
        
        	关于Flags:
        	# ‘chain|C’ (chained with next rule)
        	# ‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ (set cookie)
        	# ‘env|E=VAR:VAL’ (set environment variable)
        	# ‘forbidden|F’ (force URL to be forbidden)
        	# ‘gone|G’ (force URL to be gone)
        	# ‘last|L’ (last rule)
        	# ‘next|N’ (next round)
        	# ‘nocase|NC’ (no case)
        	# ‘noescape|NE’ (no URI escaping of output)
        	例如:
        	RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
        	这将会将’/foo/zed’ 转向到’/bar?arg=p1=zed’
        	# ‘nosubreq|NS’ ( not for internal sub-requests)
        	# ‘proxy|P’ (force proxy)
        
        	Note: mod_proxy must be enabled in order to use this flag.
        	# ‘passthrough|PT’ (pass through to next handler)
        	(例如:
        	RewriteRule ^/abc(.*) /def$1 [PT]
        	Alias /def /ghi
        
        	# ‘qsappend|QSA’ (query string append)
        	# ‘redirect|R [=code]‘ (force redirect)
        	# ’skip|S=num’ (skip next rule(s))
        	# ‘type|T=MIME-type’ (force MIME type)
        

        Tag:
        相关文章