CentOS7 FTP服务搭建(vsftpd.conf配置文件详解)

配置文件说明

/etc/vsftpd/vsftpd.conf这个文件是vsftpd服务的核心配置文件!
我们在修改配置文件的时候,最好先备份一份!

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

配置的大致内容:

# 是否允许匿名登录FTP服务器,默认设置为YES允许
# 用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。
# 如不允许匿名访问则设置为NO
anonymous_enable=YES
# 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许
# 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub
# 若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器
local_enable=YES
# 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许
write_enable=YES 
# 掩码,本地用户默认掩码为077
# 你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值
#local_umask=022
# 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES
#anon_upload_enable=YES
# 是否允许匿名用户创建新文件夹
#anon_mkdir_write_enable=YES 
# 是否激活目录欢迎信息功能
# 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息
# 默认情况下,欢迎信息是通过该目录下的.message文件获得的
# 此文件保存自定义的欢迎信息,由用户自己建立
#dirmessage_enable=YES
# 是否让系统自动维护上传和下载的日志文件
# 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定
# 默认值为NO
xferlog_enable=YES
# Make sure PORT transfer connections originate from port 20 (ftp-data).
# 是否设定FTP服务器将启用FTP数据端口的连接请求
# ftp-data数据传输,21为连接控制端口
connect_from_port_20=YES
# 设定是否允许改变上传文件的属主,与下面一个设定项配合使用
# 注意,不推荐使用root用户上传文件
#chown_uploads=YES
# 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名
# 可以把上传的文件都改成root属主。whoever:任何人
#chown_username=whoever
# 设定系统维护记录FTP服务器上传和下载情况的日志文件
# /var/log/vsftpd.log是默认的,也可以另设其它
#xferlog_file=/var/log/vsftpd.log
# 是否以标准xferlog的格式书写传输日志文件
# 默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定
# 默认值为NO
#xferlog_std_format=YES
# 以下是附加配置,添加相应的选项将启用相应的设置
# 是否生成两个相似的日志文件
# 默认在/var/log/xferlog和/var/log/vsftpd.log目录下
# 前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd类型的日志
#dual_log_enable
# 是否将原本输出到/var/log/vsftpd.log中的日志,输出到系统日志
#syslog_enable
# 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒
# 即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改
#idle_session_timeout=600
# 设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改
#data_connection_timeout=120
# 运行vsftpd需要的非特权系统用户,缺省是nobody
#nopriv_user=ftpsecure
# 是否识别异步ABOR请求。
# 如果FTP client会下达“async ABOR”这个指令时,这个设定才需要启用
# 而一般此设定并不安全,所以通常将其取消
#async_abor_enable=YES
# 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
# 启用此选项将允许服务器以ASCII方式传输数据
# 不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击
#ascii_upload_enable=YES
#ascii_download_enable=YES
# 登录FTP服务器时显示的欢迎信息
# 如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后
#ftpd_banner=Welcome to blah FTP service.
# 黑名单设置。如果很讨厌某些email address,就可以使用此设定来取消他的登录权限
# 可以将某些特殊的email address抵挡住。
#deny_email_enable=YES
# 当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器
# 此文件需用户自己创建,一行一个email address即可
#banned_email_file=/etc/vsftpd/banned_emails
# 用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限
# 设置为YES时,用户被锁定在自己的home目录中,vsftpd将在下面chroot_list_file选项值的位置寻找chroot_list文件
# 必须与下面的设置项配合
#chroot_list_enable=YES
# 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录
# 从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立
#chroot_list_file=/etc/vsftpd/chroot_list
# 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O
#ls_recurse_enable=YES
# 是否允许监听。
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=YES
# 设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
# 则必须运行两套vsftpd,采用两套配置文件
# 同时确保其中有一个监听选项是被注释掉的
#listen_ipv6=YES
# 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件
# 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中
#pam_service_name=vsftpd
# 是否允许ftpusers文件中的用户登录FTP服务器,默认为NO
# 若此项设为YES,则user_list文件中的用户允许登录FTP服务器
# 而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有
#userlist_enable=YES/NO
# 设置是否阻扯user_list文件中的用户登录FTP服务器,默认为YES
#userlist_deny=YES/NO
# 是否使用tcp_wrappers作为主机访问控制方式。
# tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制
# 在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制
# 前者设置允许访问记录,后者设置拒绝访问记录。
# 如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令:
# vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY
# 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器
# 此时FTP服务器虽可以PING通,但无法连接
tcp_wrappers=YES

除此之外,还有一些其它常用的控制选项

