Skip to content

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临时调试
DockerPhase 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.target
bash
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/server

4.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=info
bash
sudo chmod 600 /etc/twin-server/env
sudo chown deploy:deploy /etc/twin-server/env

4.3 文件描述符限制

WebSocket 高并发需提高 nofile

bash
ulimit -n
# systemd 中 LimitNOFILE=65535

5. 代码解析

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 devsystemctl start
环境变量.env.local/etc/.../env
日志浏览器 Consolejournalctl / slog stdout
热更新Vite HMR重新 build + 重启进程
远程SSH

7. 常见错误

错误 1:监听 127.0.0.1 却从外网直连 8080

应通过 Nginx 反代,或改监听 0.0.0.0(不推荐直接暴露)。

错误 2:二进制无执行权限

Permission deniedchmod +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. 学习检查

  1. 如何从 Windows 交叉编译 Linux 二进制?
  2. systemd 的 Restart=on-failure 何时触发?
  3. 127.0.0.1:80800.0.0.0:8080 区别?
  4. 本机可访问但外网不可访问,排查步骤?
  5. 为什么生产不建议 root 运行 Go 服务?

12. 下一步

已完成下一知识点关系
Linux · SSH · Process · PortNginx · Reverse Proxy · HTTPS · DNS进程本地运行 → 对外域名与 TLS

下一步配置 Nginx 反向代理 HTTP/WebSocket,绑定域名并启用 HTTPS。


学习导航

上一篇:Docker 与 Docker Compose · 对应练习 · 下一篇:Nginx、HTTPS 与 DNS