转到正文

DalianSky's Blog

正在修建中的空中楼阁

存档

标签: mysql

刚才同事打电话说家园的mysql数据库报错,登录服务器一看,原来是家园数据库中的某个出现问题了,具体报错如下:

1
Table './uchgbk/uchome_space' is marked as crashed and should be repaired

提示说家园的帖子uchome_space被标记有问题,需要修复。我记得以前也出现过类似的问题,但是只要点击Phpmyadmin上的repair按纽就自动修复了,但是这次很绝,什么都没有.于是赶快上网查找原因。最终将问题解决。解决方法如下:

找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:

1
myisamchk -c -r ./uchgbk/uchome_space.MYI

然后myisamchk 工具会帮助你恢复数据的索引。好象也不用重新启动mysql,问题就解决了。

问题分析:

1、
错误产生原因,有网友说是频繁查询和更新dede_archives表造成的索引错误,因为我的页面没有静态生成,而是动态页面,因此比较同意这种说法。
还有说法为是MYSQL数据库因为某种原因而受到了损坏,如:数据库服务器突发性的断电、在提在数据库表提供服务时对表的原文件进行某种操作都有可能导致
MYSQL数据库表被损坏而无法读取数据。总之就是因为某些不可测的问题造成表的损坏。

问题的编号为145

2、问题解决办法。

当你试图修复一个被破坏的表的问题时,有三种修复类型。如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次–这通常是上一次修复操作遗留下来的。
这三种修复方法如下所示:

1
2
3
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName

第一种是最快的,用来修复最普通的问题;而最后一种是最慢的,用来修复一些其它方法所不能修复的问题。

检查和修复MySQL数据文件
如果上面的方法无法修复一个被损坏的表,在你放弃之前,你还可以试试下面这两个技巧:

果你怀疑表的索引文件(*.MYI)发生了不可修复的错误,甚至是丢失了这个文件,你可以使用数据文件(*.MYD)和数据格式文件(*.frm)重新生
成它。首先制作一个数据文件(tblName.MYD)的拷贝。重启你的MySQL服务并连接到这个服务上,使用下面的命令删除表的内容:

1
 mysql> DELETE FROM tblName;


删除表的内容的同时,会建立一个新的索引文件。退出登录并重新关闭服务,然后用你刚才保存的数据文件(tblName.MYD)覆盖新的(空)数据文件。
最后,使用myisamchk执行标准的修复(上面的第二种方法),根据表的数据的内容和表的格式文件重新生成索引数据。

如果你的表的
格式文件(tblName.frm)丢失了或者是发生了不可修复的错误,但是你清楚如何使用相应的CREATE
TABLE语句来重新生成这张表,你可以重新生成一个新的.frm文件并和你的数据文件和索引文件(如果索引文件有问题,使用上面的方法重建一个新的)一
起使用。首先制作一个数据和索引文件的拷贝,然后删除原来的文件(删除数据目录下有关这个表的所有记录)。

启动MySQL服务并使用当初的CREATE TABLE文件建立一个新的表。新的.frm文件应该可以正常工作了,但是最好你还是执行一下标准的修复(上面的第二种方法)。
3、myisamchk工具介绍(见mysql的官方手册)

可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。

调用myisamchk的方法:

1
shell> myisamchk [options] tbl_name ...

options指定你想让myisamchk做什么。在后面描述它们。还可以通过调用myisamchk –help得到选项列表。

tbl_name
是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行myisamchk,你必须指定数据库目录的路径,因为myisamchk不知道你的数据
库位于哪儿。实际上,myisamchk不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件拷贝到别处并且在那里执行恢复操
作。

如果你愿意,可以用myisamchk命令行命名几个表。还可以通过命名索引文件(用“ .MYI”后缀)来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的MyISAM表:

1
shell> myisamchk *.MYI

如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:

1
shell> myisamchk /path/to/database_dir/*.MYI

你甚至可以通过为MySQL数据目录的路径指定一个通配符来检查所有的数据库中的所有表:

1
shell> myisamchk /path/to/datadir/*/*.MYI

推荐的快速检查所有MyISAM表的方式是:

1
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI

如果你想要检查所有MyISAM表并修复任何破坏的表,可以使用下面的命令:

