Ubuntu 部署产品原型静态服务器:SFTP + Nginx

Ubuntu 部署产品原型静态服务器:SFTP + Nginx

一、目标

在 Ubuntu 云服务器上搭建一个简单的产品原型静态服务器:

  • 产品经理通过 SFTP 上传、删除、修改原型文件。
  • 产品经理只能操作 /opt/prd 下的文件,无法通过 SSH 执行 Linux 命令。
  • Nginx 将 /opt/prd/www 作为静态网站根目录。
  • 产品经理可以自由创建多级目录,不需要修改 Nginx 配置。
  • 每个目录只要存在 index.html,即可直接通过 URL 访问。
  • 上传或修改文件后,刷新浏览器即可生效。

最终目录结构:

text 复制代码
/opt/prd/
└── www/
    ├── lims/
    │   ├── index.html
    │   ├── css/
    │   ├── js/
    │   └── demo/
    │       └── index.html
    │
    ├── iot/
    │   └── index.html
    │
    └── 2026/
        └── project/
            └── demo/
                └── index.html

对应访问地址:

text 复制代码
http://prd.xxx.com/lims/
http://prd.xxx.com/iot/
http://prd.xxx.com/lims/demo/
http://prd.xxx.com/2026/project/demo/

二、创建目录

首先创建产品原型目录:

bash 复制代码
sudo mkdir -p /opt/prd/www

/opt/prd 作为 SFTP 的 Chroot 根目录,因此必须由 root 用户拥有:

bash 复制代码
sudo chown root:root /opt/prd
sudo chmod 755 /opt/prd

www 是真正存放产品原型文件的目录。


三、创建 SFTP 用户

创建一个专门用于产品原型管理的用户 prd

bash 复制代码
sudo useradd -d /www -s /usr/sbin/nologin prd

设置登录密码:

bash 复制代码
sudo passwd prd

然后将 /opt/prd/www 交给 prd 用户管理:

bash 复制代码
sudo chown prd:prd /opt/prd/www
sudo chmod 755 /opt/prd/www

最终权限关系:

text 复制代码
/opt/prd       root:root       755
└── www        prd:prd         755

这样既满足 SSH Chroot 的要求,又允许 prd 用户自由操作 www 目录。


四、配置 SFTP

备份 SSH 配置:

bash 复制代码
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

编辑 SSH 配置:

bash 复制代码
sudo nano /etc/ssh/sshd_config

在文件末尾增加:

text 复制代码
Match User prd
    ChrootDirectory /opt/prd
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no

其中:

text 复制代码
ChrootDirectory /opt/prd

表示 prd 用户登录后看到的根目录就是:

text 复制代码
/

实际上对应服务器上的:

text 复制代码
/opt/prd

因此产品经理登录 SFTP 后看到:

text 复制代码
/
└── www/

而无法看到服务器上的:

text 复制代码
/etc
/var
/home
/opt

等其他系统目录。


ForceCommand internal-sftp

text 复制代码
ForceCommand internal-sftp

是整个权限控制的关键。

它表示 prd 用户只能使用 SFTP,不能通过 SSH 获得 Shell。

例如不能执行:

bash 复制代码
rm -rf /
docker ps
systemctl restart nginx

只能通过 WinSCP、FileZilla 等 SFTP 客户端操作文件。


五、检查并重启 SSH

修改配置后先检查:

bash 复制代码
sudo sshd -t

如果没有任何输出,说明配置语法正确。

然后重启 SSH:

bash 复制代码
sudo systemctl restart ssh

可以检查 SSH 服务状态:

bash 复制代码
sudo systemctl status ssh

六、使用 FileZilla 连接

产品经理可以使用 FileZilla。

连接参数:

text 复制代码
文件协议:SFTP
主机名:服务器 IP
端口:22
用户名:prd
密码:设置的密码

登录后:

text 复制代码
/
└── www/

进入 /www 后,就是产品经理自己的原型目录。

例如:

text 复制代码
/www/
├── lims/
├── iot/
├── animal/
└── test/

产品经理可以自由进行:

  • 上传
  • 下载
  • 新建目录
  • 删除
  • 重命名
  • 移动
  • 覆盖文件
  • 创建多级目录

不需要登录服务器,也不需要执行 Linux 命令。


七、安装 Nginx

如果服务器还没有 Nginx:

bash 复制代码
sudo apt update
sudo apt install nginx -y

确认 Nginx:

bash 复制代码
sudo systemctl status nginx

八、配置 Nginx

假设原型服务器域名:

text 复制代码
prd.xxx.com

创建 Nginx 配置:

bash 复制代码
sudo nano /etc/nginx/sites-available/prd

写入:

nginx 复制代码
server {
    listen 80;
    server_name prd.xxx.com;

    root /opt/prd/www;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

这里最重要的是:

nginx 复制代码
root /opt/prd/www;

它表示:

text 复制代码
URL路径
    ↓
/opt/prd/www

例如:

text 复制代码
http://prd.xxx.com/lims/

对应:

text 复制代码
/opt/prd/www/lims/

如果目录中存在:

text 复制代码
/opt/prd/www/lims/index.html

Nginx 就会返回这个文件。


九、启用 Nginx 配置

创建软链接:

bash 复制代码
sudo ln -s /etc/nginx/sites-available/prd /etc/nginx/sites-enabled/prd

如果不再需要 Ubuntu 默认站点,可以删除:

bash 复制代码
sudo rm -f /etc/nginx/sites-enabled/default

检查 Nginx 配置:

bash 复制代码
sudo nginx -t

正常情况下会看到:

text 复制代码
syntax is ok
test is successful

然后重新加载:

bash 复制代码
sudo systemctl reload nginx

十、创建第一个产品原型

通过 WinSCP 登录:

text 复制代码
/www/

创建:

text 复制代码
lims/

上传:

text 复制代码
index.html

最终服务器:

text 复制代码
/opt/prd/www/
└── lims/
    └── index.html

浏览器访问:

text 复制代码
http://prd.xxx.com/lims/

即可打开原型。


十一、支持任意多级目录

这个方案不要求项目目录固定。

例如产品经理可以创建:

text 复制代码
/opt/prd/www/
└── 2026/
    └── 08/
        └── LIMS/
            └── V2/
                └── PC/
                    ├── index.html
                    ├── css/
                    ├── js/
                    └── images/

直接访问:

text 复制代码
http://prd.xxx.com/2026/08/LIMS/V2/PC/

Nginx 会自动找到:

text 复制代码
/opt/prd/www/2026/08/LIMS/V2/PC/index.html

因此产品经理可以按照自己的习惯组织目录,不需要开发人员参与。


十二、静态资源和页面跳转

例如项目:

text 复制代码
lims/
├── index.html
├── css/
│   └── style.css
├── js/
│   └── app.js
├── images/
│   └── logo.png
└── pages/
    ├── user.html
    └── device.html

HTML 中可以正常使用相对路径:

html 复制代码
<link rel="stylesheet" href="css/style.css">

<script src="js/app.js"></script>

<img src="images/logo.png">

<a href="pages/user.html">用户管理</a>

也可以使用目录跳转:

html 复制代码
<a href="pages/">页面管理</a>

如果:

text 复制代码
pages/
└── index.html

那么:

text 复制代码
/pages/

会自动打开:

text 复制代码
/pages/index.html

十三、修改原型后是否需要重启?

不需要。

例如产品经理修改:

text 复制代码
/opt/prd/www/lims/index.html

或者替换:

text 复制代码
/opt/prd/www/lims/js/app.js

Nginx 会直接读取最新文件。

产品经理只需要:

text 复制代码
上传/修改文件
       ↓
刷新浏览器
       ↓
看到最新版本

不需要:

bash 复制代码
nginx reload

也不需要重启服务器。


十四、最终架构

text 复制代码
                 产品经理
                     │
                     │ SFTP
                     ▼
              用户:prd
                     │
                     ▼
               /opt/prd
                     │
                     └── www
                         │
                         ├── lims
                         ├── iot
                         ├── animal
                         └── 其他任意目录
                              │
                              │
                         Nginx :80
                              │
                              ▼
                     http://prd.xxx.com

权限关系:

text 复制代码
/opt/prd
    │
    ├── root:root
    │
    └── www
         │
         └── prd:prd

最终实现的效果就是:

prd 用户负责维护 /opt/prd/www 下的所有原型文件,Nginx 负责把这个目录直接作为静态网站根目录。产品经理怎么创建项目、怎么划分目录都不受限制,只要目录下存在 index.html,就可以通过对应 URL 直接访问。

相关推荐
旗开得胜马到成功2 小时前
AMD TPM 8.3/8.5漏洞技术剖析:服务器加密信任根崩塌后的备份密钥泄露风险与紧急加固
运维·服务器·网络·系统架构
guanchabao2 小时前
三相63A与端口级遥调并行:2026年AI服务器老化测试专用PDU的选型路径
服务器
烬羽2 小时前
nginx 里写 localhost 反而 502?一条请求带你彻底搞懂 Docker 端口映射与反向代理
nginx·docker·程序员
breeze jiang2 小时前
TypeScript 工具类型怎么记:从 Pick、Omit 到 keyof 与 Exclude 推导
linux·ubuntu·typescript
小林ixn2 小时前
Docker + Nginx 反向代理:从“我电脑能跑”到“哪里都能跑”
nginx·docker·容器
深念Y3 小时前
无头电视盒子改服务器调优记录
linux·运维·服务器·串口·嵌入式·电视盒子·海思
hyf3266333 小时前
高收益玩法:站群泛程序结合本地服务引流变现全流程
运维·服务器·前端·搜索引擎·蜘蛛池
我是小灰灰吖3 小时前
Qt 6.9.3 Ubuntu 22.04 虚拟键盘显示问题全记录与解决方案
linux·qt·ubuntu
Mortalbreeze3 小时前
深入理解TCP协议(一):TCP报文格式详解
linux·服务器·网络·tcp/ip