Posted on 22-07-2012
Filed Under (技术) by waterlin

FastCGI 用来作为 Web 服务器的设计方案,有着很多优点。要搭建这样一个服务,有一个最简单的办法来搭建,可以使用 Apache 以及 mod_fcgid 模块来实现。

鉴于网上有关 FastCGI 的中文资料(尤其是实战资料)比较少,下面就用 Ubuntu 11.04 及 Apache2.2 为例,说明一下 FastCGI 服务器配置的基本流程。

Apache 及 mod_fcgid 模块的配置

首先,正确安装 Apache,这个直接从命令行安装就可以了:

$ sudo apt-get install apache2

然后,再安装 mod_fcgid 模块,同样可以直接从命令行安装:

$ sudo apt-get install libfcgi-dev

安装好 Apache 及 mod_fcgid 模块以后,再到配置文件

/etc/apache2/sites-enabled/000-default

里配置一下有关 mod_fcgid 的选项(注意,根据 Apache 版本及安装方式不同,配置文件所在路径会有所不同,详细情况请查阅 Apache 手册),配置示例如下所示:

<Directory /var/www/>
SetHandler fcgid-script
Options +ExecCGI

# Customize the next two directives for your requirements.
Order allow,deny
Allow from all
</Directory>

这里配置的目录,是指把后面编译好的 FastCGI 程序放到目录 /var/www/ 下,当然,你也可以选择任意一个 Apache 有权限运行的目录。

安装 fcig 开发库

在 Linux 下,需要安装库 libfcgi 才能在 C, C++, Java, Perl 等程序下开发 FastCGI 功能,这样才能在 C/C++ 程序里正确使用 FastCGI,fcgi 库把 FastCGI 封装好了,你不需要关注 FastCGI 协议的任何细节。可以使用下面的命令来安装:

$ sudo apt-get install libfcgi-dev

在你的工作目录里新建一个 .c 文件,并输入下面这段代码,并保证可以正确编译:

#include "fcgi_stdio.h"
#include <stdlib.h>

void main(void)
{
    int count = 0;
    while(FCGI_Accept() >= 0)
        printf("Content-type: text/html\r\n"
               "\r\n"
               "<title>FastCGI Hello!</title>"
               "<h1>FastCGI Hello!</h1>"
               "Request number %d running on host <i>%s</i>\n",
                ++count, getenv("SERVER_NAME"));
}

使用下面的命令编译上述代码:

$ gcc tiny-fcgi.c -o tiny-fcgi -lfcgi

编译好的 FastCGI 程序应该可以直接运行(是的,就像普通可执行程序一样),会输出相关的结果,你可以试试。

然后把编译出来的文件,拷贝到上面 Apache 设置的 FastCGI 程序可执行目录里:

$ cp tiny-fcgi /var/www/

访问你的 FastCGI 服务

重启 Apache 服务:

$ sudo /usr/sbin/apachectl restart

然后在浏览器里输入类似下面的网址,就可以访问这个 FastCGI 提供的服务了:

http://127.0.0.1/tiny-fcgi

小结

上述整体配置还算很简单,以后再介绍一些 FastCGI 高级使用技巧。FastCGI 这种比较古老的协议,特别适合用来设计需要做分布式计算、用 C 来实现计算代码的场景。服务器与计算引擎的分开,能很方便地让 Web 开发人员与后台服务器人员不受干扰,各自发挥自己的特长。

(0) Comments    Read More   
Posted on 07-08-2009
Filed Under (技术) by waterlin

Xampp提供了一个在本地搭建LAMP服务器的便捷方法,而Magento则是电子商务开源软件中的新宠儿,我们没有理由不在Xampp里搭建一个Magento开发环境。

