lnmp是Linux+Nginx+Mysql+php的简称,这是Web开发中很厉害的一种组合方式,但是它也有一点的缺点。
为了弥补某些缺点,后来加入Apache,成为lnmpa。
lnmp.org提供了lnmp的一键安装包,详见 http://lnmp.org/
lnmp.org也提供了lnmpa的一键安装包,详见 http://lnmp.org/lnmpa.html
之前用lnmp一键安装包,可以很方便运行cgi程序,一旦升级为lnmpa,就不支持cgi程序了。
一些很必要的程序必须基于cgi,例如统计工具awstats。
为了使lnmpa支持cgi程序,我花了很长时间来研究,最后找出了解决方案。
解决方法
1.查看lnmpa升级文件 apache.sh ,搜索“cgi”
# cd lnmp0.9-full/
# cat apache.sh | grep cgi
./configure --prefix=/usr/local/apache --enable-headers --enable-mime-magic --enable-proxy --enable-so --enable-rewrite \
--enable-ssl --enable-deflate --enable-suexec --disable-userdir --with-included-apr --with-mpm=prefork --with-ssl=/usr \
--disable-userdir --disable-cgid --disable-cgi
我们发现cgi默认情况下是禁止的,若要开启cgi支持,重新配置并编译apache。
# cd httpd-2.2.22
# ./configure --prefix=/usr/local/apache --enable-headers --enable-mime-magic --enable-proxy --enable-so --enable-rewrite --enable-ssl --enable-deflate --enable-suexec --disable-userdir --with-included-apr --with-mpm=prefork --with-ssl=/usr
# make
# make install
要编译很久,默默等待……
然后重启lnmpa,就可以在phpinfo中看到cgi模块了。
# cd lnmp0.9-full/
# ./lnmpa restart
2.接下来需要修改nginx的vhost文件来使nginx把cgi等请求交给apache处理
# vi /usr/local/nginx/conf/vhost/YOUR_NAME.conf
找到以下语句:
location ~ .*\.(php|php5)?$ { proxy_pass http://127.0.0.1:88; include proxy.conf; }
改为
location ~ .*\.(php|php5|cgi|pl)?$ { proxy_pass http://127.0.0.1:88; include proxy.conf; }
重新装载一下nginx
# /etc/init.d/nginx reload
3.修改你的apache的vhost配置文件
在配置文件中合适位置适当增加或修改。
AddType text/plain .cgi .pl <Directory "/home/wwwroot/tool/"> Options Includes Indexes ExecCGI FollowSymLinks AllowOverride All AddHandler cgi-script .cgi .pl </Directory>
优雅的重新装载apache服务
# /etc/init.d/httpd graceful
4.编写测试脚本
在指定的根目录中新建一个index.cgi的脚本,内容如下
#!/bin/sh
echo
echo "hello world!"
第一行是声明解析器类型
第二行是输出一个空号
第三行是打印一个hello world!
保存这个文件,并把它赋予www用户的可执行权限
# chmod +x index.cgi
访问规定的网址,即可显示出hello world!
常见问题
1.phpinfo中不会出现mod_cgi 可能是没有重启lnmpa。不是重启apache,是整个lnmpa。
2.访问index.cgi时提示下载文件 没有在apache配置文件中添加“AddType text/plain .cgi .pl”
3.访问index.cgi打开是源代码 nginx配置文件中没有将cgi请求转发给apache
没有将cgi模块成功安装,apache不处理cgi请求
4.打开index.cgi提示malformed header from script. Bad header
cgi文件中没有打印首个空行,http响应头有错
5.打开index.cgi提示Premature end of script headers
cgi文件没有执行权限