用Remote SSH把开发环境搬上云服务器:从零到网站上线全记录
2026/9/16 2:32:22 网站建设 项目流程

1. 写在前面:为什么把开发环境直接搬到云端

先交代一下背景。我手头有一台某厂商的促销云服务器,2核2G、40GB SSD系统盘,续费一年不到一百块。买它的初始意图纯粹是折腾——搭个个人站点、挂点小服务,本质上就是个“玩具服务器”。但真到动手的时候发现问题来了:代码在本地写得好好的,一发到服务器就各种报错;环境变量、依赖版本、系统库对不上,来回传文件改配置能磨掉一晚上。后来我换了个思路,用 Trae 的 Remote SSH 功能直接把整个开发环境搬到云服务器上,本地 Trae 窗口里操作的所有文件、终端命令,全部跑在远程机器的真实环境里。代码、环境、部署三者彻底统一,从空系统到网站开口上线,我实测走通完整流程只用了两个多小时。

这篇文章就把全过程完整记录下来。你不需要有很深的运维基础,我尽量把每一步都拆开讲,包括命令、参数、踩坑点、为什么这么做,全部交代清楚。适合三类人看:一是刚买了便宜云服务器还不知道拿来干嘛的;二是本地开发能跑、一部署就废的“环境毁灭者”;三是对 AI 编程工具感兴趣、想让它直接操作远程服务器的新手。

2. 整体思路与方案选型

2.1 为什么用 Remote SSH,而不是本地开发再上传

先说结论:Remote SSH 的核心价值,是把你的 IDE(在这里是 Trae)从“本地工具”变成一个“远程控制台”。你的编辑器界面还是本地的,但底下的文件系统、终端、调试器、运行环境,全在服务器上。

这个方案对“服务器部署”这件事是降维打击。如果用传统方式,流程是这样的:本地写代码 → 本地测试 → 打包上传 → 服务器装环境 → 服务器跑起来 → 报错 → 回本地改 → 再上传。中间任何一步环境不一致,都会产生“我本地明明是好的”这种经典冲突。

用 Remote SSH,流程直接变成:SSH 连上服务器 → 在服务器里写代码 → 在服务器里跑 → 在服务器里部署。环境只有一份,就是线上那份。对新手来说,最大的好处是:你操作的就是真实环境,不存在“本地模拟”的偏差。我实际体验下来,Trae 对远程模式的支持做得相当流畅,文件的打开、保存、搜索,和本地操作几乎没有感知差异。

2.2 为什么是 Trae,顺手说下和 Cursor 的区别

Trae 是字节跳动出的 AI IDE,界面和操作习惯基本复刻 VS Code,所以 VS Code 的 Remote SSH 工作流可以直接迁移过来。它内置了 Chat 和 Builder 两种 AI 交互模式:Chat 适合对话式解答问题,Builder 可以按自然语言指令直接改代码、建文件。我实测在远程服务器里,让 Builder “把 Nginx 默认页改成一个带样式的个人介绍页”,它能直接定位到远程的 /var/www/html/index.html 并完成修改,不需要我手动切换上下文。

你可能想问,用 Cursor 不也一样吗?说实话,Cursor 的 Remote SSH 我也用过,两者功能上基本对标。但 Trae 目前对国内用户更友好的是:下载不用额外处理网络问题,注册门槛低,而且基础模型对话是免费的。对预算有限的个人开发者来说,这很重要。接下来所有操作均以 Trae 为例,核心步骤同样适用于 VS Code 或 Cursor。

2.3 整体路线规划与流程拆解

我这次的目标很明确:一台裸系统云服务器 → 上线一个可访问的网页。围绕这个目标,我把整个流程拆成了四个阶段:

  1. 云服务器初始化:选系统镜像、配置安全组、确认 SSH 能连上。
  2. Trae 端准备:安装 Trae、解决 Remote SSH 扩展问题、配置 SSH 免密登录。
  3. 服务器环境搭建:安装 Nginx、配置站点目录、准备网页文件。
  4. 署与验证:启动服务、绑定域名、访问确认。

