1.  使用参考

1.1  第三方服务

Joomla 页面列举了一些设计 logo、页面模板、数据迁移等第三方服务的提供商,这些服务 WordPress 基本上也可以用。

1.2  有创意的博客

2.  部分Blog架设软件

由于我的网站空间的限制,我关注的主要是使用php实现的不需数据库的文本后台存储的软件。其他种类的优秀blog软件还有很多。

其他好像还有国人自己制作的符合我的需求的blog程序,由于不确定是否会得到持续的更新以及是否有足够的普及度,因此暂时没有特意关注。

目前听说pmwiki上也有一部分人在试图将blog功能作为一个cookbook模块融合入pmwiki,要是那样简直是完美,但是不知道什么时候才能够实现,希望我真的能够等得及。。

3.  WordPress 使用

3.1  博客数据移植工具

SimplePhpBlog迁移数据到WordPress的Perl脚本(参见原作者页面,为了能正常迁移中文数据,本人对代码进行了少许改动):

3.2  如何用 WordPress 建立保密的家庭博客

主要依赖两个插件:

  • CaPa Protect:WordPress 的权限控制插件,可以默认屏蔽匿名用户查看文章及评论内容等。
  • WordPress Mobile Pack:WordPress 的移动版定制界面,能自动识别浏览器做界面切换。现在有个没能解决的问题是在移动端发文章似乎要求用户必须有管理员权限,仅有普通作者权限好像不行。

为了方便发布内容,可以利用移动 App 来访问,比如 iPhone 上我现在使用 TinyDesktop Writer ,使用体验要比 WordPress 官方的 App 靠谱很多。

  • 建议在服务器端安装 NextGEN Gallery 图片库插件,配合 TinyDesktop Writer 也就又多了一个私有的照片管理工具(可通过手机端上传、管理图库图册等)。

3.3  让 Twitter Widget Pro 插件翻墙读数据(WordPress 使用代理)

步骤1:配置 ShadowSocks 客户端

shadowsocks Python 包自身就带有命令行的客户端实现 sslocal 。可以通过 Python-Pip 安装整个包:

 pip install shadowsocks

运行 sslocal 的时候,我们既可以把配置信息放在命令行参数里,像这样:

 sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法

也可以把配置信息放在命令行参数里,类似这样:

 sslocal -c /etc/shadowsocks.json -d start

总之成功运行之后, sslocal 会在指定的本地端口建立一个 socks5 格式的网络代理。之后想办法让 WordPress 能用上这个代理就行了。

如果希望随服务器自动启动这个服务,那么把如下指令放进 cron 里就可以,ShadowSocks 会自动避免启动多个程序实例。

 /usr/local/bin/sslocal -c /etc/shadowsocks.json -d start

步骤2:socks5 代理转 HTTP 代理

Polipo 是一个轻量级的代理软件,Debian 系列的发行版直接带有这个包,可以直接

 apt-get install polipo

修改 /etc/polipo/config 文件,设置 socksParentProxy 和 socksProxyType 两个参数启用父级代理,也即指向 步骤1 中建立起来的本地 socks5 代理。例如:

socksParentProxy = "127.0.0.1:10890"
socksProxyType = socks5

重启 Polipo 服务,让配置文件的修改生效:

 /etc/init.d/polipo restart

这时 Polipo 已经在 127.0.0.1 的 8123 端口基于父级 socks5 代理创建了一个 HTTP 方式的代理服务了,WordPress 等软件可以调用。

步骤3:配置 WordPress 使用代理访问外部网站

编辑 wp-config.php 文件,在其中增加如下行,让 WordPress 使用代理访问外部网站(原文参考 WordPress Proxysupport ):

// Setting proxy for WordPress:
define('WP_PROXY_HOST', '127.0.0.1');
define('WP_PROXY_PORT', '8123');
define('WP_PROXY_USERNAME', '');
define('WP_PROXY_PASSWORD', '');
define('WP_PROXY_BYPASS_HOSTS', 'localhost, elias.cn');

重启 httpd 服务器进程,这个修改应该就已经生效了。Twitter Widget Pro 应该能够正确访问 Twitter Api 了(可能还需要在插件的配置界面中,让它改为使用 http 接口而不是 https 接口,如果遇到问题的话)。

(已废弃) 旧方法步骤1:墙外服务器上搭建代理服务器

最简单省事就是直接使用 Tinyproxy ,绝大多数 Linux 发行版官方包里就有同名包。 Debian 下安装完毕立即就是限制只有本机能访问的 8888 端口上的 http 代理。我们也不需要给它做权限访问控制,需要用这个代理的时候,用 ssh 隧道连过来就好了。

