debian下安装qmail+clamav+webmail
Posted in LAMP on 2007/11/08 / 评论(0) »
debian下安装软件很简单。
1.首先卸载原来的邮件系统,否则会因为冲突而不能安装qmail.
dpkg -P --force-depends exim4-daemon-heavy
2.安装qmail
qmail的授权协议不允许发布2进制包,
因此debian下只提供了qmail的源码包以及配置文件和编译脚本.
自己编译很简单.
编译会在/tmp/qmail下进行,后会自动安装并删除临时文件.
安装源码包
aptitude install qmail-src
编译并安装
build-qmail     
 build-ucspi-tcp

3.安装vpopmail用mysql管理email帐号
下载 vpopmail的源码包后编译。
http://www.inter7.com/vpopmail/
执行configure之前,需要先添加vpopmail和vchkpw用户组,
配置:
./configure \
--enable-libdir=/usr/lib \
--enable-clear-passwd=y \
--enable-qmail-ext \
--enable-passwd=y \
--enable-tcprules-prog=/usr/bin/tcprules \
--enable-auth-module=mysql \  如果不要mysql管理账号可以去掉这一行.
--enable-ip-alias-domains=n \
--enable-roaming-users=y \
--enable-relay-clear-minutes=20 \
--disable-many-domains \
--enable-learn-passwords=y \
--enable-sqwebmail-pass=y
编译安装
make
make install-strip
装完后,修改/etc/tcp.smtp
127.0.0.1:allow,RELAYCLIENT="" 本机允许发信
192.168.:allow,RELAYCLIENT="" 局域网允许发信
:allow
修改/var/qmail/control/me
mail1.anheng.com.cn
修改/var/qmail/control/helohost
mail1.anheng.com.cn ;有些smtp收信服务器要求对端的helo信息跟ip能够对上
修改/var/qmail/control/rc
#!/bin/sh
# Using qmail-local to deliver messages to ~/Mailbox by default.
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir splogger qmail
修改/var/qmail/control/users/assign,里面内容只放一个'.'符号.
.


在mysql建立vpopmail表,以及vpopmail帐号
mysql的帐号放进/home/vpopmail/etc/vpopmail.mysql,以便vpopmail程序使用它们
照如下修改/etc/init.d/qmail让pop3使用vpopmail作认证。

sh -c "start-stop-daemon --start --quiet --user root \
  --exec /usr/bin/tcpserver -- -R -H -U -t 1 -l 0 -c 100\
  0 pop-3 /usr/sbin/qmail-popup anheng.com.cn \
  /home/vpopmail/bin/vchkpw /usr/sbin/qmail-pop3d Maildir &"

4.clamav的安装(可选) 
debian下的qmail的启动脚本对内存占用限制在16M,
如果要用clamav就需要修改到160m
修改/etc/init.d/qmail里面的 ulimit 一行从16384改成163840
clamav-daemon 在我的服务器上安装,跟qmail-scanner配合不成功,所以选择clamav 不用daemon方式
安装程序
aptitude install clamav unzip maildrop
(需要用到maildrop中的mime解码程序)
到sf.net下载qmail-scanner 作为clamavqmail之间的桥梁。
http://jaist.dl.sourceforge.net/sourceforge/qmail-scanner/qmail-scanner-2.01.tgz

aptitude install unzip 安装unzip

qmail-scanner的安装需要setuidgid这个程序,这个程序存在于daemontools软件包中,
debian没有包含这个软件包,只包含了它的build工具daemontools-installer
aptitude install daemontools-installer
然后执行 build-daemontools 编译并安装.
安装build工具, 会安装一堆的dev库, 当我们编译完,就可以卸载daemontools-installer,
这时这些dev库就会一同被卸载了.

还要安装一个perl-suid
aptitude install perl-suid

或者只需要perl-suid不需要setuidgid?不确定, 等下次安装确认一下.

tar zxvf qmail-scanner-2.01.tgz
cd qmail-scanner-2.01
./configure #照提示手动建立组和用户,
./configure --install

修改/etc/tcp.smtp,让进入的邮件运行查毒程序
127.0.0.1:allow,RELAYCLIENT="" ;本机邮件不检查
192.168.:allow,RELAYCLIENT="",QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
:allow,QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"

执行/home/vpopmail/bin/clearopensmtp 让tcp.smtp生效。
这就装完了。
要看信件的收发日志, 可以 tail -f /var/log/mail.info
还可以手动修改文件 /var/qmail/bin/qmail-scanner-queue.pl
修改病毒通知邮件地址等.


增加邮件域名: /home/vpopmail/bin/vadddomains aaa.com
增加帐号:/home/vpopmail/bin/vadduser aaa@aaa.com
删除域名 /home/vpopmail/bin/vdeluser aaa@aaa.com

