这篇文章用于记录我在个人阿里云服务器ECS上配置Ngnix和vsftpd的过程,用于以后我的个人设备实现OTA升级的功能。



1.Ngnix和vsftpd是什么?


VSFTPD(全称Very Secure FTP Daemon)和Nginx(全称Engine X)都是在服务器环境中广泛使用的软件,但它们的职责截然不同。简单来说,VSFTPD专注于安全的文件传输,而Nginx则是一个高性能的Web服务器反向代理

特性

VSFTPD

Nginx

核心职能

FTP文件传输服务器

Web服务器、反向代理服务器、负载均衡器

协议

FTP / FTPS

HTTP / HTTPS、IMAP、POP3、SMTP等

主要用途

文件的上传与下载

发布网站、反向代理、负载均衡

关键特点

以安全性和轻量级著称

高性能、高并发、低内存占用

💻 如何选择与组合使用

  • 独立使用场景:如果你只需要一个让用户上传下载文件的服务器,就单独安装配置VSFTPD 。如果你的业务仅仅是提供一个网站(尤其是静态内容)或做请求转发,单独使用Nginx就足够了 。

  • 组合使用场景:这是一种非常经典的架构。让两者各司其职,协同工作:

    1. 文件上传:用户或应用程序通过FTP协议(如使用FileZilla、FtpClient )将文件上传到VSFTPD服务器。

    2. 文件存储:文件被安全地存储在VSFTPD服务器上。

    3. 文件访问:Nginx配置为指向VSFTPD的文件存储目录 。当用户通过浏览器访问文件时,Nginx通过HTTP协议高效地将文件提供出去。

    这种做法的好处是实现了文件统一管理,并且能防止文件因Tomcat等应用服务器重启而丢失 。由于浏览器主要通过HTTP访问资源,通过Nginx代理,可以方便地通过网页链接分享文件 。

执行完上面的命令后,输入:

  • 2.安装 Nginx (使用 dnf 命令)

    在终端里依次执行以下命令:

  • 更新软件源缓存

    codeBash
    dnf makecache
  • 安装 Nginx

    codeBash
    dnf install nginx -y
  • 启动 Nginx (安装完它不会自动启动,这点和 Ubuntu 不一样):

    codeBash
    systemctl start nginx
  • 设置开机自启 (防止重启服务器后服务挂了):

    codeBash
    systemctl enable nginx
  • codeBash
    systemctl status nginx

    2.1.验证是否安装成功

    codeBash

systemctl status nginx

这是我在服务器执行的结果,显示Nginx已激活


 

2.2.修改阿里云安全组入规则
 

Nginx基于HTTP(超文本传输协议实现),HTTP默认端口80,如果我们从外部访问服务器,那么需要在阿里云后台的**“安全组”**打开 80 端口。你需要去阿里云控制台 -> 实例 -> 安全组 -> 添加规则,放行 TCP 80 端口
(AI科普小知识):
80端口的意义
:80端口是HTTP(超文本传输协议)的公认标准端口。当你直接在浏览器中输入域名(如 www.example.com)时,浏览器实际上就是在尝试连接服务器的80端口。因此,Nginx 使用80作为默认端口,可以让你在部署网站后,让用户以最简便的方式(无需在网址后加端口号)进行访问
如下图:

然后进入Ngnix生成的网页看看,在浏览器输入公网地址http://你的公网IP。

2.3现在我们来修改nginx.conf

直接vi打开:vi /etc/nginx/nginx.conf。我得配置修改如下:
主要加了:
user root;

root /home/ota_files;
autoindex on; 

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        #root         /usr/share/nginx/html;
        root         /home/ota_files;
        autoindex on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

2.4检查并放入文件

确保你的目录存在,且里面有东西:

codeBash

# 1. 确保目录存在
mkdir -p /home/ota_files

# 2. 随便放个文件进去测试 (如果没有固件的话)
echo "Hello OTA" > /home/ota_files/1.txt

