障碍排除

### Movable Type 使用手册：障碍排除

« 目录

- 障碍排除

- 我执行 Movable Type 的时候看到 CGI 脚本的源码
- 我祇看到 500 Internal Server Error
- 执行 mt-load.cgi 的时候发生错误
- ``无法加载模版''
- 无法加载 Perl 模块
- 无法显示影像、样式以及文件
- 我一直回到 Movable Type 登入画面
- 我没办法注销！
- 我的 PHP 输出档案需要能被执行
- 我总是没有收到回响的电子邮件通告
- 我的网页服务器没有 sendmail
- 我的主机没有 Image::Magick
- 我重建档案的时候出现了一个关于 .new 档案的错误
- Movable Type 在我所使用的语言中出现错误的编码
- 我不喜欢 MT 中出现的 `404` 错误讯息页面
- 我变更过主机后，现在没办法登入 Movable Type

# 障碍排除

## 我执行 Movable Type 的时候看到 CGI 脚本的源码

当你试图要在你的浏览器里加载 mt.cgi -- 或者是在初始程序里的 mt-load.cgi 或 mt-check.cgi -- 的时候发生了这个错误，那么就是你的网页服务器并没有在组态设定里启用 CGI 脚本支持。

如果你的网站架在其它人的机器上的话，那么你可能得寄信给提供机器的人，并且要求她对你的帐号（或者是对整个网页服务器）开启 CGI 脚本的权限；这件事很不幸地不是你以一人之力就得以完成的。

如果你是在自己的网页服务器上执行，或者说你可以存取网页组态档案 -- 同时也有在修改过组态后重新激活网页服务器的权限 -- 的话，你可以参考这些步骤来在你的网页服务器上启用 CGI 脚本。下列这些指引假设你正在执行 Apache 。

1. 找到 httpd.conf 组态档案，并且以某个编辑器开启。

2. 找到组态服务器上 webroot 的 `Directory` 或 `Location` 区块。

   在这个区块里，加入这一列：

       Options +ExecCGI

3. 在 `Directory` 或 `Location` 区块以外的地方，加入这一列：

       AddHandler cgi-script .cgi

4. 重新激活网页服务器。

CGI 脚本现在应该可以执行了，所以就不会显示出他们的源码了。

## 我祇看到 500 Internal Server Error

`500 Internal Server Error` 是某处出错时所会跑出来的常见网页服务器错误讯息 -- 更精确地来说，是当试图执行 CGI 脚本时出错的时候。

这里列出了如何诊断并修复这个错误的方法：

- 检查是否所有的 CGI 脚本和函式库都以 ASCII 模式上传了？

- 检查是否所有的 CGI 脚本都被设定成正确的权限了？他们应该通通要被设定成 755 ，也就是拥有者具有读取/写入/执行权限，而其它人则具有读取/执行权限。

- 检查机器上的 Perl 路径是否正确。 Perl 路径会在每一个 CGI 脚本的第一列被指定，像是： #!/路径/指到/perl 里， /路径/指到/perl 就是这个路径。通常在 Unix 服务器上，这里会是 #!/usr/bin/perl 。如果在你的机器上用了不同的路径，就得在每一个 CGI 脚本里修改这个值。如果你需要修改这个设定的话，请小心不要移掉每一个档案第一列尾端的 `-w` ；这个设定会启用 Perl 的警告讯息，保持开启会相当重要。

  要得知你的网页服务器上的 Perl 路径，可能得要看看你的主机服务的维护页面。不然如果你有 shell （命令列）帐号，而你又习惯这种接口的话，你也可以登入这个帐号，然后输入：

      $ whereis perl

  这应该会告诉你在你的系统上 Perl 到底在哪里。

- 检查你的网页服务器上的 Perl 版本够不够新？ Movable Type 至少需要 5.004_04 版以上的 Perl ，若使用了更旧版本的 Perl 就会跑出错误讯息。

## 执行 mt-load.cgi 的时候发生错误

