外观
Linux 运维基础
Phase 08 — Deployment · 知识点 01–04:Linux · SSH · Process · Port
1. 学习目标
完成本知识点后,你应该能够:
- 使用 Linux 基础命令管理文件、目录与权限
- 通过 SSH 安全远程连接云服务器
- 以 systemd 或 nohup 方式管理 Go 服务 Process
- 理解 Port 监听、防火墙与端口转发
- 在 Linux 上部署 Go 编译产物并验证 WebSocket 服务可达
- 排查「服务启动但外网无法访问」类常见问题
2. 为什么需要
Docker Compose 适合本地与单机,但生产环境最终运行在 Linux 服务器上。你需要 SSH 登录、上传二进制、配置进程守护、开放端口,才能让 Vue/Three.js 前端通过公网访问数字孪生 API 与 WSS。
作为前端开发者,Linux 服务器类似「没有 GUI 的远程电脑」——一切通过终端完成。
3. 核心概念
3.1 Linux 基础
| 命令 | 作用 |
|---|---|
ls -la | 列出文件与权限 |
cd / pwd | 切换 / 显示当前目录 |
cp / mv / rm | 复制 / 移动 / 删除 |
mkdir -p | 递归创建目录 |
chmod / chown | 修改权限 / 所有者 |
cat / less | 查看文件 |
grep / tail -f | 搜索 / 实时日志 |
Go 部署常用路径:
/opt/twin-server/ # 应用目录
/opt/twin-server/bin/server # 二进制
/etc/twin-server/env # 环境变量(权限 600)
/var/log/twin-server/ # 日志(若写文件)3.2 SSH(Secure Shell)
bash
# 本地连接
ssh user@203.0.113.10
# 指定密钥
ssh -i ~/.ssh/id_ed25519 deploy@203.0.113.10
# 上传二进制
scp ./server deploy@203.0.113.10:/opt/twin-server/bin/安全实践:
- 禁用密码登录,仅用密钥
- 非 root 用户 + sudo
- 修改默认 22 端口(可选)
3.3 Process(进程管理)
| 方式 | 适用 |
|---|---|
systemd | 生产推荐,开机自启、自动重启 |
nohup / screen | 临时调试 |
| Docker | Phase 07 已学,单机可继续用 |
systemd 单元示例 /etc/systemd/system/twin-server.service:
ini
[Unit]
Description=Digital Twin Go Server
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/twin-server
EnvironmentFile=/etc/twin-server/env
ExecStart=/opt/twin-server/bin/server
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.targetbash
sudo systemctl daemon-reload
sudo systemctl enable twin-server
sudo systemctl start twin-server
sudo systemctl status twin-server
journalctl -u twin-server -f # 日志3.4 Port(端口)
- Go 服务默认监听
:8080(TCP) - 监听地址:
0.0.0.0:8080对外可访问;127.0.0.1:8080仅本机(Nginx 反代时常用后者)
bash
ss -tlnp | grep 8080 # 查看监听
curl http://127.0.0.1:8080/health # 本机验证防火墙(Ubuntu ufw 示例):
bash
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
# 8080 通常不对外暴露,由 Nginx 反代4. 基础语法
4.1 交叉编译 Go 二进制
在 Windows/macOS 开发机构建 Linux 产物:
bash
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o server ./cmd/server上传到服务器并赋予执行权限:
bash
chmod +x /opt/twin-server/bin/server4.2 环境变量文件
/etc/twin-server/env:
APP_ENV=production
HTTP_ADDR=127.0.0.1:8080
DATABASE_URL=postgres://...
REDIS_ADDR=127.0.0.1:6379
LOG_LEVEL=infobash
sudo chmod 600 /etc/twin-server/env
sudo chown deploy:deploy /etc/twin-server/env4.3 文件描述符限制
WebSocket 高并发需提高 nofile:
bash
ulimit -n
# systemd 中 LimitNOFILE=655355. 代码解析
After=network.target:网络就绪后启动,避免 DB 连接时网络未初始化(DB 在同机时仍建议 healthcheck)。
Restart=on-failure:进程异常退出自动重启;正常 systemctl stop 不会触发。
127.0.0.1:8080:Go 只对本机监听,公网经 Nginx 443 进入,减少直接暴露应用端口。
journalctl -f:类似 Docker logs -f,查看 systemd 托管服务 stdout/stderr。
6. JavaScript / TypeScript 对比
| 概念 | 前端开发 | Linux 部署 |
|---|---|---|
| 运行服务 | npm run dev | systemctl start |
| 环境变量 | .env.local | /etc/.../env |
| 日志 | 浏览器 Console | journalctl / slog stdout |
| 热更新 | Vite HMR | 重新 build + 重启进程 |
| 远程 | 无 | SSH |
7. 常见错误
错误 1:监听 127.0.0.1 却从外网直连 8080
应通过 Nginx 反代,或改监听 0.0.0.0(不推荐直接暴露)。
错误 2:二进制无执行权限
Permission denied → chmod +x server。
错误 3:GLIBC 版本不匹配
Alpine 构建 musl 二进制在 Ubuntu 可能不兼容;用 CGO_ENABLED=0 静态编译或 Docker。
错误 4:防火墙未开放 80/443
本机 curl 成功,外网超时 → 检查 ufw / 云厂商安全组。
错误 5:以 root 运行 Go 服务
安全风险;创建专用 deploy 用户。
8. 实际应用
数字孪生 Go 服务部署流程
1. 本地 GOOS=linux go build
2. scp 上传到 /opt/twin-server/bin/
3. 配置 /etc/twin-server/env
4. systemctl start twin-server
5. 本机 curl /health
6. 配置 Nginx(下一知识点)对外 HTTPS/WSS与 Three.js 联调:
- 开发阶段:前端 Vite 代理到服务器
- 生产:前端静态文件 CDN,API 指向
https://api.example.com
9. 深入理解
9.1 云厂商安全组 vs ufw
两层防火墙都需放行 80/443。安全组是控制台配置,ufw 是 OS 内配置。
9.2 零停机部署(简述)
新版本二进制上传 → systemctl stop → 替换 → start。Phase 08 CI/CD 知识点会扩展为脚本化;高级方案本路线不展开。
9.3 日志轮转
长期运行需 logrotate 或仅依赖 journald 默认策略,避免磁盘写满。
10. 练习
详细练习见
exercises/phase-08-deployment/01-linux-operations.md。
Level 1 — 基础
练习 1.1:SSH 登录云服务器(或本地 WSL/VM),创建 /opt/twin-server 目录。
练习 1.2:交叉编译 Go 程序并 scp 上传,本机 curl 验证。
Level 2 — 应用
练习 2.1:编写 systemd unit,实现开机自启。
练习 2.2:配置 ufw,仅开放 SSH + 80 + 443。
Level 3 — 综合
练习 3.1:故意使进程崩溃,验证 Restart 策略。
练习 3.2:调整 LimitNOFILE,文档记录 WebSocket 并发与 ulimit 关系。
Level 4 — 项目实践
练习 4.1:Project 03 在 Linux 上以 systemd 运行,提供运维命令清单。
11. 学习检查
- 如何从 Windows 交叉编译 Linux 二进制?
- systemd 的
Restart=on-failure何时触发? 127.0.0.1:8080与0.0.0.0:8080区别?- 本机可访问但外网不可访问,排查步骤?
- 为什么生产不建议 root 运行 Go 服务?
12. 下一步
| 已完成 | 下一知识点 | 关系 |
|---|---|---|
| Linux · SSH · Process · Port | Nginx · Reverse Proxy · HTTPS · DNS | 进程本地运行 → 对外域名与 TLS |
下一步配置 Nginx 反向代理 HTTP/WebSocket,绑定域名并启用 HTTPS。