64 位 FreeBSD 上部署轻量级 Subversion

作者:wiLdGoose 发布时间:May 12, 2010 分类:技术 Technology

其实,我要的只是一个与 Apache 无关的轻量的独立的 Subversion 守护进程,即 svnserve;这次操作系统是 64 位的 FreeBSD 7.2。不知是 64 位的原因还是 7.2 的原因,部署过程非常不顺利。前后陆陆续续地折腾了两个多星期,快把 Google 都搜烂了。期间公司运维的贾同学与杨同学给予了大力帮助,在此表示感谢。

现在我们开始。首先刻录 64 位 FreeBSD 7.2 的第一张 CD,分区,最小化安装,设置 root 密码,添加隶属 wheel 组的普通用户帐户,配置网络与 sshd……一路顺畅无比,十分痛快,不再赘述。

然后使用 ssh 客户端(推荐 PuTTy,它还支持手机塞班操作系统)连接到服务器,验明正身:

svn# uname -a
FreeBSD svn.xx.xxxx.com 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Fri May  1 07:18:07 UTC 2009     root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

接着下载 wget 并安装:

svn# mkdir -p /home/work/src/
svn# cd /home/work/src/
svn# fetch http://ftp.gnu.org/gnu/wget/wget-1.12.tar.gz
svn# tar -xzf wget-1.12.tar.gz
svn# cd wget-1.12.tar.gz
svn# ./configure
svn# make
svn# make install
svn# rehash

然后下载需要的其他安装包,并解压:

svn# cd /home/work/src/
svn# wget -c http://xmlsoft.org/sources/libxml2-2.7.7.tar.gz
svn# wget -c "http://downloads.sourceforge.net/project/expat/expat/2.0.1/expat-2.0.1.tar.gz?use_mirror=cdnetworks-kr-2"
svn# wget -c http://subversion.tigris.org/downloads/subversion-1.6.11.tar.gz
svn# wget -c http://subversion.tigris.org/downloads/subversion-deps-1.6.11.tar.gz
svn# tar -xzf libxml2-2.7.7.tar.gz
svn# tar -xzf expat-2.0.1.tar.gz
svn# tar -xzf subversion-1.6.11.tar.gz
svn# tar -xzf subversion-deps-1.6.11.tar.gz

安装 libxml:

svn# cd /home/work/src/libxml2-2.7.7/
svn# ./configure
svn# make
svn# make install

安装 expat:

svn# cd /home/work/src/expat-2.0.1/
svn# ./configure
svn# make
svn# make install

然后:

ln -s /usr/local/lib/libexpat.so /usr/lib/libexpat.so

进入 subversion 目录,逐个安装依赖包的组件:

svn# cd /home/work/src/subversion-1.6.11/

svn# cd apr
svn# ./configure --prefix=/usr/local/apr LDFLAGS="-L/lib64"
svn# make
svn# make install

svn# cd ../apr-util
svn# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ LDFLAGS="-L/lib64"
svn# make
svn# make install

svn# cd ../zlib
svn# ./configure
svn# make
svn# make install

之前一直安装 serf,方法:

svn# cd ../serf
svn# ./configure --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ LDFLAGS="-L/lib64"
svn# make
svn# make install

无奈它死活就是报错:

/usr/lib/crt1.o(.text+0x8a): In function `_start':
: undefined reference to `main'
*** Error code 1

Stop in /usr/home/work/src/subversion-1.6.11/serf.

结果 Google 了好几天,看了 N 篇老外的帖子,发现如果不搭配 Apache 使用,这个组件可以不安装……

然后 neon 也可以不安装。下面的安装方式或许会报错:

svn# cd ../neon
svn# ./configure --enable-shared --enable-ssl LDFLAGS="-L/lib64"
svn# make
svn# make install

其实这个 sqlite 也可以不安装:

svn# cd ../sqlite-amalgamation
svn# ./configure --prefix=/usr/local/sqlite
svn# make
svn# make install

记得不要写到 Subversion 的编译参数里面。“--without-sqlite”也不行,会报错。

最后可以安装 Subversion 了:

svn# cd ..
svn# ./configure --prefix=/usr/local/subversion --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr-util/bin/apu-1-config --with-ssl --with-zlib=/usr/lib --without-serf --without-berkeley-db --enable-maintainer-mode LDFLAGS="-L/lib64"
svn# make
svn# make install