这个顺序是有讲究的。很多新手喜欢先装环境再连 IDE,其实恰恰相反——先用 Remote SSH 把“远程开发通道”打通,后续所有操作都可以在 Trae 的终端里完成,根本不需要再开一个本地 SSH 客户端,也不用来回切窗口。我建议你严格按这个顺序走,能少踩很多坑。

3. 云服务器选购与初始化细节

3.1 99元机型配置怎么看,够用吗

我实测的机型是 2核CPU、2GB内存、40GB SSD盘,带宽按量计费或固定3Mbps。先给个结论:跑个人网站、博客、小型 API 服务,完全够用;但别指望它跑大型应用或高并发服务。

关于带宽,我看到很多人买完服务器后抱怨“访问好慢”,其实是带宽太小。固定 3Mbps 的带宽,理论下载速度约 384KB/s,放一个纯静态页面或轻量博客绰绰有余。但如果你的页面放了高清图、视频,首屏加载就会明显变慢。我的建议是:初期就做个人展示页、博客这类轻量内容,完全够用。后续如果流量大了,再升配或上对象存储 CDN,都比直接升级服务器带宽划算。

内存 2GB 要精打细算。装完 Nginx + PHP + MySQL 全家桶后,内存占用大概在 700MB-1GB 左右,还留有余量。如果再用 Docker 跑容器,建议给 Docker 分配的资源限制写明确,否则内存容易被吃满导致 OOM。

3.2 系统镜像怎么选,我踩过的镜像坑

云厂商默认会提供多种系统镜像,常见的有:Ubuntu、Debian、CentOS(或 Rocky Linux)、Windows Server 等。个人建站我强烈推荐 Debian 系,而不是 CentOS 系。原因有三点:

第一,软件版本新。Ubuntu 22.04/24.04、Debian 12 的软件源里,Nginx 都是 1.22+ 版本,PHP 至少 8.1。CentOS 7 的默认源还停留在 Nginx 1.16、PHP 5.4,这个版本跑现代框架会非常痛苦。第二,社区资料多。你搜“服务器装 Nginx”,十篇教程里九篇是 Ubuntu/Debian 的,命令直接照着敲就行。第三,apt 包管理比 yum 直观,依赖处理更省心。

操作建议:在云厂商控制台选“Ubuntu Server 22.04 LTS”或“Debian 12”,64位架构。我这次用的是 Ubuntu 22.04,下面所有命令都基于这个版本。如果你已经买了 CentOS,建议直接重装系统,越早换越省事。

3.3 安全组配置:不先放行端口,后面全是坑

这一步很多人忽略,但它是“连不上服务器”的头号原因。云服务器的安全组相当于一层外部防火墙,默认只放行 22 端口(SSH),其他端口全部拦截。

我的建议是,在初始化阶段一次性配置好常用端口:

  • 22:SSH 远程登录,必须放行。
  • 80:HTTP 访问网站,必须放行。
  • 443:HTTPS 访问网站,如果后续要上证书就放行。
  • 其他端口(如 8080、3306)等用到时再开,没必要提前暴露。

注意,这里有两个层面的防火墙。一个是云控制台的安全组,一个是服务器系统内的防火墙(如 iptables、ufw)。我遇到的坑是:安全组放行了 80 端口,但系统内 ufw 没放行,结果网页还是打不开。所以在装完系统后,建议先确认 ufw 状态。Ubuntu 默认 ufw 是 inactive,不需要额外处理;如果你主动开启了 ufw,记得执行sudo ufw allow 80/tcp

3.4 初始密码、密钥登录与 SSH 快速验证

购买服务器后,你会得到 root 密码或可以设置密码。第一件事是本地终端尝试 SSH 登录验证:

ssh root@你的服务器公网IP