Magento在Windows XAMPP里的安装,比起Zen-cart之类的开源系统,稍微麻烦一些,服务器需要进行一些配置。另外,低版本Xampp里php的pdo_mysql库可能有bug,导致写入MySQL数据库时,浏览器会莫名其秒地死掉。在我的机器上,Xampp 1.7.0里,安装不成功,但是升级到Xampp 1.7.1后,安装就没有什么问题。如果你使用的是Xampp 1.7.0或更低版本,安装前请先升级Xampp到最新版本。安装之前也应该仔细阅读一下官方的安装文档

安装前可以下载magento-check.php脚本来测试一下服务器是否满足Magento的安装要求,测试会显示类似下面的结果:

Your server does not meet the following requirements in order to install Magento.
The following requirements failed, please contact your hosting provider in order to receive assistance with meeting the system requirements for Magento:
You need MySQL 4.1.20 (or greater)
The following requirements were successfully met:
You have PHP 5.2.0 (or greater)
Safe Mode is off
You have the curl extension
You have the dom extension
You have the gd extension
You have the hash extension
You have the iconv extension
You have the mcrypt extension
You have the pcre extension
You have the pdo extension
You have the pdo_mysql extension
You have the simplexml extension

第一个错误应该是那个测试脚本自身的问题,它有时候不能正确检测出MySQL的版本号,如果你确定你的MySQL高于此版本,则不用理会。

第二个错误可以通过修改php.ini文件解决,把

;extension=php_mcrypt.dll
;extension=php_curl.dll

改为

extension=php_mcrypt.dll
extension=php_curl.dll

即去掉注释行为的;号,从而启用curl模块。

注意:Xampp里有好几个php.ini文件,哪个才是正确的呢?路径/xampp/apache/bin/php.ini才是正确的那个!而/xampp/php目录里的php.ini文件只是在CGI/CLI模式时使用。所以,当你需要修改php的环境变量时,请配置/xampp/apache/bin/php.ini文件,并在修改后重新启动Apache服务。

一切都配置好后,新建一个数据库,根据Magento的提示进行安装,在写入数据库的时候比较费时间,请耐心等待。

(1) Comment    Read More   
Posted on 07-08-2009
Filed Under (技术) by waterlin

Xampp官方网站上有关升级Xampp的论述是这样的:

当 XAMPP 程序集里的单独组件被升级时,我们会将 XAMPP 同步升级。然而,其中一些组件的变化与我们最新发布的版本不兼容,所以我们就不会升级这类组件。我们通常能升级 XAMPP 中所有的服务器和程序。但我们不升级配置文件,因为您可能已经修改过他们了。提示:如果您用的是安装包版的 XAMPP,那么您在使用升级安装包的时候将非常轻松。其他用户请下载自解压 7-ZIP 压缩包。直接将其中的文件释放到 XAMPP 文件夹中,并覆盖原有的文件即可。

相信大多数人用的应该是Xampp的解压版本,这个时候,最好用ftp上传新版本的Xampp文件来覆盖掉原有的旧文件,并保证你自己的文件不要被覆盖掉。

还是那句话,升级前记得把你原来的文件打包备份一下,小心最重要了!

(1) Comment    Read More   
Posted on 06-08-2009
Filed Under (技术) by waterlin

Xampp虚拟主机刚创建的时候,并不安全,需要我们自己来创建管理密码。这个时候,可以访问下面的地址:

http://localhost/security/

照着这个页面的说明,就可以修改密码、进行安全配置了。

(0) Comments    Read More   
Posted on 13-03-2009
Filed Under (技术) by waterlin

WordPress-mu的安装和一般的免费php系统相比起来,有点麻烦,经常一不小心就出现类似于

Error establishing a database connection

的错误。下面就简单介绍一下我在Xampp里安装Wordpress-mu本地测试系统的方法。

首先,要对Apache进行必要的设置:

1) 对/xampp/apache/conf/httpd.conf文件里的rewrite_module修改成如下形式:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

2) 在httpd.conf文件里的<Directory>相关的信息里,把这行

“AllowOverride None”

改为

“AllowOverride FileInfo Options”

