emlog 更新至 5.1.2 出现的问题 @emlog博客

今天 emlog 博客系统发布了 5.1.2 版本,在更新过程中遇到的问题来总结一下。

1. 从 5.0.1 升级时,执行“up5.0.1to5.1.1.php”升级程序,提示“错误操作:您必须完成升级步骤里的第一步才再进行本操作,详见安装说明”。

解决方法:因为我直接用了 5.1.1 和 5.1.2 的补丁,没有在更新到 5.1.1 之后就升级数据库。将升级程序 (up5.0.1to5.1.1.php) 的 105 行注释掉或删除即可。(请确保是从 5.0.1 升级的,不然要先执行之前的升级程序。)

2. 旧的“代码高亮”插件与新版自带功能冲突,导致“写文章”页面出错,无法载入编辑器。

解决方法:在后台管理页面的“插件”中删除“代码高亮”插件即可。新版 KindEditor 已经带了 prettyprint 代码高亮功能。

3. [W3C Validator 规范错误] (默认主题) 底部 <script>prettyPrint();</script> 缺少 type 属性。

解决方法:修改为 <script type=”text/javascript”> 即可。(位于 content/templates/default/footer.php)

4. [W3C Validator 规范错误] (默认主题) 右侧边栏的 <li> 标签位置错误。

解决方法:在 content/templates/default/module.php 的 79 行后面,插入新行内容 </li> 。应该是作者的小失误吧。

以上所有修改过的文件,可以点击这里下载

由于 emlog 当前没有真正的开源(版本库是托管于 bitbucket 的私有库),<更正>emlog 官微告诉我现在已经开源了,源码在GitHub,不过貌似没有之前版本的提交记录了</更正>,我在本地维护了一个修改版的 emlog 程序,包括一些默认模板和代码的修改,修改后的页面都符合 W3C 标准(可以测试本博客首页和大部分文章,有些文章内容中有错误除外)。如果有兴趣的话,可以联系我索取该版本或直接 pull 我的版本库。

emlog 插件 — 自定义代码 (du9l_emlog_code)

这是我之前做的一个小插件,用于在 emlog 的钩子处插入 HTML 代码,可以用来放置自己的 JavaScript、统计和广告代码。

插件下载:更新官网插件地址(推荐)点击打开,更新百度网盘(推荐)点击打开,本地下载—点击这里下载 0.3版本,发布于2012年11月3日。

注意:1. 下载服务器有防盗链,请链接百度网盘或官网地址。
2. 插件没有提交 emlog 官方列表。请谨慎使用。
3. 下载使用表明您遵守 GNU GPLv3 授权协议。注:官网版本要求 GPLv2 协议,因此两个协议均可以接受。
4. 可以用于 PHP 5.2 以上环境,未使用 5.3 特性。

后台截图:

支持以下钩子处的代码插入(钩子描述来自 emlog 官方博客):

  • index_head:前台头部扩展:可以用于增加前台css样式、加载js等
  • index_footer:首页底部扩展点
  • index_loglist_top:日志列表顶部扩展点,如显示公告等
  • log_related:阅读日志页面扩展点,用于增加日志相关内容(暂不支持参数)
  • navbar:用于扩展导航条,例如相册插件会利用这个挂载点生成一个相册的导航链接
  • comment_reply:回复评论扩展点
  • rss_display:Rss输出扩展
  • diff_side:侧边栏控制扩展点

使用方法:在 emlog 后台插件中上传,成功后在左侧的 “自定义代码” 功能中,点击相应条目编辑并保存即可。支持(不过滤)HTML 且不支持(不会运行)PHP 代码。

使emlog反向输入验证码,回避垃圾评论

最近博客上有好多垃圾评论,我懒得装反垃圾插件,就改了下验证码验证,要求反向输入验证码,机器人或者老外就搞不定啦。

1. 修改验证码保存的Session值,将 /include/lib/checkcode.php 中的15行左右,将:

$_SESSION['code'] = strtoupper($randCode);

改为:

$_SESSION['code'] = strrev(strtoupper($randCode));

这样在判断时,就会以为反过来的字符串(ABCD变成DCBA这样的反过来)是正确的,原本的验证码是错误的。

2. 添加输入验证码的提示,在模板中的 module.php (/content/templates/[模板名]/module.php)文件,找到 blog_comments_post 这个函数,修改其中的内容即可。

官方也有不少反垃圾评论插件,可以直接使用那些插件来过滤大部分国外垃圾评论,打开审核功能和验证码也是很管事的方法。

将Drupal博客迁移到emlog平台

今天终于完成了这个蛋疼的任务,因为实在受不了Drupal的复杂和缓慢了。顺便为了测试一下新浪SAE的效果,就干脆搬到了这个平台上。