如果你执行 mt-load.cgi 的时候看到 `Tie '/path/to/db' failed: No such file or directory` 或者是 `Tie '/path/to/db' failed: Permission denied` 这样的错误讯息，就表是你在 mt.cfg 里面所设定的 DataSource 路径不正确；不然就是你的 db 目录权限设定不正确。

DataSource 设定必须要包含你的 db 目录的完整档案系统路径。你有许多方法可以得知这个路径：

- 如果你在服务器上有 shell 帐号（不管是用 telnte 或者是 SSH ），就可以用命令列工具来得知 db 目录的完整路径。首先先登入到你的 home 目录，然后用 cd 指令来开启你的 db 目录：

      $ cd 我的/db/

  这里的 我的/db/ 是指从你的 home 目录相对的 db 目录路径。接著用 pwd 来直接显示那个目录的完整路径：

      $ pwd

  这个指令会印出完整路径，然后你可以复制下来，再贴到你的 mt.cfg 档案里，当作是 DataSource 的值。

- 如果你没有 shell 帐号的话，你还是可以执行 mt-check.cgi 来得到一些关于 db 目录的消息。请注意：这个作法不会真的告诉你 db 目录的确切路径，而祇会告诉你你的 home 目录的完整路径；不过这么一来你应该就能够补完剩下的部分了。

  用这个方法的时候，把你的浏览器指到你站台上的 mt-check.cgi 网址以执行 mt-check.cgi 。举例来说，如果你的站在位于 http://www.your-site.com/ ，然后你把 Movable Type 的档案都上传到 /mt 目录里，所以你应该键入 http://www.your-site.com/mt/mt-check.cgi 。

  然后在 mt-check.cgi 的执行结果中，找找看应该有一列会像这样：

      Current working directory: /路径/指到/你的/mt/目录

  这也就是你安装 Movable Type 目录的完整路径。从这个路径里，你应该就能够知道你的 db 目录的完整路径了。

如果你得到的错误讯息是 `Permission denied` 的话，通常表示你的 db 目录存取权限不正确。请参考安装指引来看看如何把权限设定成 777 。

## ``无法加载模版''

当你首度用 mt.cgi 程序来检视 Movable Type 应用程序时，如果你看到某个很长的错误讯息，开头像是 `Can't load error template, got error 'Loading template 'error.tmpl' failed` 然后一直接下去。这个现象表示 Movable Type 没办法在你的 tmpl 目录里找到那个档案。

发生这种状况时，请试著这么做：

1. 首先确定你的 tmpl 目录跟 mt.cgi 放在同一个地方；然后在 tmpl 里面还有个叫做 cms 的目录；继续在 cms 里面还有好几个扩展名是 .tmpl 的档案。

   除此之外，也请确定这些目录的名称中，大小写是正确的；这些路径是大小写敏感的，所以例如当你的 FTP 程序把目录名称改成 Cms 的话，就会烂掉。

2. 如果所有的档案都在他们应该在的地方，那么整个状况就会变成是你的网页服务器在不同的工作路径执行 CGI 脚本，然而这些 CGI 脚本根本不在哪里！

   修正这个问题的方法是这样的，首先用文字编辑器开启你的 mt.cfg 档案，然后加入下列这几列：

       TemplatePath /完整/路径/指到/tmpl/

   这里的 /完整/路径/指到/tmpl/ 也就是你的 tmpl 目录的完整路径。

   储存 mt.cfg ，然后试著再执行 mt.cgi 一次。

## 无法加载 Perl 模块

如果当你执行任何 Movable Type 的 CGI 脚本时，收到像是 `Can't locate Some/File.pm in @INC` 的错误讯息，这里的 Some/File.pm 是某个档案的档名，你应该照著下列的步骤来修正这个问题：

1. 首先，你应该执行 mt-check.cgi 来确定 Movable Type 所会用到的 Perl 模块都已经安装在你的网页服务器上了。如果没有的话，请参照安装指引的说明来安装。