1
2
3
4
shell> myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI

该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的详细信息,参见5.9.5.5节,“myisamchk内存使用”。

当你运行myisamchk时,必须确保其它程序不使用表。否则,当你运行myisamchk时,会显示下面的错误消息:

1
warning: clients are using or haven't closed the table properly

这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(例如mysqld服务器)更新的表。

如果mysqld正在运行,你必须通过FLUSH TABLES强制清空仍然在内存中的任何表修改。当你运行myisamchk时,必须确保其它程序不使用表。避免该问题的最容易的方法是使用CHECK TABLE而不用myisamchk来检查表。

Google ReaderGoogle BookmarksFacebookTwitterYahoo BookmarksMySpaceHotmailYahoo MailWordPressYahoo MessengerShare

 

 

前言

1.       看了张宴的《linux版本的Nginx 0.5.33 + PHP 5.2.5》后,马上找了一台服务器测试了一下,然后加了一个线上的discuz的论坛跑了一下,性能非常的卓越,感叹搜遍整个互联网,就是nginx+php唯一的一篇文档。对于他的文档,我认为:写的非常专业,对于php extensions库也分析的非常透彻。但是一篇专业的文档,也存在一些专业带来的麻烦,就是起点有点高,假如要更新里面的软件包和定义自己的目录,势必需要一点波折。另外不知道为何,最近网站老是打不开。情急之下,小弟重新写了一篇freebsd下面的傻瓜式安装文档。

2.       又结合了平时的一些经验,顺便把如何防卸ddos,并通过对系统的优化,如何来进一步提高nginx的并发数做 一些详解。

3.       由于个人能力有限,错误的地方,还请读者谅解


 

一、安装软件前的准备

系统的安装:插入freebsd6.2以上的光盘,最小化安装系统,同时安装好ports

二、手动安装nginx+php

1)        进入系统后,准备cvs更新:

1.         cd /usr/ports/net/cvsup-without-gui

2.         cp /usr/share/examples/cvsup/ports-supfile /etc/ports-supfile

3.         # vi /etc/ports-supfile

将其中的#*default host=CHANGE_THIS.FreeBSD.org一行改为

*default host=cvsup4.FreeBSDchina.org

4.         更新ports

    /usr/local/bin/cvsup -g -L 2 /etc/ports-supfile

2)        安装mysql

#cd /usr/ports/databases/mysql51-server

#make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install clean

#cp /usr/local/share/mysql/my-large.cnf /usr/local/etc/my.cnf   ##mysql的优化参数,也可以手动修改

#rehash

# mysql_install_db –user=mysql          ##初始化mysql

#/usr/local/bin/mysqld_safe &            ##启动mysql

#/usr/local/bin/mysqladmin -u root password ‘newpass    ##修改root密码,newpass是你需要改的密码

关闭mysql可以使用mysqladmin -uroot -p shutdown

3)        安装php

#cd /usr/ports/lang/php5

#make config    ##配置编译参数

[X] CLI        Build CLI version
[X] CGI        Build CGI version
[ ] APACHE     Build Apache module
[ ] DEBUG      Enable debug
[X]] SUHOSIN Enable Suhosin protection system
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6       Enable ipv6 support
[ ] REDIRECT   Enable force-cgi-redirect support (CGI only)
[ ] DISCARD    Enable discard-path support (CGI only)
[X] FASTCGI    Enable fastcgi support (CGI only)
[X] PATHINFO   Enable path-info-check support (CGI only)
#make install clean

# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini   ##cp php.ini配置文件

4)        安装php5-extensions

# cd /usr/ports/lang/php5-extensions/

#make config

Options for php5-extensions 1.1
————————————————-
[X] CURL        CURL support

[X] FTP        FTP support
[X] GD       
[X] GETTEXT
[X] MBSTRING multibyte string support

[X] MCRYPT      Encryption support 
[X] MYSQL

[X] PCRE        Perl Compatible Regular Expression support
[ ] POSIX //
去掉.
[ ] SQLITE //
去掉.

[X] ZIP         ZIP support
[X] ZLIB
# make install clean

5)        安装Zend Optimizer

#cd /usr/ports/devel/ZendOptimizer/

#make                       #不要安装,只需要下载解包