这里有一个非常重要的建议:立刻配置 SSH 密钥登录,因为密码登录容易被暴力破解。云服务器默认暴露在公网上,我见过新买的服务器开一天,/var/log/auth.log里就有几百条来自各个境外 IP 的 SSH 爆破尝试。

配置密钥登录的流程:

在本地机器下(不是服务器上)执行:

ssh-keygen -t rsa -b 4096

一路回车即可,会在~/.ssh/id_rsa.pub生成公钥。然后通过 ssh-copy-id 命令把它上传到服务器:

ssh-copy-id root@你的服务器公网IP

输入一次密码后,公钥就会被追加到服务器的~/.ssh/authorized_keys里。之后用ssh root@你的服务器公网IP登录就不再需要密码了。

登录成功后再做一步加固:修改服务器上的/etc/ssh/sshd_config,找到PasswordAuthentication,把它改成no,然后重启 sshd 服务:

sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config sudo systemctl restart sshd

这样服务器就只认密钥,不认密码了。这一步强烈建议做,成本极低收益极大。

4. Trae 环境准备与 Remote SSH 连接配置

4.1 安装 Trae 与第一次启动注意点

打开 Trae 官网下载对应系统的安装包(Windows 或 macOS 都有)。安装过程没什么好说的,一路下一步。首次启动会要求登录账号,我用的是 Google 邮箱直接登录,没遇到阻碍。

启动后的界面和 VS Code 几乎一致,左侧是活动栏,中间是代码编辑区,底部是终端面板。菜单栏里有“File → Open Remote Window”之类的选项,这就是 Remote SSH 功能的入口。

有一个细节容易忽略:Trae 对中文环境的支持做得不错,但如果你的系统用户名是中文,可能会导致远程连接时某些路径出现兼容问题。建议本地用户名保持英文,实在不行也可以在 Trae 里用英文路径工作目录,别用中文。

4.2 Trae 扩展市场找不到 Remote SSH 的解决办法

这一步是全网坑最多的环节。Trae 目前的内置扩展市场不完全等于 VS Code 官方市场,搜索 “Remote SSH” 可能会出现两种情况:要么搜不到,要么搜到了但安装报错。

我当时就遇到了安装失败的情况,后来发现正确姿势是手动下载 VSIX 文件安装。具体操作如下:

打开 VS Code 官方扩展市场页面,在搜索框输入Remote - SSH,找到发布者为 Microsoft 的那个扩展,点击右侧的 “Download Extension” 按钮,会得到一个.vsix文件。

然后在 Trae 中打开扩展面板(快捷键 Ctrl+Shift+X),点击右上角的...菜单,选择 “Install from VSIX”,选中刚才下载的文件,等待几秒即可完成安装。

安装完成后,左侧活动栏会出现一个远程资源管理器图标。记得检查扩展版本是否与 Trae 兼容,如果安装后提示版本不兼容,可以去找历史版本。一般来说,微软发布的 Remote SSH 系列对 VS Code 内核的兼容性做得很好,我装的版本没有遇到任何问题。

4.3 在 Trae 中配置 SSH 连接与免密登录

Trae 的 Remote SSH 连接配置,本质上是复用你本机的~/.ssh/config文件。你可以直接用文本编辑器打开这个文件,或者在 Trae 的远程资源管理器里点 “Settings”,选择 SSH 配置文件路径。

我推荐直接在~/.ssh/config里维护,一劳永逸。内容格式如下:

Host my-server HostName 你的服务器公网IP User root Port 22 IdentityFile ~/.ssh/id_rsa

这里是关键配置项说明:Host是自定义别名,用来区分不同服务器;HostName填公网 IP;User填 SSH 登录用户,这里是 root;IdentityFile指向你刚才生成的私钥路径。如果私钥路径不写也可以,SSH 会默认去~/.ssh/id_rsa找,但显式写明更稳妥。

这个配置文件的核心价值是“多服务器管理”。以后你买第二台、第三台机器,只需要在这个文件里多加几段配置即可。连接时在 Trae 远程资源管理器里选对应的 Host,点连接,首次会有指纹确认提示,选 Continue 即可。