2. 确定在你存放 CGI 档案（像是 mt.cgi ）的地方，有一个叫做 lib 的目录，里面应该正好有著刚刚错误讯息理所提到的那个档案（像是Some/File.pm ）。再举个例子说明，以上面那个错误讯息来说，这里应该会有 lib/Some/File.pm 。

   请注意档名对于大小写是有别的，所以如果那个目录其实是 Lib 的话，就会烂掉。另外像是 some/file.pm 也跟 Some/File.pm 不同；后面那个才是正确的，而都是小写的那个在这里则会烂掉。

## 无法显示图片、样式以及文件

当你首度检视 Movable Type 的时候，如果图片跟样式在你的浏览器里没有正确显示出来，那么你得把这些图片、文件和样式给移到不同的位置去。原因是你显然把 Movable Type 安装到你的 cgi-bin 目录里，有可能 -- 祇是推测 --你在你的服务器上就是需要这样做。但是把非 CGI 的档案放到 cgi-bin 目录里却可能会有问题，因为有的时候网页服务器会试著去执行这些图片，就好像在执行其它程序一样。

要修正这个错误，你得重新把图片目录（ images ）、文件目录（ docs ）和样式（ styles.css ）上传到 cgi-bin 之外的其它目录。然后编辑 mt.cfg 档案，加入这一列：

    StaticWebPath /路径/指到/目录/

这里的 /路径/指到/目录/ 是包含有图片和 styles.css 的目录的网址。举例来说，如果 images 位于 /movable-static/images/ ，那么你就该用

    StaticWebPath /movable-static/

这样应该就可以解决这个问题了。

## 我一直回到 Movable Type 登入画面

这个问题是：你可以登入系统并且看到`主选单`，但是不管你按下哪一个链结，画面总是会回到登入画面。

造成这个现象的原因很有可能是因为你浏览器的 cookies 被停用了。 Movable Type 必须使用 cookie 来储存你的认证信息；在这个 cookie 里，你的密码会被单向加密，所以不会有安全性的顾虑。然而如果你不允许这个 cookie 的话， Movable Type 就无从得知你是否已经成功地登入了，所以当你想要做任何事的时候，它都会呈现登入画面。

修正这个错误的方法就是在你的浏览器里启用 cookie 。

## 我没办法注销！

这个问题是：你已经登入 Movable Type 了，但是每当你试图注销以登入成另一个使用者（举例来说）的时候，仍然会登入成你原来的身份。

这很有可能是因为你的浏览器有许多不同版本的 Movable Type 登入 cookie 所致。确实的原因应该是因为这个 cookie 乃是依据网域名称而定的；所以如果你有两个网域名称会存取到同一份 Movable Type ，而你不巧又同时用了这两个网址，那么你就会有两个版本的 Movable Type cookie 。如果其中一个域名是另一个域名的一部份 -- 举例来说，其中一个域名可能是 `www.foo.com` 而另一个是 `foo.com` -- 那么你就需要在两边都注销才是真正的注销。所以你要分别用两个域名加载 Movable Type ，然后都注销。

因为这个原因，你应该保持祇用同一个域名来存取 Movable Type 才对。

## 我的 PHP 输出档案需要能被执行

如果你使用 Movable Type 来产生 PHP 档案的话，某些网页服务器会要求你设定这些档案的执行位元（也就是说这些档案的权限至少应该要是 `755` ）。在预设的情况下，所有由系统产生的档案权限都会是 `666` ，所以你就会看到档案没办法被执行的错误讯息。

要解决这个问题，你得在你的 mt.cfg 档案里加入这一列：

    HTMLPerms 0777

这会把所有由系统建立的档案预设权限设成 `777` ；请注意如果你在 mt.cfg 里还用了 HTMLUmask 设定的话， HTMLPerms 的值就会被 umask 设定加以调整。举例来说，如果你把 HTMLPerms 设成 `0777` ，而把 HTMLUmask 设成 `0022` ，那么所有系统产生出来的档案权限就都会是 `0755` 。