#cd /usr/ports/devel/ZendOptimizer/work/ZendOptimizer-*

#./install-tty               ##会出现一个文字的安装界面,只是最后一步,不要选择apache就可以了

#vi /usr/local/etc/php.ini          #插入zend的路径,一般来说,上面的安装会自动加入下面的文字,假如没有,请手动添加。

 

[Zend]

zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.0

zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.0

zend_optimizer.version=3.3.0a

zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so

zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so

 

小提示:安装zend,在freebsd下面,目前只有支持到php5.1.x,对于php5.2.x还不能支持,因为zend还没有为php5.2.x开发版本,在网上查了好多关于解决此类的问题,但得到的结果是,zend可以顺利安装,phpinfo也显示zend正常了,但程序无法调用,即zend没有工作,也就是目前无法解决,我想只有等到zend php5.2.x的版本后,才可以解决此问题,也希望哪位已经解决此类问题的兄弟,share一下你的经验。假如你非要使用zend,那就请你将php降到5.1.x,或者你不当心已经升级了ports,那建议你可以安装php4.x,毕竟目前php4.x还通用于大部分的环境

6)        安装nginx

#cd /usr/ports/www/nginx/

#make install

7)        安装lighttpd,为了得到fastcgi

# cd /usr/ports/www/lighttpd/

#make install

#rehash

8)         配置nginx

#user   nobody
删除前面的注释#,改成 user   www

#log_format  main  ‘$remote_addr – $remote_user [$time_local] ‘

#                      ‘”$request” $status $body_bytes_sent ‘

#                      ‘”$http_referer” “$http_user_agent”‘;

log_format  main  ‘$remote_addr – $remote_user [$time_local] ‘

                      ‘”$request” $status $body_bytes_sent ‘

                      ‘”$http_referer” “$http_user_agent”‘;

##以上步骤,为了能够正常分析logpvhits,访问量,才设定的,默认的log格式,是无法准确分析出所需要的结果

 

location / {
    root    /usr/local/www/nginx;
    index    index.html index.htm;
}
index.html前面添加一个index.php
location / {
    root    /data/web/www.jk0086.com/htdocs;
    index    index.php index.html index.htm;
}

#location ~ \.php$ {
#    fastcgi_pass    127.0.0.1:9000;
#           fastcgi_index   index.php;
#           fastcgi_param     SCRIPT_FILENAME     /scripts$fastcgi_script.name;
#    include      fastcgi_params;
#}
将前面的#去掉,修改为
location ~ \.php$ {
    fastcgi_pass    127.0.0.1:9000;
           fastcgi_index   index.php;
           fastcgi_param     SCRIPT_FILENAME     /usr/local/etc/nginx$fastcgi_script.name;
    include      fastcgi_params;
}
##
去掉注释,其实就是激活了nginxfastcgi功能,也说明了nginx本身就已经准备用于fastcgi的环境中

 

9)        配置spawn-fcgi,就是一个启动fastcgi命令,使得nginx可以通过9000端口访问(纯粹个人理解-_-

参数说明:监听127.0.0.19000端口,进程数为64(如果服务器内存小于3GB,可以只开启25个进程),用户为www

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -C 64 -f /usr/local/bin/php-cgi

10)     这边请注意启动顺序,先启动fastcgi,再启动nginx

Nginx.conf由于经常需要修改,即经常需要重启nginx,因此这边写了一个启动脚本,请查看:

#!/usr/local/bin/bash

case $1 in

start)

        /usr/local/sbin/nginx

;;

stop)

        killall -9 nginx

;;

test)

        nginx -t -c /usr/local/etc/nginx/nginx.conf

;;

restart)

        ps auxww | grep nginx | grep master | awk ‘{print $2}’ | xargs kill -HUP

;;

show)

        ps -aux|grep nginx

;;

esac

保存为nginx.sh使用方法为:

nginx.sh start   #启动nginx

nginx.sh stop   #停止nginx

nginx.sh restart #重启nginx

nginx.sh test   #测试nginx.conf的准确性

11)     安装phpMyAdmin

#cd /usr/ports/databases/phpmyadmin

#make install

#mv /usr/local/www/phpmyadmin /data/web/ www.jk0086.com/htdocs/