use_localtime=YES    <==是否使用本地时间,默认为NO(默认使用GMT时间)
listen_port=21    <==vsftpd的端口号,默认为21
pasv_enable=YES    <==是否启用数据的被动模式连接,默认为YES
pasv_min_port=0    <==设置FTP被动模式连接的最小端口。默认为0,表示不受限制
pasv_max_port=0    <==设置FTP被动模式连接的最大端口。默认为0,表示不受限制
connect_timeout=60    <==PORT方式下建立数据连接的超时时间,单位为秒 ,默认为60
accept_timeout=60      <==被动(PASV)数据连接的超时时间,单位为秒,默认值为60
max_clients=0    <==vsftpd允许每个客户端的最大连接数,默认为0,表示不受限制
max_per_ip=0    <==vsftpd允许每个IP的最大连接数,默认为0,表示不受限制
local_max_rate=0    <==本地用户所能使用的最大传输速度。默认为0,表示不受限制
anon_max_rate=0     <==匿名用户所能使用的最大传输速度。默认为0,表示不受限制
anon_world_readable_only=YES    <==仅允许匿名用户具有下载可读文件的权限,默认为YES
anon_other_write_enable=YES    <==是否允许匿名用户具有除了写之外的权限,包括删除与修改文件和目录,默认为NO
ftp_username=ftp            <==定义匿名用户的账户名称,默认值为ftp。
no_anon_password=YES        <==匿名用户登录时是否询问口令。设置为YES,则询问。默认NO
anon_umask=022              <==设置匿名用户新增文档的umask。默认077

userlist_enable和userlist _deny选项不同时

userlist_enable=YES && userlist_deny=YES    <==/etc/vsftpd/user_list中的用户禁止访问
userlist_enable=YES && userlist_deny=NO     <==/etc/vsftpd/user_list中的用户允许访问

②/etc/vsftpd/ftpusers这个文件是禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。
③/etc/vsftpd/user_list这个文件禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。

注意:/etc/vsftpd/ftpuser不受任何配制项的影响,它总是有效,它是一个黑名单。当userlist_enable=YES时,userlist_deny选项才会生效。当userlist_enable=YES,userlist_deny=YES时,user_list是一个黑名单;当userlist_enable=YES,userlist_deny=NO时,user_list是一个白名单。需要提醒的是,使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

传输模式配置

开启被动模式

connect_from_port_20=NO(默认为YES) #设置是否允许主动模式
pasv_enable=YES(默认为YES) #设置是否允许被动模式
pasv_min_port=50000(default:0(use any port))
pasv_max_port=60000(default:0(use any port))

开启主动模式

connect_from_port_20=YES
pasv_enable=NO

上边配置只是开启所需模式要求的,其他配置看实际需求!

用户访问模式配置
vsftpd服务访问模式有三种:匿名用户模式,系统用户模式和虚拟用户模式!

匿名用户配置
Vsftpd默认以匿名用户访问,匿名用户默认访问的FTP服务器端路径为:/var/ftp/pub,匿名用户只有查看权限,无法创建、删除、修改。
这种模式下,不需改动配置文件,直接启动服务即可访问!

如果想要允许匿名用户能够上传、下载、删除文件,需修改/etc/vsftpd/vsftpd.conf配置文件中:

anon_upload_enable=YES               #允许匿名用户上传文件;
anon_mkdir_write_enable=YES          #允许匿名用户创建目录;
anon_other_write_enable=YES          #允许匿名用户其他写入权限。

另外默认Vsftpd匿名用户有两个:anonymousftp,所以匿名用户如果需要上传文件、删除及修改等权限,需要ftp用户对/var/ftp/pub目录有写入权限,使用如下chown和chmod任意一种即可,设置命令如下:

chown -R ftp pub/

如果要关闭匿名用户登录,只需设置:

anonymous_enable=NO

系统用户配置

匿名模式可以让任何人使用ftp服务,比较公开!多适用于共享文件!如果我们想要特定用户使用,就需要使用系统用户登录访问!这种模式,需要我们新建不同用户,linux创建用户:

useradd 新的用户名
passwd 新的用户名

然后需要修改配置文件:

anonymous_enable=NO   #禁止匿名用户登录
chown_uploads=NO      #设定禁止上传文件更改宿主
nopriv_user=ftptest   #设定支撑Vsftpd服务的宿主用户为新建用户
ascii_upload_enable=YES
ascii_download_enable=YES #设定支持ASCII模式的上传和下载功能。
userlist_enable=YES
userlist_deny=NO

最后打开/etc/vsftpd/user_list文件,将新建的用户添加到最后一行(一个用户一行)

这种模式下,登录访问的目录就是/home/新建用户/

虚拟用户配置
系统用户模式虽然可以控制访问,但是如果用户过多,就会影响服务器系统的管理,对服务器安全造成威胁!而且我们需要的仅仅是可以使用搭建在服务器的FTP服务而已!
那么就需要我们设置虚拟用户进行登录,这也是推荐的方式!这种方式更加安全!

虚拟用户就是没有实际的真实系统用户,而是通过映射到其中一个真实用户以及设置相应的权限来实现访问验证,虚拟用户不能登录Linux系统,从而让系统更加的安全可靠。

一、首先需要我们新建一个虚拟宿主用户,也就是上边说的要映射的真实用户:

useradd virtualhost -s /sbin/nologin

这里设置宿主用户也不允许登录系统!

二、然后修改配置文件,下边我给出我的设置:

anonymous_enable=NO  #设定不允许匿名访问
local_enable=YES  #设定本地用户可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。
write_enable=YES  #设定可以进行写操作。
local_umask=022  #设定上传后文件的权限掩码。
anon_upload_enable=NO  #禁止匿名用户上传。
anon_mkdir_write_enable=NO  #禁止匿名用户建立目录。
dirmessage_enable=YES  #设定开启目录标语功能。
xferlog_enable=YES  #设定开启日志记录功能。
connect_from_port_20=YES #设定端口20进行数据连接。(主动模式)
chown_uploads=NO  #设定禁止上传文件更改宿主。
#chown_username=whoever
xferlog_file=/var/log/xferlog
#设定Vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来,并且由于这里更改了Vsftpd的服务宿主用户为手动建立的Vsftpd。必须注意给与该用户对日志的写入权限,否则服务将启动失败。
xferlog_std_format=YES #设定日志使用标准的记录格式。
#idle_session_timeout=600 #设定空闲连接超时时间,单位为秒,这里默认。
#data_connection_timeout=120 #设定空闲连接超时时间,单位为秒,这里默认
#nopriv_user=ftptest

async_abor_enable=YES  #设定支持异步传输功能。

ascii_upload_enable=YES
ascii_download_enable=YES  #设定支持ASCII模式的上传和下载功能。

ftpd_banner=Welcome to blah FTP service.  #设定Vsftpd的登陆标语。

#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails

chroot_list_enable=NO #禁止用户登出自己的FTP主目录。

# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list

ls_recurse_enable=NO  #禁止用户登陆FTP后使用"ls -R"的命令。该命令会对服务器性能造成巨大开销。如果该项被允许,那么挡多用户同时使用该命令时将会对该服务器造成威胁。
listen=YES 设定该Vsftpd服务工作在StandAlone模式下
#listen_ipv6=YES

userlist_enable=YES  #设定userlist_file中的用户将不得使用FTP。
#userlist_deny=NO
tcp_wrappers=YES  #设定支持TCP Wrappers

#下边是关于虚拟用户的重要配置
guest_enable=YES  #设定启用虚拟用户功能。
guest_username=virtualhost  #指定虚拟用户的宿主用户。
virtual_use_local_privs=YES  #设定虚拟用户的权限符合他们的宿主用户。
pam_service_name=vsftpd  #设定PAM服务下Vsftpd的验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置。
user_config_dir=/etc/vsftpd/virtualconf  #设定虚拟用户个人Vsftp的配置文件存放路径。也就是说,这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件,一个需要注意的地方就是这些配置文件名必须和虚拟用户名相同。

需要注意的地方
①Vsftpd的日志文件不存在,建立Vsftpd的日志文件,并更该属主为Vsftpd的服务宿主用户。

touch /var/log/vsftpd.log
chown virtualhost.virtualhost /var/log/vsftpd.log

②建立虚拟用户配置文件存放路径:

mkdir /etc/vsftpd/virtualconf

这里是跟配置文件中的user_config_dir这一项是对应的!

三、接着制作虚拟用户数据库文件,这里需要先安装db4包,用来支持文件数据库。
安装:

yum install db4

然后建立虚拟用户名单文件:touch /etc/vsftpd/virtusers
建立了一个虚拟用户名单文件,这个文件就是来记录vsftpd虚拟用户的用户名和口令的数据文件,我这里给它命名为virtusers。为了避免文件的混乱,我把这个名单文件就放置在/etc/vsftpd/下。
接着编辑这个文件,将虚拟用户信息写入这个文件vi /etc/vsftpd/virtusers

virtual1
123456
virtual2
123456

类似上边的格式,一行用户名,一行密码
接着生成虚拟用户数据文件:

db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

四、设定PAM验证文件,并指定虚拟用户数据库文件进行读取
这里需要我们安装pam服务,一般系统都会有安装:

yum install pam

Vsftp的PAM验证配置文件:/etc/pam.d/vsftpd
这里对应的就是核心配置文件中的pam_service_name,它会去找/etc/pam.d/vsftpd这个文件!

那么我们需要编辑这个文件,同样的编辑前先备份一下:

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

然后编辑文件:vi /etc/pam.d/vsftpd

#%PAM-1.0
auth    sufficient      /lib/security/pam_userdb.so     db=/etc/vsftpd/virtusers
account sufficient      /lib/security/pam_userdb.so     db=/etc/vsftpd/virtusers

以上两条是手动添加的,内容是对虚拟用户的安全和帐户权限进行验证。
这里的auth是指对用户的用户名口令进行验证。
这里的accout是指对用户的帐户有哪些权限哪些限制进行验证。
其后的sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
再后面的/lib/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。
最后的db=/etc/vsftpd/virtusers则指定了验证库函数将到这个指定的数据库中调用数据进行验证。

这里有一个问题需要注意一下:
如果你的系统是64位的,那么这里要改成:

/lib64/security/pam_userdb.so

否则会验证失败!不能登录!

五、配置虚拟用户
1.规划好虚拟用户的主路径:mkdir /opt/vsftp/
2.建立测试用户的FTP用户目录:

mkdir /opt/vsftp/virtual1/  /opt/vsftp/virtual2/

3.建立虚拟用户配置文件模版

cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/virtualconf/vconf.tmp

4.定制虚拟用户模版配置文件: vi /etc/vsftpd/virtualconf/vconf.tmp

