Ubuntu 上让 FTP 与 Web 协同工作的最佳实践
一 架构与方案选择
- 推荐将 vsftpd 作为 FTP 服务,Web 内容目录(如 /var/www/html 或 /var/www/ftp_share)作为 FTP 用户的家目录或子目录,使上传的文件可直接被 Apache/Nginx 发布。
- 访问方式以“目录共享”为主:FTP 负责写入,Web 负责 HTTP 分发;如需通过 HTTP 访问 FTP 目录,可在 Web 端配置目录别名或启用目录列表。
- 安全建议:禁用匿名、启用 FTPS、限制用户到主目录、配置被动模式端口范围并放行防火墙。
二 快速落地步骤
- 安装组件
- sudo apt update && sudo apt install -y vsftpd apache2 或 vsftpd nginx
- sudo systemctl enable --now vsftpd apache2(或 nginx)
- 创建共享目录并设权限(示例:/var/www/ftp_share)
- sudo mkdir -p /var/www/ftp_share
- 若由 Apache 发布:sudo chown -R www-data:www-data /var/www/ftp_share && sudo chmod -R 755 /var/www/ftp_share
- 若由 Nginx 发布:sudo chown -R nginx:nginx /var/www/ftp_share && sudo chmod -R 755 /var/www/ftp_share
- 创建 FTP 用户并指向共享目录
- sudo adduser ftpuser
- sudo usermod -d /var/www/ftp_share ftpuser(必要时将用户加入 www-data 组以便 Web 读取)
- vsftpd 关键配置(/etc/vsftpd.conf)
- anonymous_enable=NO
- local_enable=YES
- write_enable=YES
- chroot_local_user=YES
- allow_writeable_chroot=YES
- pasv_enable=YES
- pasv_min_port=60000
- pasv_max_port=60100
- pasv_address=你的公网IP
- 可选加密:ssl_enable=YES;rsa_cert_file=/etc/ssl/private/vsftpd.crt;rsa_private_key_file=/etc/ssl/private/vsftpd.key
- 防火墙放行
- sudo ufw allow 21/tcp
- sudo ufw allow 60000:60100/tcp
- 重启服务
- sudo systemctl restart vsftpd && sudo systemctl restart apache2(或 nginx)
三 Web 服务器发布配置
- Apache 发布共享目录
- Nginx 发布共享目录
- 说明
- 若希望“HTTP 访问 FTP 目录”,使用 Nginx 的 alias/autoindex 或 Apache 的目录配置即可;不建议用 Nginx 反向代理到 ftp://127.0.0.1:21 来替代浏览器直传/直读。
四 安全与运维要点
- 加密传输
- 生成自签证书:sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.crt
- vsftpd 启用:ssl_enable=YES;rsa_cert_file=/etc/ssl/private/vsftpd.crt;rsa_private_key_file=/etc/ssl/private/vsftpd.key
- 被动模式与云服务器
- 必须设置 pasv_min_port/pasv_max_port 并在云安全组/本机防火墙放行;公网环境设置 pasv_address=公网IP
- 权限最小化
- FTP 用户家目录与 Web 根目录一致时,确保仅授予 Web 服务读取所需权限(如 755),上传由 FTP 完成
- 可选运维工具
- 使用 Webmin(https://服务器IP:10000)进行可视化用户与 vsftpd 配置管理(生产环境建议为其配置受信任证书)
五 验证与常见问题
- 验证步骤
- FTP 上传:ftp your_domain 或 lftp,登录后 put/get 测试;FTPS 使用支持 TLS 的客户端
- HTTP 访问:浏览器访问 http://ftp.yourdomain.com/web_ftp 或站点根目录,确认可列目录与访问文件
- 常见问题
- 被动模式失败:检查云安全组/防火墙是否放行 21 与 60000–60100/tcp,以及 pasv_address 是否正确
- 上传后 403:检查目录属主与权限(如 www-data:www-data 与 755),以及目录内文件权限
- SELinux 环境(如 CentOS/RHEL):必要时执行 chcon/setsebool 调整上下文与布尔值(Ubuntu 默认不使用 SELinux)