
1.2 模仿更真实的服务器环境
这一节我们将不得不涉及一些关于Web服务器的知识,我很希望把它放到最后去讲,因为对于很多网络编程的初学者来说,这是一个拦路虎,会严重影响学习的兴趣,但是没办法,虽然有Zend Server、XAMPP等万有灵丹,但它们并不能解决所有问题。现在我们需要面对一个挑战,拿下它才能顺利进入Zend Framework的大门。
现在如果假设你的开发环境是Linux,那么一般来说,你的开发项目路径应该位于/var/www目录,通常这个目录也是你的Web服务器指定的根目录,很多人在本地开发网站时,习惯于将项目文件放在Web服务器指定的根目录下,然后通过http://localhst/xxx路径来访问,这很正常,但对Zend Framework框架来说,这样的访问方式会引发问题,因为默认安装情况下,站点创建会要求在Apache或IIS里把站点根目录指到public这个目录下,Zend Framework会把URL路由到特定的public目录下的index.php文件,然后所有的URL就都交给前端控制器和分发器,结合Web服务器的Rewrite功能来进行路由。Zend Framework处理来自HTTP的请求有自己的一套规则,采用http://localhost/xxx/public这样的路径,将使得前端控制器不能正确识别URL,从而引起访问出错,所以我们需要用类似http://mydomainname.com这样的正式域名来访问站点。
以上的表述是正确的,但并不完全。从本质上讲,我们需要一个直接的地址直接访问到public,例如,http://localhost如果能直接指向/var/www/xxx/public,那么就用http://localhost好了,而且访问域名也不一定非得像个正规域名,为了简洁,http://kehuanedu这样的也可以……只是在这里我不想把问题搞得太复杂,让初学者们苦恼。事实上Zend Framework门槛高的恶名有一大部分就是来自于这些问题,如果能理解当然很好,如果实在不理解,这些分析可以略过,只需照着本例进行配置就好。
1.2.1 劫持一个域名
你可以通过http://localhost或http://127.0.0.1或你的本机IP来访问本机的网站根目录,但由于前面已讲过的Zend Framework的路由规则问题,我们需要配置一个虚拟主机,用一个正式的域名指向public目录。稍后介绍虚拟主机的配置,让我们先劫持一个域名kehuan.edu来用。这种.edu后缀的域名一般被美国教育机构垄断了,很难注册到,但尽可拿来做例子使用。
为了便于使用,我把电脑的IP设为静态的192.168.8.1,下面我将更改本机的hosts文件,将kehuan.edu访问指向192.168.8.1。
如果你的系统是Ubuntu,打开/etc/hosts文件,添加以下一行代码到文件末尾:
192.168.8.1 kehuan.edu
记得把192.168.8.1换成你自己的本机IP。在Windows系统下,用记事本打开c:\windows\system32\drivers\etc\hosts文件,添加以下一行代码到文件末尾:
192.168.8.1 kehuan.edu
这样,kehuan.edu就被劫持到访问本机来了,访问这个域名会访问到本机,在Linux终端或Windows的DOS界面下,输入ping kehuan.ecu命令,如果ping得通,则表示域名劫持成功。
1.2.2 启用Rewrite模块
Zend Framework必须用到Rewrite模块来改写URL,所以我们需要开启Apache的mod_rewrite。
在Ubuntu系统下,通过以下命令打开Apache的Rewrite模块:
sudo a2enmod rewrite
在Windows系统中,安装了XAMPP之后,该模块是默认打开的。
如果你使用Windows系统做服务器,使用IIS而不是Apache,那么需要下载并安装单独的IIS Rewrite组件,具体的方法这里就不提供了,网上有很详尽的资料。
1.2.3 创建虚拟主机
创建一个虚拟主机,我们假设你正在使用Apache Web服务器。Zend Framework在其他的服务器上同样工作良好——包括微软的IIS,以及Tomcat、Lighttpd、Nginx等,但是绝大多数开发者都至少熟悉Apache,它很便捷地提供了Zend Framework所需要的目录结构和重写功能,所以我们以Apache作为Web服务器来配置一个虚拟主机。
为了创建你的虚拟主机,你应该知道httpd.conf文件所在的位置,以及其他潜在配置文件所在的位置。一些通常的位置是:
● Linux(Fedora, RHEL, CentOS):/etc/httpd/httpd.conf。
● Linux(Debian或Ubuntu下):/etc/apache2/httpd.conf。
● Windows系统:安装目录\apache\conf。
1.Windows下的解决方案
如果你是按照前面的教程做下来的,那么你的httpd.conf应该在XAMPP的安装目录中,如F:\xampp\apache\conf。而事实上,在XAMPP中,我们不需要修改这里的httpd.conf,而是修改F:\xampp\apache\conf\extra下面的httpd-vhosts.conf文件,它是httpd.conf的扩展,通过修改它来配置Apache服务器会更为灵活方便。安装好XAMPP后,httpd-vhosts.conf扩展是默认开启的,如果你使用其他的开发环境,可能需要打开httpd.conf文件,找到 # Include conf/extra/httpd-vhosts.conf这一行,将前面的#注释符去掉,以开启httpd-vhosts.conf扩展。
接下来在你的httpd.conf或者httpd-vhosts.conf文件中,需要做两件事情:
首先,确保NameVirtualHost已经被定义。通常我把它设置成192.168.8.1:80,也就是你的静态IP。
其次,在文件末尾定义一个虚拟主机,格式如下:
<VirtualHost 192.168.8.1:80> ServerName yourname.com DocumentRoot /你的项目路径/public </VirtualHost>
例如,我的虚拟主机配置如下:
<VirtualHost 192.168.8.1:80> DocumentRoot "F:/xampp/htdocs/www/khweb/public" ServerName kehuan.edu ErrorLog "/var/log/apache2/kehuanedu_errors.log" CustomLog "/var/log/apache2/kehuanedu_accesses.log" common </VirtualHost>
这里需要注意,DocumentRoot指向了项目的public子目录——这意味着只有在那个目录下的文件是被暴露在Apache服务下的,这样其他文件不会开放给网络用户读取,保证了相对的安全。ErrorLog和CustomLog定义的两个文件,记录Apache服务器运行中出现的错误和普通日志,如果网站有什么异常,可以通过查看这两个文件寻找问题出在哪里。
2.Linux下的解决方案
Ubuntu系统中,要先在/etc/apache2/sites-available/中建立并编辑一个kehuanedu文件:
sudo vi /etc/apache2/sites-available/kehuanedu
在该文件中,输入以下内容:
<VirtualHost 192.168.8.1:80> ServerName kehuan.edu DocumentRoot "/var/www/kehuanedu/public" ErrorLog "/var/log/apache2/kehuanedu_errors.log" CustomLog "/var/log/apache2/kehuanedu_accesses.log" common </VirtualHost>
然后保存并退出vi编辑器。这样就单独为kehuanedu配置了一个虚拟主机文件,其中后两行定义了日志文件,当Apache运行中出现意外状况时,可以通过查看日志查找原因。如果不需要,可以省略。
接下来开启该虚拟主机站点:
sudo a2ensite kehuanedu
重启Apache服务器:
sudo /etc/init.d/apache2 restart
3.检查
此时,你应该可以启动Zend Framework应用程序了。把浏览器指向之前设置好的服务器的名字(server name),你应该能看到一个欢迎页面。
提示:
Aapche的日志文件会记录运行中出现的问题,当Web服务器运行出错时,查看error.log日志可以帮助我们判断错误类型以便针对类型解决问题。在Ubuntu下该日志文件位于/var/log/apache2/目录下。