想实践下Apache是如何运行cgi程序的,却发现先前编译安装Apache的时候,没有安装Apache的cgi模块。
附:CentOS6.x编译安装LAMP(2):编译安装 Apache2.2.25
此时,从 httpd.conf 文件中可看到如下模块被动态加载(没有cgi模块):
LoadModule deflate_module modules/mod_deflate.so LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so LoadModule ssl_module modules/mod_ssl.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule php5_module modules/libphp5.so
查了下网络资料,发现Apache自带的apxs工具,可以在不重新编译Apache的前提下,给Apache添加模块。
Apache运行cgi程序需要用到2个模块:mod_cgi.so 与 mod_cgid.so
操作如下:
添加的模块:
LoadModule cgi_module libexec/mod_cgi.so
LoadModule cgid_module libexec/mod_cgid.so
添加步骤:
如要额外安装cgi,先找到mod_cgi.c及mod_cgid.c。一般在apache安装包目录下,如 ./httpd-2.2.25/modules/generators 。
#编译安装 cgi模块
cd /usr/local/src/Apache-2.2.25/httpd-2.2.25/modules/generators /usr/local/apache/bin/apxs -i -a -c mod_cgi.c
编译成功后会输出:
cd /usr/local/src/Apache-2.2.25/httpd-2.2.25/modules/generators /usr/local/apache/bin/apxs -i -a -c mod_cgi.c .... #省略掉了前部分内容 ---------------------------------------------------------------------- chmod 755 /usr/local/apache/modules/mod_cgi.so [activating module `cgi' in /usr/local/apache/conf/httpd.conf] #这行表示,在httpd.conf中已经加载了cgi module
#编译安装 cgid模板
cd /usr/local/src/Apache-2.2.25/httpd-2.2.25/modules/generators /usr/local/apache/bin/apxs -i -a -c mod_cgid.c
编译成功后会输出:
.... #省略掉了前部分内容 ---------------------------------------------------------------------- chmod 755 /usr/local/apache/modules/mod_cgid.so [activating module `cgid' in /usr/local/apache/conf/httpd.conf] #这行表示,在httpd.conf中已经加载了cgid module
asps参数含义:
-i 表示需要执行安装操作。
-a 自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-n 增加或启用的模块名称。
# 再次查看下配置文件 httpd.conf:
LoadModule deflate_module modules/mod_deflate.so LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so LoadModule ssl_module modules/mod_ssl.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule php5_module modules/libphp5.so LoadModule cgi_module modules/mod_cgi.so LoadModule cgid_module modules/mod_cgid.so
cgi与cgid模块被加载。
#重启下Apache
service httpd restart
结果报如下错误:
[root@localhost PHP-5.3.27]# service httpd restart 停止 httpd: [确定] 启动 httpd:httpd: Syntax error on line 61 of /usr/local/apache/conf/httpd.conf: module cgi_module is built-in and can't be loaded [失败]
提示说:cgi_module 是内建模块,即无需手动加载,所以我们把“LoadModule cgi_module modules/mod_cgi.so”注释掉即可!
用命令 apachectl -l 去查看下哪些模块被内建了
[root@localhost generators]# httpd -l Compiled in modules: core.c mod_authn_file.c mod_authn_default.c mod_authz_host.c mod_authz_groupfile.c mod_authz_user.c mod_authz_default.c mod_auth_basic.c mod_include.c mod_filter.c mod_log_config.c mod_env.c mod_setenvif.c mod_version.c prefork.c http_core.c mod_mime.c mod_status.c mod_autoindex.c mod_asis.c mod_cgi.c mod_negotiation.c mod_dir.c mod_actions.c mod_userdir.c mod_alias.c mod_so.c [root@localhost generators]#
从上面可看出,mod_cgi.c 果然被内建了!
常见的安装报错及解决方案(以安装rewrite模块为例)
报错1:
Can`t loacte API module staructure `mod_rewrite_module` in file /usr/local/apache2/modules/mod_rewrite.so:/usr/local/apache2/lib/libapr-0.so.0:undefined symbol:mod_rewrite_module
解决方法:
httpd.conf 里面写的mod_rewrite_module改成rewrite_module。
报错2:
module rewrite_module is built-in and can't be loaded.
解决方法:
表示模块是内建的,不用再手动调入,注释掉 httpd.conf 中如下行:
#LoadModule rewrite_module modules/mod_rewrite.so
检查所有内建模块的命令: apachectl -l