下面说一下转换数据、跳转地址的方法。首先,Drupal版本为6.22(就是说版本5和7我都不保证能行),emlog是4.1.0的最新版。要求有一个安装好的emlog,以及Drupal数据库的完整备份,还需要一个支持phpMyAdmin的MySQL数据库做数据中转(我是在本地架设的)。

1. 将Drupal数据库导出,并导入到本地数据库中。假设Drupal的表前缀为drblog_。

2. 安装好emlog,进入后台的“数据”,选择备份到本地。然后将备份也导入本地同一个数据库。假设emlog的表前缀为emlog_。

3. 在本地数据库中执行下面的SQL语句:(我SQL学的很渣,不要吐槽我- -)

INSERT INTO `emlog_sort`(`sid`, `sortname`) 
SELECT `drblog_term_data`.`tid`, `drblog_term_data`.`name` FROM `drblog_term_data`
WHERE `drblog_term_data`.`vid` = (SELECT `drblog_vocabulary`.`vid` FROM `drblog_vocabulary` LIMIT 0,1);
INSERT INTO `emlog_blog` (`gid`, `title`, `date`, `content`, `excerpt`, `author`, `sortid`, `type`, `views`, `hide`)
SELECT `drblog_node`.`nid`, `drblog_node_revisions`.`title`, `drblog_node`.`created`, `drblog_node_revisions`.`body`, `drblog_node_revisions`.`teaser`, 1, `drblog_term_node`.`tid`, 'blog', `drblog_node_counter`.`totalcount`, IF(`drblog_node`.`status`=1, 'n', 'y')
FROM `drblog_node`, `drblog_node_revisions`, `drblog_term_node`, `drblog_node_counter`
WHERE `drblog_node_revisions`.`nid` = `drblog_node`.`nid` AND `drblog_term_node`.`nid` = `drblog_node`.`nid` AND `drblog_node_counter`.`nid` = `drblog_node`.`nid`;
UPDATE `emlog_blog` SET `emlog_blog`.`comnum` =
(SELECT COUNT(*) FROM `drblog_comments` WHERE `drblog_comments`.`nid` = `emlog_blog`.`gid`);
INSERT INTO `emlog_comment`(`cid`, `gid`, `pid`, `date`, `poster`, `comment`, `ip`)
SELECT `cid`, `nid`, `pid`, `timestamp`, `subject`, `comment`, `hostname` FROM `drblog_comments`;

注意:这里根据我的环境编写的,即只有一个用户ID=1,只有一个Taxomony(分类)ID=1,将日志最初发表时间作为日志时间,将评论标题作为emlog中的评论者名称。

4. 将执行完毕的库导出为SQL备份,并按照emlog备份的格式添加头尾、修改好之后,用emlog数据还原即可。

UPDATE: 更新一下用.htaccess将旧地址替换为新地址的代码,这里假设新博客地址就是本博客(t.du9l.com),替换的内容包括分页、文章、分类和作者页面。

  # Moving to SAE
  RewriteCond %{QUERY_STRING} page=([0-9]+)
  RewriteRule ^.*$ http://t.du9l.com/page/%1 [L,R=301]
  RewriteRule ^node/([0-9]+)$ http://t.du9l.com/post/$1 [L,R=301]
  RewriteRule ^blog/([0-9]+)$ http://t.du9l.com/author/$1 [L,R=301]
  RewriteRule ^taxonomy/term/([0-9]+)$ http://t.du9l.com/sort/$1 [L,R=301]
  RewriteRule ^.*$ http://t.du9l.com/ [L,R=301]
  # Moving to SAE

手工配置 Nginx 反向代理 Apache 的全过程

现在很流行这种 LANMP 的组合,因为 Nginx 具有强力的静态文件、并发处理和反向代理能力,而 Apache 具有高安全性的 PHP 解析模块。于是今天自己手工配置了一遍这两个组合。

注意:本文载于小杜博客,因此要求读者在引用、转载、演绎或以其他形式使用本文内容时,必须遵守CC-by-sa协议(在页面顶部或底部均能看到协议大意及全文),按照协议要求对本文来源进行链接、使用和共享。

环境:主机上安装VirtualBox 4.1.2 For Windows,虚拟机为全新安装的Ubuntu Server 11.04(安装了自带的LAMP服务器,Apache 2.2.17 + PHP 5.3.5 + MySQL 5.1.54),软件包全部使用自带(不手动编译),更新源为网易163源。

虚拟机网络与主机桥接,DHCP获取到IP为192.168.1.5。

1. 安装Nginx,很简单,一行命令。Nginx版本为0.8.54。

# sudo apt-get update && sudo apt-get install nginx

2. 为Apache创建两个网站test1.du9l.com、test2.du9l.com(已经在主机上用Hosts解析到192.168.1.5),使其侦听于127.0.0.1:80,并启用网站。(以下只演示test1的配置,test2只需复制过去修改一下即可)

# sudo nano /etc/apache2/sites-available/test1

