pure-ftpd在CentOS Linux 8下连接MySQL出现的bug:Can't connect to server through'/var/lib/mysql/mysql.sock'

背景

现在(2020.02.26)CentOS Linux 8下通过dnf安装的Pure-ftpd默认版本是1.0.49。
这个版本的Pure-ftpd在使用MySQL认证方式的时候,有个“mysql.sock”相关的bug,如果设置不好,会出现无法使用的情况。

Bug重现如下:

第一步:将MySQL的配置文件/etc/my.cnf:

vi /etc/my.cnf

相关的“mysql.sock”设置如下:

socket = /tmp/mysql.sock

第二步:将Pure-ftpd的配置文件/etc/pure-ftpd/pureftpd-mysql.conf:

vi /etc/pure-ftpd/pureftpd-mysql.conf

相关内容设置如下:

MYSQLSocket      /tmp/mysql.sock

第三步:开启MySQL和Pure-ftpd服务:

systemctl start mysqld
systemctl start pure-ftpd 

第四步:跟踪日志,并开启ftp访问:
跟踪日志:

tail -f /var/log/messages

使用熟悉的任何一个ftp客户端,连接Pure-ftpd的ftp服务,连接一定会失败,日志那边会出现类似以下内容:

[ERROR] The SQL server seems to be down [Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)]

总结及解决方法

Pure-ftpd根本就没有使用咱们配置的“mysql.sock”,它自己使用默认的“mysql.sock”来连接MySQL,想要处理只能通过修改它的源代码解决。为了迅速的部署,咱们就将MySQL的“mysql.sock”改为这个位置来提供服务。

vi /etc/my.cnf

相关的“mysql.sock”设置如下:

socket = /var/lib/mysql/mysql.sock

第二步:将Pure-ftpd的配置文件/etc/pure-ftpd/pureftpd-mysql.conf:

vi /etc/pure-ftpd/pureftpd-mysql.conf

相关内容设置如下:

MYSQLSocket      /var/lib/mysql/mysql.sock

重启 一下MySQL和Pure-ftpd服务:

systemctl restart mysqld
systemctl restart pure-ftpd 

附:DNF安装Pure-FTPd安装+MySQL用户认证过程

MySQL的安装请参考Tristone微博的相关文章,并将MySQL的“mysql.sock”修改为“/var/lib/mysql/mysql.sock”。
Pure-FTPd安装

dnf -y install pure-ftpd

FTP配置文件pure-ftpd.conf

vi /etc/pure-ftpd/pure-ftpd.conf

对应位置做修改如下:

Bind              *,2221
MinUID			80
NoAnonymous                 yes
MySQLConfigFile             /etc/pure-ftpd/pureftpd-mysql.conf
LimitRecursion              20000000 80
MaxClientsNumber            500
VerboseLog                  yes
LogPID                     yes
NoChmod                     yes
NoRename                  yes
ProhibitDotFilesRead        yes
PassivePortRange          30000 50000      #被动模式端口,防火墙要同步开启

Pure-FTPd的MySQL配置文件:

vi /etc/pure-ftpd/pureftpd-mysql.conf

对应位置做修改如下:

MYSQLServer     localhost
MYSQLPort       3306
MYSQLSocket     /var/lib/mysql/mysql.sock
MYSQLUser       pureftpd
MYSQLPassword   pureftpd
MYSQLCrypt      md5
MYSQLDefaultUID 80
MYSQLDefaultGID 80

用你熟悉的方法在MySQL里面进行以下操作:
----新建数据库pureftpd
----创建pureftpd用户,主机名为:localhost
----设置用户pureftpd的密码为pureftpd
执行以下SQL,创建users表,并插入一条数据:

CREATE TABLE `pureftpd`.`users` ( 
       `id` int(32) unsigned NOT NULL auto_increment, 
       `User` varchar(16) NOT NULL default '', 
       `Password` varchar(64) NOT NULL default '', 
       `Uid` varchar(11) NOT NULL default '-1', 
       `Gid` varchar(11) NOT NULL default '-1', 
       `Dir` varchar(128) NOT NULL default '', 
       `QuotaSize` smallint(5) NOT NULL default '0', 
       `QuotaFiles` int(11) NOT NULL default '0', 
       `ULBandwidth` smallint(5) NOT NULL default '0', 
       `DLBandwidth` smallint(5) NOT NULL default '0', 
       `ULRatio` smallint(6) NOT NULL default '0', 
       `DLRatio` smallint(6) NOT NULL default '0', 
       `comment` tinytext NOT NULL, 
       `ipaccess` varchar(15) NOT NULL default '*', 
       `status` enum('0','1') NOT NULL default '0', 
       `create_date` datetime NOT NULL default '1970-01-01 00:00:00',  
       `modify_date` datetime NOT NULL default '1970-01-01 00:00:00',  
       PRIMARY KEY  (`id`,`User`), 
       UNIQUE KEY `User` (`User`) 
       ) ENGINE=MyISAM ;
GRANT ALL PRIVILEGES ON `pureftpd`.* TO 'pureftpd'@'localhost';
flush privileges;
INSERT INTO `pureftpd`.`users` VALUES (1, 'upload', md5('123456'), '80', '80', '/wwwroot', 0, 0, 0, 0, 0, 0, '', '*', '1', '2016-09-28 13:41:33', '2016-09-28 13:41:33');

这样ftp用户名就是:upload,密码:123456,服务器的目录是:/wwwroot,使用的CentOS用户是www(用户ID和组ID都是80)。
将pureftpd负责的目录权限设置一下:

chown -R www:www /wwwroot

PS:Pure-ftpd日志默认存储在:/var/log/messages
启动服务:

systemctl start pure-ftpd

随服务器启动:

systemctl enable pure-ftpd

你可能感兴趣的:(运维,CentOS,MySQL)