local_root=/opt/vsftp/virtuser
指定虚拟用户的具体主路径。
anonymous_enable=NO
设定不允许匿名用户访问。
write_enable=YES
设定允许写操作。
local_umask=022
设定上传文件权限掩码。
anon_upload_enable=NO
设定不允许匿名用户上传。
anon_mkdir_write_enable=NO
设定不允许匿名用户建立目录。
idle_session_timeout=600
设定空闲连接超时时间。
data_connection_timeout=120
设定单次连续传输最大时间。
max_clients=10
设定并发客户端访问个数。
max_per_ip=5
设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件。
local_max_rate=50000
设定该用户的最大传输速率,单位b/s。

这里将原vsftpd.conf配置文件经过简化后保存作为虚拟用户配置文件的模版。这里将并不需要指定太多的配置内容,主要的框架和限制交由 Vsftpd的主配置文件vsftpd.conf来定义,即虚拟用户配置文件当中没有提到的配置项目将参考主配置文件中的设定。而在这里作为虚拟用户的配置文件模版只需要留一些和用户流量控制,访问方式控制的配置项目就可以了。这里的关键项是local_root这个配置,用来指定这个虚拟用户的FTP主路径。
5.更改虚拟用户的主目录的属主为虚拟宿主用户:

chown -R virtualhost.virtualhost/opt/vsftp/

6.配置虚拟用户,从虚拟用户模版配置文件复制:
cp /etc/vsftpd/virtualconf/vconf.tmp /etc/vsftpd/virtualconf/virtual1

7.针对具体用户进行定制:vi /etc/vsftpd/virtualconf/virtual1

local_root=/opt/vsftp/virtual1
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=300
data_connection_timeout=90
max_clients=1
max_per_ip=1
local_max_rate=25000

当然,如果很熟练的话3,4,6步骤都可以省略!不要设置!
这里主要是为了方便!可以在原来的基础的进行修改而已!

最后别忘了,开启或者重启服务!

测试

我们可以先在模板目录新建一个空文件

touch /opt/vsftp/virtual1/test.txt

登录一下,在windows打开cmd:(当然我们使用浏览器,或者使用windows文件浏览窗口都可以!)

ftp 192.168.164.133