# 3. 确保权限开放
chmod -R 777 /home/ota_files

2.5重启 Nginx 并测试

codeBash

systemctl restart nginx

2.6再次打开网页http://你的阿里云公网IP

注意:Nginx 默认配置下,只提供“下载服务”(读),不提供“上传接口”(写)。也就是说设备可以通过HTTP请求来获取升级固件进行OTA升级了,但是不能够向服务器推送日志,我打算让设备具备向服务器推送日志的功能!接下来配置vsftpd。

3.安装vsftpd

3.1安装 vsftpd

在终端执行:

codeBash

dnf install vsftpd -y
systemctl enable vsftpd

3.2创建一个 FTP 用户

为了安全,也为了配合你代码里的 USER 和 PASS,我们需要创建一个专门的用户。
假设你的代码里:用户名是 ftpuser,密码是 123456。

codeBash

# 1. 创建用户,并将他的“家”指定为 Nginx 的那个目录
# -d 指定目录
# -s /sbin/nologin 禁止他 SSH 登录(安全)
useradd -d /home/ota_files -s /sbin/nologin ftpuser

# 2. 设置密码 (输入命令后,盲打输入 123456 并回车两次)
passwd ftpuser

# 3. 修正目录权限 (让 ftpuser 拥有读写权限)
chown -R ftpuser:ftpuser /home/ota_files
chmod -R 755 /home/ota_files

3.3修改 vsftpd 配置文件(核心)

这里是成败的关键。我们需要开启被动模式,并告诉 FTP 服务器“我是阿里云,我有公网 IP”。

  1. 打开配置文件:

    codeBash
    vim /etc/vsftpd/vsftpd.conf
  2. 清空里面所有内容(或者直接覆盖),粘贴以下配置。
    注意:把 pasv_address 改成你自己的公网 IP!
    打开配置文件 vi /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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES

# --- 锁定用户目录 (防止他乱跑) ---
chroot_local_user=YES
# 允许写根目录 (新版vsftpd安全限制)
allow_writeable_chroot=YES

# --- 阿里云专用:被动模式配置 (PASV) ---
pasv_enable=YES
# 【重要】这里填你的阿里云公网 IP
pasv_address=你的阿里云服务器公网IP
# 【重要】指定数据端口范围,一定要去安全组开这些端口
pasv_min_port=30000
pasv_max_port=30010

然后保存退出(:wq),重启服务:systemctl restart vsftpd


设置开启自启动

# 设置 FTP (vsftpd) 开机自启
systemctl enable vsftpd

3.4为vsftpd修改阿里云服务器入规则


因为 FTP 协议需要的端口(21 和 30000-30010)不在阿里云的预设快捷选项里,所以必须手动填写。

3.4.1开放 FTP 命令端口 (21)

  1. 协议类型:选 自定义 TCP

  2. 端口范围:填 21/21

  3. 授权对象:填 0.0.0.0/0 (表示允许所有人连接)

  4. 描述:可以填 “FTP命令端口”

3.4.2开放 FTP 数据端口 (30000-30010)

(这一步是必须的,否则被动模式会连不上)

  1. 协议类型:选 自定义 TCP

  2. 端口范围:填 30000/30010

    • 注意:格式是 起始端口/结束端口

  3. 授权对象:填 0.0.0.0/0

  4. 描述:可以填 “FTP数据端口”

如下图:

3.5在mobaxterm中登陆ftp服务器
 

在mobxterm中点击session,然后选择FTP,输入公网IP,账户名和端口,点击OK。然后会提示输入密码,密码是在3.2小节中设置好的那个密码123456。如果忘记密码,重置一下密码,在服务器输入命令:passwd ftpuser,然后盲打两次密码,系统会提示successful。



后续设备就可以通过FTP或者Nginx(HTTP),从服务器这个/home/ota_files这个目录下载固件了,也可以通过FTP方式来推送日志到服务器!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