标签为 "apache" 的存档

nginx下配置安装在线客服系统mibew

mibew是一个用php、mysql实现的开源在线客服系统,可以方便的集成到现有的网站系统中。客服人员和客户都可以直接通过浏览器进行沟通交流,无需安装额外的客户端或插件。关于mibew更加详细的介绍飞尘这里就不多啰嗦了,用到的朋友自行查阅吧。

从mibew官方网站https://mibew.org下载最新版本的安装包,目前最新的是2.0.0-bata.5,当然也有1.6.x的稳定版本,根据个人需要选择下载即可。

下载好解压安装包到任意目录,比如mibew/,在该目录的下README.txt文件中提供了详细的安装步骤,虽然是英文,但是比较简单,就不翻译了。不过几个注意点说明一下:

1. 中文语言包需要另外下载,解压到mibew/locales/下
2. 数据库需要先创建好,地址、用户名、密码需要手动在config.yml文件中配置。
3. config.yml配置文件默认缓存方式为file_system,windows下受到文件名长度的限制会有问题,如果没有性能方面的考虑,这里设置为storage: none
4. 可设置默认语言为中文

# Locales
## Native name will be used in this locale
home_locale: zh-cn
## If user does not provide known lang
default_locale: zh-cn

5. 配置好后通过浏览器访问安装http://yourdomain/mibew/install.php,README文档里没有写php的扩展名

windows平台下安装比较容易,linux系统下可能需要注意一些文件的权限设置。

mibew自身提供了.htaccess配置文件,安装到apache服务器中几乎不用修改什么配置。但是笔者这里没有使用apache,web服务器是nginx,所以使用浏览器访问http://yourdomain/mibew/install.php时就出现问题了,页面自动跳转到http://yourdomain/mibew/install.php/install/check-requirements,自然显示404了,nginx找不到文件。

看了一下.htaccess配置文件,的确是用rewrite规则的,这个需要在nginx中相应的配置一下,虽然获得正确规则配置的过程曲折了一些,但是结果是令人满意的,先看一下成功的配置吧

# 假设mibew安装在子目录mibew中
rewrite ^/mibew/$ /mibew/index.php permanent;
rewrite ^/mibew/install\.php/(.*)$ /mibew/install.php?$1 last;
rewrite ^/mibew/index\.php/(.*)$ /mibew/index.php?$1 last;

看上去真的好简单哦,但是得到的过程却不简单,先是使用.htaccess转换工具,又google了一番未果,只能自己丰衣足食,其实最主要的问题是rewrite与location的组合,开始尝试的配置是这样的

location /mibew/ {
rewrite ^/mibew/install\.php/(.*)$ /mibew/install.php?$1 last;
rewrite ^/mibew/index\.php/(.*)$ /mibew/index.php?$1 last;
}

安装没有问题,但是使用的时候添加了一个客服人员,在上传头像时死活就是404,都是伪静态的链接,
http://yourdomain/mibew/install.php/operator/operator/2/edit这个正常访问,但是http://yourdomain/mibew/install.php/operator/operator/2/avatar这个就是404,搞了半天还是搞不定,最后把location段删除了,rewrite直接放在server段,然后就神奇了。至于配合location怎么弄,期待你的高见。。。

apache支持mht类型文件

ppt文件另存为单个网页mht类型文件,直接使用ie打开该类型文件没有问题。放到服务器(apache)上之后,使用iframe嵌入该文件,浏览器无法正常显示。

因为apache默认是不支持mht文件格式的,我们需要手动添加一下。

打开apache安装目录下的conf/mime.types文件,找到这行

message/rfc822 eml mime

在后面添加mht

message/rfc822 eml mime mht

可能apache的版本不一样,message/rfc822后面的内容有所不同,只要在原有的基础上加上mht就可以了。

保存文件,重启apache后,访问mht文件就正常了。

webpy搭配wsgi使用session的问题

项目使用webpy作为python的web框架,同时借助于mod_wsgi搭建在apache服务器之上。

随着项目的不断推进,用户相关的需求被引入,自然就用到了session。

在webpy官方也给出了session及用户认证相关的例子,可以参考:

http://webpy.org/cookbook/sessions

http://webpy.org/cookbook/userauthpgsql

在结合自身项目时,遇到了点小问题,总是报这样的错误:

AttributeError: ‘function’ object has no attribute ‘add_processor’

经过一番折腾,在google讨论组找到了原因:

http://groups.google.com/group/webpy/browse_thread/thread/5a41ad7a10dca68f

对于wsgi是这样的

application = web.application(urls, globals(), autoreload=True).wsgifunc()

注意这里是globals()

而webpy官方给出的例子中是locals()

app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore(‘sessions’), initializer={‘count’: 0})

难怪会出错呢

原有的保持不变,新增加一个app用来为session服务就好了

app = web.application(urls, locals())

