Java堂  


Apache下FastCGI模块的众多版本

类归于: OS, Web&Server — Jet @ 8:36 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2010/01/07/3629356.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

这两天在Apache上配置以FastCGI方式来加载PHP和Perl,连续花了三天的时间才正式配置好并且稳定了,配置的话到不是很麻烦,关键是配置好之后还要稳定。后续我会将整个过程记录下来给大家分享,今天我要先说的是FastCGI的版本问题。

目前我们在网上能够找到的FastCGI有三个版本:
(1) mod_fastcgi:官方地址是http://www.fastcgi.com/。这个可以说是最初始的FastCGI的版本,可惜的是现在作者已经好久没有维护了,现存编译好的版本非常少,其官方网站更多的是以一个“标准”的姿态出现的。现在给出通过官方网站没法直接找到的两个地址,一个是下载地址http://www.fastcgi.com/dist/,另外一个是相关的配置参数的文档http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html。虽然是官方标准,但是不建议在生产环境中直接使用,因为它特别的不稳定,而且兼容性极差。

(2) mod_fcgid v2.2:官方地址是http://fastcgi.coremail.cn/,不过网站现在打不开了,所幸的是可以在http://www.apachelounge.com/download/网站上下载。fcgid是在fastcgi的基础上进行了扩展和优化,并且针对Apache的新版本做了及时的更新,使得可以在生产环境下使用,二者具体的区别可以阅读下面的参考资料。原来在coremail上所提供的文件因为现在网站没法访问,所以具体的关于ApacheLounge上所提供的mod_fcgid2.2和coremail上所提供的有什么区别我不是很了解。所幸我找到了作者的邮箱,通过跟作者邮件沟通了解到,原来作者在做完第一个版本的fcgid之后就将源代码发布到了网上,后来ApacheLounge的Steffen使用源代码重新在Windows下面编译后发布了可以直接使用的二进制版本的mod_fcgid.so文件。同时,Steffen也是Apache Windows版本的一个维护者。经过试用,我感觉这个版本的mod_fcgid是最适合在Windows环境下使用的。

(3) mod_fcgid v2.3.x +:官方地址为http://httpd.apache.org/mod_fcgid/,相关文档地址为:http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html。这个是目前Apache官方所提供的mod_fcgid,目前最新版本为2.3.4。通过作者了解到,这个是作者将原来放在coremail上的mod_fcgid代码捐献给Apache之后由Apache官方来维护的一个版本,可以说是2.2版本之后的后续版本。但是我在Windows上面使用之后感觉不是很稳定,Apache总是隔一段时间就自动关闭,不知道是我设置的问题还是其他问题。