## 我总是没有收到回响的电子邮件通告

注意：这个问题的另一个症状是透过`编辑文章项目`所寄出的通告讯息从来没有真的寄到通告清单里的信箱。

如果你知道有使用者在你的站台发表了回响，而你却没有收到的话，你首先应该要检查你的网志组态，确认是否核选了`有新的回响时寄给我`。

如果你有的话，那么最可能的问题可能就是出在网页服务器上 sendmail 程序的路径了。 Movable Type 会在这三个路径里寻找 sendmail ： /usr/lib/sendmail 、 /usr/sbin/sendmail 和 /usr/ucblib/sendmail 。这也是 Unix 机器上 sendmail 最常见的摆放位置。如果你的 sendmail 放在不同的地方，可以参考下列的指引来告诉 Movable Type 要去哪里找：

1. 判断你的网页服务器上 sendmail 的路径。你可能得询问主机提供者或者是系统管理员才能知道。

2. 在你安装 Movable Type 的目录里，有个叫 mt.cfg 的档案；下载这个档案并用某个编辑器开启它。（如果你习惯使用 shell 的话，其实你就不需要下载这个档案了，而可以直接用 vi 或其它你喜欢的编辑器直接开启。）

3. 在这个档案里加入这一列：

       SendMailPath /路径/指到/sendmail

   这里的 `/路径/指到/sendmail` 就是你在步骤 1 里所得知的 sendmail 路径。

4. 储存 mt.cfg 并且重新上传到你的服务器上。请确定你用了 ASCII （文字）模式上传。（如果你刚刚是用 shell 编辑档案的话，就跳过这一步吧。）

这样就好了；如果 sendmail 的路径正确的话，你现在应该就可以收到新回响的电子邮件通告了。

## 我的网页服务器没有 sendmail

如果你已经用上述的步骤努力试著让 sendmail 运作起来，或者是你知道你的网页服务器并没有 sendmail -- 举例来说， Win32 机器上就不会有 sendmail -- Movable Type 也允许你用 SMTP 来寄出邮件讯息。要这样做之前，你得先安装 Mail::Sendmail 这个 Perl 模块；如果你在 Win32 机器上，那么你可以用 Activestate 的 ppm 工具。执行 ppm ，然后在提示符号里键入

    install Mail::Sendmail

接著 ppm 就会把所有安装模块该做的事做完。如果你使用的不是 Win32 的机器而你需要（或想要）用 SMTP 的话，你可以直接从这里下载这个套件：

    http://www.movabletype.org/cpan/cpan-Mail-Sendmail.tar.gz

把这个压缩档用解压缩程序解开，然后用 FTP 连到你的网页服务器。打开你安装 Movable Type 的目录，然后再打开 extlib 目录；接著建立一个叫做 `Mail` 的新目录，再打开这个 `Mail` 目录，并把压缩档里的 Sendmail.pm 上传到这个 `Mail` 目录里。

在你安装过这个 Mail::Sendmail 之后，你还需要加以组态 Movable Type 来用 SMTP 寄信。首先编辑你的 mt.cfg 档案，然后加入这一列：

    MailTransfer smtp

预设的情况下， Movable Type 会使用你的网页服务器上（也就是在 `localhost` ）的 SMTP 服务器；如果你需要加以更换，就再加入另一列：

    SMTPServer smtp.服务器.的.地址

储存（有需要的话就重新上传）你的 mt.cfg 档案，就完成了。 Movable Type 现在应该会从 SMTP 服务器寄信了。

## 我的主机没有 Image::Magick

有些主机没有 Image::Magick 这个 Perl 模块，所以 Movable Type 没办法建立上传图片的缩图。从 2.3 版的 Movable Type 起，系统开始支持建立缩图的替代方法，也就是使用 NetPBM 工具套件。如果你的系统有 NetPBM 而没有 Image::Magick 的话，你会需要做这些事：