但是又遇到了新的问题:

AttributeError: ‘ThreadedDict’ object has no attribute

费了九牛二虎之力还是没有搞定,都准备放弃webpy了,看了一下django,重构的成本有点大,再说webpy不可能不行啊,终于还是在webpy官方找到了原因:

Note: mod_wsgi + sessions

If you use sessions with mod_wsgi, you should change you code like below:

app = web.application(urls, globals())

curdir = os.path.dirname(__file__)
session = web.session.Session(app, web.session.DiskStore(os.path.join(curdir,’sessions’)),)

application = app.wsgifunc()

现在来输出一下session_id就不再报错了

[Thu Dec 08 10:59:38 2011] [error]
[Thu Dec 08 10:59:38 2011] [error] da397a83fc1f92f4d4ed1fa919b6f50d105392a5

哎,真是的,当初只看了一半,看来有时候还是应该静下心来仔细的阅读一下文档,似乎做项目太浮躁了,只管实现就好,真是不应该啊。

python使用logging模块之二

之前写过一篇如何在python中启用日志logging模块的文章,当时是使用外部配置文件的形式来设置logging相关参数的。

由于开发环境是在win7下,潜在的文件权限问题没有及时的暴露出来。在项目部署到服务器的linux环境中时,出现了许多始料未及的问题,而最主要的也就是文件系统的差异带来的问题。

记得在配置文件中,日志输出到文件只需要设置日志文件名就可以了,当然可以带有路径,只是需要绝对路径。至于相对路径,在python环境下自然是脚本所在的路径了,但是跑在apache容器中的时候,就不是脚本文件的路径了,而是apache安装的路径。

所以当时只设定了文件名,而这个日志文件是写在了apache安装目录下,windows下一般是不会有问题的,等到linux环境时,apache目录自然是不允许随便写的啦,python脚本执行出错。查看了apache的错误日志才发现了这个问题。

网上也查了些资料,始终没有找到解决方法,当时只能先将日志功能禁用。

如今又需要日志了,既然配置文件不好使,那就先来点直接的。

log.py文件如下

使用logger的时候遇到另外一个问题,重复的日志会多次输出,由于是web形式,每次刷新页面,log就会多输出一次,乖乖!

经查,原来是没有removeHandler,那种返回logger对象的方法不好用,于是自己修改为上面的形式。引入log模块后,调用相应级别的方法就好了,如log.debug(‘hello’)

python使用webpy文件路径错误

按照webpy官方给的样例代码进行修改时发现在code.py中引入自定义模块时出现错误:

ImportError: No module named someName

错误消息是在apache的log中查看的,页面显示500错误

此时需要将当前应用的路径加入系统路径:

import os
import sys
sys.path.append(os.path.abspath(os.path.dirname(__file__)))

页面显示正常,可以引入自定义模块了。

过了一段时间,项目中增加了logging功能,并且是通过配置文件对logging进行初始化的。在python中直接运行脚本没有问题,但是整合到页面中时,又报500了,查看apache错误日志:

NoSectionError: No section: ‘formatters’

而配置文件中明明有formatters,而且模块本身可以正常运行。

经过一翻排查,原来还是路径的原因

将原来的读取配置文件的代码

logging.config.fileConfig(“logger.conf”)

改为下面的即可,注意/

import os
logging.config.fileConfig(os.path.abspath(os.path.dirname(__file__)) + “/logger.conf”)

php通过curl提交数据出错

php通过curl提交数据,需要开启curl功能,在php.ini文件中取消注释

;extension=php_curl.dll

改为

extension=php_curl.dll

重启apache服务器生效。

使用php的curl模块获取或者提交数据都是很方便的,但是使用中遇到了这样的一个问题:提交数据时出错,服务器返回400错误。

下面先给出一个通过curl提交数据的php文件示例:

直接传递数组时,一切正常,但是将数组编码后,服务器返回出错信息

HTTP Status 400 – Syntactically incorrect

Description: The request sent by the client was syntactically incorrect ().

经过对比测试,可以看到编码前的参数

Array ( [username] => test-user [password] => 789cbe0407840b1c2041cb33452ff60f19bf58cc [timestamp] => 1314842207975 )

经过http_build_query编码后的参数

username=test-user&password=789cbe0407840b1c2041cb33452ff60f19bf58cc&timestamp=1314842207975

正是编码后的这个连接符&导致的问题

在php.ini文件有如下的配置项:

; The separator used in PHP generated URLs to separate arguments.
; PHP’s default setting is “&”.
; http://php.net/arg-separator.output
; Example:
arg_separator.output = “&”

在xampp中,php默认的配置是启用的

;arg_separator.output = “&”

将其注释后重启服务器,不再报错。

不修改php全局配置也可以,在php脚本里设置一下就行

ini_set(‘arg_separator.output’, ‘&’);