综合来看,上面三个版本的情况如下:

  • mod_fastcgi:最初始的标准版本,适合开发,不适合直接在生产环境中使用;
  • mod_fcgid v2.2:目前在Apache Lounge上提供下载,个人认为是最适合在Windows环境下使用的一个版本,缺点是因为原来的fastcgi.coremail.cn网站已经不能访问,所以所参考的文档极少;
  • mod_fcgid v2.3.x +:最新最稳定的官方版本,其特点是目前mod_fcgid中最新的版本,而且是有官方来维护,文档内容也非常丰富。但以我个人使用来看,在Windows环境下不是很稳定。
  • 更新(2010.1.8):经过同mod_fcgid原作者Ryan Pan (Pan Qingfeng, pqf or 潘庆峰)沟通,他已经答应将原来在http://fastcgi.coremail.cn/的内容放到本站做镜像,详细说明见http://www.javatang.com/mod_fcgid-v2-2-mirror

    附同mod_fcgid作者沟通的邮件内容(经本人允许):

    庆峰,你好!
    很冒昧的给你发mail,我是mod_fcgid的使用者,有个疑问一直未知,就是关于mod_fcgid版本的问题。我现在在网络上找到三种mod_fcgid的版本:
    (1) 在http://www.apachelounge.com/download/上列出的两个mod_fcgid-2.2b-w32.zip(用于Apache 2.2.9+)和 mod_fcgid-2.2a-w32.zip(用于Apache 2.2.0到2.2.8),作者好像是Steffen。
    (2) 在http://fastcgi.coremail.cn/index.cn.htm(现在无法访问了)上也有一个mod_fcgid,作者的信息我只在ChinaUnix找到一个帖子http://bbs3.chinaunix.net/thread-320106-1-1.html,有人说跟上面的是同一个,但因为网站无法访问,所以没有办法看到。
    (3) 最后一个就是你写的mod_fcgid了,官方地址是http://httpd.apache.org/mod_fcgid/,现在的版本是2.3.4,详细文档地址是http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html。
    因为想在实际的项目中使用mod_fcgid加载PHP,所以还望解答我的疑问,非常感谢!
    顺颂商祺!
    马志勇 (Jet Ma)
    =========================
    Hi, 马先生
    (1)其实是专门维护Windows版Apache的一位外国朋友做的,源代码也是来自标准的mod_fcgid, 不过Steffen维护的是Windows版的编译好的mod_fcgid.so,方便大家直接使用(Windows很多人没有安装编译工具,直接给源代码大家基本上没多少人可以用的上)
    (2) 之前做mod_fcgid的时候,代码和文档一直放在这里的,但是后来代码捐献了给Apache之后,这里就不再维护了,另外最近公司服务器做了一些调整,我也改不了redirect到apache网站了
    (3) 这是当前官方的mod_fcgid, 维护的是最新最稳定的mod_fcgid, Apache软件基金会的程序员(我也是其中之一)正在维护这个项目,如果您有什么问题,可以直接在Apache的邮件列表提出的(不过使用问题最好不要在开发邮件列表提出了)

    Thanks

    参考资料:
    mod_fastcgi和mod_fcgid的区别
    Windows 下 Apache 1.3 以 FastCGI 模式运行 PHP

    Subversion和Apache的安装使用指南

    类归于: JavaPlateform, Web&Server — Jet @ 5:21 上午
    原文出处: http://www.javatang.com/archives/2009/12/31/2139330.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    虽然Subversion(SVN)直接可以注册为服务程序,但是最方便的还是使用SVN+Apache的方式,因为可以无防火墙限制、方便直接使用浏览器对代码进行浏览等等。下面我就将自己在Windows下安装Subversion(SVN)和Apache的方法记录一下:

    1. 从Apache网站上下载Apache的安装包进行安装,这个过程比较简单。需要注意Apache的版本,本文采用2.2,当然也可以使用2.0版本。假定Apache的安装目录为D:\apache2。

    2. 在http://subversion.tigris.org/官方下载Subversion的Windows下面与Apache的配合版本,这里需要注意Apache的版本,2.0和2.2的是不一样的,不要下载错了。

    然后将下载下来的zip包解压缩到一个目录,比如D:\svn-win32-1.6.6。

    3. 将svn安装目录的bin目录下面的mod_authz_svn.so和mod_dav_svn.so两个文件拷贝到Apache安装目录的modules目录下面,然后修改Apache的配置文件httpd.conf,将下面两行的注释去掉:

    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule dav_module modules/mod_dav.so

    同时在下面增加两行:

    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so

    4. 接下来就是对SVN进行配置了,配置文件(包含每条的含义)如下:

    # 表示访问SVN的地址,形式为http:///svn
    <Location /svn>
    # 告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块
    DAV svn
    # 在Subversion 1.3及更高版本中,这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库
    SVNListParentPath on
    # 下面制定SVN仓库的位置,有两种选择:
    # (1) 单库:一个Apache下面只有一个SVN仓库,这样的话就使用SVNPath来指定唯一的仓库位置,访问仓库的方式是http:///svn
    # (2) 多库:一个Apache下面可以有多个SVN仓库,这样的话就使用SVNParentPath来指定所有仓库所在的主目录,访问仓库的方式是http:///svn/仓库1、http:///svn/仓库2等等
    SVNPath “D:\Data\SVNData\repository”
    #SVNParentPath “D:\Data\SVNData\repository”

    # 当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
    AuthName “Subversion repositories”
    # 启用基本的验证,比如用户名/密码对,通常来做这样做就已经足够了。
    AuthType Basic
    # 指定密码文件的位置,密码文件中存放了用来验证用户的用户名和密码信息。这个文件的生成方式在后续步骤中会介绍
    AuthUserFile “D:\Data\SVNData\config\passwd”
    # 对版本库和人员进行权限分配,后面会进行详细的设置和介绍。
    AuthzSVNAccessFile “D:\Data\SVNData\config\svnaccessfile”

    # 限定用户只有输入正确的用户名及密码后才能访问这个路径
    Require valid-user
    # 如果想匿名读取的话使用下面的方式
    #<LimitExcept GET PROPFIND OPTIONS REPORT>
    #Require valid-user
    #</LimitExcept>
    </Location>

    5. 接下来使用Apache中的htpasswd.exe命令来生成密码文件,也就是上面AuthUserFile 设置项所指向的文件,切换到Apache安装目录的bin目录下,指向下面的命令:

    # 后面的参数c表示新建文件,在第一次执行的时候使用
    htpasswd -c D:\Data\SVNData\config\passwd
    # 如果是追加新用户或修改原有用户密码,命令后面不加参数c
    htpasswd D:\Data\SVNData\config\passwd

    每次执行命令之后会提示输入两遍密码

    6. 这个时候如果重启Apache的话会出现一个错误提示,这个是因为svn所使用的一些dll文件apache还无法获取,解决的方法可以将svn安装目录的bin目录下面的dll文件拷贝到系统的system32目录下面,但最好的方式是将bin目录加入到path环境变量中。

    7. 这个时候如果访问http:///svn的话,应该会出现一个登录框,输入用户名/密码之后就可以看到SVN仓库的内容了。不过常见下面的几个错误:
    (1) 出现“403 Forbidden”错误
    出现这个错误的原因有很多种,比如Apache2.2相对于之前的版本来说增强了安全性,默认情况下目录是禁止访问的,将“<Directory />”修改如下:

    <Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    </Directory>

    如果这样还不行的话那就是“多库还是单库”的问题了。上面讲过,在对SVN进行配置的时候,使用SVNParentPath设置所有库的根目录,在根目录下面存放多个SVN的库,那这样的话直接访问父目录是没有权限的,只能通过http:///svn/project1来访问对应的项目仓库;如果使用SVNPath设置为单库的话则不会出现这个错误了。

    (2) 出现“<m:human-readable errcode=”720003″>Could not open the requested SVN filesystem</m:human-readable>”错误
    出现这个错误是告诉你你所指定的SVN仓库的位置并不是一个合法的SVN仓库,解决的方法是首先创建一个空目录,然后使用“svnadmin create”命令来创建SVN库:

    # 首先进入 D:\Data\SVNData\repository 目录下
    md project1
    svnadmin create D:\Data\SVNData\repository\project1

    8. 最后安装SVN客户端就可以访问啦,Eclipse集成的客户端推荐使用Subclipse,Visual Studio集成的客户端推荐使用ankhsvn,系统集成的客户端推荐使用TortoiseSVN

    参考资料:
    [翻译] windows安装基于Apache的SVN服务器(包括SSL配置)
    基于svnserve的服务器,权限文件authz配置的常见问题及解答
    Forbidden access or bad repository ?
    Subversion for Windows 安裝指南

    一个VPN拨号之后不能上网的问题

    类归于: OS, Web&Server — Jet @ 1:41 上午
    Tags:
    原文出处: http://www.javatang.com/archives/2009/03/18/4138299.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    最近在服务器端使用路由器做了一个VPN服务,然后将远程登录等操作放在VPN中进行,增加了安全性。但是在公司里面使用VPN拨号上去之后发现不能浏览任何网站,于是对出现的问题进行了小结:
    1) 拨号上去不能浏览网页,但是MSN和QQ可以使用;
    2) 在家里使用ADSL环境下没有任何问题,但是在单位的局域网环境下有这个问题。

    通过上面的现象可以分析出应该是因为DNS服务器的问题造成的,将网卡上面的DNS服务器强制设置成当地的DNS服务器还是不行。后来使用route print命令查看了一下路由表,发现是因为VPN拨号上去之后本地的默认网关已经放到VPN服务器上面了,必须还转移到本地才可以。于是使用route delete删除远程网关,然后使用route add将网关指向本地,这样就可以了。

    但是后来想到总不能在公司里的每台机器都要这样设置吧?而且为什么ADSL环境下没有这个问题呢?在想这个问题的时候我无意间看到了本地局域网的IP地址为10.44.xxx.xxx,而VPN拨号上去分配的地址为10.240.xxx.xxx,于是想到会不会是因为二者都使用的是A类地址的原因呢?后来在VPN服务器上面将分配的地址修改为B类,再重新拨号连接,问题消失了。

    附局域网可用的IP地址范围:

    A类地址10.0.0.0 – 10.255.255.255
    B类网172.16.0.0 – 172.31.255.255
    C类网192.168.0.0 -192.168.255.255

    参考资料:
    教你解决公司VPN不能上网的故障(图)
    局域网IP

    IE6中出现“无法设置selected属性”的bug及解决方法

    类归于: Web&Server — Jet @ 6:07 下午
    原文出处: http://www.javatang.com/archives/2008/10/19/0704277.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    如果在IE6中设置select控件的selected属性的时候,会提示“无法设置selected属性。未指明的错误。”比如执行如下代码:

    1. var selectObj = document.getElementById('selectId');
    2. // 执行下面语句之后出错
    3. selectObj.options[1].selected = true;

    后来查了一下资料,发现这个错误在IE5.5、7及Firefox等浏览器下面没有问题,唯独IE6下有如下的提示。后来有人找到了一个解决的方法,就是设置selected属性的时候使用setTimeout函数设定一个时间即可,代码如下:

    1. var selectObj = document.getElementById('selectId');
    2. // 使用setTimeout之后问题解决
    3. setTimeout(function() {
    4.     selectObj.options[1].selected = true;
    5. }, 1);

    参考资料:
    急!请教高手:利用xml的selected问题!

    Apache+Resin下如何写伪静态和301跳转

    类归于: SearchEngine, Web&Server — Jet @ 7:19 下午
    Tags: , ,
    原文出处: http://www.javatang.com/archives/2008/10/18/1942276.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    目前网上大多数资料都是介绍如何在Apache中设置伪静态的,在Resin中很少提及,经过实践实现了这一点,现在做如下总结。

    1. Apache下如何写伪静态和301重定向
    直接上代码(以本站域名为例):

    1. <IfModule mod_rewrite.c>
    2.     RewriteEngine On
    3.     # 叹号表示非,L表示最终结果,不再循环;NC是不区分大小写。
    4.     RewriteCond %{http_host} !^www.javatang.com [NC]
    5.     RewriteRule ^/(.*)$ http://www.javatang.com/$1 [R=301,NC,L]
    6.     RewriteRule ^(.*)/index(.*)$ $1/index.html [R=301,NC]
    7.   </IfModule>

    2. Resin下如何写伪静态和301重定向
    Resin下的重定向也是由伪静态来写的,不过具体一些的话他同页面伪静态是分别由两个tag来完成的,页面伪静态由forward完成,301永久重定向由moved-permanently完成。

    下面是具体的代码:

    1. <rewrite-dispatch>
    2.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
    3.         <!-- HTTP 301 moved -->
    4.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
    5.     </rewrite-dispatch>

    这里需要特别注意的一点就是地址中的QueryString中&连接符需要使用&来代替,否则为出现错误。

    因为JavaEE默认的web.xml文件不支持上述属性,所以可以在你的站点WEB-INF目录下创建一个resin-web.xml文件,这个文件会被Resin看作为站点配置文件,然后在文件中写下如下内容:

    1. <web-app xmlns="http://caucho.com/ns/resin"
    2.          xmlns:resin="http://caucho.com/ns/resin/core">
    3.     <rewrite-dispatch>
    4.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
    5.         <!-- HTTP 301 moved -->
    6.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
    7.     </rewrite-dispatch>
    8. </web-app>

    3. Apache+Resin组合的时候设置伪静态需要注意的地方

    二者组合中Resin主要完成Servlet所映射的地址为文件类型,而Apache完成其余部分,因此关于页面伪静态部分需要在Resin和Apache中同时设置才有效,否则有时候会出现404错误。但对于301永久重定向来说,如果是涉及域名部分的只需要在Apache中设置即可,如果二者都设置的时候会出现域名解析错误;如果涉及到页面部分的话需要在二者中都设置。

    关于Resin如何同Apache组合请看这篇文章 Resin 3.0.x 经验总结

    关于Resin+Apache下如何设置泛域名请看这篇文章 Apache+Resin泛域名的设置

    参考资料:
    Resin url rewrite tags
    Apache网站301永久重定向设置

    JPA和Hibernate注解的继承问题

    类归于: JavaPlateform, Web&Server — Jet @ 3:03 下午
    Tags: ,
    原文出处: http://www.javatang.com/archives/2008/06/19/0308269.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    UUID类型的主键字段是长度为32的字符类型,Hibernate中自带自动生成UUID类型的主键,但有的时候需要自定义长32的字符串最为主键值,因此这里就有了一个分类关系:系统自带的UUID和用户自定义的UUID都有一个共性,都是一个长32的字符。我们基于此创建一个继承体系。

    1. // UUIDBase.java
    2. @MappedSuperclass
    3. public abstract class UUIDBase {
    4.  
    5.     protected String id;
    6.  
    7.     @Id
    8.     @Column(nullable=false, updatable=false, length=32)
    9.     public String getId() {
    10.         return id;
    11.     }
    12.  
    13.     public void setId(String id) {
    14.         this.id = id;
    15.     }
    16. }
    1. // UUIDSystem.java
    2. @MappedSuperclass
    3. public abstract class UUIDSystem extends UUIDBase {
    4.     @Override
    5.     @GeneratedValue(generator="system-uuid")
    6.     @GenericGenerator(name="system-uuid", strategy="uuid")
    7.     public String getId() {
    8.         return id;
    9.     }
    10. }
    1. // UUIDCustom.java
    2. @MappedSuperclass
    3. public abstract class UUIDCustom extends UUIDBase {
    4.     @Override
    5.     @GeneratedValue(generator="custom-uuid")
    6.     @GenericGenerator(name="custom-uuid", strategy="package.IDGenerator")
    7.     public String getId() {
    8.         return id;
    9.     }
    10. }
    1. // POJO.java
    2. @Entity
    3. public class POJO extends UUIDCustom {
    4.     //...
    5. }

    但是如果这样做的话如果对POJO进行操作的时候,会出现如下的异常:
    org.hibernate.MappingException: Repeated column in mapping for entity

    如果将UUIDBase修改如下:

    1. // UUIDBase.java
    2. @MappedSuperclass
    3. public abstract class UUIDBase {
    4.  
    5.     protected String id;
    6.  
    7.     @Id
    8.     @Column(nullable=false, updatable=false, length=32)
    9.     @GeneratedValue(generator="system-uuid")
    10.     @GenericGenerator(name="system-uuid", strategy="uuid")
    11.     public String getId() {
    12.         return id;
    13.     }
    14.  
    15.     public void setId(String id) {
    16.         this.id = id;
    17.     }
    18. }

    这个时候无论子类中getId()方法使用什么注解都是无效的,最终主键还是按照父类的主键生成器。

    为了避免出现这样的错误,建议将主键的注解一步到位,不要使用继承扩展的方式。

    让非NT服务程序像NT服务那样自动运行

    类归于: Web&Server — Jet @ 7:19 上午
    原文出处: http://www.javatang.com/archives/2008/03/21/1944266.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    我们知道在WindowsNT类系统(Windows2000/XP/2003/Vista)下有一种开机不需要登录就自动运行的程序叫做NT服务程序,这样的程序尤其在服务器系统中尤为重要。但是并非所有非常有用的程序都提供NT服务功能的,如何让这些程序像NT服务程序那样自动运行呢?因为即使将这些程序设置为自动运行也仅仅是使用远程账号登录之后才运行,如果注销的话程序也自动关闭了,达不到NT服务程序的效果。

    这里采用的方法就是创建一个账号并让该账号自动登录,从而实现自动开机运行非NT服务程序的效果。最近ARP病毒非常猖獗,下面来说明一下怎样让金山ARP防火墙实现NT服务程序运行,其他应用程序可以以此类推。

    (1) 在运行里面输入 compmgmt.msc 打开计算机管理控制台,然后在本地用户-用户中右键创建一个名为 arpuser 的用户名并设置一个密码,将下面的“用户下次登录时须更改密码”选项去掉并勾选“用户不能更改密码”和“密码永不过去”。这时候arpuser用户隶属于Users用户组,主要是为了系统安全考虑。

    (2) 在运行中输入“rundll32 netplwiz.dll,UsersRunDll”或“control userpasswords2(Win2000中是control userpasswords)”命令打开“用户账号”对话框,在下面的本机用户列表中选中刚才创建的 arpuser 用户然后将上面的“要使用本机,用户必须输入用户名和密码”复选框去掉,点击“应用”按钮之后会出现一个“自动登录”的对话框,将刚才设置的arpuser密码输入其中然后确定即可。

    (3) 重新启动计算机,这个时候就会在任务管理器中的用户标签中看到已经自动登录了刚才我们创建的arpuser用户。接下来打开“C:\Documents and Settings\arpuser\「开始」菜单\程序\启动”目录,将金山arp防火墙的快捷方式放入其中,接下来打开金山arp防火墙的安装目录,将该目录的安全属性添加arpuser用户并设置为全部允许。最后再次重启计算机之后,可以通过任务管理器的进程标签中查看金山arp防火墙已经启动了,显示的用户名为arpuser。

    最后在说明几点需要注意的地方:

    (1) 可以将注册表中HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run中不必要的程序项删除掉,因为这里的运行程序是对于所有登录用户的。
    (2) 除了上面介绍的方式之外还可以通过修改注册表的方法实现上面的效果,具体可以参考参考资料中的“WINDOWS NT 自动登陆的实现”文章。

    参考资料:
    Windows Xp中如何设置自动登录
    WINDOWS NT 自动登陆的实现

    Apache+Resin泛域名的设置

    类归于: Web&Server — Jet @ 3:25 下午
    Tags: ,
    原文出处: http://www.javatang.com/archives/2008/03/18/2532264.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    在Apache中如果设置范域名的话使用 ServerAlias ,比如

    1. <VirtualHost *:80>
    2.   ServerName javatang.com
    3.   ServerAlias *.javatang.com
    4.   ...
    5. </VirtualHost>

    如果使用Apache+Resin架构的话,需要在Resin中设置同样的泛域名与Apache进行对应。在Resin中设置泛域名使用 host-alias-regexp 标签,对应于上面Apache在Resin中设置如下:

    1. <host id="javatang.com" root-directory=".">
    2.    <host-alias-regexp>^([^/]*).javatang.com</host-alias-regexp>
    3.    ...
    4. </host>

    参考资料:
    host-alias-regexp
    apache、resin泛域名、多域名设置

    Discuz!一次误删会员用户组的恢复

    类归于: Web&Server — Jet @ 6:55 上午
    Tags:
    原文出处: http://www.javatang.com/archives/2008/03/13/5500263.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    今天上午好友colin电话过来大呼救急,原来他昨天晚上不知为何把Discuz论坛中的会员用户组除了“新手上路”和“注册会员”之外的用户组都删除了,删除之后发现有许多会员出现了异常:有的出现禁言,有的出现未验证等等。

    论坛的版本是Discuz 6,首先在后台将论坛暂时关闭,避免因为新的数据而造成更多的冲突。然后使用SQLyog将原来的数据都备份下来,避免操作数据库出现失误之后可以方便恢复数据。上面这两个前期工作非常重要,事实上在后面的一次操作中就将会员数据给破坏掉了,然后使用备份恢复之后又重新进行操作的。

    接下来分析Discuz的数据库,首先查找到记录会员用户组的表名为 cdb_usergroups (前缀cdb_为默认的,或许与你的不同),接下来使用一条查询语句检查一下会员中的group属性:

    1. select uid,username,credits,groupid from cdb_members order by groupid desc

    结果发现很多会员的groupid还是保留的被删除的会员用户组id,找到了问题的原因之后就好办了。

    首先恢复默认的会员用户组的数据,打开Discuz6安装包中的upload/install/discuz.sql文件,找到下面一行

    1. DROP TABLE IF EXISTS cdb_usergroups;

    然后将这行连同下面创建表结果及插入默认数据的sql语句复制下来在MySQL中执行,这样就将会员用户组中的数据恢复到了默认状态。

    然后就是需要查看会员表(cdb_members)中的groupid是否都存在于会员组中,查看所有的groupid是否都在cdb_usergroups.id的范围之内(1-15):

    1. select uid,username,credits,groupid from cdb_members where groupid>15 order by groupid desc

    如果执行之后发现没有数据则表示一切OK了,如果发现有的话则说明肯定添加过新的会员用户组,这个时候需要对会员中的groupid进行整理:

    1. update cdb_members set groupid=10 where (credits>0 and credits<50) and groupid>8;
    2. update cdb_members set groupid=11 where (credits>50 and credits<200) and groupid>8;
    3. update cdb_members set groupid=12 where (credits>200 and credits<500) and groupid>8;
    4. update cdb_members set groupid=13 where (credits>500 and credits<1000) and groupid>8;
    5. update cdb_members set groupid=14 where (credits>1000 and credits<3000) and groupid>8;
    6. update cdb_members set groupid=15 where (credits>3000 and credits<6000) and groupid>8;
    7. update cdb_members set groupid=16 where (credits>6000 and credits<999999) and groupid>8;

    因为groupid为8以下的都为系统组,不需要进行整理。这样整理之后一切都OK了,重新打开论坛。~~

    Zend Optimizer 出错造成站点无法访问

    类归于: Web&Server — Jet @ 3:17 上午
    原文出处: http://www.javatang.com/archives/2008/02/28/1713261.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    今天有朋友的服务器出现站点无法访问的状况,登录进去看到Apache占用了服务器的大部分内存导致服务器剩余内存很少,如果重启Apache的话依然无法释放内存,只有重启服务器之后才正常。

    查看“事件查看器”中出现一个Zend Optimizer错误,而且这个错误都是每次启动服务器之后产生的:

    事件类型: 错误
    事件来源: Zend Optimizer
    事件种类: 无
    事件 ID: 487
    日期: 2008-2-28
    事件: 9:22:15
    用户: N/A
    计算机: XXX
    描述:
    事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: Unable to view file mapping, 试图访问无效的地址。

    查阅了一下网上的资料,其实只有一个版本,具体内容可以看下面的参考资料。我这里结合自己的解决方法总结一下:

    首先如果你的PHP使用了eAccelerator则将其注释掉就可以了,这是因为Zend Optimizer同eAccelerator相冲突。其实二者都是用于加速PHP程序的,只要使用其中的一个就可以了。

    如果你的PHP没有使用eAccelerator的话则大部分是权限的问题了,这种情况在Apache+PHP中很少见,通常都是在IIS+PHP这种搭配中出现的比较多。这个时候只需要修改%SystemRoot%\Temp的权限,设置为EveryOne全部允许;然后如果该目录下没有ZendOptimizer.MemoryBase@SYSTEM文件的话就手动新建一个文本文件然后命名为ZendOptimizer.MemoryBase@SYSTEM即可。

    如果还是有问题的话可以查看一下php下的ext目录中是否有php_yaz.dll和php_zip.dll两个文件,有哪一个就在php.ini将 “extension=…”前面的分号去掉。

    做完上面的操作之后如果依然出现问题的话请在下面留言或给我mail,可以再继续探讨。

    [后续(2008.3.4):]做完上述的操作之后依然出现上面的错误,不过错误出现的次数少了而已,最后不得已将Zend卸载掉了。现在感觉好像应该是Zend Optimizer的一个bug吧。

    参考资料:
    事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。
    解决“事件ID(487)的描述(在资源(Zend Optimizer)中)无法找到”问题

    下一页 »