因为Wordpress-mu系统只能安装在80端口,并且不允许用IP作为访问的方式。因此,为了出错的概率比较小,我们需要在Apache里设置一下基于域名的虚拟主机,在文件/xampp/apache/conf/extra/httpd-vhosts.conf里加上类似这种内容:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@localhost.localdomain
    DocumentRoot E:/xampp/htdocs/wordpress-mu
    ServerName *.localhost.localdomain
#    ErrorLog @rel_logfiledir@/localhost.localdomain
#    CustomLog @rel_logfiledir@/localhost.localdomain
</VirtualHost>

把Wordpress-mu的安装文件解压后,直接扔到上面设定的虚拟主机目录里,在这里是E:/xampp/htdocs/wordpress-mu。

因为我们是在本地做测试用,并不需要一个真正的域名解析到本地,所以,虚拟主机里的localhost.localdomain这个域名,你可以任意设定。

然后,我们需要修改Windows的Hosts文件,把你刚刚填的虚假域名以及你需要的域名解析到本地即可:

127.0.0.1       localhost.localdomain
127.0.0.1       blog1.localhost.localdomain
127.0.0.1       blog2.localhost.localdomain

启动Apache和MySQL服务后,在浏览器里访问http://localhost.localdomain,根据提示填写相关内容即可进行Wordpress-mu的安装。

注意,安装时Server Address不要填127.0.0.1,而要填你上面写的localhost.localdomain(你上面的假域名是啥,就填啥)。

(2) Comments    Read More   
Posted on 12-03-2009
Filed Under (技术) by waterlin

Xampp作为Apache的一种portable版本,对虚拟主机的设置,和Apache服务器配置没啥两样。

作为一个Apache的portable版本,大家可能会担心,一旦我把这个Xampp拷到其它电脑上了,我设置好的虚拟主机路径怎么办?

不用担心,换了一台新电脑,只要你跑一下setup_xampp.bat,Xampp会自动帮你修改虚拟机的路径。

如果你之前的虚拟机路径是D:/xampp/htdocs/test1,然后换了一台新的电脑,把Xampp扔到了E盘,你只要一运行setup_xampp.bat,就会自动修改D:/xampp/htdocs/test1为E:/xampp/htdocs/test1。

真是方便!建议大家在/xampp/htdocs目录下建一个类似于myhome的目录,专门用来建自己的虚拟主机,这样和Xampp预先的设置就不会有冲突了。

(0) Comments    Read More   
Posted on 11-03-2009
Filed Under (软件) by waterlin

Apache Http Server配置的WWW服务器,只要对配置文件httpd.conf和httpd-vhosts.conf进行修改,就可以实现虚拟主机的服务,即在同一台机器上提供多台主机的服务,下面就详细介绍一下其基本原理、具体的设置方法。当然,要熟练掌握这些技巧,需要仔细地对照配置文件的注释来慢慢试验。

一、WWW服务器虚拟主机原理

WWW服务器虚拟主机是指使用一台物理机器,充当多个主机名的WWW服务器。比如由一台机器同时提供http://www.company1.com, http://www.company2.com等的WWW服务,而浏览这些WWW站点的用户感觉不到这种方式下跟由不同的机器提供不同的服务有什么差别。

使用WWW虚拟主机的好处在于,一些小规模的网站,通过跟其他网站共享同一台物理机器,可以减少系统的运行成本,并且可以减少管理的难度。另外,对于个人用户,也可以使用这种虚拟主机方式来建立有自己独立域名的WWW服务器,目前国内有很多公司都提供这种免费的服务。

WWW虚拟主机有两种工作方式:

1.1 基于IP地址的虚拟主机方式

这种方式下,不同的主机名解析到不同的IP地址,提供虚拟主机服务的机器上同时设置有这些IP地址。服务器根据用户请求的目的IP地址来判定用户请求的是哪个虚拟主机的服务,从而进一步的处理。