注意:这一步一定要先完成上一章的免密登录配置。否则每次连接 Trae 都会弹密码输入框,体验很割裂,而且密码在 IDE 里输入还有被记录的风险。

5. 实操部署全程:Nginx 环境搭建与站点上线

5.1 连接服务器,打开远程终端

在 Trae 远程资源管理器中,右键你的 Host,选择 “Connect to Host in New Window”。此时 Trae 会新开一个窗口,左下角显示绿色状态条,表示已经连接到远程服务器。底部终端会自动变成远程机器的终端,你在这里敲的任何命令,都执行在云服务器上。

验证一下是否真正处于远程环境:

hostnamectl

如果输出的是你云服务器的主机名,说明连接成功。这时候本地和远程的边界已经消失了——你在 Trae 里打开文件夹、编辑文件,操作的就是服务器上的真实文件。

在 Trae 的欢迎页点击 “Open Folder”,在弹窗中输入远程路径/root,回车。Trae 会打开远程目录,你可以像操作本地文件一样浏览服务器文件。

5.2 安装 Nginx,一条命令与三步验证

环境我选择 Nginx 直接安装,不上 Docker。原因很简单:个人静态站就一个 Nginx 进程,用 Docker 反而多一层抽象,还要管理镜像和容器,内存开销也不可控。

Ubuntu 下安装 Nginx 只需一行命令:

sudo apt update && sudo apt install -y nginx

装完后验证三步走。第一步检查服务状态:

systemctl status nginx

看到 active (running) 就说明启动成功。第二步检查端口监听:

ss -tlnp | grep :80

如果输出包含nginx: master进程监听0.0.0.0:80,说明 80 端口正常。第三步直接本地请求验证:

curl -I http://localhost

返回 HTTP/1.1 200 OK,说明 Nginx 已经正常工作。

5.3 网站文件放哪,权限怎么给

Ubuntu 上 Nginx 的默认站点根目录是/var/www/html。初始状态下,这个目录下有一个index.nginx-debian.html文件,是默认欢迎页。

我习惯把个人站点文件放在/var/www/mysite下,而不是直接改默认目录,这样后续多个站点方便管理。创建目录并写入一个最简单的页面:

sudo mkdir -p /var/www/mysite sudo tee /var/www/mysite/index.html > /dev/null <<'EOF' <!DOCTYPE html> <html> <head><title>My First Site</title></head> <body><h1>Hello from Trae Remote SSH!</h1></body> </html> EOF

权限这里是个坑。默认情况下,/var/www/mysite的属主是 root,Nginx 的 worker 进程以www-data用户身份运行。如果目录权限是 755,文件权限是 644,那 Nginx 可以正常读取;但如果你后续要直接在 Trae 里修改这个文件,可能会遇到“Permission denied”报错,因为当前登录的 root 虽然能改,但你通过 Trae 打开文件时用的可能是 root 身份或 www-data 身份,容易混乱。

最简单的解决方案:把整个站点目录的属主改成你 SSH 登录的用户(这里就是 root)即可:

sudo chown -R root:root /var/www/mysite

因为 root 权限最高,Trae 用 root 账号连接,写入没问题。如果是 Ubuntu 默认禁用了 root 登录的系统,就改成你自己的用户名和用户组。

然后修改 Nginx 默认站点配置,把root指向你的新目录。Nginx 默认站点配置在/etc/nginx/sites-available/default,编辑它:

sudo vim /etc/nginx/sites-available/default

找到root /var/www/html;这一行,改成:

root /var/www/mysite;

然后测试配置并重载:

sudo nginx -t sudo systemctl reload nginx

这一步非常关键,nginx -t会检查配置语法,如果输出syntax is ok再重载,千万不要跳过语法检查直接 reload,否则配置写错了 Nginx 直接罢工,比不重载还麻烦。

这时在浏览器输入服务器公网 IP,就能看到Hello from Trae Remote SSH!了。

