一、准备工作
本文以 CentOS 7 64位系统为例,介绍如何将 Nginx 配置为静态文件下载服务器,并集成 FTP 服务用于文件上传。
1. 创建 Screen 会话
为避免编译过程因网络中断而失败,建议先创建一个 Screen 会话。
screen
2. 创建 Nginx 运行用户
为安全起见,建议为 Nginx 服务创建一个专用的系统用户和用户组。
/usr/sbin/groupadd -f www
/usr/sbin/useradd -g www www
如需查看系统用户和组,可使用以下命令:
cat /etc/group
cat /etc/passwd
3. 更新系统并安装编译工具
更新系统软件包并安装 Nginx 编译所需的依赖。
yum -y update
yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre-devel zip unzip net-snmp snmp-mibs-utils vsftpd
二、Nginx 及模块安装
1. 下载并准备第三方模块
创建一个目录用于存放下载的模块源码。
mkdir /DLserver
cd /DLserver
下载 Nginx-accesskey 模块(防盗链)
wget http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
tar -xzvf Nginx-accesskey-2.0.3.tar.gz
rm -f Nginx-accesskey-2.0.3.tar.gz
编辑该模块的配置文件,将 $HTTP_ACCESSKEY_MODULE 修改为 ngx_http_accesskey_module。
vi nginx-accesskey-2.0.3/config
下载 Nginx-limit-traffic-rate-module(限速模块)
wget https://github.com/bigplum/Nginx-limit-traffic-rate-module/archive/master.zip
unzip master.zip
rm -f master.zip
下载 Nginx upload module(上传模块)
wget https://github.com/vkholodkov/nginx-upload-module/archive/2.2.zip
unzip 2.2.zip
rm -f 2.2.zip
2. 下载并编译 Nginx
下载 Nginx 源码并解压。
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -xzvf nginx-1.8.0.tar.gz
rm -f nginx-1.8.0.tar.gz
cd nginx-1.8.0
配置编译参数。作为静态文件服务器,可以移除不必要的模块以精简体积。
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --user=www --group=www --without-http_fastcgi_module --without-http_autoindex_module --without-http_ssi_module --without-http_memcached_module --without-http_scgi_module --without-http_uwsgi_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module --with-http_realip_module --with-threads --add-module=/DLserver/nginx-accesskey-2.0.3 --add-module=/DLserver/Nginx-limit-traffic-rate-module-master --add-module=/DLserver/nginx-upload-module-2.2.0 --with-http_secure_link_module
参数说明:
--with-http_realip_module:用于在反向代理场景下获取客户端真实 IP。--with-http_stub_status_module:启用 Nginx 状态监控页面。--with-threads:启用线程池支持,为后续使用异步 I/O (aio threads) 做准备。
执行编译与安装。
make && make install
3. Nginx 目录结构与常用命令
主要目录:
- 安装目录:
/usr/local/nginx - 配置文件:
/usr/local/nginx/conf/nginx.conf - 日志目录:
/usr/local/nginx/logs
常用命令:
# 查看编译参数
/usr/local/nginx/sbin/nginx -V
# 启动
/usr/local/nginx/sbin/nginx
# 停止
/usr/local/nginx/sbin/nginx -s stop
# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
# 查看进程
ps -ef | grep nginx
4. 配置 Nginx 作为下载服务器
编辑 /usr/local/nginx/conf/nginx.conf 文件,以下是一个基础的下载服务器配置示例:
user www www;
worker_processes auto;
events {
use epoll;
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
# 定义连接数限制区
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 定义请求频率限制区(1次/秒)
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 8080; # 建议使用非80端口
server_name your-domain.com; # 替换为你的域名
charset utf-8;
location / {
root /path/to/your/files; # 替换为文件存储的实际路径
index index.html index.htm;
# 启用防盗链
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "your_secret$remote_addr"; # 替换 your_secret
# 连接数与请求频率限制
limit_conn addr 2; # 每个IP最多2个并发连接
limit_req zone=one burst=5 nodelay;
# 限速(每个连接128KB/s)
limit_rate 128k;
# 优化大文件发送
sendfile_max_chunk 512k;
aio threads;
directio 4m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置要点:
worker_processes:通常设置为 CPU 核心数。listen:作为专用下载服务器,建议使用非标准端口(如8080),并在防火墙中关闭不必要的端口。accesskey_signature:其中的your_secret需与生成下载链接的应用程序保持一致。- 限速参数(
limit_rate、sendfile_max_chunk等)可根据服务器带宽和需求调整。
5. 设置开机自启与日志切割
将 Nginx 启动命令加入 rc.local 以实现开机自启。
echo "/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf" >> /etc/rc.local
chmod +x /etc/rc.local
建议配置日志切割(如按天切割),可使用 logrotate 或自行编写脚本。
三、FTP 服务安装与配置(vsftpd)
1. 安装与基础配置
安装 vsftpd。
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
编辑主配置文件 /etc/vsftpd/vsftpd.conf,确保以下关键设置:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO # 与 user_list 文件配合,仅允许列表中的用户
chroot_local_user=YES # 将用户限制在其家目录
allow_writeable_chroot=YES # 允许被限制的用户有写权限
2. 创建 FTP 用户
创建一个专门用于文件上传的系统用户,并指定其家目录为下载服务器的文件根目录。
useradd -d /path/to/your/files -s /sbin/nologin ftpuser
passwd ftpuser
将用户名 ftpuser 添加到允许访问的列表文件中。
echo "ftpuser" >> /etc/vsftpd/user_list
重启 vsftpd 服务使配置生效。
systemctl restart vsftpd
3. 防火墙配置
如果系统启用了防火墙(如 firewalld 或 iptables),需要放行 FTP 端口(默认为21)以及被动模式端口范围。
# 对于 firewalld
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=30000-31000/tcp # 被动模式端口范围
firewall-cmd --reload
# 或在 vsftpd.conf 中指定被动模式端口范围
pasv_min_port=30000
pasv_max_port=31000
四、安全与优化建议
1. 服务器安全
- 修改 SSH 端口:避免使用默认的22端口,减少暴力破解风险。
- 使用密钥登录:禁用 SSH 密码登录,采用密钥对认证。
- 配置防火墙:严格限制入站端口,仅开放必要的服务端口(如 Nginx 下载端口、FTP 端口、SSH 新端口)。
- 定期更新:保持系统和软件(如 Nginx、vsftpd)更新到安全版本。
2. Nginx 防盗链与限速
上文配置已启用 accesskey 模块实现防盗链。限速则通过 limit_conn、limit_req 和 limit_rate 指令组合实现,可有效防止单个用户或 IP 耗尽带宽。
3. 中文文件名支持
若通过 FTP 上传的中文文件名在服务器上显示乱码,通常是因为客户端与服务器编码不一致。可尝试在 vsftpd 配置中强制使用 UTF-8。
# 在 /etc/vsftpd/vsftpd.conf 中添加
utf8_filesystem=YES
五、常见问题排查
1. Nginx 启动报错
- “Address already in use”:端口被占用。使用
netstat -ntpl查找占用进程并停止,或修改 Nginx 监听端口。 - “open() "/usr/local/nginx/nginx.pid" failed”:PID 文件不存在。使用
nginx -c /path/to/nginx.conf指定配置文件启动。
2. FTP 连接问题
- 530 Login incorrect:检查
/etc/vsftpd/user_list和/etc/vsftpd/ftpusers文件,确保用户未被拒绝。检查 PAM 配置/etc/pam.d/vsftpd。 - 被动模式失败:确保防火墙已放行配置的被动模式端口范围(如30000-31000)。
通过以上步骤,你可以搭建一个具备文件上传(FTP)、安全下载(防盗链、限速)、基础监控功能的 Nginx 静态文件下载服务器。请根据实际生产环境的需求,对配置参数进行进一步调优。