如果不安装前面的 expat,会报错:

/usr/bin/ld: cannot find -lexpat
*** Error code 1

Stop in /usr/home/work/src/subversion-1.6.11.

安装到此结束,如果没有意外报错的话——恭喜你,可以自恋一下了:

svn# /usr/local/subversion/bin/svnserve --version
svnserve, version 1.6.11 (r934486)
   compiled May 12 2010, 04:25:34

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository back-end (FS) modules are available:

* fs_fs : Module for working with a plain file (FSFS) repository.

启动方式就不多说了,手册上写得非常清楚。需要智能化脚本的,也可以 Google 到。

部署结束,感谢收看。

解决 Typecho 在 Godaddy 主机上的重写问题

作者:wiLdGoose 发布时间:November 12, 2009 分类:技术 Technology

前段时间将博客从独立服务器迁移到了 Godaddy 的主机上,顺便从 Magike 换到了 Typecho。期间先将 Magike 迁移到 Godaddy 的主机上测试,然后将本地安装好的 Typecho 迁移到 Godaddy 的主机上测试,最后在 Godaddy 主机上全新安装 Typecho,整个过程始终被一个诡异的问题所困扰,即重写无法生效。

这个问题源于 Godaddy 主机环境使用的 Apache 版本和 Magike、Typecho 本身使用的 Rewrite 机制。经过自己反复折腾和反复骚扰 70 同学后均没有彻底解决问题,最后易先生眼看自己的博客也受到了影响,于是才亲自动手搞定。

这个问题是这样的:

首先,Godaddy 主机的 Apache 版本是 1.3.33。假设 Magike 或 Typecho 没有开启伪静态,在处理类似 https://www.xuchao.org/index.php/archives/1/ 这样的地址时,服务器会在
/index.php/archives/1/ 这个目录里找 index.php 然后来执行,并不会带上 /archives/1/
这个参数,所以点到哪都是首页。若 Magike 或 Typecho 开启了伪静态,浏览器则会接收到 404 错误。

要解决这个问题,大致有两种方案:
1、改变 Magike 和 Typecho 的 URL 传参形式,及程序获得参数的方法;
2、通过升级 Apache 版本等方式,解决服务器对 Magike 和 Typecho 的 URL 的识别。

很显然,在一个租用环境中无法做到第二点。因此只能考虑调整 Magike 和 Typecho 的 URL 解析的函数。

最后问题是这样解决的:

1、Magike

在根目录 index.php 的 include('./core/core.php'); 这行前面加上如下代码:

$baseInfo = @explode('?', $_SERVER['REQUEST_URI'], 2);
if (is_array($baseInfo))
{
        $_SERVER['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
        $_SERVER['PATH_INFO'] = $baseInfo[0];
        unset($_GET);
        if ($baseInfo[1])
        {
                $getInfo = @explode('&', $baseInfo[1]);
                foreach ($getInfo as $v)
                {
                        $getInfo2 = @explode('=', $v);
                        $_GET[$getInfo2[0]] = $getInfo2[1];
                }
        }
}

如果启用了伪静态,则需要修改 .htaccess 文件如下:

RewriteEngine On
RewriteBase /
RewriteRule index(\.)php/(.*) /index.php?/$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

2、Typecho

在根目录 index.php 的 Typecho_Plugin::factory('index.php')->begin(); 这行前面加上上面一样的代码,若需伪静态,.htaccess 文件也一样。

值得庆幸地是,以上问题仅存在于 Magike 和 Typecho 0.6 以下(含)版本,最新的 Typecho 0.7 正式版已完全解决此问题。

问题解决,立此存照。感谢易先生的帮助与 70 同学的辛勤耕耘。

2013 年 4 月 13 日更新:关闭本篇文章评论,垃圾太多。

新网(Xinnet.com)首页被挂马

作者:wiLdGoose 发布时间:July 25, 2009 分类:技术 Technology

2009 年 7 月 25 日晚 20 点左右,我正要打开新网代理商平台准备注册几个域名,突然 NOD32 跳出来报警。我觉得蹊跷,直接打开新网首页,发现 NOD32 依旧提示木马。如下图所示,点击小图可以欣赏到高清、无码、激情的大图。

分析首页 HTML 代码可以看到是新网公告这个二级域名下被挂了马:

阅读剩余部分...

解决 sendmail 邮件队列文件的磁盘溢出问题

作者:wiLdGoose 发布时间:June 22, 2009 分类:技术 Technology

最近准备重新回归运维,很好。前一阵子易先生打电话说服务器上 session 失效,他在公司又不方便 ssh 上去看。于是我为了自己的博客勉为其难上去看了一下,结果发现 /var 下面居然爆满溢出了。

www# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    989M     59M    851M     7%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1d    989M    2.2M    908M     0%    /tmp
/dev/ad0s1e     19G    1.6G     16G     9%    /usr
/dev/ad0s1f    989M    910M   -384K   100%    /var
/dev/ad0s1g    124G    1.7G    113G     2%    /www
/dev/ad2s1d    9.7G    1.4G    7.5G    16%    /database
/dev/ad2s1e    139G     42G     85G    33%    /backup

在啧啧称赞之外,准备找出在 /var 下面所有大于 1MB 的文件:

www# find /var -xdev -size +2048 -ls| sort -r +6

这个搜索结果是相当的恐怖,可以用眼花缭乱来形容当时的屏幕滚动。强行中止后发现绝大部分文件都集中在 /var/spool/clientmqueue 这个目录下面。那么这到底是个什么目录呢?

原来,当使用 sendmail 发邮件,或者系统默认要发邮件(譬如 crontab)的时候,首先会把邮件复制到这个目录里,然后等待 MTA 处理。MTA 做的事情就是把这个目录中的邮件转移到 /var/spool/mqueue,然后再发往目的地。

在 /var/spool/clientmqueue 下产生大量文件的情况,通常是因为没有合适的 MTA 来发送邮件,于是都堆积在这里了。假如这里的邮件并不是你需要的,比如由 crontab 产生的信,你可以简单地删除。

还有一种情况,当这个目录下面的文件数量足够多的时候,直接 rm -f * 的话会被提示 Argument list too long。没事,下面两个命令会帮助你搞定问题:

find /var/spool/clientmqueue/ -type f –delete

或者

find /var/spool/clientmqueue/ -type f -exec rm {} \+

不过这两条命令要求 find 的版本较新,如果你的文件版本较低,可尝试:

find /var/spool/clientmqueue/ -type f -exec rm {} \;

到这里,我们已经搞明白 /var 爆满的原因。可以判断的是,易先生服务器的问题就在于系统中有用户启用了 crontab,且 crontab 中执行的程序有输出内容。这些内容会以邮件形式发给 crontab 的用户,而 sendmail 又没有启动,所以就大量产生了这些队列文件。

解决的办法很简单,在 crontab 中命令的最后加上:

>/dev/null 2>&1

这样输出的内容会被直接抛弃,问题就得以解决了。

最后也顺便提一下禁用 sendmail 的事情。本地 MTA 正确工作是 Unix 系统正确工作的一个必要条件。盲目禁止 sendmail 意味着对安全的不关注。如果你不打算启动任何邮件服务,就不应该使用 sendmail_enable="NONE",而应使用 sendmail_enable="NO"。

当然,你也可以考虑用下面的办法来彻底消除其影响,但我认为没什么必要。在 /etc/make.conf 中加入:

NO_SENDMAIL=yes
INSTALL=install

然后 make buildworld installworld,然后用 find 删除 lib、libexec、usr/bin、usr/sbin 等目录中没有被碰过的文件,最后删除 /etc/mail、/etc/rc.d/sendmail 等文件。这个方法来源于网络,没有亲自实验,请谨慎操作。

MySQL 安装后配置细节及 PureFTPd 报错处理

作者:wiLdGoose 发布时间:March 4, 2009 分类:技术 Technology

易先生的要求,我对《快速搭建 FAMP 环境》一文作如下补充。

对 MySQL 依次进行 configure、make、make install 后,还需要执行初始化数据库、配置权限等操作,具体如下:

www# /usr/local/mysql/bin/script/mysql_install_db --user=mysql

www# pw groupadd mysql
www# pw useradd mysql -g mysql -s /sbin/nologin

www# chown -R mysql:mysql /usr/local/mysql/var

www# /usr/local/mysql/bin/mysqld_safe --user=mysql &

安装 PureFTPd 的过程简单,不再赘述。但经常能遇到这样的报错:

Shared object "libmysqlclient.so.15" not found, required by "pure-ftpd"

一般遇到这样的情况,可以这样操作:

阅读剩余部分...

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. ...
  9. 13