使用用户virtual1和密码123456登录!
然后输入ls,展示该目录下文件列表。
看有没有我们刚才新建的test.txt文本?!
然后测试一下上传,使用put命令,然后看一下目录中是否有上传的文件?
接着测试一下建立目录操作:mkdir newdir,看是否有新目录被创建?!
然后测试一下下载:使用get test.txt,将test.txt文件下载到本地!注意默认的下载路径为windows用户目录c:\Users\xxxxx目录下`!

centos7ftp服务器的搭建

注意,如果要所有人同时编辑 FTP 上的所有文件,可以将 vsftpd.conf 配置文件中的 local_umask 选项设置为 002,并且在创建用户时通过 -g ftp 将所有的 FTP 用户加入同一个用户组。

yum install -y vsftpd #安装vsftpd服务
rpm -qa | grep vsftpd #查看vsftpd版本信息
vim /etc/selinux/config #更改selinux=disabled
setenforce 0 #关闭selinux
getenforce #查看selinux状态
firewall-cmd –permanent –add-service=ftp #防火墙放行vsftpd
firewall-cmd –reload #防火墙配置立即生效
firewall-cmd –list-all #查看防火墙放行服务

systemctl start vsftpd # 启动vsftpd服务
systemctl enable vsftpd # 开机自启动vsftpd服务

1. 安装 ftp 服务端软件

yum install vsftpd

2. 配置 vsftpd.conf 配置文件

vsftpd 只需要设置这个文件即可,所有设置项的等号两边不能有空白!!

vim /etc/vsftpd/vsftpd.conf

常见的设置如下,所有的可用设置可以通过 man 5 vsftpd.conf 查看:

#FTP 用户新建文件和目录的默认权限,022 对应 755 只有自己可以修改,002 对应 775 同一个用户组的都可以修改
local_umask=002
#禁止匿名访问
anonymous_enable=NO
#接受本地用户
local_enable=YES
#允许上传
write_enable=YES
#用户只能访问限制的目录
chroot_local_user=YES
#设置所有的 FTP 用户使用同一个目录,不然所有用户默认使用各自的家目录。
local_root=/home/ftp
#支持 PAM 服务的管理,为 vsftpd 使用配置文件
pam_service_name=vsftpd

3. 创建 FTP 目录并调整权限

这个是避免“500 OOPS: vsftpd: refusing to run with writable root inside chroot()”

mkdir /home/ftp
chmod a-w /home/ftp
mkdir /home/ftp/data

4. 添加ftp用户

-M 不自动建立用户的家目录,-d <登入目录> 指定用户登入时的启始目录,-g ftp 将所有用户添加到同一个用户组,-s /sbin/nologin 使这些用户只能使用 FTP 无法登陆系统:

useradd -d /home/ftp -M -g ftp -s /sbin/nologin xiaoming
passwd xiaoming

5. 修改 pam.d/vsftpd

这时候登录 ftp 会报错: 530 login incorrect

vim /etc/pam.d/vsftpd

注释掉下面一行:

#auth    required pam_shells.so

6. 启动 vsftpd

systemctl start vsftpd

现在可以登录了,看到的是 /home/ftp,并且限制在该目录。

可以在浏览器用 ftp://xxx.xxx.xxx.xxx 访问,也可以用 ftp 软件比如 FileZilla,密码就是 xiaoming 的密码。

Centos7 Mysql8.0版本 重置root密码

问题产生背景:

安装完 最新版的 mysql8.0后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下:

1 修改配置文件免密码登录mysql

需要登录你安装mysql的电脑或者服务器,修改etc文件夹下的my.cnf 配置文件让其跳过登录密码检查。

vim /etc/my.cnf //永久修改
echo skip-grant-tables >> /etc/my.conf //临时修改

2 在 [mysqld]最后加上如下语句 并保持退出文件;

skip-grant-tables

3 重启mysql服务:

systemctl restart mysqld.service

第二步免密码登录到mysql上;直接在命令行上输入:

mysql  
//或者  
mysql -u root -p   
//password直接回车

第三步: 给root用户重置密码;

ALTER user 'root'@'localhost' IDENTIFIED BY 'Zhige123#';

然后我们继续编辑/etc/my.conf删除掉刚刚添加的那一行skip-grant-tables,然后重启mysql。

至此修改成功; 从新使用用户名密码登录即可;

systemctl restart mysqld.service 
systemctl status mysqld.service 
mysql -u root

结尾提示:

select host, user, authentication_string, plugin from user;
host: 允许用户登录的ip‘位置’%表示可以远程;

user:当前数据库的用户名;

authentication_string: 用户密码;在mysql 5.7.9以后废弃了password字段和password()函数;

plugin: 密码加密方式;

退出mysql, 删除/etc/my.cnf文件最后的 skip-grant-tables 重庆mysql服务;

Centos7挂载硬盘

以root身份登录系统进行以下操作。

一. 查看磁盘信息

注意:在没有分区和格式化数据盘之前,使用 df-h 命令是无法看到数据盘的。

fdisk -l
[root@ecs-CwM ~]# fdisk -l

Disk /dev/vda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000425c

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200    41943039    19921920   8e  Linux LVM

Disk /dev/vdb: 139.6 GB, 139586437120 bytes, 272629760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-root: 18.2 GB, 18249416704 bytes, 35643392 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

二. 新建分区

fdisk /dev/vdb  //这里的vdb是要挂载的新硬盘
n //添加新分区
p //创建主分区
1 分区号1
按回车 //起始扇区选择默认
也是回车默认 //为了不浪费空间
p //查看创建出来的分区
w //保存
[root@ecs-CwM ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x7adc4797.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-272629759, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-272629759, default 272629759): 
Using default value 272629759
Partition 1 of type Linux and of size 130 GiB is set

查看创建出来的分区

Command (m for help): p

Disk /dev/vdb: 139.6 GB, 139586437120 bytes, 272629760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x7adc4797

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048   272629759   136313856   83  Linux

保存并退出fdisk工具命令行

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

三. 格式化分区

可格式为ext4或xfs

注:若选择xfs,需要匹配docker默认overlay2存储驱动,建议使用命令:    mkfs.xfs -n ftype=1 /dev/vdb1

[root@ecs-CwM ~]# mkfs.xfs -n ftype=1 /dev/vdb1
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=8519616 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=34078464, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=16639, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

四. 将新添加硬盘分区挂载到指定文件目录

mkdir /datavol
mount /dev/vdb1 /datavol

五. 编辑配置文件,实现开机自动挂载

vi /etc/fstab

在末尾添加如下:

/dev/vdb1    /datavol    xfs    defaults    1    2

使用vi命令:wq保存退出,查看/etc/fstab配置文件

cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Jun 10 14:18:53 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=8223c1d3-9644-4885-80b9-f24158ea6013 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/vdb1    /datavol    xfs    defaults    1    2

六. 重启之后,验证是否成功

df -T
[root@ecs-CwM ~]# df -T
Filesystem              Type     1K-blocks    Used Available Use% Mounted on
devtmpfs                devtmpfs   4064316       0   4064316   0% /dev
tmpfs                   tmpfs      4077448       0   4077448   0% /dev/shm
tmpfs                   tmpfs      4077448    8696   4068752   1% /run
tmpfs                   tmpfs      4077448       0   4077448   0% /sys/fs/cgroup
/dev/mapper/centos-root xfs       17811456 2175180  15636276  13% /
/dev/vda1               xfs        1038336  289548    748788  28% /boot
tmpfs                   tmpfs       815492       0    815492   0% /run/user/0
/dev/vdb1               xfs      136247300   32992 136214308   1% /datavol

七. 跨分区跨文件系统创建软链接目录

mv /var /datavol/
ln -s /datavol/var /var

联通劫持用户请求加入广告代码的解决。

这个问题虽然问的是联通,不过在中国,网页劫持的现象实在是太普遍了,不仅仅是联通等运营商会劫持网页,连一些网络设备和软件也会给你搞劫持。网页劫持会让上网多出很多额外的广告,甚至让你访问不了正确的页面。要如何对付网页劫持?针对所有的网页劫持现象,这就给大家分享一些思路和方法。

https://www.youtube.com/watch?v=Tx7Vwx_YSY4&t=9s

选择可靠的DNS

在“用户点击→网页正常显示”过程中,最容易被下手的莫过是DNS解析这一环节。输入网址后,要访问到相应的IP,需要专门的DNS服务器来进行跳转。如此一来,这个DNS服务器的人品,就很关键了。如果你没有指定专门的DNS服务器,那么就会默认使用运营商提供的DNS服务器来进行解析。运营商本该承担起为整个上网流程提供保障的义务,然而现实是,运营商提供DNS服务器,人品令人担忧。

运营商目前竞争比较激烈,为了进一步推广业务,或者进行额外的创收,一些管理不严的二线运营商或者运营商的分部,就会在DNS解析上动歪脑筋。于是,你常常就能看到运营商会把你给跳转到什么开通上网套餐之类的页面,甚至会出现你输入A购物网但却被跳转到竞争对手B的情况,这些往往就是DNS劫持在作怪。对于这些情况,我们可以手动设置可靠的DNS。目前很多安全厂商或者互联网企业乃至公益组织,都提供了DNS解析服务。例如奇虎360、诺顿、Comodo、百度、阿里、Google等企业,都有提供DNS解析服务,你也可以选择OpenDNS这样的老牌免费DNS服务。这些DNS服务,都可以在网上轻易搜到具体的IP地址,这里就不一一罗列了。当然,并不是说用了这些DNS服务,就一定不会有DNS劫持,万一这些企业人品也不行呢?至于谁靠谱,就得靠你来自个儿筛选了。另外,DNS如果不是运营商所提供的话,速度表现并不一定理想。这里推荐一款名为“DNS jumper”的软件,它能够比较全面得测试DNS的连接速度,并设置DNS。利用DNS jumper,很容易就能够找到适合你网络状况的DNS。

centos7 搭建postfix邮件服务器

一、邮件系统的简单介绍
电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有下面这些。
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件,占用服务器的25/TCP端口。
邮局协议版本3(Post Office Protocol 3):用于将电子邮件存储到本地主机,占用服务器的110/TCP端口。
Internet消息访问协议版本4(Internet Message Access Protocol 4):用于在本地主机上访问邮件,占用服务器的143/TCP端口。
一个最基础的电子邮件系统肯定要能提供发件服务和收件服务,为此需要使用基于SMTP协议的Postfix服务程序提供发件服务功能,并使用基于POP3协议的Dovecot服务程序提供收件服务功能。这样一来,用户就可以使用Outlook Express或Foxmail等客户端服务程序正常收发邮件了。

二、准备工作

系统:CentOS 7
软件:postfix,dovecot
域名:拥有自己的域名

三、搭建准备

  1. 域名解析配置

  1. MX记录添加

  1. 开放端口

firewalld 防火墙

firewall-cmd --add-port=25/tcp --permanent
firewall-cmd –-add-port=110/tcp --permanent
firewall-cmd --reload

iptables 防火墙

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT
service iptables save
systemctl restart iptables
  1. 修改主机名
# 语法
hostnamectl  set-hostname   mail.域名

# 例:
hostnamectl  set-hostname   mail.abc.com

四、邮箱软件安装配置

安装并配置postfix

  1. 软件说明

postfix是提供发件服务的(注意:修改配置文件需备份,以下步骤未包含备份。)
postfix服务程序主配置文件中的重要参数。

参数 作用
myhostname 邮局系统的主机名
mydomain 邮局系统的域名
myorigin 从本机发出邮件的域名名称
inet_interfaces 监听的网卡接口
mydestination 可接收邮件的主机名或域名
mynetworks 设置可转发哪些主机的邮件
relay_domains 设置可转发哪些网域的邮件
  1. 安装postfix
yum install postfix
  1. 配置
vim /etc/postfix/main.cf

# 修改内容:

# 75行: 取消注释,设置hostname 
myhostname = mail.abc.com 
# 83行: 取消注释,设置域名 
mydomain = abc.com 
# 99行: 取消注释 
myorigin = $mydomain 
# 116行: 默认是localhost,我们需要修改成all
inet_interfaces = all 
# 119行: 推荐ipv4,如果支持ipv6,则可以为all 
inet_protocols = ipv4 
# 164行: 添加 
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 
# 264行: 取消注释,指定内网和本地的IP地址范围 
mynetworks = 127.0.0.0/8
# 419行: 取消注释,邮件保存目录
 home_mailbox = Maildir/ 
# 571行: 添加 
smtpd_banner = $myhostname ESMTP 
# 添加到最后 
# 规定邮件最大尺寸为10M 
message_size_limit = 10485760 
# 规定收件箱最大容量为1G 
mailbox_size_limit = 1073741824 
# SMTP认证 
smtpd_sasl_type = dovecot 
smtpd_sasl_path = private/auth 
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous 
smtpd_sasl_local_domain = $myhostname 
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
  1. 开启postfix服务并添加到系统自启
systemctl  restart  postfix
systemctl  enable  postfix

安装并配置dovecot

  1. 安装dovecot
yum install dovecot
  1. 配置

编辑文件dovecot.conf

vim /etc/dovecot/dovecot.conf 

# 更改内容:

# 26行: 如果不使用IPv6,请修改为* 
listen = *
#在主配置文件中的第48行,设置允许登录的网段地址,也就是说我们可以在这里限制只有来自于某个网段的用户才能使用电子邮件系统。如果想允许所有人都能使用,则不用修改本参数
login_trusted_networks = 192.168.10.0/24更改内容

编辑文件10-auth.conf

vim /etc/dovecot/conf.d/10-auth.conf 

# 更改内容:

# 9行: 取消注释并修改 disable_plaintext_auth = no 
# 97行: 添加 auth_mechanisms = plain login

编辑文件10-mail.conf

vim /etc/dovecot/conf.d/10-mail.conf

# 更改内容:

# 30行: 取消注释并添加 mail_location = maildir:~/Maildir

编辑文件10-master.conf

vim /etc/dovecot/conf.d/10-master.conf

# 更改内容:

# 88-90行: 取消注释并添加 # Postfix smtp验证 
unix_listener /var/spool/postfix/private/auth { 
mode = 0666 
user = postfix
group = postfix
}

注意:如果我们没有使用ssl的话需要进行下面的操作。使用了则不需要。

编辑文件10-ssl.conf

vim /etc/dovecot/conf.d/10-ssl.conf 

# 更改内容:

# 8行: 将ssl的值修改为 ssl = no
  1. 开启dovecot服务并添加到系统自启
systemctl restart dovecot
systemctl enable dovecot

五、收发邮件测试

 

  1. 开启dovecot服务并添加到系统自启
useradd admin
passwd 12345
  1. 使用FOXMAIL登陆


1中我们需要选择我们之前开放端口对应的服务器类型。

2中 我们只需要填入我们的用户名,例如admin,root

3中 我们收件和发件都填入我们的mail.域名。例 mail.abc.com

4 中 我们如果使用了ssl的话就需要勾选,如果没有使用的话就不需要勾选

 

注意事项
我们邮件服务器在设定mynetworks 这个值的时候,一行不要设置all,因为会有很多服务器会将你的服务器作为中转邮件服务器,最终导致的你的邮件服务器发送的邮件被qq,163,gamil,这些邮件服务商标记为垃圾邮件。

当某天我们检查我们的mail日志(/var/log/maillog)时发现很多邮件发送,而且邮件不是我们自己产生的话,那么我们的邮件服务器是出了问题的

这时我们服务器一定有很多邮件堆积,然后自己邮件会发不出去。

我们需要做的操作:检查

du -sh /var/spool/postfix/*

查看目录下的defer和deferred的目录大小,通过postqueue –p来查看队列的邮件,通过postsuper -d ALL 删除所有的队列邮件。

————————————————

本人的经验分享,希望可以帮助到你们,如何不对的地方,可以评论留言,帮我指正一下。

卸载阿里云盾监控

阿里云的vps安装面板上,默认勾选安装“阿里云盾”,稍不注意就“中招”了。顾名思义,云盾的作用就是监视vps的使用、抵御网络攻击等。作为一个对xxxx有特殊需求的人来,云盾其实就是一种“间谍”,监控你的一举一动。在特殊情况下,这甚至会成为“有关部门”将你治罪的“关键证据”,所以卸载云盾就成了使用者第一件要做的事。在这里介绍两种卸载的方式,读者可以任选一种。

1、卸载阿里云盾及其附属程序

卸载阿里云盾监控

wget http://update.aegis.aliyun.com/download/uninstall.sh
sh uninstall.sh
wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh
sh quartz_uninstall.sh

删除目录残留

pkill aliyun-service
rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service
rm -rf /usr/local/aegis*

v2-ui,一个全新的多协议多用户 v2ray 面板

一、前言

sprov-ui 从 2 月份发布,到现在也差不多半年了,中间停更了一段时间。之后就不回归 sprov-ui 了,而是重新做一个新的出来,主要原因是 sprov-ui 使用的是 Java 语言,内存占用较高,对低内存的机器不太友好。于是这次用 Python 来写,内存占用会有明显改善,Python 还是比 Java 更适合写这类小工具。

二、功能介绍

使用中出现了问题、BUG 报告及功能建议请前往 Github – issues,请务必先查看别人是否已经提过同样的问题,确认没有再提 issue。

  • 系统状态监控
  • 支持多用户多协议,浏览器可视化操作,无需敲命令
  • 支持的协议:vmess、shadowsocks、dokodemo-door、socks、http
  • vmess 支持的传输配置:tcp(http伪装、tls)、kcp(伪装)、ws(tls)、http(tls)、quic(tls)
  • 支持账号流量统计
  • 支持自定义 v2ray 配置模板
  • 支持 https 访问面板(需自备域名 + ssl 证书)
  • 更多高级配置项,详见面板

三、安装&升级

用户注意事项(必看)

v2-ui 与其它所有关于修改 v2ray 配置文件的工具完全不兼容(包括 sprov-ui),安装 v2-ui 后会导致 v2ray 配置文件被重写,导致原有 v2ray 账号丢失,如有必要,请自行提前做好备份,以免造成不必要的后果。

建议系统

面板建议以下系统安装,建议尽量使用新版的系统:

  • CentOS 7+
  • Ubuntu 16+
  • Debian 8+

一键安装&升级

若出现 bash curl: command not found 等错误,请先安装 curl
CentOS 系统:yum install curl -y
Debian 或 Ubuntu 系统:apt install curl -y

bash <(curl -Ls https://blog.sprov.xyz/v2-ui.sh)

更新与升级都是这条命令,升级不会造成数据丢失,你所做的个性化面板设置也会保留。

全新安装后,在浏览器中打开 http://<服务器IP>:65432 即可访问面板,默认用户名和密码都是 admin。

升级后,仍然使用你升级前的方式进入面板。

四、面板其它操作

v2-ui                  # 显示管理菜单 (功能更多)
v2-ui start            # 启动 v2-ui 面板
v2-ui stop             # 停止 v2-ui 面板
v2-ui restart          # 重启 v2-ui 面板
v2-ui status           # 查看 v2-ui 状态
v2-ui enable           # 设置 v2-ui 开机自启
v2-ui disable          # 取消 v2-ui 开机自启
v2-ui log              # 查看 v2-ui 日志
v2-ui update           # 更新 v2-ui 面板
v2-ui install          # 安装 v2-ui 面板
v2-ui uninstall        # 卸载 v2-ui 面板

重置流量

如图所示,点击【总用量】的标签即可重置对应的流量

重置流量

启用禁用账号

启用禁用账号

配置 https 访问

配置 https 需要域名和对应的证书,如果你连域名都没有的话,需要先买一个,并将一个子域名解析到服务器 IP。

证书申请教程:在 FreeSSL 上为你的域名申请免费 SSL 证书

方式①

域名和证书都搞定后,将证书文件上传至服务器任意位置,并进入面板配置如下两项并重启,配置错误会导致无法启动面板,需参考下面的教程重置面板设置。

配置 ssl 证书

方式②

当然你也可以使用 nginx、caddy 等 web 服务器反向代理面板,并在面板中设置【面板网页根路径】来达到路径分流的效果,我只在此提供思路,具体实施请自行研究。

以下为 nginx 参考配置,面板根路径为 /v2-ui,设置完之后访问路径就变成了 /v2-ui。假设之前的访问网址是:http(s)://xxx.com:65432,那么按照以下设置之后访问网址是:http(s)://xxx.com/v2-ui。总之最后要加个 /v2-ui

location /v2-ui {
    proxy_pass http://127.0.0.1:65432/v2-ui;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
面板配置根路径

面板数据备份与迁移

面板所有数据包括账号信息等都存在 /etc/v2-ui/v2-ui.db 中,只要备份此文件即可。在新服务器安装了面板之后,先关闭面板,再将备份的文件覆盖新安装的,最后启动面板即可。

卸载面板

执行以下命令即可完全卸载面板,如果还需要卸载 v2ray,请自行找相关教程。

systemctl stop v2-ui
systemctl disable v2-ui
rm /usr/local/v2-ui/ -rf
rm /etc/v2-ui/ -rf
rm /etc/systemd/system/v2-ui.service -f
systemctl daemon-reload

jdk11下载安装-环境配置(Win10)

1、JDK11安装

1)下载JDK11

Oracle JDK11: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

OpenJDK11: http://jdk.java.net/11/

在上面两个地址下载需要的版本。

本文主要是64位win10上安装,文件下载地址:https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip

2)解压下载文件

将下载好的.zip文件解压到指定的安装目录,例如,安装到C:\Program Files\Java下,在Java文件夹下新建jdk11文件夹,将文件解压到jdk11文件夹下。

注意:zip文件解压后,JDK中bin文件夹应该在jdk11文件夹下。

如果下载的是exe文件,就选择安装目录为新建好的那个JDK11文件夹下。

2、配置环境变量

1)配置JAVA_HOME

按Windows键+R键,出现运行窗口,在打开文件框中输入sysdm.cpl,点击确定,出现”系统信息”窗口。

在系统信息窗口依次点击,

系统信息窗口 =》高级 =》环境变量-》系统环境变量 , 注意:如果用户环境变量中有对应的环境变量设置,就在用户环境变量中添加。否则会优先读取用户环境,有可能找不到设置的环境变量。如果没有,在系统环境变量或用户环境哪一个都可以,系统环境变量是对所有用户生效的。

点击环境变量->新建->变量名JAVA_HOME,变量值JDK11的安装目录如C:\Program Files\Java\jdk11

2)配置Path环境变量

编辑Path变量


%JAVA_HOME%\bin;
这个变量插入最前面,注意要有分号和后面的变量间隔开。

注意:如果是win10系统,点击编辑后,要点击新建,值为%JAVA_HOME%\bin,win10系统中不用自己加冒包。

效果如下图

3)验证是否安装成功

按windows键+R键,输入cmd,在打开的cmd窗口中输入java -version,安装成功提示如下:

Microsoft Windows [版本 10.0.17134.254]
(c) 2018 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

Mysql 8.x [Err] 1055 only_full_group_by 问题记录

查询时报错 [Err] 1055 – Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘

SELECT c.* ,COUNT(courseId) as cnum FROM center_coursetime c WHERE isDel=0  GROUP BY schoolId ORDER BY c.createTime DESC

解决方法:

登录mysql 后可以查看sql_mode

show variables like ‘%sql_mode%’;

mysql> SELECT @@GLOBAL.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

其中ONLY_FULL_GROUP_BY 就是引起问题的关键

在 mysql配置文件中/etc/my.cnf中加入

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

重启服务,问题解决