1. 安装 IPC::Run
   你得需要安装 IPC::Run 这个 Perl 模块，这样 Movable Type 才能够拿来跟 NetPBM 工具沟通。从这个网址下载这个档案：

       http://www.movabletype.org/cpan/cpan-IPC-Run.tar.gz

   在你的 FTP 服务器上，在 extlib 数据夹里再建立某个叫做 IPC 的新数据夹，然后把 IPC-Run 套件里的 Run.pm 档案和 Run 数据夹上传到服务器上的 IPC 数据夹里。

2. 编辑 mt.cfg
   编辑你的 mt.cfg 档案，并加入这一列：

       ImageDriver NetPBM

   在预设的情况下， Movable Type 会从下列的路径中寻找 NetPBM 工具： /usr/local/netpbm/bin 、 /usr/local/bin 或 /usr/bin 。如果你需要设定到不同的路径的话，就在 mt.cfg 里面再加入这一列：

       NetPBMPath /路径/指到/netpbm

   储存（有需要的话就重新上传）你的 mt.cfg 档案，这样就好了。

如果你的主机没有 NetPBM ，或者是你是在自己的服务器上执行时，那么你可以从 http://netpbm.sourceforge.net/ 下载并安装 NetPBM 工具套件。如果你偏好（或需要）预先编译过的可执行档，你也可以从 http://sourceforge.net/project/showfiles.php?group_id=7130 下载 Gallery 开发者所提供的可执行档。

## 我重建档案的时候出现了一个关于 .new 档案的错误

当你重建档案的时候， Movable Type 首先会把页面数据写到某个扩展名为 .new 的暂存盘去；举例来说，如果 index.html 正被重建，那么这个暂存盘就会叫 index.html.new 。 Movable Type 这么做是为了要避免损毁你的档案；否则若因为任何原因，重建程序在写入数据途中就被砍掉了，那么这些档案就会不完整，并且在网页浏览器里烂掉。

写入这些暂存盘案的过程会需要把`本机站台路径`目录设定成 777 ；有些使用者不能 -- 或者不愿意 -- 如此大方地设定这个权限，然后就会在 Movable Type 不能写入 .new 暂存盘的时候收到错误讯息。如果这对你来说是个问题的话，你可以关掉使用暂存盘的选项。要这样做的话，首先编辑你的 mt.cfg 档案，然后加入这一列：

    NoTempFiles 1

这会告诉 Movable Type 不要把数据写到暂存盘，然后你重建档案时应该就不再会看到这样的错误讯息了。

## Movable Type 在我所使用的语言中出现错误的编码

把字符编码成 HTML 项目 -- 不论是在编辑或者是使用 encode_html 全域卷标属性 -- 的时候， Movable Type 都使用 HTML::Entities 这个 Perl 模块；不过要是你的服务器上没有这个模块，它就会改用一个简单的编码程序来把 `<` 、 `>` 、 `&` 和 `` 编码成适当的项目。

然而在某些情况下， HTML::Entities 对你的字符却没办法良好运作 -- 这很有可能发生在像是你的字符被编码成不同的字元集（如果你正在使用波兰文、俄文之类的语言书写）。在这种情况下，请编辑你的 mt.cfg 档案，然后加入这一列：

    NoHTMLEntities 1

这会叫 Movable Type 使用它自己的简单编码程序，就不会把特殊字符跟你用的字符混在一起了。

## 我不喜欢 MT 中出现的 `404` 错误讯息页面

Movable Type 套件中，在 Movable Type 主目录里包括了一个 index.html 档案；当你把这个档案上传到你的网页服务器上时，它可以避免使用者看到目录清单的内容。这并不表示著这个档案就能提供防弹安全，但是至少可以避免奇怪的画面。

这个跟著 Movable Type 一并被发行的版本相当的朴素，你很有可能会想要加以改进；你祇需要编辑 index.html 档案就可以了，他就祇是标准的 HTML 档案罢了。