#cd /data/web/www.jk0086.com/htdocs/phpmyadmin

#vi config.inc.php   ##这边要说明一下,freebsd默认安装的phpmyadmin,里面配置文件有问题,需要手动修改,请修改成如下内容:

<?php

 

 

 

/* $Id: config.sample.inc.php 9689 2006-11-10 20:05:49Z nijel $ */

 

// vim: expandtab sw=4 ts=4 sts=4:

 

 

 

/**

 

 * phpMyAdmin sample configuration, you can use it as base for

 

 * manual configuration. For easier setup you can use scripts/setup.php

 

 *

 

 * All directives are explained in Documentation.html and on phpMyAdmin

 

 * wiki <http://wiki.cihar.com>.

 

 */

 

 

 

/*

 

 * This is needed for cookie based authentication to encrypt password in

 

 * cookie

 

 */

 

$cfg['blowfish_secret'] = ‘asdf:LKJ’; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

 

 

 

/*

 

 * Servers configuration

 

 */

 

$i = 0;

 

 

 

/*

 

 * First server

 

 */

 

$i++;

 

/* Authentication type */

 

$cfg['Servers'][$i]['auth_type'] = ‘cookie’;

 

/* Server parameters */

 

$cfg['Servers'][$i]['host'] = ‘localhost’;

 

$cfg['Servers'][$i]['connect_type'] = ‘tcp’;

 

$cfg['Servers'][$i]['compress'] = false;

 

/* Select mysqli if your server has it */

 

$cfg['Servers'][$i]['extension'] = ‘mysql’;

 

/* User for advanced features */

 

// $cfg['Servers'][$i]['controluser'] = ‘pam’;

 

// $cfg['Servers'][$i]['controlpass'] = ‘pampasswd’;

 

/* Advanced phpMyAdmin features */

 

// $cfg['Servers'][$i]['pmadb'] = ‘phpmyadmin’;

 

// $cfg['Servers'][$i]['bookmarktable'] = ‘pma_bookmark’;

 

// $cfg['Servers'][$i]['relation'] = ‘pma_relation’;

 

// $cfg['Servers'][$i]['table_info'] = ‘pma_table_info’;

 

// $cfg['Servers'][$i]['table_coords'] = ‘pma_table_coords’;

 

// $cfg['Servers'][$i]['pdf_pages'] = ‘pma_pdf_pages’;

 

// $cfg['Servers'][$i]['column_info'] = ‘pma_column_info’;

 

// $cfg['Servers'][$i]['history'] = ‘pma_history’;

 

// $cfg['Servers'][$i]['designer_coords'] = ‘pma_designer_coords’;

 

 

 

/*

 

 * End of servers configuration

 

 */

 

 

 

/*

 

 * Directories for saving/loading files from server

 

 */

 

$cfg['UploadDir'] = ”;

 

$cfg['SaveDir'] = ”;

 

 

 

?>

 

 

以上只是一个配置文件,当你打开Phpmyadmin的时候,会提示你输入用户名密码,然后登陆数据库,相对比较安全的

 

 

三、系统优化+防止ddos

1)        这个话题有点大,我相信我做的只是其中很小的一部分,同时很多人也会问我,是不是要编译内核,这边的回答是不需要编译任何内核,只需要copy文件,然后重启一下服务器就可以了。

2)        加载文件修改

# vi /boot/loader.conf    #加入如下文本

kern.dfldsiz=”2147483648″               # Set the initial data size limit

kern.maxdsiz=”2147483648″               # Set the max data size

kern.ipc.nmbclusters=”0″        # Set the number of mbuf clusters

kern.ipc.nsfbufs=”66560″                # Set the number of sendfile(2) bufs

##解释:

a.  第一,第二行主要是为了突破1G内存设置的

b.  第三行其实是bsd的一个bug,当系统并发达到一个数量级的时候,系统会crash,这个是非常糟糕的事情,所幸更改了这个参数后,在高并发的时候,基本可以没有类似情况,当然非常bt的情况,还得进一步想办法

c.  第四行是读取的文件数,如果你下载的文件比较大,且比较多,加大这个参数,是非常爽的

 

3)        Sysctl修改

#vi /etc/rc.local

