Nginx vs. FTP 服务器
非常重要的一点是:Nginx 本身并不是一个完整的 FTP 服务器软件。

- 传统 FTP 服务器:如
vsftpd,ProFTPD,它们是专门为文件传输而设计的,拥有完整的用户认证、权限管理、日志记录等功能。 - Nginx 的角色:Nginx 是一个高性能的 Web 服务器和反向代理,它可以通过一个模块
ngx_http_auth_basic_module来提供基于 HTTP 的基本认证(用户名/密码)。
当我们说 "用 Nginx 配置 FTP 服务器" 时,我们通常指的是以下两种常见架构:
- Nginx +
pure-ftpd/vsftpd(推荐):Nginx 作为 Web 服务器,提供文件列表和下载功能,运行一个真正的 FTP 服务器(如pure-ftpd)来处理文件的上传、删除等操作,两者共享用户认证信息。 - Nginx +
ngx_http_dav_module(仅限 HTTP):利用 Nginx 的 WebDAV 模块,将一个目录暴露为可以通过 Web 浏览器进行文件上传、下载、管理的地址,这看起来像是一个 "Web 文件管理器",而不是标准的 FTP 协议服务。
下面,我将详细介绍这两种配置方法。
Nginx + pure-ftpd (功能最完整、最推荐)
这种方案结合了 Nginx 的 Web 优势和 pure-ftpd 的专业 FTP 功能,用户可以通过浏览器访问文件列表,也可以使用 FTP 客户端进行上传下载。
步骤 1:安装必要软件
以 Ubuntu/Debian 为例:

# 安装 Nginx sudo apt update sudo apt install nginx # 安装 pure-ftpd,它会自动创建一个系统用户组 'ftpgroup' sudo apt install pure-ftpd
步骤 2:创建 FTP 用户和目录
我们需要为 FTP 服务创建一个专用的系统用户,并设置其家目录。
# 创建一个名为 'ftpuser' 的用户 # --home 指定家目录 # --shell /usr/sbin/nologin 禁止该用户通过 SSH 登录,仅用于 FTP sudo useradd -m -d /home/ftpuser -s /usr/sbin/nologin ftpuser # 为 ftpuser 设置密码 sudo passwd ftpuser
/home/ftpuser FTP 用户的根目录,让我们在里面放一些测试文件。
# 创建一个上传目录 sudo mkdir /home/ftpuser/files # 将目录所有权给 ftpuser sudo chown -R ftpuser:ftpuser /home/ftpuser # 设置正确的权限 sudo chmod -R 755 /home/ftpuser sudo chmod -R 775 /home/ftpuser/files # 给上传目录写权限 # 放一个测试文件 echo "Hello from Nginx FTP Server!" | sudo tee /home/ftpuser/index.html
步骤 3:配置 pure-ftpd
编辑 pure-ftpd 的配置文件,通常位于 /etc/pure-ftpd/conf/ 目录下。
# 编辑配置文件
sudo nano /etc/pure-ftpd/conf/ChrootEveryone
```修改为 `yes`,这样用户将只能访问其家目录及其子目录,无法“跳出”到其他地方。
```bash
# 编辑配置文件
sudo nano /etc/pure-ftpd/conf/PureDB
```指向用户数据库,默认情况下,它应该是 `/etc/pure-ftpd/pureftpd.passwd`,如果文件不存在,没关系,下一步创建时会自动生成。
#### 步骤 4:将 Nginx 用户和 `pure-ftpd` 用户关联
为了实现用户认证同步,我们需要将 `ftpuser` 的密码信息同步给 Nginx。
1. **安装 `apache2-utils`** (它包含 `htpasswd` 工具):
```bash
sudo apt install apache2-utils
-
创建 Nginx 的密码文件:
# -c 表示创建新文件,如果文件已存在,请去掉 -c,否则会覆盖。 # ftpuser 是用户名,后面会提示你输入两次密码(必须和 pure-ftpd 的密码一致) sudo htpasswd -c /etc/nginx/.htpasswd ftpuser
-
修改密码文件所有者:
sudo chown www-data:www-data /etc/nginx/.htpasswd sudo chmod 640 /etc/nginx/.htpasswd
步骤 5:配置 Nginx
创建一个新的 Nginx 配置文件,用于展示 FTP 用户的文件。
sudo nano /etc/nginx/sites-available/ftp_server
server {
listen 80;
server_name your_server_ip; # 替换成你的服务器IP或域名
# FTP 用户的根目录
root /home/ftpuser;
# 开启目录列表
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
# --- 关键部分:使用 HTTP 基本认证 ---
# 这会弹出一个登录框,要求输入用户名和密码
# 密码文件我们已经在步骤4中创建
auth_basic "Restricted FTP Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# 可选:限制只允许特定 IP 访问,增加安全性
# allow 192.168.1.0/24; # 允许这个网段
# deny all;
}
启用这个站点:
# 创建软链接到 sites-enabled sudo ln -s /etc/nginx/sites-available/ftp_server /etc/nginx/sites-enabled/ # 检查 Nginx 配置语法 sudo nginx -t # 如果没问题,则重载 Nginx sudo systemctl reload nginx
步骤 6:启动并测试服务
# 启动 pure-ftpd 服务 sudo systemctl start pure-ftpd sudo systemctl enable pure-ftpd # 开机自启 # 检查服务状态 sudo systemctl status pure-ftpd
测试:
-
Web 访问测试: 在浏览器中输入
http://your_server_ip,你会看到一个登录框。- 用户名:
ftpuser - 密码: 你为
ftpuser设置的密码 登录后,你应该能看到/home/ftpuser目录下的文件列表,index.html和files文件夹。
- 用户名:
-
FTP 客户端测试: 使用 FileZilla 或其他 FTP 客户端连接。
- 主机:
your_server_ip - 端口: 21 (FTP 默认端口)
- 用户名:
ftpuser - 密码: 你为
ftpuser设置的密码 连接成功后,你应该能看到/home/ftpuser目录,并可以上传、下载文件。
- 主机:
Nginx WebDAV (仅限 HTTP,无需额外 FTP 服务)
如果你不需要标准的 FTP 协议,只是想通过 Web 浏览器来管理文件,这个方案更简单。
步骤 1:安装 Nginx
sudo apt update sudo apt install nginx
步骤 2:创建用户和目录
# 创建一个 WebDAV 用户 sudo useradd -m -d /home/webdavuser -s /usr/sbin/nologin webdavuser sudo passwd webdavuser # 创建 WebDAV 共享目录 sudo mkdir -p /var/www/webdav sudo chown -R webdavuser:www-data /var/www/webdav sudo chmod -R 775 /var/www/webdav
步骤 3:创建密码文件
sudo htpasswd -c /etc/nginx/.htpasswd webdavuser sudo chown www-data:www-data /etc/nginx/.htpasswd sudo chmod 640 /etc/nginx/.htpasswd
步骤 4:配置 Nginx
创建一个新的配置文件:
sudo nano /etc/nginx/sites-available/webdav
server {
listen 80;
server_name your_server_ip;
root /var/www/webdav;
# WebDAV 相关配置
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:r all:r;
# HTTP 基本认证
auth_basic "WebDAV Login";
auth_basic_user_file /etc/nginx/.htpasswd;
# 错误页面重定向到登录页
error_page 401 /401.html;
location = /401.html {
internal;
root /var/www/html; # 你需要一个 401.html 文件,或者重定向到登录页
}
}
启用站点并重载 Nginx:
sudo ln -s /etc/nginx/sites-available/webdav /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
步骤 5:测试
-
浏览器访问: 在浏览器输入
http://your_server_ip,会弹出登录框,登录后,你可以通过浏览器的开发者工具或专用 WebDAV 客户端(如 Cyberduck)来上传、下载、创建文件夹。 -
使用
cadaver命令行工具 (Linux/macOS):# 安装 cadaver sudo apt install cadaver # 连接 cadaver http://your_server_ip # 然后输入用户名和密码 # 在 cadaver 提示符下,可以使用 ls, put, get, mkdir 等命令
总结与对比
| 特性 | 方案一 (Nginx + pure-ftpd) |
方案二 (Nginx WebDAV) |
|---|---|---|
| 协议 | FTP (21端口) + HTTP (80端口) | HTTP/HTTPS (80/443端口) |
| 客户端 | 任何 FTP 客户端 (FileZilla等) | Web 浏览器、WebDAV 客户端 |
| 功能 | 完整的 FTP 功能(上传、下载、删除、重命名) | 基本的文件管理(上传、下载、删除、创建目录) |
| 优点 | 功能强大、标准协议、支持各种客户端 | 配置简单、无需额外服务、可通过 HTTPS 加密 |
| 缺点 | 需要维护两个服务、端口暴露更多 | 功能相对简单、依赖 Web 客户端体验 |
| 适用场景 | 需要专业 FTP 服务、大量用户、兼容旧客户端 | 简单的文件共享、Web 管理后台、临时传输 |
对于大多数现代应用,方案一 是最健壮和功能最全的选择,如果你只是想在 Web 上快速搞一个文件管理功能,方案二 则足够简单快捷。