缺点:基于IP地址的虚拟主机方式需要在提供虚拟主机服务的机器上设立多个IP地址,既浪费了IP地址,又限制了一台机器所能容纳的虚拟主机数目。因此这种方式越来越少使用。但是,这种方式是早期使用的HTTP 1.0协议唯一支持的虚拟主机方式。

1.2 基于主机名的虚拟主机方式

由于基于IP地址的虚拟主机方式有如上的缺点,HTTP 1.1协议中增加了对基于主机名的虚拟主机的支持。具体说,当客户程序向WWW服务器发出请求时,客户想要访问的主机名也通过请求头中的“Host:”语句传递给WWW服务器。比如,www.company1.com, www.company2.com都对应于同一个IP地址(即由同一台机器来给这两个虚拟域名提供服务),客户程序要存取http://www.company1.com/index.html时,发出的请求头中包含有如下的内容:

GET /index.html HTTP/1.1
Host: www.company1.com
…..

WWW服务器程序接收到这个请求后,可以通过检查“Host:”语句,来判定客户程序请求是哪个虚拟主机的服务,然后再进一步的处理。

优点:提供虚拟主机服务的机器上只要设置一个IP地址,理论上就可以给无数多个虚拟域名提供服务,占用资源少,管理方便。目前基本上都是使用这种方式来提供虚拟主机服务。

缺点:在早期的HTTP 1.0版本下不能使用。实际上现在使用的浏览器基本上都支持基于主机名的虚拟主机方式。

二、Apache服务器下的虚拟主机设置技术

2.1 Apache WWW服务器简介

Apache WWW服务器是目前Internet上使用最广的WWW服务器软件。通过灵活的配置,它可以完成几乎您想得到的功能。本文主要介绍在Apache下设置各种虚拟主机的方法。

2.2 Apache WWW服务器下基于IP地址的虚拟主机设置

使用这种虚拟主机方式,首先要在服务器上为每个虚拟主机单独设置一个IP地址。这些IP地址可以通过增加多个网卡或者在一个网卡上设立多个IP地址来完成。有了多个IP地址后,可以采用以下两种方式之一来设置Apache:

2.2.1 为每个虚拟主机运行一份Apache

采用这种方式,每一份Apache程序可以以单独的用户运行,因此各个虚拟主机之间互不影响。设置这种虚拟主机时,只要为每一份Apache设置一套配置文件就可以了,唯一需要注意的是:必须使用“Listen”语句,强制每一份Apache仅仅在属于“自己”的IP地址上接收服务请求。

优点:各个虚拟主机之间互不干扰,安全性高。

缺点:占用系统资源较多。

2.2.2 多个虚拟主机共享同一份Apache

采用这种方式,各个虚拟主机共享同一份Apache,因此各个虚拟主机之间有一定的影响,尤其是执行CGI程序时,可能会带来一些严重的安全问题。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可:

<VirtualHost www.company1.com>
DocumentRoot /home/company1

</VirrualHost>

优点:占用系统资源比上一种方式少。

缺点:安全性低,每个虚拟主机仍然需要占用一个IP地址。

2.3 Apache WWW服务器下简单的基于域名的虚拟主机设置

这种方式下,各个虚拟主机共享同一份Apache,因此有CGI程序运行时,安全性也不高。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可:

NameVirtualHost 111.222.33.44 ; 在这个IP地址接收虚拟主机的服务
<VirtualHost 111.222.33.44>
ServerName www.company1.com
DocumentRoot /www/company1
</VirtualHost>
<VirtualHost 111.222.33.44>
ServerName www.company2.com
DocumentRoot /www/company2
</VirtualHost>

优点:只要一个IP地址就可以提供大量的虚拟主机服务。

缺点:安全性差。维护这些虚拟主机时需要更改配置文件,并且需要重新启动Apache进程才能起作用。因此不适合进行大规模的虚拟主机服务。

2.4 Apache WWW服务器下简单的基于端口的虚拟主机设置

