前言

一直想搭建一个文件服务器,就是那种可以在线查看文件目录和文件列表,可以下载也可以上传。记得在学校时,用过那种 ftp 服务器,主要功能就是账号密码登录后上传或者下载文件。

当然可以用 PHP 或者 Java 做一个上传下载的程序,但最直接也最简单的方法,还是借助 Nginx 等服务器实现。

参考了网上的一些教程,做了一个基于 Nginx 的简单文件服务器。

简单 Nginx 文件服务器搭建

文件服务器主要有列表功能,上传文件功能,下载文件功能,和用户登录验证功能。

先来看看如何实现列表功能。玩过服务器的应该都了解,Apache 或者 Nginx 在配置虚拟主机时,可以指定程序的 index 默认文件,这一般会是应用的入口文件。当不存在默认文件的时候,Nginx 默认会展示 403 Access Forbidden 。此时可以通过配置一个参数 autoindex,选择浏览目录。

server {
...
# 默认为 off
autoindex on;
...
}

这个配置项可以放在 location / 里面,表示根目录下的配置,也可以放在 ~ 外面,表示虚拟主机全局配置。

其他相关的配置参数:

autoindex_exact_size off;
# 默认为on,显示出文件的确切大小,单位是bytes。
# 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB

autoindex_localtime on;
# 默认为off,显示的文件时间为GMT时间。
# 改为on后,显示的文件时间为文件的服务器时间

# 如果列出的文件名中有中文一定要加上
charset utf-8;

# 如果映射的目录在其他地方,可以使用别名
alias /data/;

修改了虚拟主机的配置文件后,需要重启 Nginx 生效:

path/to/nginx/bin/nginx -t
path/to/nginx/bin/nginx -s reload
# 如果使用 yum 安装
nginx -t
nginx -s reload

再次访问那个虚拟主机,页面会变成 Index of / 和一个文件列表。

可以直接右击下载。上传暂时需要借助 ftp 工具。

Nginx 文件服务器添加密码访问

这需要两步,第一步修改 Nginx 虚拟主机配置,配置认证的密码文件;第二步生成密码文件。

1. 修改 Nginx 虚拟主机配置

auth_basic 'ftp_restricted'; # 认证名称,随意填写
auth_basic_user_file /htpasswd/passwd.db; # 认证的密码文件,需要生成

2. 生成密码文件

可以选择通过 htpasswd 命令,生成用户名和账户到指定的文件中。

据说 htpasswd 属于 Apache 服务器的一个工具,在 Nginx 下使用的话,需要独立安装:

yum -y install httpd-tools

安装好之后,就可以使用 htpasswd 指令了:

htpasswd -c /htpasswd/passwd.db test
# 之后会提示输入密码和再次输入密码

指令执行后,可以使用 cat /htpasswd/passwd.db 查看生成的密码文件内容。形式如下:

# 用户名:加密密码
test:xxx

每执行一次指令(用户名不重复),会生成一条新的账号、密码记录。

也可以借助工具,或自己写一个脚本生成账号密码文本。

在线 htpasswd 生成器

经测试,除了 plain 也就是不加密形式,其他加密形式,如 crypt、md5、sha-1 生成的用户名密码文本都可以正常使用。

在得到用户名密码文本后,直接将其加入到密码文件中即可(每一条密码记录都需要独立一行)。

密码授权访问的生命周期暂时不清楚,但关闭浏览器后,会话结束。

美化 Nginx 目录页面

可以参考 使用 autoindex 页脚功能配置美化 nginx 目录