或者直接修改数据库,增加账号和密码.


后续安装:
5.安装sqwebmail,
首先安装sqwebmail
aptitude install sqwebmail

debian中没有带vpopmail的认证模块,这个我们可以自己来做一个. 
或者从ftp://debian.anheng.com.cn下载我做好的deb文件
当然还可以使用mysql认证模块.那样会更简单一些.

首先apt-get source courier-authlib 获取authlib的源代码
在目录debian我们需要改2个文件增加一个文件.
增加/usr/src/courier-authlib-0.58debian/courier-authlib-vchkpw.files 包含一行内容:
/usr/lib/courier-authlib/libauthvchkpw.*
修改rules 把里面的--without-vchkpw 改成--with-vchkpw
修改control 增加一个小结

Package: courier-authlib-vchkpw
Architecture: any
Depends: ${shlibs:Depends}, courier-authlib (>= ${RELUP})
Description: vpopmail support for the Courier authentication library

然后我们编译它生成deb文件.
dpkg-buildpackage -rfakeroot -uc -b
执行完毕后,可以找到../courier-authlib-vchkpw_0.58-4_amd64.deb

安装它 dpkg -i courier-authlib-vchkpw_0.58-4_amd64.deb

修改/etc/courier/authdaemonrc
把多余的authlib模块去掉,
只保留
authmodulelist="authvchkpw"

重启authlib和sqwebmail服务,
/etc/init.d/courier-authdaemon restart
/etc/init.d/sqwebmail restart

运行一下测试
authtest liushiwei@anheng.com.cn *******

ok!
Linux 下java 乱码的 解决
Posted in LAMP on 2007/10/29 / 评论(0) »
假设用的字体是 /usr/share/fonts/truetype/fireflysung.ttf

cd /path/to/jre/lib/fonts
sudo mkdir fallback
cd fallback
sudo ln -s /usr/share/fonts/truetype/fireflysung.ttf .
sudo mkfontdir
sudo mkfontscale

这是最简单的方法,其他方法也有,不过都很麻烦。
Mysql视图
Posted in LAMP on 2007/07/27 / 评论(0) »

修改视图需要create view 和 delete 权限。

表和视图的命令在同一个命名空间中,所以同一个数据库不能有表名和视图名重复。

可以对其他数据库中的表建视图

视图的定义有以下的限制:
1、from子句中不能有子查询
2、select不能指向系统或者用户的变量
3、select不能指向prepared语法参数
4、定义中的表或视图必须存在
5、不能对临时表建视图,也不能建临时视图
6、视图定义中的表名必须已经存在
7、不能在触发器和视图之间建关联


ORDER BY可以用在视图定义中,但是如果访问视图的select中使用的order by,则视图定义中的ORDER BY被忽略。

语法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

ALGORITHM扩展了标准sql,有三个值,默认值是UNDEFINED,预算法则决定了mysql如何处理视图。
对于临时表方式,会将视图的结果放置到临时表中,然后使用临时表执行sql,这样的好处是在临时表建完之后,就会释放在原表上面的锁,这样比MERGE方式更快的释放在访问的表上的锁。
对于UNDEFINED方式,是指有系统自己决定使用临时表方式还是MERGE方式,MERGER方式更高效,且临时表方式不能更新视图的数据。

对于MERGE方式,实际上是把访问视图的SQL拼接到视图本身的sql上面。要求视图的行和表的行之间是一一对应的,如果不存在
这样的一一对应的关系,则会切换到临时表算法。
包含以下关键字的sql,不能使用merge方式:
聚合函数(sum,min,max,count等等)
distinct
group by
having
union或者union all
常量视图

另外,这些视图的纪录也是不能更新和删除的,不能更新和删除纪录的视图除了以上那些情况外,还包括:
select中包含子查询
join
from一个不能更新的视图
from一个表的子查询
算法是临时表的视图

如果视图还想要可以插入纪录,则必须满足以下条件:
视图必须包含基表没有默认值的所有字段
视图列必须是简单的对应表的列,没有在上面进一步的处理。

多于多表视图的可更新性:
首先必须是基于MERGE算法的
表连接必须是内连接
视图中只有一个单表是可以被更新的。

对于多表可更新视图,如果插入其中一个单表是可以的,删除纪录是不允许的

WITH [CASCADED | LOCAL] CHECK OPTION决定了是否允许更新数据使纪录不再满足视图的条件。
这个选项和oracle是类似的
local是只要满足本视图的条件就ok
cascade则是必须满足所有针对该表的所有视图的条件才ok。
如果没有明确是local还是cascade,则默认是cascade。


删除视图:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]

显示视图内容:
SHOW CREATE VIEW view_name

