Linux环境下VSFTPD与Nginx搭配使用教程(以图片服务器为例)
# CentOS系统
yum -y install vsftpd
# Debian系统
sudo apt-get update && sudo apt-get install vsftpd
# CentOS系统
yum -y install nginx
# Debian系统
sudo apt-get install nginx
# CentOS系统
systemctl start vsftpd && systemctl enable vsftpd
systemctl start nginx && systemctl enable nginx
# Debian系统
sudo systemctl start vsftpd && sudo systemctl enable vsftpd
sudo systemctl start nginx && sudo systemctl enable nginx
编辑VSFTPD主配置文件 /etc/vsftpd/vsftpd.conf,按需调整以下参数:
# 禁止匿名访问(生产环境必须)
anonymous_enable=NO
# 允许本地用户登录
local_enable=YES
# 允许本地用户上传文件
write_enable=YES
# 设置本地用户umask(上传文件权限为755)
local_umask=022
# 关闭匿名用户上传(若开启匿名上传需设置为YES,但不推荐)
anon_upload_enable=NO
# 开启被动模式(解决FTP连接超时问题)
pasv_enable=YES
# 被动模式端口范围(需在防火墙中放行)
pasv_min_port=30000
pasv_max_port=31000
# 允许本地用户切换目录
chroot_local_user=YES
# 允许本地用户写入(需配合chroot)
allow_writeable_chroot=YES
保存后重启VSFTPD:
systemctl restart vsftpd
# 创建FTP用户(如ftpuser)
useradd -m ftpuser
# 设置用户密码
passwd ftpuser
# 创建图片存储目录(如/home/ftpuser/images)
mkdir -p /home/ftpuser/images
# 设置目录权限(确保Nginx可读取)
chown -R ftpuser:nginx /home/ftpuser/images
chmod -R 755 /home/ftpuser/images
# 允许FTP用户访问其家目录
setsebool -P ftp_home_dir on
# 允许FTP完全访问(若需更严格的权限可调整)
setsebool -P allow_ftpd_full_access on
编辑Nginx配置文件(如 /etc/nginx/nginx.conf 或站点配置文件 /etc/nginx/conf.d/default.conf),添加以下server块:
server {
listen 80;
server_name your_domain_or_ip; # 替换为服务器IP或域名
# 图片访问路径(将/ftp指向FTP用户的images目录)
location /ftp {
alias /home/ftpuser/images/; # 关键:alias指向FTP存储目录
autoindex on; # 开启目录列表(可选,生产环境建议关闭)
autoindex_exact_size off; # 显示文件大小为易读格式(如KB、MB)
autoindex_localtime on; # 显示文件时间为本地时间
charset utf-8,gbk; # 支持中文文件名
}
}
保存后重启Nginx:
systemctl restart nginx
在浏览器输入 http://your_domain_or_ip/ftp,若配置正确,将显示/home/ftpuser/images目录下的文件列表。
若需通过程序上传文件,可使用Apache Commons Net库实现:
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileInputStream;
public class FtpUploadUtil {
public static boolean uploadFile(String host, int port, String username, String password,
String localFilePath, String remoteFileName) {
FTPClient ftpClient = new FTPClient();
FileInputStream inputStream = null;
try {
// 连接FTP服务器
ftpClient.connect(host, port);
ftpClient.login(username, password);
// 检查登录状态
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
return false;
}
// 切换到目标目录
ftpClient.changeWorkingDirectory("/home/ftpuser/images");
// 设置被动模式(解决连接超时)
ftpClient.enterLocalPassiveMode();
// 设置上传文件类型为二进制(避免图片损坏)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 读取本地文件并上传
inputStream = new FileInputStream(localFilePath);
return ftpClient.storeFile(remoteFileName, inputStream);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (inputStream != null) inputStream.close();
ftpClient.logout();
ftpClient.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
测试上传:
public static void main(String[] args) {
boolean result = uploadFile("your_domain_or_ip", 21, "ftpuser", "ftpuser_password",
"D:\\test.jpg", "test.jpg");
System.out.println("上传结果:" + result);
}
alias路径是否正确,目录权限是否允许nginx用户读取(chown -R ftpuser:nginx /path)。write_enable=YES,目录权限正确,SELinux设置为允许FTP访问。alias路径是否存在,nginx用户是否有读取权限,SELinux是否阻止访问(setsebool -P allow_ftpd_full_access on)。通过以上步骤,即可实现VSFTPD与Nginx的搭配使用,构建一个安全、高效的图片(或文件)服务器。