0x00 什么是Mezzanine
它是一个基于django的内容管理平台(content management platform),组成简单,可扩展性和定制性强,特别适合小型的个人博客系统。它也提供了类似于wordpress的管理页面、博客发布、图片展示等功能,配置简单,数据库灵活改变。相对于wordpress那样笨重繁多的功能来说,mezzanine显得非常轻巧,但麻雀虽小,五脏俱全,博客系统该有的东西,它都有提供。
官方网站:Mezzanine - The Best Django CMS
0x01 安装依赖环境
接下来我以基于debian发行版的linux系统为例,介绍如何搭建。
首先,确保你安装了python2.7(最好是这个版本),并且已经安装了pip,同时setuptools已经完成了更新。
输入下面的命令完成setuptools的更新:
pip install -U setuptools
接下来,我们安装一些python相关的依赖:
apt-get install python-imaging python-dev
apt-get install libjpeg8 libjpeg8-dev build-dep
如果你用的是centos:
centos: yum install python-imaging python-dev
0x02 安装Mezzanine
方式一,直接通过pip安装:
pip install mezzanine
我失败了,所以选择了下面这种方式,去官方的 github clone文件,手动安装:
mkdir mezzanine-src
cd mezzanine-src
git clone https://github.com/stephenmcd/mezzanine.git
接下来,我们进入到目录中,执行安装命令:
python setup.py install
我在安装的时候特别慢,有些库下载直接超时,如果你也出现这种情况,建议可以考虑手动pip安装那些库。
接下来,创建我们的第一个工程:
mezzanine-project yourproject_name
cd yourproject_name
python manage.py createdb --noinput # 这里用的是默认的SQLite数据库,后面我再说怎么修改
本地把项目跑起来:
python manage.py runserver
这时,你打开浏览器,本地访问 http://127.0.0.1:8000/
就能看到网站了。注意,别用 localhost,它目前并不在mezzanine允许的HOST列表中,所以会报错。
0x03 修改默认数据库
大家刚刚应该注意到了,我说这个项目默认的数据库是SQLite,这个轻量级数据库对一个博客系统来说完全足够了,但有特殊需求怎么办?我如何换成mysql?
Mezzanine 默认支持4种数据库,postgresql_psycopg2 , mysql , sqlite3 和 oracle 。
我们进入工程目录,我的目录大概是这样的:
接着进入 yourproject_name (我的是myproject),编辑 local_settings.py
,
这个注释写的很清楚了,我就不做更多的说明了。
修改完以后,重新执行:
python manage.py createdb --noinput
即可重新创建数据库。
0x04 修改默认的主页
这个主页是不是挺low的?我们的博客系统肯定不能用这么low的主页,比如我想要主页打开就是文章的列表,应该怎么办?
依旧进入到刚刚修改数据库时的那个目录,找到并编辑 urls.py
文件,
看到我划线的地方了吧,去掉划直线那句代码的注释,并把最上面的 HOMEPAGE AS STATIC TEMPLATE 对应的url语句注释起来。还没完,它提示你了,别忘了引入视图函数!
在该文件(urls.py)的开头,加上 import mezzanine.blog.views
,重启项目,你就会发现你的首页变成了 Blog 。
0x05 修改配置信息
大家肯定注意到了,左上角是 Mezzanine ,我想让它显示 MyBlog ,怎么办?
还有,我想要开启一些功能,但是admin管理页面无法做到,怎么办?
肯定不会让你改源代码的,访问:http://mezzanine.jupo.org/docs/configuration.html#default-settings
比如第一个问题,就可以通过配置这个选项来解决:
在 local_settings.py
文件里随便找个地方,加上:
重启服务,你就能看到变化了。
其它的配置也是类似。
0x06 部署
官方其实提供了部署方式,大家只用四级英语的水平看看文档也就明白了。
我这里提供自己的简易部署方式,基于uwsgi + nginx 完成的。因为我上一篇博客也完成了类似的部署,大家可以对照看一下:centos+flask+uwsgi+nginx+supervisor部署小结
首先你要正确安装 uwsgi 和 nginx ,这里我就不细说了,网上有很多。重点是安装完 uwsgi 以后,启动一下看有没有报错(错误会用三个 !!!括起来)。
然后,我们开始配置:
第一步,在第二层工程目录下,也就是和local_settings.py
一个目录下,有个 wsgi.py
,把它拷出来,放到上一层目录,即和manage.py
一个目录下。
第二步,在 manage.py
所在目录下,新建一个 config.ini 文件,内容如下:
[uwsgi]
socket = 127.0.0.1:8001
chdir = /usr/apps/python/myblog/ //改成你的项目根目录
processes = 2
threads = 4
module = wsgi //这里和 wsgi.py 对应
第三步,nginx 配置如下,配置文件里其余的地方不用改:
server {
listen 80;
server_name www.you.com;
access_log /var/log/myblog_access.log;
error_log /var/log/myblog_error.log;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
}
location /static/ {
alias /usr/apps/python/myblog/static/;
}
}
大家观察nginx的配置文件应该注意到了,静态资源文件夹 static 下的文件是不全的,访问时会报404,怎么办?
一种解决方案是把 Mezzanine 框架中的static文件直接拷过来,不过我发现了更好的解决办法,直接执行:
python manage.py collectstatic
第四步,开启服务:
uwsgi config.ini
nginx -s start
观察输出信息,都没报错的话,应该就搞定了。
0x07 小结
忙活了大半天,期间出了一个令我怀疑人生的BUG,无论如何配置nginx,静态资源都是404,后来才发现,不知道什么时候我设置了缓存时间30天,而且还是我在错误配置的时候,所以后面就悲剧了。
当时我就在想,之前写过一篇博客,关于浏览器的缓存头部,还说什么如果黑客给你设置一个极长的缓存时间,那你将活在梦中。
没想到自己竟然亲身体验了一把,缓存真是个好东西。