sysctl kern.ipc.maxsockets=100000    ##增加并发的socket,对于ddos很有用

sysctl kern.ipc.somaxconn=65535     ##打开文件数

sysctl net.inet.tcp.msl=2500          ##timeout时间

 

 

4)        通过上述的简单优化,会给你带来意外的惊喜,如果有兴趣的兄弟,可以尝试一下看看,绝无副作用。

 

四、其他

1)        加速ports安装

#vi /etc/make.conf     ##加入如下

MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/

MASTER_SITE_OVERRIDE?=http://ports.cn.freebsd.org/${DIST_SUBDIR}/

 

2)        Freebsd颜色显示

secureCRT设置:仿真:终端->linux>勾选ANSI颜色–>确定

#vi /etc/csh.cshrc    ##加入如下

setenv LSCOLORS ExGxFxdxCxegedabagExEx

setenv CLICOLOR yes

#cd /usr/ports/edit/vim;make install

#echo “syntax on”>/root/.vimrc

#echo “alias vi        vim” >>/root/.cshrc

##颜色主要是靠vim来显示的,因此需要安装vim,然后把vi aliasvim就可以了

3)        Other。。。。。。。。更新中

 

 本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68301/showart_1074584.html

Google ReaderGoogle BookmarksFacebookTwitterYahoo BookmarksMySpaceHotmailYahoo MailWordPressYahoo MessengerShare

 

 用惯了proftpd,本来打算用pureftpd的,后来想想算了。proftpd虚拟用户的配置其实很早就解决了,只是虚拟用户和本地用户同时登录,一直没有解决。于是趁这个机会仔细研究了下。依然是debian下面的配置。

参考站点:HowtoForge  上面有很多server的配置,各种平台下,从debian到redhat,以及suse,mandriva都有,非常详细。强烈推荐。

安装mysql和phpmyadmin,其中phpmyadmin不是必需的

apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin apache2

为mysql设置root密码

mysqladmin -u root password yourrootsqlpassword

如果需要其他人访问本机的mysql,同样需要设置密码

mysqladmin -h server1.example.com -u root password yourrootsqlpassword

安装带mysql支持的proftpd,注意选择proftpd工作在standalone模式

apt-get install proftpd-mysql

建立虚拟用户组,这个是为了把proftpd用户虚拟到本机的一个用户上。注意下面的2001修改为自定义的。

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c “proftpd user” -g ftpgroup ftpuser

建立proftpd使用的mysql数据库,并创建数据表。

bt:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.0.32-Debian_7etch1-log Debian etch distribution

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> create database ftp;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpd’@'localhost’ IDENTIFIED BY ‘password’;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpd’@'localhost.localdomain’ IDENTIFIED BY ‘password’;
Query OK, 0 rows affected (0.00 sec)

mysql> USE ftp;
Database changed
mysql> CREATE TABLE ftpgroup (groupname varchar(16) NOT NULL default ”,gid smallint(6) NOT NULL default ’5500′,members varchar(16) NOT NULL default ”,KEY groupname (groupname)) TYPE=MyISAM COMMENT=’ProFTP group table’;
Query OK, 0 rows affected, 1 warning (0.06 sec)

