【 以下文字转载自 BBSSystem 讨论区 】
发信人: atppp (ATP (Big Mouse)), 信区: BBSSystem
标 题: smthbbs 代码系统技术方面的一些笔记
发信站: 牧场物语 (Sun Mar 14 19:59:33 2004), 转信
主要是一些常见问题的解答,我这东西最开始写给我一个朋友用于建BBS的,也不成
什么系统,而且我们已经解决了的常见问题我可能也没写进来。有问题大家多在smth的
BBSMan_Dev版或者cn.bbs.admin.installbbs新闻组上讨论。另外想知道这篇垃圾的
出处和更新,欢迎到bbs.stanford.edu BBSSystem版的文摘区。
1. WWW方面的一些问题
1.1 上传文件的配置
默认的配置下,上传文件需要有~bbs/boards/_attach/目录。
修改上传文件的大小限制:$WWWROOT$/site.php。还有apache/php的POST限制,
我默认安装的redhat9,相应的就需要修改/etc/php.ini(upload_max_filesize)和
/etc/httpd/conf.d/php.conf(LimitRequestBody)
1.2 救命啊,文件传上去以后和原文件不一样,文件大小也不对
检查httpd.conf和php.conf里面是不是都设置了php过滤。加入PHP支持常用两种
方法,httpd.conf里面增加AddType application/x-httpd-php .php。还有就是
php.conf里面增加SetOutputFilter PHP和SetInputFilter PHP。特别要注意
这两种方法只能取其一,不能同时设置。redhat9默认设置好了php.conf,所以不要在
httpd.conf里面多此一举加上AddType。
1.3 WWW发出来的消息会在'和"前面多加一个\
php.ini里面设置magic_quotes_gpc = Off。或者在相关php里面使用stripslashes
函数。另外也可以使用的方法是在.htaccess里面使用php_flag设置。参照php文档吧。
2. 修改分类讨论区
站点,特别是小站,有的时候会希望更改分类讨论区的设置,比方关掉一个区。
要做这件事情,一般一开始要有一个计划,特别是修改分类之后各个讨论区都划归
什么新的分类。计划好了以后,一般有下面几件事情要做:
1. 修改~bbs/etc/menu.ini,里面有个分类讨论区的东东。
2. 相应的修改bbs2www里面的site.php
3. 源代码里面,site.c要修改定制的seccode,groups,secname,explain,如果你修改
了分区数目,还需要在site.h里面修改定制的SECNUM。弄好了以后就重新make一下。
4. 新的menu.ini生效以后,
5. 如果版面的分类发生了变化,还需要修改讨论区设置,使用新的分区号。
3. email和BBS互通的问题
BBS系统往外发邮件比较简单,似乎主要是配置~bbs/etc/sysconf.ini里面的
MAILSERVER。信件选单可以直接外发邮件,文章可以按F往外转发。
配置BBS接受邮件包括接受用户信件,和将特定邮件直接转发到版面。这个功能
的程序都在mail2bbs目录下面。一般可以修改系统sendmail把发往特定地址的邮件交给
BBS系统去处理。目前我用的是mail2bbs.c,希望玩转qmail2bbs之后写个详细点的说明...
BBS系统可以开POP3服务器供用户下载邮件。程序是daemon/newpop3.c。收件箱
的POP3用户名是id或者id.DIR,发件箱是id.SENT。
4. 转信
下面说说BBS和新闻组转信要做的设置。cn.bbs.admin新闻组每个月1号自动张贴
cn.bbs.* HOWTO,有大量的指导。这里简要说一些要点。
4.1 代码
转信的代码都在源代码的 innbbsd/ 目录。innbbsd/doc/tw/ 下面有一些比较好的
文档可以看看。程序基本功能介绍:
innbbsd 这个程序是个基础,必须最先运行。程序默认监听 internet 7777端口接
受被动转信,还监听一个unix-socket接受后面两个本地程序的请求。
bbslink 这个是发送文章的程序,任何要转信出去的文章都要由它发送。一般在
crontab 里面设置每 5 分钟执行一次。
bbsnnrp 这个是主动转信程序。任何主动转入的文章都由它处理。
4.2 配置和初始测试
转信的配置文件都在 ~bbs/innd/ 目录。如果已经是正式成员可以去cn-bbs.org
网页上看你应该做的设置。在初期测试阶段,配置和测试可以参考cn.bbs.admin组上面
每个月1号自动张贴的 cn.bbs.* HOWTO 里面的
Q6:如何书写bbsname.bbs、newsfeeds.bbs、nodelist.bbs和active文件呢
Q7:如何执行innbbsd呢?
4.3 FAQ
4.3.1 bbslink 说 Segmentation fault(ft)
这问题我碰到过两次,原因都是 bbsname.bbs 里面的那个名字在 nodelist.bbs
里面没有对应项。考虑要不要直接看看bbslink/innbbsd程序做个检查...
4.3.2 被动转信进不来
可以tail一下~bbs/innd/bbslog会看到有用的信息。一般可能的原因是上游没有
喂信给你(联系你上游服务器的管理员);你禁止了上游给你喂信(检查你的
nodelist.bbs里面上游服务器的IP地址对不对;另外~bbs/innd/下面如果有个文件叫
ncmperm.bbs,把它删掉 - 除非你知道这文件是干嘛用的);你的转信对应版面不对
(检查newsfeeds.bbs,改了版名没改这个文件就会出这个问题);还有可能是你重新
配置了某些文件但是没有重新启动 innbbsd(执行 ctlinnbbsd reload 即可)。
4.3.3 最开始主动转信的时候,我不要新闻组上面以前的文章!
执行 bbsnnrp -c news_server active_file(如果打bbsnnrp,帮助信息里面也
有 -c 这个参数的说明)。一般新闻组上面保留最近几个月的文章,如果一般方式执行
主动转信的bbsnnrp程序,就会每次收100篇以前的文章下来。
4.3.4 我怎么看得到cn.bbs.admin上面的文章啊!
有几个办法。可以去新闻组网页版
http://webnews.cn-bbs.org/;或者你也可以
去各大加入转信的BBS站点找相关版面,一般叫做cnAdmin版。
4.3.5 phpbb论坛和新闻组/BBS可以互相转信吗?
可以用NewsSync模块,但是只能做到主动转信。这方面我还在研究中...
5. 编译参数
大多数编译参数应该在 site.h 里面定义。有的时候可以偷懒直接改 default.h。
我只写一些我了解的参数吧。
5.1 程序功能的编译参数
这些编译参数只是一些小系统功能的编译参数,新代码不影响系统的共享内存数据
和系统数据文件,如果你修改了这些编译参数,所需要做的就是:
1. 在src根执行 make; make install;
2. lsof -i :23 | grep LISTEN 看看是什么进程在listen那个端口
3. kill 掉那个进程,然后 /home/bbs/bin/bbsd -p 23。这样做可以不影响当前
登录的用户,但是新登录的用户就已经开始使用新代码了
4. bbs2www/ 或者 libBBS/ 下面的程序如果也被修改了,需要重新启动 httpd。
*) COLOR_ONLINE 文章列表用绿/蓝色显示在线/隐身作者
*) COMMEND_ARTICLE 推荐文章被送往的版面名称
*) HAVE_COLOR_DATE 贴子列表里面显示彩色日期
*) HAVE_CUSTOM_USER_TITLE 呵呵,用户职务说明,参见doc/README.SYSOP
*) IDLE_TIMEOUT telnet方式idle自动断线的秒数
*) MAX_WWW_GUEST_IDLE_TIME wwwguest idle自动断线秒数
*) NEW_COMERS 注册后自动在newcomers版发文
*) MAIL_BBSDOMAIN,NAME_BBS_ENGLISH,NAME_BBS_CHINESE,NAME_BBS_NICK,
BBS_FULL_NAME BBS的中英文名等
*) SHOW_USERIP 参考smth.h/c定义站点自己的显用户IP的函数
*) USE_DEFAULT_READ_PERM,USE_DEFAULT_SEE_PERM 是否使用默认的判断用户
是否可读/可见某个版面的函数...参考default.c自定义。
5.2 涉及到共享内存数据结构的编译参数
这些编译参数涉及到系统共享内存的数据结构,安全的升级办法是
1. make; 解决所有的编译期错误
2. 停掉所有的BBS服务(注意,包括cron里面的!),然后 make install;
3. 清掉共享内存
4. 启动所有的BBS服务。
*) BBSUID, BBSGID 系统里面bbs用户的uid/gid,必须在site.h里面定义
linux下面用bbs身份执行id可以看到。
*) DAY_DELETED_CLEAN 被删除文章在这个天数之后自动被彻底删除(miscd)
*) MAXACTIVE 最大在线用户数
*) MAXBOARD 最大版面数
*) MAXUSERS 最大注册用户数。这个好像系统会自动转换.PASSWD?
*) MAX_GUEST_NUM,WWW_MAX_LOGIN,MAX_WWW_GUEST
5.3 涉及到系统数据文件结构的编译参数
这个改动就大了,嘿嘿。升级方法类似于上面的4.2里面的的步骤,不过在启动所有
BBS服务之前,需要运行文件结构转换的程序。
*) CONV_PASS 如果从fb2k系统升级用户,定义为1。
*) FLOWBANNER,MAXBANNER,BANNERSIZE 底部流动相关
*) HAVE_BIRTHDAY 记录用户的生日/性别信息
*) HAVE_FILEHEADER_DEFINE 不定义这个就应该在site.h里面定义fileheader
*) HAVE_WFORUM 加入wForum支持
*) NUMPERMS等 权限说明等。如果是小添加/修改等往往不需要转换文件
6 一些杂问题
6.0 问问题之前首先检查的一些东东
目录权限:很多问题都出在这里,运行一下 chown -R bbs:bbs ~bbs。另外,推荐
大多数操作都使用bbs用户来执行,除非你非要用root权限。
一些特别弱的问题:
*) ~bbs是什么意思?简单的说就是BBS数据主目录,一般是/home/bbs。
*) 十大统计怎么才能运行起来?参考源代码目录下的contrib/crontab.SMTH和
doc/README.local_utl设置合适的crontab。
6.1 crontab出问题了。明明我直接运行可以,但是放到crontab里面运行不了。
检查这个程序是否需要设置特殊的环境变量,还有是否需要在特定的目录下执行。
另外,还有些人在编辑crontab文件的时候使用了windows类型的编辑器,检查crontab
的行末是\n(linux换行符)还是\r\n(windows换行符)。crontab程序不认\r\n这种
换行符,而将\r作为命令行的最后一个字符。解决办法?...
6.2 crontab怎么设置才能不运行一次就给我发一封信啊
默认的情况下,crond 运行程序发现控制台有输出就会将输出发送给 crontab 里
面 MAILTO 指定的那个用户。你可以在命令行末加上下面的东东
> /dev/null 2>&1
这样,只有程序输出错误的时候才会发出信件。
6.3 到底有哪些文件记录了系统的错误
bbs主目录下面的 usies, user.log, trace 可能都能提供有用的错误信息。
bbsinnd 的出错信息默认在 ~bbs/innd/bbslog,mail2bbs 的在 ~bbs/mail-log。
另外,crond 上的定时程序如果出现错误可能会给 crontab 里面 MAILTO 指定的用户
发信,用 mail 或者 pine 之类的收信看看。httpd 那边出错,一般可以检查 httpd
的 error log。我用的 redhat 9 系统默认的 httpd.conf 配置将 log 放在
/var/log/httpd/ 目录下面。
6.4 自动程序运行不起来,比方十大统计
确认一下~bbs下面有以下几个目录:etc/posts/ bonlinelog/ xml/
6.5 留言版留不了言
确认一下有 ~bbs/etc/notepad_tmp 目录
6.6 怎么合并两个版
基本过程是合并两个版的M.*文件,合并两个版的.DIR文件,然后用gen_title程序
重新产生版面文章的回复结构。其中合并.DIR最简单办法就是cat .DIR1 >> .DIR2,
这样做的话原来版面1的文章就会全部放到最后。
我参考了smth/BBSMan_Dev精华区里面一个程序来合并两个.DIR,合并后文章按照日
期排序。希望写个自动保留/同步reid字段的并版程序...
6.7 “进入所有讨论区”菜单的时候我不想看到二级版面
这么做要出事的...你真要这么做就来问我吧。
--