网页服务器开发:CGI(2)
来源:互联网 发布:破解版阅读软件 编辑:程序博客网 时间:2024/05/16 17:14
开发好的web CGI程序部署到linux主机上出现问题。
环境与条件
- linux版本:ubuntu 12.04 server
- Apache版本:2.4.18
产生问题
- 直接输出CGI程序源文件(Python script source code)
- permision denied
- 元数据错误
- UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 11-12: ordinal not in range(128): /home/MyWebsite/cgi-bin/GetCustomNavigateContent.py
解决方案
输出源文件的问题。
应该是Apache没有设置好。查看apachectl -M 命令(查看Apache加载的所有模块)。发现果然没有cgi模块。查看apachectl -l命令,发现有mod_so.c,这个模块负责动态加载其它模块,如果没有这个模块,动静就大了,不再本文讨论范围之内。
发现mod_so.c之后,便知道可以更新配置文件动态加载Apache模块。
在本机中Apache的配置文件在 /etc/apache2中的apache2.conf。里面有这样一句描述
# Include module configuration:IncludeOptional mods-enabled/*.loadIncludeOptional mods-enabled/*.conf
说明相关的配置文件在mods-enabled中生效。Apache自身携带了很多模块,很多配置文件,位置在mods-available中,使用的时候只需要将其中的配置文件利用ln -s连接到enabled文件夹中即可。
/etc/apache2# tree -F .├── apache2.conf├── apache2.conf.bak├── conf-available/│ ├── apache2-doc.conf│ ├── charset.conf│ ├── localized-error-pages.conf│ ├── other-vhosts-access-log.conf│ ├── security.conf│ └── serve-cgi-bin.conf├── conf-enabled/│ ├── apache2-doc.conf -> ../conf-available/apache2-doc.conf│ ├── charset.conf -> ../conf-available/charset.conf│ ├── localized-error-pages.conf -> ../conf-available/localized-error-pages.conf│ ├── other-vhosts-access-log.conf -> ../conf-available/other-vhosts-access-log.conf│ ├── security.conf -> ../conf-available/security.conf│ └── serve-cgi-bin.conf -> ../conf-available/serve-cgi-bin.conf├── envvars├── magic├── mods-available/│ ├── access_compat.load│ ├── actions.conf│ ├── actions.load│ ├── alias.conf│ ├── alias.load│ ├── allowmethods.load│ ├── asis.load│ ├── auth_basic.load│ ├── auth_digest.load│ ├── auth_form.load│ ├── authn_anon.load│ ├── authn_core.load│ ├── authn_dbd.load│ ├── authn_dbm.load│ ├── authn_file.load│ ├── authn_socache.load│ ├── authnz_fcgi.load│ ├── authnz_ldap.load│ ├── authz_core.load│ ├── authz_dbd.load│ ├── authz_dbm.load│ ├── authz_groupfile.load│ ├── authz_host.load│ ├── authz_owner.load│ ├── authz_user.load│ ├── autoindex.conf│ ├── autoindex.load│ ├── buffer.load│ ├── cache_disk.conf│ ├── cache_disk.load│ ├── cache.load│ ├── cache_socache.load│ ├── cgid.conf│ ├── cgid.load│ ├── cgi.load│ ├── charset_lite.load│ ├── data.load│ ├── dav_fs.conf│ ├── dav_fs.load│ ├── dav.load│ ├── dav_lock.load│ ├── dbd.load│ ├── deflate.conf│ ├── deflate.load│ ├── dialup.load│ ├── dir.conf│ ├── dir.load│ ├── dump_io.load│ ├── echo.load│ ├── env.load│ ├── expires.load│ ├── ext_filter.load│ ├── file_cache.load│ ├── filter.load│ ├── headers.load│ ├── heartbeat.load│ ├── heartmonitor.load│ ├── ident.load│ ├── include.load│ ├── info.conf│ ├── info.load│ ├── lbmethod_bybusyness.load│ ├── lbmethod_byrequests.load│ ├── lbmethod_bytraffic.load│ ├── lbmethod_heartbeat.load│ ├── ldap.conf│ ├── ldap.load│ ├── log_debug.load│ ├── log_forensic.load│ ├── lua.load│ ├── macro.load│ ├── mime.conf│ ├── mime.load│ ├── mime_magic.conf│ ├── mime_magic.load│ ├── mpm_event.conf│ ├── mpm_event.load│ ├── mpm_prefork.conf│ ├── mpm_prefork.load│ ├── mpm_worker.conf│ ├── mpm_worker.load│ ├── negotiation.conf│ ├── negotiation.load│ ├── proxy_ajp.load│ ├── proxy_balancer.conf│ ├── proxy_balancer.load│ ├── proxy.conf│ ├── proxy_connect.load│ ├── proxy_express.load│ ├── proxy_fcgi.load│ ├── proxy_fdpass.load│ ├── proxy_ftp.conf│ ├── proxy_ftp.load│ ├── proxy_html.conf│ ├── proxy_html.load│ ├── proxy_http.load│ ├── proxy.load│ ├── proxy_scgi.load│ ├── proxy_wstunnel.load│ ├── ratelimit.load│ ├── reflector.load│ ├── remoteip.load│ ├── reqtimeout.conf│ ├── reqtimeout.load│ ├── request.load│ ├── rewrite.load│ ├── sed.load│ ├── session_cookie.load│ ├── session_crypto.load│ ├── session_dbd.load│ ├── session.load│ ├── setenvif.conf│ ├── setenvif.load│ ├── slotmem_plain.load│ ├── slotmem_shm.load│ ├── socache_dbm.load│ ├── socache_memcache.load│ ├── socache_shmcb.load│ ├── speling.load│ ├── ssl.conf│ ├── ssl.load│ ├── status.conf│ ├── status.load│ ├── substitute.load│ ├── suexec.load│ ├── unique_id.load│ ├── userdir.conf│ ├── userdir.load│ ├── usertrack.load│ ├── vhost_alias.load│ └── xml2enc.load├── mods-enabled/│ ├── access_compat.load -> ../mods-available/access_compat.load│ ├── alias.conf -> ../mods-available/alias.conf│ ├── alias.load -> ../mods-available/alias.load│ ├── auth_basic.load -> ../mods-available/auth_basic.load│ ├── authn_core.load -> ../mods-available/authn_core.load│ ├── authn_file.load -> ../mods-available/authn_file.load│ ├── authz_core.load -> ../mods-available/authz_core.load│ ├── authz_host.load -> ../mods-available/authz_host.load│ ├── authz_user.load -> ../mods-available/authz_user.load│ ├── autoindex.conf -> ../mods-available/autoindex.conf│ ├── autoindex.load -> ../mods-available/autoindex.load│ ├── cgi.load -> ../mods-available/cgi.load│ ├── deflate.conf -> ../mods-available/deflate.conf│ ├── deflate.load -> ../mods-available/deflate.load│ ├── dir.conf -> ../mods-available/dir.conf│ ├── dir.load -> ../mods-available/dir.load│ ├── env.load -> ../mods-available/env.load│ ├── filter.load -> ../mods-available/filter.load│ ├── mime.conf -> ../mods-available/mime.conf│ ├── mime.load -> ../mods-available/mime.load│ ├── mpm_event.conf -> ../mods-available/mpm_event.conf│ ├── mpm_event.load -> ../mods-available/mpm_event.load│ ├── negotiation.conf -> ../mods-available/negotiation.conf│ ├── negotiation.load -> ../mods-available/negotiation.load│ ├── setenvif.conf -> ../mods-available/setenvif.conf│ ├── setenvif.load -> ../mods-available/setenvif.load│ ├── status.conf -> ../mods-available/status.conf│ └── status.load -> ../mods-available/status.load├── ports.conf├── sites-available/│ ├── 000-default.conf│ └── default-ssl.conf└── sites-enabled/ └── 000-default.conf -> ../sites-available/000-default.conf
本例中只需要一个cgi.load即可。如果是多线程的需要连接cgid.load与cgid.conf。
permision denied
出现此种问题说明权限不匹配,需要设置权限,为Apache设置好CGI目录执行权限之后,在CGI目录所在和所操作的内容所在的位置利用chmod 777 -R path 修改权限去吧。
元数据错误
这个问题是将MacOS 上开发的Python部署到linux上发现的。原因在于两个版本的python3.5采用的dbm存储方式不同,解决方法,将初始化dbm数据过程转化为Python script脚本,传到服务器之后,删除所有数据,重新初始化。
UnicodeEncodeError
这个错误比较诡异。他出现的原因不明,解决的方案简单,让我瞠目结舌。
代码中是这样写的。
customxml = open('CustomNavigate.xml', 'w')customxml.write(r'''<?xml version="1.0" encoding="utf-8"?><root id="rootNode"><li> <a href="http://www.jd.com" target="_blank" collectnum="0" style="animation-delay: 6s;"> <img src="http://img.9553.com/uploadfile/2016/1027/20161027053122646.jpg"/> </a> <p>中文字符</p> </li></root>''')customxml.close()xmlContent = open('CustomNavigate.xml')for line in xmlContent.readlines(): print(line) pass
重写pythonscript之后一步步来执行发现完全不能输出中文,无论是单独输出还是在文件中输出。排故,一天找到如下方案。在文件头部添加以下两行。
import codecs, syssys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)customxml='''<?xml version="1.0" encoding="utf-8"?><root id="rootNode"><li> <a href="http://www.jd.com" target="_blank" collectnum="0" style="animation-delay: 6s;"> <img src="http://img.9553.com/uploadfile/2016/1027/20161027053122646.jpg"/> </a> <p>中文字符</p> </li></root>'''file = open("CustomNavigate.xml",'w')file.write(customxml)file.close()xmlfile = open('CustomNavigate.xml')content = xmlfile.readlines()for line in content: print(line)
以上代码省略了许多过程,大家意会即可。经过测试,似乎是python3设置的问题。这个问题在shell执行环境下是无法发现的,必须放到CGI执行环境中才会出现,不知道为什么。
Mac OS + Python3 (服务器使用了Python内置的HTTPServer(srvraddr, CGIHTTPRequestHandler))搭建本地测试环境显示正常,没有linux主机的问题。很是奇怪。
- 网页服务器开发:CGI(2)
- 网页服务器开发:CGI
- cgi实现网页向服务器传送文件
- cgi服务器
- OpenWrt 自学笔记(6)------网页CGI
- (转)CGI工作原理及其WEB服务器开发
- 嵌入式Web服务器BOA和CGI编程开发
- C语言CGI和Apache服务器的开发环境
- 嵌入式Web服务器BOA和CGI编程开发
- 开发基于Apache服务器上的CGI程序
- 嵌入式Web服务器BOA和CGI编程开发
- 开发基于Apache服务器上的CGI程序
- 网页游戏服务器开发随感
- Python网页编程(CGI)
- HTTP(2) -- CGI
- ubuntu 安装Apache cgi在自己的服务器上网页上只显示内容
- CGI技术及其开发(二)
- CGI技术及其开发(三)
- RedHat nfs文件挂载
- C++查漏补缺
- The value for the useBean class attribute XXX is invalid.解决方法
- 贪心算法实例(五):小船过河问题
- form中获取field+textfield赋值+combo的自动赋值+ 重置表单
- 网页服务器开发:CGI(2)
- Mybatis foreach 问题 Parameter 'item' not found
- HTTP协议详解
- Java+Selenium3方法篇10-findElement之By PartialLinkText
- Spring Security(19)——对Acl的支持
- 泛型与函数式比较
- WebRTC 初探
- 我的第一篇博客
- Android下面打印进程函数调用堆栈(dump backtrace)的方法