目前是和 @dotkrnl 一起合买 DigitalOcean 的 VPS ,我们目前在 VPS 上面放置了两三个 PHP 虚拟主机。之前 @dotkrnl 已经很好地配置了 nginx, php-fpmMariaDB ,然后我自己装了个 Wordpress ,发现没有 FTP 好不方便,于是我就装了个 vsftpd ,下面的记录可供参考。

首先,服务器的背景是这样的:

  • 网站在 /srv/http/www/abcdabcd987.com/ 里面
  • /srv/http/www/abcdabcd987.com/ 的所有者是 abcdabcd987_com 所有组是 http

vsftpd.conf 如下:

anonymous_enable=NO                     # 拒绝匿名
local_enable=YES                        # 用 Linux 账号登入
write_enable=YES                        # 允许写入
local_umask=0007                        # 去除其他人的所有权限
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
ftpd_banner=Welcome to remote.dotkrnl.com FTP service.
chroot_local_user=YES                   # 锁定根目录
allow_writeable_chroot=YES              # 允许写入
listen=YES
seccomp_sandbox=NO                      # ???
userlist_deny=NO                        # 只允许特定用户登入
userlist_enable=YES                     # 使用用户列表
userlist_file=/etc/vsftpd.allowed_users

后来发现这样 FTP 上传的文件的所有组不是 http ,由于对 Linux 权限管理不是很熟悉,所以又 Google 了一番,发现只要 把父目录 chmod g+s 即可!

如果现在要再加入一个网站,大致可以按照如下脚本执行:

DIR=/srv/http/www/abcdabcd987.com/
USER=abcdabcd987_com
mkdir $DIR
useradd -d $DIR -s /bin/nologin $USER
chown -R $USER $DIR
chgrp -R http $DIR
chmod -R g+s /srv/http/www/abcdabcd987.com/
echo abcdabcd987_com >> /etc/vsftpd.allowed_users
passwd ababcd987_com

其实一开始的时候遇到了一点奇怪的问题,附上问题的解决方案:

  • 500 OOPS: priv_sock_get_cmd error while making an FTP connection: seccomp_sandbox=NO
  • 500 OOPS: vsftpd: refusing to run with writable root inside chroot:allow_writeable_chroot=YES