参照完整性(Referential integrity)是数据库设计中一个重要的概念。在系统不同的列表中,当数据库所有参照合法或非合法关联时都会涉及到参照完整性。当参照完整性存在时,任何与不存在记录的关联将变得无效化,由此可防止用户出现各种错误,从而提供更为准确和实用的数据库。

参照完整性通常通过外键(foreign key)的使用而被广泛应用。长久以来,流行工具开源RDBMS MySQL并没有支持外键,原因是这种支持将会降低RDBMS的速度和性能。然而,由于很多用户对参照完整性的优点倍感兴趣,最近MySQL的不同版本都通过新InnoDB列表引擎支持外键。由此,在数据库组成的列表中保持参照完整性将变得非常简单。

为了建立两个MySQL表之间的一个外键关系,必须满足以下三种情况:

  • 两个表必须是InnoDB表类型。
  • 使用在外键关系的域必须为索引型(Index)。
  • 使用在外键关系的域必须与数据类型相似。

例子是理解以上要点的最好方法。如表A所示,建立两个表,其中一个列出动物种类及相应的代码(表名为:species),另一表列出动物园中的动物(表名为:zoo)。现在,我们想通过species关联这两个表,所以我们只需要接受和保存zoo表中包含species表中的合法动物的入口到数据库中。

表A

mysql> CREATE TABLE species (id TINYINT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB;
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO species VALUES (1, 'orangutan'), (2, 'elephant'), (3, 'hippopotamus'), (4, 'yak');
Query OK, 4 rows affected (0.06 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> CREATE TABLE zoo (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_species TINYINT(4) NOT NULL, INDEX (FK_species), FOREIGN KEY (FK_species) REFERENCES species (id), PRIMARY KEY(id)) ENGINE=INNODB;

注意:对于非InnoDB表, FOREIGN KEY 语句将被忽略。

现在,fieldszoo.speciesspecies.id 之间存在一个外键关系。只有相应的zoo.speciespecies.idfield的一个值相匹配,动物表中的入口才可被访问。以下的输出即演示了当你想输入一个Harry Hippopotamus记录,而使用到不合法的species代码:

mysql> INSERT INTO zoo VALUES (1, 'Harry', 5);
ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails

这里,MySQL核查species表以查看species代码是否存在,如果发现不存在,就拒绝该记录。当你输入正确代码的,可以与以上做比较。

mysql> INSERT INTO zoo VALUES (1, 'Harry', 3);
Query OK, 1 row affected (0.06 sec)

这里,MySQL核查species表以查看species代码是否存在,当发现存在,允许记录保存在zoo表中。

为了删除一个外键关系,首先使用SHOW CREATE TABLE找出InnoDB的内部标签,如表B所示:

表 B

+-------+---------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------+
| zoo | CREATE TABLE `zoo` (
`id` int(4) NOT NULL default '0',
`name` varchar(50) NOT NULL default '',
`FK_species` tinyint(4) NOT NULL default '0',
KEY `FK_species` (`FK_species`),
CONSTRAINT `zoo_ibfk_1` FOREIGN KEY (`FK_species`)
REFERENCES `species` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------+

然后使用带有DROP FOREIGN KEY 语句的ALTER TABLE命令,如以下:

mysql> ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;
Query OK, 1 row affected (0.11 sec)
Records: 1 Duplicates: 0 Warnings: 0

为了将一个外键添加到一个现成的表中,使用ADD FOREIGN KEY ALTER TABLE语句指定合适的域作为一个外键:

mysql> ALTER TABLE zoo ADD FOREIGN KEY (FK_species) REFERENCES species (id);
Query OK, 1 rows affected (0.11 sec)
Records: 1 Duplicates: 0 Warnings: 0

如以上例子解释的,外键在捉摸数据入口错误上起着重要的作用,由此可建立更为强健更加集成的数据库。另一方面值得提到的是,执行外键核实是内部资料处理的过程,且不同表之间指定复杂的内部关系可以导致数据库的性能下降。所以,在参照完整性与性能考虑之间找到平衡点相当重要,而使用外键就是能够确保性能与稳健之间的最优结合。

我期望本期的有关外键的介绍对你有所好处,你将会在下回的MySQL数据库设计中感受到外键的好处。编程快乐!

apache添加二级域名
Posted in LAMP on 2007/05/28 / 评论(0) »
<VirtualHost 202.103.57.20>
ServerAdmin zxs@fwcn.com
DocumentRoot  d:/home/fwcn.com/
ServerName www.fwcn.com
ServerAlias fwcn.com wwww.fwcn.com
ErrorLog  logs/www.fwcn.com-error_log
CustomLog logs/www.fwcn.com-access_log  common
ErrorDocument 404 /404.html
</VirtualHost>
分页: 14/20 第一页 上页 9 10 11 12 13 14 15 16 17 18 下页 最后页 [ 显示模式: 摘要 | 列表 ]