在2.3中,基于主机IP的虚拟主机,其实就是解析到主机IP的80端口上。为了利用主机的各个端口,其实我们还可以在主机的不同端口上,设置不同的虚拟主机。例如,以下代码就在本机建立了基于端口8888和8989的虚拟主机。

Listen 8989
Listen 8888

NameVirtualHost 127.0.0.1:8989
NameVirtualHost 127.0.0.1:8888

<VirtualHost *:8989>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot “E:/xampp/htdocs/zen-cart”
ServerName 127.0.0.1:8989
#    ErrorLog @rel_logfiledir@/8989-error_log
#    CustomLog @rel_logfiledir@/8989_log common
</VirtualHost>

<VirtualHost *:8888>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot “E:/xampp/htdocs/wordpress”
ServerName 127.0.0.1:8888
#    ErrorLog @rel_logfiledir@/8888-error_log
#    CustomLog @rel_logfiledir@/8888_log common
</VirtualHost>

当然,你需要找到适合放这些代码的准确位置。基于端口的虚拟主机,同样可以把上面的IP换成域名,前提是你把域名解析到了这个IP上。

优点:配置简单、灵活,尤其适合在本地搭建服务器开发、测试时使用。

缺点:每个虚拟主机都要占用一个端口,可能与其它系统服务引起冲突,可提供的虚拟主机服务数量也与端口数量密切相关。

2.5 Apache WWW服务器下基于域名的大规模虚拟主机设置

所谓大规模虚拟主机,是指能够提供非常多的虚拟主机服务,比如能提供超过数十万个域名的虚拟主机服务。如果使用以上讨论的方法,是很难完成的。实现这种服务的一种方式是利用Apache 功能强大的URL重写功能。下面以一个实例来说明这种方式。

2.5.1 Apache中URL重写功能

Apache1.2及以后版本都有URL重写(Rewrite)功能。简单的说,URL重写功能就是在Apache接收到请求后,在处理的过程中能根据预先设定的规则,对请求中的URL进行修改。这些规则主要由正规表达式组成。重写依赖于输入的URL、各种服务器端环境变量、HTTP请求头中的内容、时间,甚至可以通过外部的程序来使用数据库中的信息来帮助重写。

URL重写功能非常强大,通过URL重写,可以使Apache完成异常复杂的功能。当然,URL重写功能本身也比较复杂,关于URL重写功能的详细说明可以参看Apache的随机文档。

2.5.2 使用Apache中URL重写功能实现基于域名的大规模虚拟主机设置

假设机器www.home.com提供名字形如abcde.home.com、hijk.home.com等的大规模虚拟主机服务。其中虚拟主机名必须是字母或数字,并且长度至少为3。为了防止一个目录下文件或子目录太多而对性能产生很大的负面影响,对用户的目录按照名字进行分级划分,如虚拟主机abcde.home.com的相关文件存放在目录/member/ab/de/abcde下面。其中“ab”、“de”分别是“abcde”的前边两个字符和最后两个字符。当用户请求http://abcde.home.com时,系统应该返回/member/ab/de/abcde下面的文件。下面是为了完成这种功能需要进行的设置:

1). 对域名服务器的设置

假设www.home.com的IP地址为202.103.190.57,在域名服务器DNS的home.com数据文件中增加一行:

* IN A 202.103.190.57

这样,所有 *.home.com的IP地址都会被解析为202.103.190.57,就没有必要为各个虚拟主机分别进行设置。

2). 对Apache的设置

首先使用命令“httpd -l”检查mod_rewrite模块是否已经编译到Apache中,如果没有,重新编译Apache。

