有需要服务器方面的需求和咨询,可以联系博主QQ 7271895(收费)
我擦!这两天可把我累的够呛,心累的那种,用python写了个API想放在Apache服务器上面利用CGI使用,但是整了两个晚上,经过无数次尝试和失败,最终终于搞定了,最终豁然开朗的感觉,才觉得这特么真是非常的坑。
先简单介绍一下Apache的CGI
Apache都不知道是啥的大兄弟就自己去百度吧。。CGI你可以理解为它的一个接口,利用CGI你可以实现各种脚本的运行,只要你的服务器可以运行的脚本都可以,通过服务器运行脚本,然后将允许结果最终以HTML的形式显示给浏览器。Apache根目录如下:
- bin:Apache服务器软件所在地
- cgi-bi:保存自己写的CGI脚本程序
- conf:保存服务器设置的信息
- error:网站发送错误的处理
- htdcocs:保存HTML程序
- icons:保存开发Apache程序用的图标
- include:保存开发web程序用到的一些头文件
- lib:保存的是开发web程序用到的一些库
- logs:日志
- manual:Apache服务器语言的设置
- modlules:保存一些动态链接库
一般我们常用的文件夹就是上面标红的那两个。、
开始配置:
声明一下,一般Apache的默认配置CGI都是开启的,可以在服务器的Apache的配置文件中看到配置情况,这里以Ubuntu14.4的Apache2为例看一下。
先进入apache2的主目录并查看文件夹,默认的apache2的默认目录在/etc/apache2
可以看到在这个目录下面有很多的文件夹和配置文件,Apache2其实是将各个模块的配置分文件夹保存了,这个CGI的配置文件在上图箭头指向的那个文件夹内,现在进入这个文件夹
这个serve-cgi-bin.conf文件就是我们要找的文件,使用vim编辑器打开这个文件
上图第一个箭头指向配置
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
这句话是用来设置别名的,就是说你在使用url访问的时候,当遇到/cgi-bin/这个目录的时候服务器会自动去/user/lib/cgi-bin/目录下面查找要访问的文件,这句话有时候可以不写,但前提是cgi的文件目录要在web的根目录下第二个箭头指向的配置
<Directory "/usr/lib/cgi-bin">
AllowOverride None #显示目录
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch #可以运行的模块
Require all granted #允许所有的请求
</Directory>
注意上面标红的位置,/usr/lib/cgi-bin/要和上面的别名一致,这个地方是个可以改动的,你可以自己选定别的文件夹,当作CGI的根目录,只要设置好目录可以访问就好,然后+ExecCGI要有,这个是加载CGI模块的选项,没有是不行的。可以看到,我们并没有声明可以运行那些脚本,所以Apache会全面默认运行。只要在脚本中指定执行程序的路径即可。下面我们会讲到。好了,文件的配置完并保存之后重启服务器,然后就可以去测试一下了。
Apache2的重启命令:
sudo /etc/init.d/apache2 restart
Apche CGI 文件测试
根据上面配置的别名,我们在浏览器访问一下试试
可以看到提示的是403然后说没有权限访问这个目录而不是404,说明找到了这个文件,只不过我们没有访问脚本文件,又不允许列出目录,所以提示403,下面我们编写一个CGI脚本测试一下,这里我使用Python来测试,代码如下:
#!/usr/bin/python #CGI运行程序的目录
# -*- coding: UTF-8 -*-
print "Content-type:text/html"
print # 空行,告诉服务器结束头部,CGI必须的部分
print '<html>'
print '<head>'
print '<meta charset="utf-8">'
print '<title>Hello Word - 我的第一个 CGI 程序!</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! 我是来自菜鸟教程的第一CGI程序</h2>'
print '</body>'
print '</html>'
上面的两个人注释的部分必须注意,规则不可以变。
写在python文件里面命令为t2.py,然后对文件进行权限的设置,让它具有可执行权限,注意,这一块很重要,要不然会提示500错误的
chmod 777 /usr/lib/t2.py
然后再浏览器中访问测试
仍然是500错误,其实这个才是我这篇博文的重点,这个坑我觉得肯定是坑死过很多人,这个流程明明没有问题,怎么还会出现问题呢?经过我多次的尝试,多次的失败,多次的googl,多次的baidu,就特么差放弃了,我特么成功了。我觉得我的配置没有问题,那么问题肯定出在CGI文件上面,通过测试发现,有两个地方必须要注意:
注意1
# -*- coding: UTF-8 -*-
上面这句话是用来声明utf8编码的,若文件中存有中文必须声明utf8编码格式,但是在这,这句话似乎不管用了,必须使用’
#coding:utf8
用上面的生命替换以前的代码之后,重新访问浏览器,结果仍然是500。重点在下面
注意2
在linux中新建的文件和在windows上面新建的文件是不同的,在CGI中运行的文件必须是unix文件编码格式,所以会出现500错误的!对于这个问题我测试了很久,虽然说vim编辑器有将文件编码格式转换为unix命令:set ff = unix ,但是结果还是不行,依然是500错误!但是,在linux上面使用vim新建的文件却可以正常运行。具体这个问题到底是怎么回事我也没有具体搞清楚,但是最不会出错的方法就是在linxu上面直接新建和编辑文件,或者在linux上面新建文件之后拿到本地用IDE编辑,注意!最好不要使用记事本,在测试中发现有时候记事本的BOM头也会影响程序执行。
既然知道了问题的原因,那么我们在linux上面使用vim新建文件并将代码复制过去,然后运行测试。
可以看到这样就成功了。两个晚上,闹心的,就是解决不了的问题,坑太多了,最终还好解决了,不然就要骂娘了。。!