前些日子項目終於結束,客戶購買了服務器,開始設置環境和項目。於是順路把實施過程中碰到的一些問題記錄下來,方便大家參考。
系統實施軟件以及硬件環境:
Django:1.02
Mysql:5.067
字符集:utf-8
Web-server:lighttpd1.4
Memcached:1.21
Os:debian4.0,linux2.6
硬件:intel 雙cpu至強處理器,硬盤500g,4G內存
=====================================================
Liunx操作系統安裝
操作系統爲debian4.0版本,拿到手時候已經按裝好。由於硬件和系統提供商不知道項目實施的方向,因此安裝的debian版本較低,而且安裝了三個python版本,默認python版本是python2.4。由於這些原因,造成了後期安裝的一些小麻煩和時間上的浪費。
如何將debian的python版本修改爲目標python版本?
Debian系統中python可執行文件是/usr/bin/python,實際上是通過硬連接進行的。
網上建議採用update-alternatives來進行鏈接重新配置,這樣可以避免舊的python版本鏈接被刪除後引發的一些問題。
ln /usr/bin/python /usr/bin/python2.5
安裝mysql數據庫
Debian中安裝mysql數據庫有一點點特殊之處,就是debian操作系統提供了自己的Mysql維護和升級帳號,具體在/usr/mysql/debian.cnf中
採用apt-get install mysql-server-5.0安裝mysql,debian系統會自動提示你安裝一些附加的軟件包,可以根據自己的情況選擇安裝。
由於我的debian版本是4.0,以至於python-mysqldb的版本最高僅適合python2.4,而我的項目是基於python2.5的,因此我沒有安裝python-mysqldb的軟件包。
安裝完成後配置mysql.cnf文件:
[client]
#設置客戶端訪問字符集
default-character-set=utf8
[client]
[mysqld]
#設置mysql存儲數據的文件夾目錄。由於我們多采用了MyISAM引擎,因此數據都位於同一個硬盤分區,如果還有其他例如InnoDB引擎,則需要根據引擎特點劃分數據分區
datadir=/home/mysqldata
#設置mysql字符集
default-character-set=utf8
character_set_server=utf8
#只允許從本機直接訪問mysql數據庫
bind-address =127.0.0.1
#根據硬件配置情況,將key_buffer從默認的16M調整爲256M,可加快利用主健的訪問速度
Key_buffer =256M
#16M->2M
Max_allowed_packet =2M
#8->128
Thread_cache_size =128
#64->512
Table_cache =512
#16M->32M
Query_cache_size =32M
在最底下加入:
skip-name-resolve
back_log=200
sort_buffer_size=4M
read_buffer_size=4M
log-slow-queries=slow.log #用來分析執行比較緩慢的sql語句,可以進行數據庫方面的優化
安裝lighttpd服務器
Apt-get install lighttpd*,選擇適合自己的版本進行安裝。
安裝成功後,lighttpd的默認配置目錄在/etc/lighttpd下面的lighttpd.conf中。
根據系統硬件的配置情況和操作系統特徵,我們對lighttpd進行優化,加入以下:
server.event-handler ="linux-sysepoll"
server.document-root = "/var/www"
server.max-fds =2048
server.stat-cache-engine ="fam"
server.max-keep-alive-requests=512
server.max-keep-alive-idle =30
server.network-backend ="linux-sendfile"
如果安裝出現問題,可以查看/usr/log/lighttpd目錄中的文件,根據項目的錯誤進行排除。
Lighttpd配置django的插件順序如下:
mod_access
mod_alias
mod_compress
mod_rewrite
mod_accesslog
mod_evasive
mod_fastcgi插件將在fastcgi.conf進行配置。
打開/etc/lighttpd/conf-enabled/目錄
vim fastcgi.conf創建或者修改當前文件:
global{server.modules +=("mod_fastcgi") }
#配置phpmysqladmin
$SERVER["socket"]=="IP:端口"{
server.document-root="/var/www/phpmyadmin"
fastcgi.server=(
".php"=>
((
"bin-path"=>"/usr/bin/php-cgi -c /etc/php5/cgi/php.ini",
"socket"=>"tmp/php.socket",
"max-procs"=>2,
"idle-timeout"=>20,
"bin-environment"=>(
"PHP_FCGI_CHILDREN"=>"4",
"PHP_FCGI_MAX_REQUESTS"=>"10000"
),
"bin-copy-environment"=>("PATH","SHELL","USER"),
"broken-scriptfilename"=>"enable"
))
)
}
#配置django項目
$HTTP["host"]=~"(^|/.)artdecochina/.com"{
server.name="域名"
server.document-root="/home/www/web"
server.port=80
fastcgi.server=(
"/artdeco.fcgi" =>
("main"=>(
#"host" =>"127.0.0.1",#tcp/ip訪問方式
#"port" =>3040,
"socket"=>"/tmp/artdeco.sock",#inux管道訪問方式
"check-local" =>"disable",
"bin-path"=>"/home/www/web/artdeco.fcgi",
"max-procs"=>20,
"min=procs"=>10,
"max-children"=>100,
))
)
#alias.url+=("/media/" => "/usr/lib/python2.5/site-packages/django/contrib/admin/media")
url.rewrite-once=(
#"^(/media.*)$"=>"$1/media/",
"^(/.*)$"=>"/artdeco.fcgi$1",
)
server.error-handler-404="/artdeco.fcgi"
}
安裝phpmyadmin
Apt-get install phpmyadmin,系統會根據選項自動安裝相關插件和軟件包,如果沒有,則將/etc/phpmyadmin中文件拷貝至/var/www目錄,lighttpd已近配置好,可直接訪問。
如果權限不足,可利用chown –R或者chmod –R修改訪問權限。
安裝django
Wget下載django,python setup.py install安裝django。
安裝python-mysqldb
Wget下載python-mysqldb for python2.5源碼。
運行python setup.py build
進行編譯
這一步可能出現許多問題,常見的有
問題1:fatal: library -lmysqlclient_r: not found
這是因爲當前平臺上沒有thread-safe library造成的。
解決辦法是,在site.cfg文件中設置:
threadsafe = False
問題2:mysql.h: No such file or directory
這是因爲找不到mysql.h這個文件,一般來說,文件都存放在mysql安裝目錄的include目錄下。
解決辦法是,在site.cfg中指定mysql的路徑。
另外需要注意的是,在編譯時,一定要保證mysql安裝目錄中/bin目錄下的文件都在PATH中,否則無法編譯通過。
接下來執行
python setup.py install
安裝完成。
比較詭異的是,有時即使安裝完成,在python中執行
import MySQLdb
仍然可能出錯:
libmysqlclient.so.12: cannot open shared object file: No such file or directory
遇到這種問題,需要在/usr/lib/下爲libmysqlclient.so.12設置一個符號鏈接(這裏假設mysql安裝在/usr/local/mysql下)
ln -s /usr/lib/mysql/lib/libmysqlclient.so /usr/lib/libmysqlclient.so.12
再次執行
import MySQLdb
成功。
安裝python-Imaging(Pil)
Wget python-Imageing源碼進行編譯
執行python setup.py build測試,查看缺少的模塊進行安裝
分配安裝各個模塊成功後,也有可能無法執行,需要對setup.py中相關目錄進行設置
FREETYPE_ROOT = None
PEG_ROOT = "/usr/local/src/jpeg-6b"
TIFF_ROOT = None
ZLIB_ROOT = None
TCL_ROOT = "/usr/include/tcl8.4"
安裝python-flup1.0+版本
Wget flup源碼
Python setup.py install順利安裝
安裝simple-json2.08
Wget simple-json源碼,
python setup.py install 順利安裝
項目實施
設置fcgi文件
#!/usr/bin/python
#coding=utf-8
import sys,os
sys.path.insert(0,"/home/www")
os.chdir("/home/www/web")
os.environ['DJANGO_SETTINGS_MODULE']="settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded",daemonize="false")
配置項目settings文件中緩存選項
SESSION_COOKIE_AGE=60*60 #session過期時間
#緩存引擎
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
#session緩存
SESSION_CACHE = 'memcached://127.0.0.1:11211/' #
#數據緩存
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
#關閉瀏覽器session過期
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
#session作用範圍
SESSION_COOKIE_DOMAIN='.域名
安裝memcached服務
Apt-get install memcached服務
Apt-get install python-memcached訪問api
配置memcached服務器:
vim /etc/memcached.conf
#最大緩存64M內存
-m 64
#訪問端口11211
-p 11211
#只允許本地訪問
-l 127.0.0.1
其他可能出現的問題
出現錯誤:
2009-02-22 06:09:47: (log.c.97) server started
2009-02-22 06:09:47: (mod_fastcgi.c.1051) the fastcgi-backend /work/www/test/main.py failed to start:
2009-02-22 06:09:47: (mod_fastcgi.c.1055) child exited with status 1 /work/www/test/main.py
2009-02-22 06:09:47: (mod_fastcgi.c.1058) If you're trying to run PHP as a FastCGI backend, make sure you're using the FastCGI-enabled version.
You can find out if it is the right one by executing 'php -v' and it should display '(cgi-fcgi)' in the output, NOT '(cgi)' NOR '(cli)'.
For more information, check http://trac.lighttpd.net/trac/wiki/Docs%3AModFastCGI#preparing-php-as-a-fastcgi-programIf this is PHP on Gentoo, add 'fastcgi' to the USE flags.
2009-02-22 06:09:47: (mod_fastcgi.c.1365) [ERROR]: spawning fcgi failed.
出現原因:可能是python/lib文件中的egg文件異常或者混亂引起
egg 也有緩存?幹啥用滴? 暫且不管幹什麼用的,爲什麼默認要把 PYTHON_EGG_CACHE 設置到 /root 目錄下呢,因爲我是以 root 用戶安裝的?好傻。 用 baidu 和 google 查找“The following error occurred while trying to extract file(s) to the Python egg”,結果就多了。 可以修改緩存文件夾的位置或權限,也可以把 egg 直接解壓。 權限已經讓我糾結這麼久了,我就不用這種方式了,直接解壓: 解壓前先從 easy-install.pth 中刪除 MySQLdb 的 egg 包路徑:
# cd /usr/lib64/python2.5/site-packages/
# mkdir t
# unzip MySQL_python-1.2.2-py2.5-linux-x86_64.egg -d t
# rm MySQL_python-1.2.2-py2.5-linux-x86_64.egg
# mv t MySQL_python-1.2.2-py2.5-linux-x86_64.egg
從 sys.path 中可以看到,我的 flup 也是 egg,順帶也把它解壓了:
# mkdir t
# unzip flup-1.0.1-py2.5.egg -d t
# rm flup-1.0.1-py2.5.egg
# mv t flup-1.0.1-py2.5.egg
暫時服務器處於測試狀態,請高手們手下留情,互相交流一下這方面經驗。
可訪問:http://eshop.artdecochina.com