然后在Apache的配置文件httpd.conf中增加如下语句(其中以“#”开头的为注释):

#禁止使用机器的正式名
UseCanonicalName off
#使能重写功能
RewriteEngine on
RewriteMap lowercase int:tolower
# 为安全考虑,对CGI程序不进行重写
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# 对www.home.com不重写,其他的重写
RewriteCond ${lowercase:%{HTTP_HOST}} !^www.home.com(.*)$
RewriteCond ${lowercase:%{HTTP_HOST}} ^[a-z0-9-]+.home.com(.*)$
# 首先把机器名改为小写,添加到请求的文件路径前,并继续处理
RewriteRule ^(.+) ${lowercase:%{HTTP_HOST}}$1 [C]
# 重写请求
RewriteRule ^([a-z0-9])([a-z0-9])([a-z0-9]).home.com([.]*)/(.*) /member/$1$2/$2$3/$1$2$3/$5
RewriteRule ^([a-z0-9])([a-z0-9])([a-z0-9]*)([a-z0-9])([a-z0-9]).home.com([.]*)/(.*) /member/$1$2/$4$5/$1$2$3$4$5/$7

优点:只要一个IP地址就可以提供大量的虚拟主机服务,维护方便。

缺点:安全性低。上例为了增强安全性,禁止运行用户自己的CGI程序。

2.5 Apache WWW服务器下的重定向虚拟主机设置

重定向虚拟主机是指仅仅提供重定向功能,而不实际存放用户主页数据的虚拟主机。比如,某站点有多个镜像服务器,假设为www1.user.com、www2.user.com,…wwwn.user.com。这些服务器放在不同的网络上,分布于各地的客户访问这些服务器的速度也互不相同。而站点www.home.com通过虚拟域名user.home.com为这些镜像的服务器提供虚拟主机服务。当客户访问http://user.home.com时,www.home.com根据用户的IP地址、收集到的网络拓扑结构信息,把客户重定向到对该客户来说访问速度最快的站点。

重定向虚拟主机服务也可以通过使用URL重写功能来完成。这里仅给出简单的重写规则:

RewriteRule ^([a-z0-9]+).home.com([.]*)/(.*) /www/cgi-bin/nph-redirect.cgi/$1/$3 [T=application/x-httpd-cgi,L]

其中,nph-redirect.cgi为一个CGI程序,为了实现自动重定向,它需要产生完整的HTTP应答头信息。该程序通过环境变量PATH_INFO得到用户请求的URL,通过环境变量REMOTE_ADDR得到用户的IP地址,并根据网络拓扑情况生成重定向信息,返回给客户。

作为一个优秀的服务器软件,Apache的使用技巧还有很多,更加详细的资料请查看Apache的联机手册。

(6) Comments    Read More   
Posted on 06-03-2009
Filed Under (技术) by waterlin

有的时候,重装Windows系统啥的,要重新搭一次Apache+MySQL+PHP的开发环境,还真不容易,光是数据库的备份和恢复就比较麻烦。

如果使用Xampp的话,不管是重装系统,还是换了电脑,都可以轻松地移植你的开发环境。

Xampp的安装非常简单:

直接解压到根目录,然后运行setup_xampp.bat配置路径,这个脚本并不会写入任何信息到Windwos系统的注册表里。

要启动Apache和Mysql则分别运行apache_start.bat, mysql_start.bat即可。

如果提示运行成功,则可以在本地用http://127.0.0.1或http://localhost测试连接成功与否。

关闭服务则运行apache_stop.bat, mysql_stop.bat即可。

其实我个人比较喜欢用图形化的控制界面,运行xampp-control.exe即可打开GUI控制台。

Xampp运行成功的话,你的根目录就是/Xampp/htdocs了,

默认的情况下,你通过http://localhost/访问的就是/Xampp/htdocs文件夹了。举例如下:

– C:\xampp\htdocs\test.php => http://localhost/test.php
– C:\xampp\myhome\test.php => http://localhost/myhome/test.php

因此,http://localhost/phpmyadmin/就是你的phpMyAdmin的路径了。

要卸载Xampp也是非常简单,直接把Xampp所在的目录删掉就可以了。当然,删掉文件之前,需要把Apache和Mysql之类的服务都停止。

有了Xampp这个玩意后,以后要备份与重装实验系统都很方便。不过,目前Xampp只能用于Windows系统。

(2) Comments    Read More