mysql> CREATE TABLE ftpquotalimits (
-> name varchar(30) default NULL,
-> quota_type enum(‘user’,'group’,'class’,'all’) NOT NULL default ‘user’,
-> per_session enum(‘false’,'true’) NOT NULL default ‘false’,
-> limit_type enum(‘soft’,'hard’) NOT NULL default ‘soft’,
-> bytes_in_avail int(10) unsigned NOT NULL default ’0′,
-> bytes_out_avail int(10) unsigned NOT NULL default ’0′,
-> bytes_xfer_avail int(10) unsigned NOT NULL default ’0′,
-> files_in_avail int(10) unsigned NOT NULL default ’0′,
-> files_out_avail int(10) unsigned NOT NULL default ’0′,
-> files_xfer_avail int(10) unsigned NOT NULL default ’0′
-> ) TYPE=MyISAM;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> CREATE TABLE ftpquotatallies (
-> name varchar(30) NOT NULL default ”,
-> quota_type enum(‘user’,'group’,'class’,'all’) NOT NULL default ‘user’,
-> bytes_in_used int(10) unsigned NOT NULL default ’0′,
-> bytes_out_used int(10) unsigned NOT NULL default ’0′,
-> bytes_xfer_used int(10) unsigned NOT NULL default ’0′,
-> files_in_used int(10) unsigned NOT NULL default ’0′,
-> files_out_used int(10) unsigned NOT NULL default ’0′,
-> files_xfer_used int(10) unsigned NOT NULL default ’0′
-> ) TYPE=MyISAM;

Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> CREATE TABLE ftpuser (
-> id int(10) unsigned NOT NULL auto_increment,
-> userid varchar(32) NOT NULL default ”,
-> passwd varchar(32) NOT NULL default ”,
-> uid smallint(6) NOT NULL default ’5500′,
-> gid smallint(6) NOT NULL default ’5500′,
-> homedir varchar(255) NOT NULL default ”,
-> shell varchar(16) NOT NULL default ‘/sbin/nologin’,
-> count int(11) NOT NULL default ’0′,
-> accessed datetime NOT NULL default ’0000-00-00 00:00:00′,
-> modified datetime NOT NULL default ’0000-00-00 00:00:00′,
-> PRIMARY KEY (id),
-> UNIQUE KEY userid (userid)
-> ) TYPE=MyISAM COMMENT=’ProFTP user table’;

Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> quit;
Bye

然后就是修改proftpd的配置文件了,nano /etc/proftpd/proftpc.conf

首先关闭对ipv6支持

UseIPv6 off

然后增加对mysql的验证支持

DefaultRoot ~

# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups

# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  ftp@localhost proftpd password

# Here we tell ProFTPd the names of the database columns in the “usertable”
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the “grouptable”
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID – otherwise these are 999 each
SQLMinID        500

# create a user’s home directory on demand if it doesn’t exist
SQLHomedirOnDemand on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1, accessed=now() WHERE userid=’%u’” ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u’” ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”

SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”

SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’” ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell off

然后nano /etc/proftpd/modules.conf,注释掉没用的部分,然后重新启动proftpd

#LoadModule mod_sql_postgres.c

/etc/init.d/proftpd restart

建立数据库并测试,强烈推荐这些通过phpmyadmin来进行操作

mysql -u root -p

USE ftp;

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES (‘ftpgroup’, 2001, ‘ftpuser’);

INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES (‘exampleuser’, ‘user’, ‘true’, ‘hard’, 15728640, 0, 0, 0, 0, 0);

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, ‘exampleuser’, ‘secret’, 2001, 2001, ‘/home/www.example.com’, ‘/sbin/nologin’, 0, ”, ”);

quit;

下面是配置匿名用户登录

依然是增加一个用户组

groupadd -g 2002 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c “Anonymous FTP User” -g anonymous_ftp anonymous_ftp

建立登录文件夹,如果想匿名用户和虚拟用户登录到同一个地方,这一步可以略过,在proftpd的配置文件中指定就行了

mkdir /home/anonymous_ftp/incoming
chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming

然后编辑proftpd的配置文件,增加下面部分,然后重新启动。配置文件具体含义不说了

<Anonymous ~anonymous_ftp>
User                                anonymous_ftp
Group                               nogroup
# We want clients to be able to login with “anonymous” as well as “ftp”
UserAlias                        anonymous anonymous_ftp
# Cosmetic changes, all files belongs to ftp user
DirFakeUser        on anonymous_ftp
DirFakeGroup on anonymous_ftp

RequireValidShell                off

# Limit the maximum number of anonymous logins
MaxClients                        10

# We want ‘welcome.msg’ displayed at login, and ‘.message’ displayed
# in each newly chdired directory.
DisplayLogin                        welcome.msg
DisplayFirstChdir                .message

# Limit WRITE everywhere in the anonymous chroot
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>

# Uncomment this if you’re brave.
<Directory incoming>
# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask                                022  022
<Limit READ WRITE>
DenyAll
</Limit>
<Limit STOR>
AllowAll
</Limit>
</Directory>

</Anonymous>

这样就ok了

Google ReaderGoogle BookmarksFacebookTwitterYahoo BookmarksMySpaceHotmailYahoo MailWordPressYahoo MessengerShare