(已废弃) 旧方法步骤2:在 WordPress 主机上创建稳定的 ssh 隧道访问代理

autossh 就可以建立一个稳定的 ssh 隧道,断线的时候会自动重连。不过我们接下来想办法把它搞成随着系统自动启动的。

让 sshd 服务器使用证书认证方式:

  1. WordPress 主机上使用 ssh-keygen 指令创建证书;
  2. 生成的证书公钥上传到 sshd 服务器: scp .ssh/id_rsa.pub user@ssh.host.name:id_rsa.pub ;
  3. WordPress 主机上把公钥导入 ssh 的认证信息: cat id_rsa.pub >> ~/.ssh/authorized_keys

把 autossh 封装成一个 init.d 的服务,在 /etc/init.d/ 下面建立名为 autossh 的可执行文件,内容如下(不过这段代码有 Bug ,stop 的时候会找不到 autossh 进程,原始代码参考 using autossh as a debian startup daemon to tunnel mysql)(注意,需要修改文件中 DAEMON_ARGS 变量的取值,改成自己的翻墙服务器设置!):

#! /bin/sh

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="autossh for init.d"
NAME=autossh
DAEMON=/usr/bin/autossh
DAEMON_ARGS="-M 0 -f -N -L 8123:127.0.0.1:8888 -p 22 wordpress@209.141.51.232 -t -t"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --stop --pidfile $PIDFILE --oknodo > /dev/null \
                || return 1
        start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile -- $DAEMON_ARGS \
                || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop}" >&2
        exit 3
        ;;
esac

有了这个文件之后可以用 service autossh start 来启动隧道了。

如果要让 autossh 服务更加稳定,可以参考文章 Permanent SSH Tunnels with autossh 中的经验进行参数调整。


4.  对话

larryli 2007 年 01 月 17 日, 02:35 下午
老版的 bo-blog 是 PHP + 纯文本,但后来升级时为了支持 tag 加入了 mysql 做后台数据库。
对于 pmwiki 我一直都很想用,也觉得整体设计很不错,但对我来说存在三个主要问题。

  • 没有相当好的 blog 集成。
  • 没有完善的带有用户注册的权限控制(目前的 pmwiki 本身的权限控制就是基于密码的)。
  • 没有评论功能(给一个 wiki 加上评论,估计除了国人以外谁都不需要吧)。

另外就是我一直对 pmwiki 分目录数据存放没搞明白。如果能支持整站的用户权限,然后可以分子站,子站下可以分目录(比如 blog 数据在 a 目录,wiki 分类 b 在 b 目录),那样就完美了。

Elias 2007 年 01 月 18 日, 05:35 下午

  • 的确PmWiki的Blog实现缺乏很多重要的Blog特性,可以说基本不可用,还得等啊等。
  • 从2.1.24开始,提供了基于用户组的权限管理方式,以前是只有基于用户和基于密码的。详细可以参考http://www.pmwiki.org/wiki/PmWiki/AuthUser 。如果希望用户自己注册的话,可以试试再加上FASTMembership
  • 关于评论,有Discussion TabComments能够实现这个功能,但是感觉Discussion Tab配置比较复杂,还是推荐用Comments实现。
  • PmWiki是站点下面有Group页面组(单层的,不支持多层次分组),组下面有页面(比如这个页面是ComUse.BuildBlog,那么是ComUse组的BuildBlog页面)。如果需要,还可以把多个PmWiki站点组成Wiki Farm进行管理。可以通过修改config.php配置文件让每个组占用一个独立目录。

向你请教一下,怎么用简单快捷的方式引用自己的用户名和当前时间呢?就像你在本页面上这样?

larryli 2007 年 01 月 19 日, 12:18 下午

  • Cookbook 里面的东东太多了,常常看的人不知道需要哪些东西,而且因为 pmwiki 的多样性,常常用户会面临很多选择,这些选择之间也没有简单明了的比较。
  • 数据分组我去测试一下,看到过 config.ini 的说明。
  • 签名的话,在编辑框下面“作者”填上自己的用户名,然后使用 wiki 标准的四波浪号 ~~~~(保存前预览都是好的,一保存就自动转换成签名了)。

Elias 2007 年 01 月 19 日, 12:45 下午
功能丰富是好事,不过CookBook里的东西的确不是很方便找。当我在查询未果的时候(也是经常查不到的,因为同一个意思有不少同义词,选择了不合适的同义词就有可能查不到想要的结果),通常会选择在PmWiki的邮件列表咨询一下其他用户的经验,通常可以获得很有用的消息。很多时候pm先生会亲自回复,都是很管用的看法。

快捷引用自己的用户名和当前时间还真是好用,不过老是不记得是什么符号有这个效果。感谢告知!

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki