概念介绍php
一、apache server 是一个流行的http服务器。对应的可执行软件是httpd 和 apachectl。httpd提供http服务,apachectl控制httpd的执行。html
二、CGI 即 Common Gateway Interface, 是apache server 上程序和http交互的协议,在多种语言上都有实现,因此你在apache服务器上能够运行perl、php、python等脚本。apache默认提供的是文旦内容,即访问服务上的资源时,获得的是一个纯文本文档。CGI让程序可以提供动态网页内容。python
三、FCGI, Fast CGI ,是CGI的改进版,性能比CGI好。web
四、apache能够加载动态模块,FCGI就是用于给apache加载的一个动态库。apache要加载哪些模块,是在配置文件中设置的。apache
五、在apache上使用CGI运行脚本的时候,须要给脚本文件设置可执行权限,不然被认为是服务器异常,http返回500状态码,日志中输出: Permission denied: AH01241: exec of '/usr/local/bin/apache/cgi-bin/printenv' failed。bash
六、APR 、 APR-UTIL 安装运行apache软件须要的环境服务器
七、Perl 一个脚本语言app
环境搭建
ide
一、安装apache server性能
进入download页下载压缩文件。解压后是没法直接安装的。须要下载 APR 、 APR-UTIL 并解压到apache的srclib目录下。文件层级以下
以后执行下面的命令,把其中的PREFIX替换成安装目录
$ ./configure --prefix=PREFIX $ make $ make install $ sudo PREFIX/bin/apachectl start
安装后的apache服务默认监听的端口是80,监听这个端口须要使用root权限。你能够在config/httpd.config文件中修改要监听的端口:Listen 8081。
apachectl start启动服务后,访问 http://localhost:8081/ 能够看到 It Works页面,说明apache 正常启动了。此时apache只提供文档内容,尚未配置CGI交互能力。
二、apache基本配置
apache的配置文件使用xml格式,默认配置文件是config/httpd.config。
apache按目录进行配置。<Directory> 标签用来配置某一个目录的信息。下面的配置表示设置/usr/local/bin/apache/htdocs目录的访问权限对全部ip公开(Require all granted ,2.4版本之前使用Allow指令设置,2.4之后的版本不能使用Allow 指令),表示设置该目录的子目录不能够重写配置(AllowOverride None),表示该目录下的能够进行的操做有显示列表(Indexes),访问链接文件(FollowSymLinks)。
<Directory "/usr/local/bin/apache/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
apache默认输出的日志不多,你须要在http.config中把LogLevel修改成下面的内容来打印更多的信息。若是不修改,下面提到的一些日志你是看不到的。
LogLevel debug
三、CGI模块安装 和 apache 配置CGI功能 (以Perl为例)
从apache官网下载模块mod_fcgid,解压后执行:
./configure.apxs make make install
安装好以后,apache的modules目录下应该有modules/mod_cgid.so文件。在http.config文件中增长配置:LoadModule cgid_module modules/mod_cgid.so,从而使得apache能加载CGI模块。
http.config中默认有下面的配置: 它表示给/usr/local/bin/apache/cgi-bin/路径设置一个别名 /cgi-bin/ 即 可使用 http://localhost:8081/cgi-bin/test-cgi 形式的地址访问/usr/local/bin/apache/cgi-bin/下的test-cgi资源。Alias指令也是设置别名,不一样的是ScriptAlias下的资源会当作脚原本执行。
ScriptAlias /cgi-bin/ "/usr/local/bin/apache/cgi-bin/"
修改配置后,直接重启apache是不能运行脚本的。从error.log中能够看到对应的错误提示。
一、第一个错误是脚本执行权限错误。由于/cgi-bin目录下的脚本默认只有读写权限,直接访问会致使http 500错误,此时error.log中会输出 Permission denied: AH01241: exec of '/usr/local/bin/apache/cgi-bin/printenv' failed。
二、第二个错误是脚本格式错误。此时error.log中提示:Exec format error: AH01241: exec of '/usr/local/bin/apache/cgi-bin/printenv' failed。须要在脚本头中添加#!/bin/bash #!/usr/bin/perl 等,用来代表使用哪个解释器来执行脚本。
三、若是你执行perl脚本,还有可能看到这条日志: can't locate fcgi.pm in @inc。它代表你的perl缺乏CGI模块。能够按照perl官网的提示下载安装。
最终在apache上经过CGI访问脚本的效果以下:
四、配置php脚本的CGI
首先从apache官网下载mod_fcgid模块,解压后执行下面的命令进行安装:
./configure.apxs make make install
httpd.conf 中设置.php 处理器
AddHandler fcgid-script .php
安装后在apache的modules目录下会出现 mod_fcgid.so 。此时在httpd.config 中配置加载mod_fcgid.so( )
LoadModule fcgid_module modules/mod_fcgid.so <IfModule fcgid_module> FcgidBusyTimeout 3600 </IfModule>
若是遇到这个异常 Can't locate FCGI.pm in @INC,请安装prel的FCGI模块(从perl官网安装)
给脚本目录配置处理器 SetHandler fcgid-script
<Directory "/usr/local/bin/apache/cgi-bin"> #AddHandler fcgid-script .php SetHandler fcgid-script AllowOverride None Options None Require all granted </Directory>
给php脚本添加可执行权限 chmod u+x *.php 。此时访问php脚本能够看到脚本提供的动态网页内容。脚本和效果以下:
<?php phpinfo() ?>
若是你遇到这个错误(mod_fcgid: error reading data),请按照下面的内容配置httpd.config
Alias /webroot/ /Users/k/webroot/ <Location /webroot/> AddHandler fcgid-script .php Options +ExecCGI FcgidWrapper /Users/k/weblib/php-wrapper .php # Customize the next two directives for your requirements. Order allow,deny Allow from all </Location> <Directory "/Users/k/webroot"> AddHandler fcgid-script .php AllowOverride None #Options None Options +ExecCGI Require all granted </Directory>
安装WordPress
配置好apache和php cgi以后,直接下载WrodPress并解压到apache访问目录,设置脚本的可执行权限。
配置目录索引页支持index.php
<IfModule dir_module> DirectoryIndex index.html index.php </IfModule>
以后访问WordPress资源,就能够看到WordPress的安装页了,效果入下:
按照WordPress的安装引导完成设置后,你可能遇到这个错误(php JIT compilation failed: no more memory in):解决的办法是找到php的配置文件php.ini 按照下面的内容修改。
把 ;pcre.jit=1 改为 pcre.jit=0 注意删除前面的逗号