5.4 让 AI 远程改代码:Trae Builder 的实际体验

网站上线是上线了,但内容过于简陋。这时候我试试 Trae 的 AI 能力——不手动写 HTML/CSS,而是让 Builder 在远程环境中直接生成一个完整页面。

在 Trae 的 Builder 模式对话框中输入:

“在 /var/www/mysite 下创建一个漂亮的个人主页 index.html,包含个人头像位、自我介绍区域、项目卡片布局和页脚,使用现代渐变风格,内联 CSS 即可,不要外部依赖。”

Builder 会先扫描当前打开的远程文件夹结构,然后直接创建、修改文件。我实测它能够准确命中远程目录,不会误改到本地文件。生成的页面结构和样式都比较完整,保存后刷新浏览器,站点样式马上变化。这个体验让我觉得 Remote SSH + AI 组合确实是未来趋势:以前部署 = 代码 + 运维 + 反复试错,现在对话式就能把前 80% 的工作做完。

如果你用的是 Chat 模式,它只会给建议不直接改文件,适合答疑。Build 模式适合“直接干活”,建议多用 Builder。AI 在远程模式下工作得很好的一个前提是:你通过 Remote SSH 打开的目录必须在服务器上,不要让 Builder 操作它看不见的路径。

5.5 域名解析与绑定,顺便 HTTP 访问优化

有 IP 能访问只是第一步,有域名才算真正“有网站在线”。这一步很顺滑:在域名服务商处添加一条 A 记录,指向你的服务器公网 IP。

DNS 解析生效后,修改 Nginx 默认配置的server_name

server_name example.com www.example.com;

同时加上一个 301 跳转,把 www 统一提到主域名:

server { listen 80; listen [::]:80; server_name www.example.com; return 301 http://example.com$request_uri; } server { listen 80; listen [::]:80; server_name example.com; root /var/www/mysite; index index.html; }

配置完成后sudo nginx -t && sudo systemctl reload nginx,再用域名访问,一切正常。到这里,“从空盘到网站上线”的全流程已经走通。

最后一个优化小点:HTTP 访问如果觉得速度慢,可以在 Nginx 里开启 gzip 压缩。在/etc/nginx/nginx.conf的 http 块中加入:

gzip on; gzip_min_length 1k; gzip_types text/plain text/css application/javascript application/json;

静态页面压缩后体积能减少 60-70%,体感明显。

6. 常见问题与排查技巧实录

6.1 表格:七类高频问题直查手册

问题现象可能原因解决办法
SSH 连接超时/无响应安全组未放行 22 端口登录云控制台,检查安全组入方向是否放行 TCP 22
密码正确但 SSH 拒绝服务器上禁用了密码登录用密钥登录,或修改 sshd_config 重新启用
连上后马上断开服务器 IP 被 SSH 限流等待几分钟再试;检查 fail2ban 是否触发
Trae 扩展安装报错扩展市场源不兼容手动下载 VSIX 文件本地安装
浏览器打开 IP 无响应安全组/服务器防火墙未放行 80安全组合 ufw(如有)都放行 80
页面返回 403 ForbiddenNginx 用户无读取权限检查站点目录权限,chmod 755 + chown 调整属主
Reload Nginx 后 502PHP-FPM 未启动或 socket 路径不符确认 php-fpm 服务状态和fastcgi_pass配置

这张表基本覆盖了部署过程中 90% 的“小白卡点”。我建议收藏起来,遇到问题先对照排查。

6.2 如何判断是“安全组”还是“系统内防火墙”的问题

这是所有服务器问题的重灾区。我的排查方法论是“从外部到内部层层递进”:

第一步,在本地机器执行telnet 你的IP 80,看能不能通。如果不通,问题大概率在安全组或运营商网络。第二步,登录服务器执行curl -I http://localhost,如果本地能通但外部不通,基本可以锁定是安全组没放行。第三步,检查sudo ufw status,如果是 active,再看 80 端口是否 allow;如果不是,确认 iptables 是否有 drop 规则。

这个方法论同样适用于 22 端口。很多朋友抱怨 SSH 连不上,其实本地ping也不通,那纯粹就是安全组问题,你在服务器上折腾什么防火墙都是白费力气。这套排查顺序我相机了大量时间,是非常高效的手段。

6.3 一个令新手困惑的 Nginx 权限问题剖析

这是一个很经典的问题:首页能打开,但子目录里的 HTML 打开是 403。现象就是 Nginx 报Permission denied

原因不是文件权限没给够,而是 Nginx 从根目录到子目录的每一级目录都需要有x(执行)权限,否则无法进入目录。我见过有人把/var/www设成700,结果 Nginx 以 www-data 身份根本进不去。

最稳妥的目录权限方案:目录设置为755,文件设置为644。这也意味着,如果你在 Trae 里创建了一个新目录,默认权限可能是755,但如果是通过 FTP 或某些工具上传的文件,权限可能变成777,这又带来安全隐患。统一用这条:

sudo find /var/www/mysite -type d -exec chmod 755 {} \; sudo find /var/www/mysite -type f -exec chmod 644 {} \;

注意 chown 的场景。如果你要放的是 PHP 项目且涉及文件上传,那需要让 web 用户对特定目录有写权限,比如:

sudo chown -R www-data:www-data /var/www/mysite/uploads sudo chmod 755 /var/www/mysite/uploads

但千万别把整个站点目录都 chown 成 www-data,否则后续通过 FTP 或 Trae 修改文件会遇到写不进去的尴尬局面。

6.4 Trae 远程模式下 AI 功能失效的排查

用 Remote SSH 时,偶尔会遇到一种情况:连接正常、文件能打开、终端能敲命令,但 Builder 或 Chat 的 AI 功能完全“变笨”,上下文感知不到远程文件。这个问题我排查后发现,多数是扩展冲突或 Trae 没有正确识别远程工作区。

解法:在远程模式下,确保你打开的文件夹确实来自 SSH 通道——左下角绿色按钮应该显示你的 Host 名,而不是本机目录。然后用快捷键Ctrl+Shift+P,输入 “Remote-SSH: Show SSH Configuration File”,确认配置是否正确。

再过一遍:如果你在本地模式打开了远程目录下的文件(比如通过文件路径方式),AI 可能只看到本地视图,操作对象就会错乱。正确做法永远是先 Connect to Host,再 Open Folder。

另一个细节是,Trae 的 AI 功能依赖网络,如果你的服务器网络到模型服务的连通性不好,也可能出现 AI 无响应。在服务器终端curl -I试一下连通性,不行就检查服务器出方向安全组是否过于严格。

7. 最后再分享一个值得尝试的扩展方向

网站跑起来之后,别急着收工。Remote SSH 的价值不止于部署静态页面,它完全可以成为你的“云端开发主力环境”。我现在这台 99 元的服务器上还挂了两个小项目,一个是基于 Flask 的 API 服务,一个是 TypeScript 写的定时任务。日常修改代码时,本地 Trae 连上远程后直接改、直接重启服务,整个过程都不需要打开第二个终端窗口。

如果你对这个玩法感兴趣,下一步可以试两件事:第一,在服务器安装 Node.js 或 Python 环境,用 Trae 的 Builder 生成一个小接口,然后让 Nginx 反向代理到这个端口,实现动态网站;第二,用 docker-compose 把 Nginx + 数据库 + 应用一次编排起来,这样你有一百个服务也能一条命令搞定管理。这些内容以后有时间我会再写文章详细拆解。

根据我这次实测的经验,Trae + Remote SSH + 便宜云服务器的组合,性价比和体验都相当可观。这个流程最大的价值是:它把“部署”这件事的门槛拉到极低,低到最后你会发现,阻碍你上线一个网站的主要因素,不再是工具链和命令,而只是你“愿不愿意花两小时跑通一次”。动手试试吧,跑通之后,你会打开新世界的大门。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询