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 直接访问。