需要安装一台服务器,主要作为图片的处理存储显示等功能,选择了ubuntu作为服务器,ubuntu的服务器版本只有500多M,非常小巧,同时使用人数众多,有什么问题能够很好解决。
使用的是2M带宽,ubuntu 8.04只用40多分钟就全部下下来了。安装很快完成,进入了配置。
首先尝试安装django,直接使用sudo apt-get install python-django,结果把0.96.1的版本给弄下来了,只能删除这个包了,sudo apt-get remove python-django,直接wget http://www.djangoproject.com/download/1.0.2/tarball/,下了一个1.0.2版本,顺利安装,然后又安装了PIL图形处理库,这次直接用sudo apt-get install python-imaging,PIL的最后一个版本在06年底发布,两年多了,没有再发布新版本,但还是有很多地方在用。
nginx很牛,所以想试试。nginx 8.04已经有了一个0.5版本,太老了,从nginx网站下了一个当前最新的0.7.44版本,开始configure,报没有pcre,zlib等模块。打算使用zlib,pcre等的最新版本,就使用wget下了最新的模块,config没有问题,却报没有make,ubuntu 8.04.2服务版本连make都没有,真是够简洁的。没有make,也没有gcc,g++等工具了,不过都可以用apt下载安装,还是方便。
nginx0.5 已经在服务器中配置好了,包括在/etc/init.d中的脚本,所以就打算覆盖安装,可以省一些事情。nginx 0.5的配置参数为
–conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –pid-path=/var/run/nginx.pid –lock-path=/var/lock/nginx.lock –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/body –http-proxy-temp-path=/var/lib/nginx/proxy –http-fastcgi-temp-path=/var/lib/nginx/fastcgi –with-debug –with-http_stub_status_module –with-http_flv_module –with-http_ssl_module –with-http_dav_module。
将相关的路径参数拷贝下来,再加上设定–prefix=/usr。其他的参数不要,这样就顺利安装了。执行/etc/init.d/nginx start ,看到了欢迎页面。
还需要安装flup,django站点中的flup链接报错,google了一下,找到1.0.1的下载地址http://www.saddi.com/software/flup/dist/flup-1.0.1.tar.gz,直接下载安装。
拷贝django提供的脚本,进行部分修改,可以方便启动django:
#!/bin/bash
# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"
cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi
exec python manage.py runfcgi pidfile=$PIDFILE host=127.0.0.1 port=8080
可以将这个脚本放入/etc/init.d/目录下,再在rcx.d目录加上一个链接,就可以实现开机自动启动django。
在/etc/nginx/nginx.conf文件中,主要server中配置,加上如下语句:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
location / {
# host and port to fastcgi server
fastcgi_pass 127.0.0.1:8080;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_intercept_errors off;
}
location ^~ /media/ {
alias /usr/lib/python2.5/site-packages/django/contrib/admin/media/;
}
location ~* ^.+\.(gif|png|jpg|jpeg|css|swf|htm|html|asp|php|jsp|js|doc|txt)$ {
root /usr/lib/python2.5/site-packages/django/contrib/admin/media/;
access_log off;
}
}
现在可以看到页面了,但是,还有问题!
使用了mysql作为django的后台数据库,mysql是ubuntu帮忙安装好的,结果python manage.py syncdb的时候报错:
_mysql_exceptions.Warning: Incorrect string value: ‘\xE4\xB8\x8A\xE4\xBC\xA0…’ for column ‘name’ at row 1
估计是字符编码的问题,难道mysql缺省不是utf8吗?查了一下,默认的是Latin1编码,在/etc/my.cnf中,[client]和[mysqld]下面均加上default-character-set=utf8,这样变成了utf8的编码,这个问题解决了。
然后可以看到首页内容了,以为应该差不多了。然后依然还有问题:进入admin界面,报错:
Unhandled Exception
An unhandled exception was thrown by the application.
检查了error.log,如下:
2009/03/25 23:26:05 [error] 17966#0: *6 FastCGI sent in stderr: “” while reading response header from upstream, client: 192.168.1.2, server: localhost, request: “GET /admin/ HTTP/1.1″, upstream: “fastcgi://127.0.0.1:8080″, host: “192.168.1.129″
2009/03/25 23:26:05 [error] 17966#0: *6 FastCGI sent in stderr: “Traceback (most recent call last):
File “/usr/lib/python2.5/site-packages/flup-1.0.1-py2.5.egg/flup/server/fcgi_base.py”, line 558, in run
protocolStatus, appStatus = self.server.handler(self)
File “/usr/lib/python2.5/site-packages/flup-1.0.1-py2.5.egg/flup/server/fcgi_base.py”, line 1116, in handler
result = self.application(environ, start_response)
File “/usr/lib/python2.5/site-packages/django/core/handlers/wsgi.py”, line 243, in __call__
response = middleware_method(request, response)
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/middleware.py”, line 35, in process_response
request.session.save()
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/db.py”, line 52, in save
session_key = self.session_key,
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/base.py”, line 152, in _get_session_key
self._session_key = self._get_new_session_key()
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/base.py”, line 144, in _get_new_session_key
if not self.exists(session_key):
File “/usr/lib/python2.5/site-packages/django/contrib/sessions/backends/db.py”, line 25, in exists
Session.objects.get(session_key=session_key)
File “/usr/lib/python2.5/site-packages/django/db/models/manager.py”, line 93, in get
return self.get_query_set().get(*args, **kwargs)
File “/usr/lib/python2.5/site-packages/django/db/models/query.py”, line 304, in get
num = len(clone)
File “/usr/lib/python2.5/site-packages/django/db/models/query.py”, line 160, in __len__
self._result_cache = list(self.iterator())
File “/usr/lib/python2.5/site-packages/django/db/models/query.py”, line 275, in iterator
for row in self.query.results_iter():
File “/usr/lib/python2.5/site-packages/django/db/models/sql/query.py”, line 206, in results_iter
for rows in self.execute_sql(MULTI):
File “/usr/lib/python2.5/site-packages/django/db/models/sql/query.py”
尝试将数据库换成sqlite3,也是这个现象。google了一下,有人碰见过类似问题,但这个问题涉及的面太广,没有说出解决方案,只能靠自己了。准备第二天再来解决,关机休息。
第二天,机器重新启动之后,很奇怪,admin没有问题了。nginx首先自动启动,然后再手工启动fastcgi,前面好像顺序不对,不知道是不是这个理由。