如果你用 Apache 来当你的网页服务器的话，你还可以用不同的技术来避免使用者浏览你的目录清单：

1. 在你安装 Movable Type 的目录里建立一个叫 .htaccess 的档案。

2. 在编辑器里开启这个档案。

3. 在这个档案里增加一行 `Options -Indexes` 。

4. 储存这个档案，然后退出编辑器。

如果你用了这个技术，你就可以从目录里移去 index.html 档案了；网页服务器现在已经会避免检视目录内容清单了。

## 我变更过主机后，现在没办法登入 Movable Type

当你换过主机提供者（或者祇是搬到不同的服务器）后，很有可能两边的服务器用了不同版本的 Berkeley DB library ；这是 Movable Type 用来储存数据用的数据库。当你从一个主机复制 DB 档案到另一个的时候，如果两个主机的 Berkeley DB 版本不同，那么新的主机将没办法读取来自旧主机的档案。

你可以藉由新版数据库所提供的 DB 档案格式转换功能来修好这个问题；要做这件事有许多不同的方法，端视涉入的 Berkeley DB 版本。需要转换的数据就是所有在你的 db 目录里的档案，他们的档名会以 .db 或者 .idx 结尾（至于 .lock 档案则不需要被转换）。

下列的步骤需要用 shell 帐号存取你的服务器，而且你本身要对执行 Unix 命令有一定程度的熟悉才行；如果很不巧你不是这样的人的话，你恐怕得找主机提供者帮你。

1. 首先，也是最重要的一件事就是备份你的 DB 档案；你需要把你 db 目录里所有的档案做一份备份起来。（如果你备份的方法是把他们从目录里下载的话，请确定你用了 binary 模式来传输档案。）

2. 转换 DB 档案最简单的方法就是使用 db_upgrade 程序；很不幸地这并非在每个服务器上都可以用，不过也许刚好你就是有得用也不一定。要一试有无，请先登入你的 shell 帐号，然后在你的 shell 提示符号里键入下列指令（这里的 <db_dir> 是你的 db 目录路径）：

       $ cd <db_dir>
       $ db_upgrade *.db *.idx

   如果你的服务器上有 db_upgrade 可用，这就会把你所有的 DB 档案转换成新的格式。如果成功了，那么你就已经完成了，请跳过后面所有的步骤；此刻 Movable Type 应该可以正常运作了。

3. 如果上面的 db_upgrade 指令没有作用 -- 例如你得到某个错误讯息说 `command not found` -- 那么你就得按照下列的方法来转换你的数据。这个方法会从你的 DB 档案里倾印所有的数据，然后再把这些 DB 档案加载成新的版本。

   用来倾印你的 DB 档案的程序可能叫做 db_dump 或 db_dump185 。要知道你可以用那个程序，首先试著在你的 shell 帐号里执行下列的指令：

       $ cd <db_dir>
       $ db_dump author.db

   如果这个指令成功了，你就会看到数据已成功倾印的讯息；否则你就会得到某个错误讯息；在后面这种情况下，再试试看下列的指令：

       $ db_dump185 author.db

   再一次，如果这个指令成功了，你就会看到数据已成功倾印的讯息。如果这样仍旧失败了，那你就得联络你的主机提供者了。

4. 现在你已经知道要用哪一个 db_dump 程序（可能是 db_dump 或 db_dump185 ）了，所以你可以把所有的数据从你旧的 DBM 档案里请印出来，然后再把这些档案加载成新的版本。请照下列的步骤来做（如果有需要的话，请把所有的 db_dump 替换成 db_dump185 ）：

       $ db_dump -f author.db.data author.db
       $ mv author.db author.db.old
       $ db_load -f author.db.data author.db
       $ chmod 666 author.db

   对每个在你的 db 目录里、以 .db 或 .idx 结尾的的档案，你都需要执行这四个指令。做完这些事后就完成了，现在你的 Movable Type 应该可以正常运作了。

Copyright © 2001-2003 Six Apart. All Rights Reserved.