<VirtualHost 127.0.0.1:80> # 侦听的端口
ServerAdmin test1@localhost
ServerName test1.du9l.com # 绑定的域名
 
DocumentRoot /var/www/test1 # 先创建好这个目录
 
<Directory />
AllowOverride All
</Directory>
 
#ErrorLog ${APACHE_LOG_DIR}/test1.err
#LogLevel warn
#CustomLog ${APACHE_LOG_DIR}/test1.log combined # 这三行是Apache访问和错误日志 请看附录(3)
</VirtualHost>

# sudo a2ensite test1

3. 为Nginx创建同样的网站,侦听于公网IP和端口80(这里是192.168.1.5:80),并启用网站。这里把所有跟反向代理和PHP有关的配置都写入xiaodu.conf,便于重复利用。还是只演示test1,如果还有其他网站,只添加新的文件,无需修改xiaodu.conf。

# sudo nano /etc/nginx/xiaodu.conf

location / {
try_files $uri $uri/ @apache;
}
 
location ~ .php$ { # 这里注意 只对.php结尾的传到代理 如果使用的是过时的.php/xxx传参 请自行修改
proxy_pass http://127.0.0.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
 
location @apache {
proxy_pass http://127.0.0.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} # 凡是带有.php的,或找不到(试图Rewrite)的,都传给127.0.0.1:80的Apache。
 
location ~ /.ht {
deny all;
} # 禁止访问htaccess或htpasswd文件,Apache本身默认有这个配置了。

# sudo nano /etc/nginx/sites-available/test1

server {
listen   192.168.1.5:80;
#listen   [::]:80 default ipv6only=on; ## listen for ipv6 这里没有开IPv6,需要开的话直接去掉开头的#号,Apache里无需任何修改。
 
root /var/www/test1; # 要跟Apache里的一样
index index.html index.htm index.php; # 默认首页 这里的首页(例如index.html)存在的话不会去后台Rewrite,所以一定要想好,是否需要设置
 
server_name test1.du9l.com; # 绑定域名,与Apache里的对应
 
access_log /var/log/nginx/test1.log; # Nginx的访问日志 详见附录(3)
 
include xiaodu.conf; # 包含上面那个公共配置
}

# sudo ln -s /etc/nginx/sites-available/test1 /etc/nginx/sites-enabled/test1

4. 启动(或重启)两个服务,Apache里默认关闭的mod_rewrite也启用。

# sudo a2enmod rewrite

# sudo service apache2 restart

# sudo service nginx restart

5. 测试相关内容:

(1) 基本的静态文件、绑定域名测试:

(2) PHP后台处理测试(没有测MySQL,也没有必要。注意是Apache2Handler):

(3) Rewrite测试(重写到一个PHP文件的QueryString中,Nginx没有启用Rewrite支持):

扩展阅读:

(1) LNMP一键安装包中的LNMPA架构:包含Nginx、Apache、MySQL和PHP的源码编译脚本,并且有一个能自动创建主机的bash脚本,非常给力。 http://www.lnmp.org/lnmpa.html

(2) Nginx官方文档:HttpProxyModule HttpCoreModule http://wiki.nginx.org/。

参考文献:

(1) 《Windows下Nginx……》(来自“车燕冰的博客”) http://blog.sina.com.cn/s/blog_495697e60100v1n5.html 有删改,会写在下面的附录中。

(2) 《Ubuntu用Nginx……》(来自“新风宇宙”) http://www.cnblogs.com/php5/archive/2011/08/19/2146033.html

附录:

(1) Proxy传递的Host用于区分域名,否则会出现400错误。而参考文献1中有一行proxy_redirect off,这行是错误的,因为如果Apache传递了一个301/302跳转,Nginx必须反向地对Location进行处理,默认值default是正确的。

(2) 在参考文献2中后半段描述的问题,部分应用发现自己运行的Apache在非80端口,则会自行加上端口号。如果只将Apache侦听于内部IP端口(如集群中的192.168.或10.段,或单机时的127.段),而将Nginx侦听于外网IP的80端口(默认是全部IP,那样Apache将无法启动),就能完美的解决这个问题。

(3) 关于Apache的日志注意两点:一是会跟Nginx的日志冗余,尤其是访问日志,基本没有必要开,使用上面Nginx配置的日志即可。二是Apache日志如果非要用的话,请自己修改下日志格式,使用LogFormat或CustomLog命令即可,修改时注意要把访客IP地址设为X-Real-IP的地址。

(4) 这里介绍的只是一个基本架构,具体应用时可能有许多变化。例如可以在Nginx配置中设置将js、css等文件缓存多久,或者Apache是一个集群,需要用upstream来做负载均衡。更多优化方法请自行查看官方文档。

注意:本文载于小杜博客,因此要求读者在引用、转载、演绎或以其他形式使用本文内容时,必须遵守CC-by-sa协议(在页面顶部或底部均能看到协议大意及全文),按照协议要求对本文来源进行链接、使用和共享。