概念介紹
1、apache server 是一個流行的http服務器。對應的可執行軟件是httpd 和 apachectl。httpd提供http服務,apachectl控制httpd的執行。
2、CGI 即 Common Gateway Interface, 是apache server 上程序和http交互的協議,在多種語言上都有實現,所以你在apache服務器上可以運行perl、php、python等腳本。apache默認提供的是文旦內容,即訪問服務上的資源時,得到的是一個純文本文檔。CGI讓程序能夠提供動態網頁內容。
3、FCGI, Fast CGI ,是CGI的改進版,性能比CGI好。
4、apache可以加載動態模塊,FCGI就是用於給apache加載的一個動態庫。apache要加載哪些模塊,是在配置文件中設置的。
5、在apache上使用CGI運行腳本的時候,需要給腳本文件設置可執行權限,否則被認為是服務器異常,http返回500狀態碼,日志中輸出: Permission denied: AH01241: exec of '/usr/local/bin/apache/cgi-bin/printenv' failed。
6、APR 、 APR-UTIL 安裝運行apache軟件需要的環境
7、Perl 一個腳本語言
環境搭建
1、安裝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交互能力。
2、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
3、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中可以看到對應的錯誤提示。
1、第一個錯誤是腳本執行權限錯誤。因為/cgi-bin目錄下的腳本默認只有讀寫權限,直接訪問會導致http 500錯誤,此時error.log中會輸出 Permission denied: AH01241: exec of '/usr/local/bin/apache/cgi-bin/printenv' failed。
2、第二個錯誤是腳本格式錯誤。此時error.log中提示:Exec format error: AH01241: exec of '/usr/local/bin/apache/cgi-bin/printenv' failed。需要在腳本頭中添加#!/bin/bash #!/usr/bin/perl 等,用來表明使用哪一個解釋器來執行腳本。
3、如果你執行perl腳本,還有可能看到這條日志: can't locate fcgi.pm in @inc。它表明你的perl缺少CGI模塊。可以按照perl官網的提示下載安裝。
最終在apache上通過CGI訪問腳本的效果如下:
4、配置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 注意刪除前面的逗號