尧图精选

一次发布事故引发的服务器运维教训:从部署到排查全指南

🕒 发布时间:2026/9/8 11:50:31 📁 来源:尧图网络
黑子上线时也是第一个把服务器干爆的学生一次发布事故给我的 N 条服务器运维教训不夸张地说几乎每个第一次真正把项目部署到云服务器的开发者都经历过“页面白屏、CPU 飙升、SSH 卡死、最后只能去控制台强制重启”的至暗时刻。你以为是代码问题重启后看着监控面板发呆才发现问题远远不止“内存不够”那么简单。最近和一个刚转行做后端的朋友复盘他的一次上线事故他从大二开始写项目前端、后端、数据库一把抓终于在一个深夜信心满满地把自己的“毕设级”项目部署到一台 2 核 4G 的云服务器上结果刚把服务拉起来发到班级群不到十分钟服务器直接失去响应控制台显示 CPU 100%、内存耗尽连top命令都敲不进去。他被同学们调侃成“第一个把服务器干爆的学生”。这个场景太典型了。不是只有大厂才会遇到服务雪崩任何一台低配服务器、任何一次没有做容量评估的上线都可能让“发布”变成“事故”。这篇文章不准备只聊情绪我想借这个“学生干爆服务器”的故事把服务器从选型、连接到部署上线、性能排查、安全加固这条链路里最容易被忽略、又最容易出事的环节讲清楚。如果你是刚接触服务器运维、准备把自己的项目部署到云服务器上的开发者这篇文章值得收藏。1. 这篇文章真正要解决的问题先说结论“把服务器干爆”的本质不是服务器太差而是上线流程里缺少三个环节——容量评估、资源限制、故障预案。很多开发者对服务器的理解停留在“能用 SSH 连上去、能跑docker run、能访问 8080 端口”这个层面。这不叫会运维这只是“会操作”。真正让一个人从“会操作”走向“能上线”的是那些在项目运行过程中慢慢暴露出来的问题并发一上来就卡、日志把磁盘写满、数据库连接数被打爆、进程被 OOM Killer 杀掉、服务器时区不对导致凌晨定时任务乱跑……这些问题的共同点是什么它们都不是“代码逻辑错误”而是“运行环境问题”。它们都有一个特点本地开发环境永远不会暴露。它们都在服务器部署这个环节集中爆发。这篇文章会沿着下面几条线展开服务器的基础概念和组成部分先搞清楚你在用什么。从零开始的服务器搭建与环境初始化涵盖 SSH 远程连接和基础安全配置。上线前必需的容量评估以及服务器部署的完整流程。“干爆服务器”的真实复盘CPU、内存、连接数、数据库到底怎么排查。用最小成本构建服务器集群和高可用思路避免单点故障。生产环境下的安全底线与最佳实践。读完这篇文章你应该能做到在项目上线前判断自己的服务器大概能扛住多少并发在服务出问题时能快速定位是 CPU、内存、磁盘、网络还是数据库的锅在下次部署时知道哪些操作必须提前做。2. 为什么你的服务器会“被干爆”先理解服务器的三个真相很多新手以为“服务器”是一台性能彪悍的超级电脑。这里有偏差。一台普通云服务器的配置可能只有 1 核 2G或者 2 核 4G它的算力可能还不如你手头的笔记本。服务器真正的价值不在硬件性能而在“稳定在线、固定地址、可远程访问”这三个特性。服务器被干爆大多数情况下和“并发”有关。用大白话解释一下并发你的服务器是一个只有 2 条收银台的超市。平时来 10 个顾客排队 5 分钟就完了。突然班级群 50 个人同时点开你的页面每个人还要在后端查几次数据库收银台瞬间就堆满了人。这时候新的顾客还在不断涌入有些人等不了走了有些人挤在门口最后连超市大门SSH都被堵住了。这个比喻能解释大部分“服务器被干爆”的现象不是超市太小而是没有预期到客流量也没有给“收银台”设置排队上限。2.1 三个需要提前知道的事实第一服务器的 CPU 和内存是有限资源。多个进程、多个请求、数据库连接、缓存都要抢占内存。一旦内存耗尽Linux 内核会启动 OOM Killer随机选择一个进程杀掉——不一定是“最不重要”的进程而是内核认为最占内存的进程。你的数据库可能就这样被杀掉了而你还在奇怪为什么应用连不上数据库。第二云服务器的带宽和磁盘 IO 同样有限。很多新手只看 CPU 和内存忽略了带宽。如果你的服务器带宽是 1Mbps那理论传输速度只有 128KB/s一张 1MB 的图片就需要 8 秒才能传输完。当 20 个用户同时访问图片时带宽就被占满了页面迟迟加载不出来用户不断刷新请求数继续累积恶性循环开始。第三服务器操作系统本身的“隐藏进程”会占用资源。刚装好的 Linux 系统即使什么都不跑也会有一些系统服务在后台运行。如果你的服务器被挖矿程序入侵或者被挂上了一些恶意脚本CPU 也会莫名其妙跑到 100%。所以Web 服务器安全不是上线后才考虑的事而是环境初始化时就要做好的事。这三点共同指向一个核心观念服务器运维的前提是对资源有清晰的感知。你连服务器有多少资源、被谁消耗掉了都不清楚自然谈不上优化和预防。3. 服务器基础概念与核心辨析在进入实操之前有几个概念很容易混淆这里先做一个快速对比。概念通俗解释常见误区云服务器在云平台上购买的虚拟机本质是一台远程电脑以为配置越高越好忽略了带宽和磁盘 IOVPS虚拟专用服务器早期云服务器的叫法把 VPS 和虚拟主机混为一谈服务器集群多台服务器协同工作分摊请求压力以为只有大厂需要小项目不需要服务器虚拟化一台物理服务器上通过虚拟化技术划分多台虚拟机以为虚拟化等于容器其实虚拟化是底层技术负载均衡把请求分发到多台后端服务器和无缝集群概念混淆反向代理接收用户请求转发给后端服务器以为 Nginx 只是 Web 服务器忽略它的代理和限流能力这里再延伸一个容易踩坑的知识点服务器时区。操作系统默认时区可能是 UTC而你的业务代码、数据库、定时任务默认按本地时间运行。这会导致两个典型问题日志时间比实际时间早 8 小时排查问题的时候对不上时间线。定时任务在错误的时间执行比如你在北京时间 02:00 备份结果系统在 UTC 时间 02:00即北京时间 10:00执行正好是业务高峰期。服务器时区设置是服务器搭建环节里很小、但破坏力很大的细节。我会在第 4 节给出具体命令。4. 服务器搭建与基础配置环境准备是上线安全的第一步很多开发者的服务器“半裸奔”就上线了。这里的“半裸奔”指的不是没有应用防火墙而是基础环境没有初始化SSH 端口没改、root 密码还很简单、系统没有更新、swap 分区没配置、时区不对、文件描述符限制没调。下面的步骤建议每一台新服务器都执行一遍。4.1 环境信息与前置条件本文的操作环境以 Linux 系统为例CentOS 7 或 Ubuntu 20.04 均适用示例中使用的是云服务器。不同发行版的部分命令略有差异但思路一致。项目推荐配置操作系统Linux如 CentOS 7、Ubuntu 20.04 LTS云服务器2 核 4G 起带宽 3Mbps 以上生产环境按业务评估本地终端macOS/Linux 直接使用 TerminalWindows 建议使用 PowerShell 或 VS Code 远程插件远程连接SSH 密钥方式禁用密码登录4.2 SSH 远程连接用密钥替代密码对于经常和服务器打交道的开发者来说SSH 是基本功。很多新手习惯用密码登录但密码存在被暴力破解的风险。更稳妥的方式是使用 SSH 密钥。先在本地生成密钥对ssh-keygen -t ed25519 -C your_emailexample.com一路回车会在~/.ssh/目录生成id_ed25519私钥和id_ed25519.pub公钥。然后把公钥拷贝到服务器ssh-copy-id -i ~/.ssh/id_ed25519.pub rootyour_server_ipWindows 用户如果没有ssh-copy-id命令可以手动把公钥内容追加到服务器的~/.ssh/authorized_keys文件里。之后就可以用密钥直接登录ssh rootyour_server_ip这只是第一步。更严格的配置是修改 SSH 服务禁用 root 密码登录只允许密钥登录。修改/etc/ssh/sshd_config文件PermitRootLogin prohibit-password PasswordAuthentication no PubkeyAuthentication yes修改后重启 SSH 服务systemctl restart sshd这里要特别提醒在修改 SSH 配置前务必确认你的密钥登录已经能正常工作否则可能把自己锁在服务器外面。这也是很多新手会踩的坑——改完配置后断开连接发现再也登不进去了只能通过云厂商的控制台 VNC 去修复。4.3 系统基础优化登录服务器后第一件事是更新系统包、设置时区、配置 swap 和文件描述符限制。# 更新系统二选一取决于发行版 yum update -y # CentOS apt update apt upgrade -y # Ubuntu # 设置时区为 Asia/Shanghai timedatectl set-timezone Asia/Shanghai # 检查时区是否生效 timedatectl时区设置这一步看似简单实际项目里“时间对不上”的问题一大半都是时区导致的。服务器时区统一后日志、定时任务、数据库时间戳才能对齐。再配置 swap 交换分区。对于 2G 或 4G 内存的云服务器合理配置 swap 能缓解内存不足的问题# 创建一个 2GB 的 swap 文件 fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写入 /etc/fstab开机自动挂载 echo /swapfile swap swap defaults 0 0 /etc/fstab # 查看 swap 是否生效 free -hswap 不是万能的。它只是磁盘空间冒充的内存速度远低于真正的内存。如果进程频繁使用 swap说明物理内存已经不足靠 swap 只是暂时续命。文件描述符限制也是一个常见坑。当一个进程需要打开大量文件时比如高并发下 Nginx 要管理几千个连接默认的 1024 限制会被打满。可以通过ulimit -n查看通过修改/etc/security/limits.conf调大echo * soft nofile 65535 /etc/security/limits.conf echo * hard nofile 65535 /etc/security/limits.conf4.4 服务器虚拟化与可视化工具提到服务器虚拟化很多刚接触服务器的同学容易把它和 Docker 容器混淆。这里做一个简单但重要的区分服务器虚拟化是底层技术把一台物理服务器划分成多台虚拟机。KVM、VMware 都属于这类。容器化是基于操作系统的轻量级虚拟化多个容器共享同一个内核。Docker 属于这类。对于大多数开发者日常使用不需要深入了解 KVM 或 Xen 的底层机制但如果你需要在一台物理机上跑多个隔离环境比如内网测试机理解“虚拟化”能帮你更好地选型。另外很多新手喜欢用宝塔面板或 AppNode 这类可视化管理工具。它们确实降低了服务器搭建的门槛但有利有弊优点图形化界面文件管理、数据库、定时任务都能一键操作。缺点一些面板工具会开放额外的 Web 端口如果服务器安全组配置不当反而增加了被攻击的风险。我的建议是如果你希望通过这些工具真正理解服务器运行原理至少要会用命令行做基础操作。面板可以当辅助工具但不要让它成为你唯一的抓手。5. 服务器部署完整流程从代码到上线环境准备好之后接下来就是项目本身的上线。很多“干爆服务器”的事故并不是发生在环境初始化阶段而是在部署之后暴露出来的。所以这一节我们重点拆解部署流程。5.1 单机部署一个最简 Java Spring Boot 示例我会用一个 Spring Boot 项目作为部署示例因为 Java 后端在服务器部署中太常见了。假设你已经在本地把项目打成了 jar 包文件名是demo-0.0.1-SNAPSHOT.jar。把这个 jar 包传到服务器scp target/demo-0.0.1-SNAPSHOT.jar rootyour_server_ip:/opt/demo/在服务器上创建一个运行脚本/opt/demo/start.sh#!/bin/bash APP_NAMEdemo-0.0.1-SNAPSHOT.jar LOG_FILE/opt/demo/logs/app.log # -Xms512m: 初始堆大小 # -Xmx512m: 最大堆大小 # -XX:UseG1GC: 使用 G1 垃圾回收器 nohup java -Xms512m -Xmx512m -XX:UseG1GC \ -jar /opt/demo/$APP_NAME \ --spring.profiles.activeprod \ $LOG_FILE 21 echo App started, pid: $!这里的关键点是Java 应用的 JVM 堆内存设置必须小于服务器物理内存。例如服务器只有 4G 内存你给 JVM 设置了 3G 堆内存然后系统上还跑着 MySQL、Redis、Nginx内存很快就会被耗尽。正确的做法是给 JVM 预留一定的内存空间同时给操作系统和数据库留出余量。5.2 Nginx 反向代理与基本限流部署后端服务后通常要用 Nginx 做反向代理和静态资源服务。安装 Nginx# CentOS yum install nginx -y # Ubuntu apt install nginx -yNginx 配置示例文件路径/etc/nginx/conf.d/demo.confserver { listen 80; server_name your_domain.com; # 静态资源目录按需配置 location /static/ { alias /opt/demo/static/; expires 7d; access_log off; } # 后端 API 反向代理 location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }检查配置并重新加载nginx -t systemctl reload nginx这里还有一个容易忽略的点连接超时设置。如果你的后端服务处理一个请求需要 3 秒而 Nginx 默认的proxy_read_timeout是 60 秒那问题不大。但如果后端服务是长连接或 WebSocket就要显式配置超时时间。5.3 用 ab 命令做压力测试在把项目发到班级群之前至少应该用一个最简单的工具测试一下接口的并发承受能力。Apache Benchab是 Apache 自带的压测工具安装后可以快速测试# 安装 ab yum install httpd-tools -y # CentOS apt install apache2-utils -y # Ubuntu # 模拟 100 个并发请求总共发送 1000 个请求 ab -n 1000 -c 100 http://your_server_ip/api/hello-n是总请求数-c是并发数。压测结果会给出每秒请求数Requests per second平均响应时间Time per request失败请求数Failed requests百分位响应时间举个例子如果ab测出来每秒能处理 20 个请求而你的班级群有 60 个人同时访问并且每个人访问都会触发 3 次 API 调用那线上并发就是 180 个请求远超服务器的处理能力。这个测试结果就是你做容量判断的最好依据。我自己见过太多“本地测试 3 毫秒线上打不开”的情况。本地测试的 3 毫秒是因为只有你一个人访问线上是几十、几百个请求同时进来数据库连接、网络带宽、内存分配都会成为瓶颈。没有压测过的项目上线等于闭着眼睛发布。6. “把服务器干爆”后的排查思路定位瓶颈的五板斧现在讲最核心的部分。如果你的服务已经出现了异常——CPU 飙高、页面打不开、SSH 卡顿、服务器响应慢——应该怎么排查我推荐下面这套顺序按从硬件到软件的优先级来检查。6.1 第一步看 CPU 和内存登录服务器后如果 SSH 还能连上先执行top按ShiftP按 CPU 排序按ShiftM按内存排序。重点关注load average后面三个数代表过去 1 分钟、5 分钟、15 分钟的系统负载。如果 15 分钟数值长期超过 CPU 核心数说明系统一直在超负荷运行。哪个进程的%CPU最高。如果是 Java 应用说明应用代码或垃圾回收出了问题如果是mysqld说明数据库查询有问题如果是未知进程要警惕安全风险。哪个进程的%MEM最高。如果内存占用接近 100%看是不是 JVM 堆内存配置过大或者缓存类应用Redis占用过多。6.2 第二步看磁盘空间磁盘写满是一个隐蔽但致命的问题。日志文件、MySQL 数据、临时文件都有可能把磁盘写满。磁盘满后MySQL 会拒绝写入应用会报磁盘空间不足甚至整个系统都会出现怪异行为。df -h如果发现磁盘使用率接近 100%再定位是哪个目录占用了空间du -sh /var/log/* 2/dev/null | sort -rh | head -20一个常见的解决方案是配置日志轮转。以 Nginx 日志为例系统自带的logrotate可以自动切割、清理日志。配置文件一般在/etc/logrotate.d/nginx/var/log/nginx/*.log { daily missingok rotate 7 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate [ -f /var/run/nginx.pid ] kill -USR1 cat /var/run/nginx.pid endscript }这个配置的含义是每天切割日志保留最近 7 份压缩旧日志避免日志无限增长。6.3 第三步看网络连接数网上有一个经典的排查命令组合netstat -antp | grep :80 | wc -l统计到 80 端口的连接数量。还可以按连接状态统计netstat -ant | awk {print $6} | sort | uniq -c | sort -n正常情况下连接数不会太多而且状态应该以ESTABLISHED为主。如果你看到大量的TIME_WAIT说明连接没有被复用新的请求还要重新建立 TCP 连接这在高并发下会耗尽服务器资源。一个有效的优化方案是启用 Nginx 的 keep-alive 连接复用keepalive_timeout 65; keepalive_requests 100;对于后端服务也可以配置数据库连接池和 HTTP 连接池避免每个请求都新建连接。6.4 第四步看数据库如果你发现应用进程还在但接口响应特别慢十有八九是数据库的问题。最常见的几个坑没有建索引where条件下的字段走了全表扫描。SQL 查询返回了过多数据或者查询列里包含大字段。数据库连接数被打满新的连接在等待。查看 MySQL 慢查询日志是排查的第一步。在 MySQL 配置文件/etc/my.cnf中slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 1开启后执行时间超过 1 秒的 SQL 会被记录下来。然后可以通过mysqldumpslow工具分析mysqldumpslow -t 10 /var/log/mysql/mysql-slow.log这能帮你快速找到最“贵”的 SQL。6.5 第五步看系统日志如果上面的手段都查不出原因最终要回到系统日志。# 查看系统日志 journalctl -xe # 查看 Nginx 错误日志 tail -f /var/log/nginx/error.log # 查看 Java 应用的输出日志 tail -f /opt/demo/logs/app.log很多情况下错误日志里已经有完整的堆栈信息。比如内存溢出会打出OutOfMemoryError数据库连接失败会打出Communication link failure网络超时会打出Connection timed out。这些信息比监控面板上的数字更直接。7. 项目发布时最常见的几个“干爆服务器”场景复盘结合前面的事实我们可以复盘一下“黑子上线时把服务器干爆”可能经历了哪几种典型场景。并给出对应的解决方案。问题现象可能原因排查方式解决方案服务器 CPU 长时间 100%SSH 卡死应用未做限流大量请求并发执行top查看 CPU 占用率最高的进程上线前用 ab 压测接入限流中间件或 Nginx 限流内存耗尽MySQL 进程被杀JVM 堆内存配置过大或数据库缓存占用过多free -h查看内存dmesg查看 OOM 记录合理配置 JVM 堆内存使用连接池限制数据库连接数接口响应极慢但 CPU 不高数据库查询没有索引或慢 SQL开启 MySQL 慢查询日志分析慢 SQL添加索引优化查询应用没有崩溃但页面加载缓慢带宽不足静态资源过大iftop查看实时带宽占用压缩静态资源配置 CDN或升级带宽定时任务在错误时间执行服务器时区设置错误timedatectl检查时区统一设置时区为 Asia/Shanghai服务器被暴力破解CPU 异常SSH 密码过于简单或存在未知可疑进程lastb查看登录失败记录top产看进程禁用密码登录、开启 fail2ban、修改 SSH 端口7.1 典型的“发布瞬间被干爆”时间线如果我们把整件事拉长来看一次“发布事故”的完整时间线通常是这样开发者在本地测试一切正常接口响应时间 10ms。开发者把代码部署到服务器手动启动应用单个请求测试也正常。开发者把项目链接发到工作群/班级群同时有几十个人点击访问。几十个请求同时进来JVM 开始频繁垃圾回收CPU 瞬间飙升。数据库连接池被打满请求排队等待数据库连接。Nginx 的worker_connections被打满新的请求被 Nginx 拒绝。最坏的情况下内存耗尽OOM Killer 把 MySQL 进程杀掉。数据库挂了 → 应用访问数据库报错 → 抛出大量异常 → 异常日志写入磁盘 → 磁盘空间被占满 → 整个系统陷入半瘫痪状态。这个链条其实每一步都有对应的预防措施第 3 步之前你应该用 ab 工具压测过知道接口的 QPS 上限。第 4 步之前你应该给 JVM 配好堆内存上限配合-XX:HeapDumpOnOutOfMemoryError参数留出诊断信息。第 6 步之前你应该把 Nginx 的worker_processes和worker_connections配置调好同时接入限流。第 8 步之前你应该配置好 logrotate避免日志写满磁盘。上面这些动作没有一个是高深到只有资深运维才懂的关键是你是否在“上线前”就严格执行。7.2 从单机到服务器集群什么时候需要扩容很多人一上来就想搞服务器集群和高可用架构但对一个小项目而言单机部署依然是成本最低、最快见效的方案。那什么时候需要考虑集群一个简单的判断标准是单台服务器 CPU 长时间超过 70%。带宽长期跑满。内存使用率长期超过 80%。数据库慢查询增多单机数据库已经扛不住写入压力。如果出现上述情况而你的业务量还在增长那就需要考虑横向扩展。但横向扩展的前提是你的应用要做到无状态化——把 Session 放到 Redis 而不是本地内存、把上传文件放到对象存储而不是本地磁盘、把数据库读写分离。没有这些改造单纯加服务器是无效的因为用户请求打到哪台机器都可能出现问题。8. 服务器运维最佳实践上线前必须做好的五件事前面说了太多“问题”这一节直接给“最佳实践”。我会按优先级排序每一条都值得做好记录。8.1 安全基线Web 服务器安全的第一道防线安全不是装个杀毒软件就够了。对 Linux 服务器来说有四个最基础的安全措施1SSH 禁止密码登录只允许密钥登录。这个前面已经讲过了。2修改 SSH 默认端口。默认 22 端口每天都在被无数扫描器暴力破解换到高位端口能减少大量攻击尝试。修改/etc/ssh/sshd_configPort 22222改完重启 sshd并用ssh -p 22222 userip登录。同样确认新端口能登录后再关闭防火墙里的 22 端口。3开启防火墙只放行必要端口# firewalld (CentOS) firewall-cmd --permanent --add-port22/tcp firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port443/tcp firewall-cmd --reload # ufw (Ubuntu) ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw enable4安装 fail2ban自动封禁多次登录失败的 IPyum install fail2ban -y systemctl enable fail2ban systemctl start fail2ban8.2 监控与预警别等用户告诉你服务器挂了最低成本的监控方案是使用云厂商自带的基础监控 CPU、内存、带宽、磁盘。如果没有可以手工写一个简单的定时任务脚本把系统负载写入日志并发送告警。更专业的方案是部署 Prometheus Grafana 或 Zabbix但对于一个学生项目或小型项目来说初期不需要上这么重的监控。最简单的路径是先把云厂商的监控打开。配置阈值告警CPU 80% 持续 5 分钟、磁盘使用率 85%、带宽跑满。再在应用里接入日志收集比如用tail -f观察关键日志。监控的意义不在于“看着舒服”而在于“提前发现”。等用户反馈“网站打不开”再去看监控已经晚了。8.3 备份策略数据库备份必须自动化服务器可以被“干爆”但如果数据丢了那可真的是职业生涯的灾难。数据库备份必须自动化并且要做恢复演练。一个简单的 MySQL 每日定时备份脚本#!/bin/bash # 文件路径/opt/scripts/backup_mysql.sh BACKUP_DIR/opt/mysql_backup DATE$(date %Y%m%d_%H%M%S) DB_USERroot DB_PASSyour_password DB_NAMEyour_db mkdir -p $BACKUP_DIR # 使用 mysqldump 备份 mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz # 保留最近 7 天的备份 find $BACKUP_DIR -name *.sql.gz -mtime 7 -exec rm {} \;然后用 cron 定时执行crontab -e # 每天凌晨 2 点执行备份 0 2 * * * /bin/bash /opt/scripts/backup_mysql.sh这里要强调备份文件不要和数据库放在同一台服务器上。可以把备份传到对象存储或另一台独立的机器否则服务器磁盘故障时备份也跟着一起丢了。8.4 发布流程从“手动上线”到“脚本发布”很多新手部署项目的方式是本地mvn package→ 用 FTP 传 jar 包 → SSH 登录 → kill 旧进程 → 启动新进程。这个过程重复几遍你就会发现最大的问题不是技术而是人的失误传错文件、忘记杀旧进程、启动参数写错。建议至少用一个 shell 脚本把“构建 → 上传 → 部署 → 启动”串起来。如果项目再复杂一点可以引入 Jenkins、GitLab CI 或 GitHub Actions 做持续集成和持续部署。但第一步永远是把重复操作脚本化。8.5 快速恢复提前写好故障预案最后一条是心态层面的。即使做了上面所有措施线上仍然可能出问题。你需要提前想清楚如果数据库挂了是先重启数据库还是先查日志如果应用打不开了是回滚到上一个版本还是修复后重新发布如果你的 SSH 连不上是否会用云厂商的控制台 VNC 登录答案应该写在一份简单的“故障排查手册”里存到本地而不是用到的时候临时 Google。很多时候从“服务不可用”到“服务恢复”只差一个清晰的恢复流程。9. 常见问题与排查专题如果你正在经历服务器相关的问题下面几个场景比较典型。问题现象可能原因排查方式解决方案使用scp或git连接服务器超时安全组未放行端口或本地网络问题检查云控制台安全组规则放行 22 端口或联系网络管理员确认页面能打开但图片加载缓慢带宽不足静态资源没有做压缩iftop查看带宽占用开启 Nginx gzip、压缩图片、配置 CDNSSH 登录非常慢输入密码后要等几十秒DNS 反向解析问题查看/etc/ssh/sshd_config设置UseDNS no重启 sshd服务器突然无法访问控制台显示“已停止”欠费、系统崩溃或硬件故障打开云厂商控制台查看状态重启实例并检查系统日志MySQL 连接失败但数据库进程存在连接数达到上限SHOW VARIABLES LIKE max_connections调大max_connections或优化连接池配置top命令没有输出系统完全卡死CPU 或内存完全耗尽内核无法调度只能通过控制台强制重启强制重启后检查日志定位根因9.1 如果你正在用 VS Code 远程连接服务器很多前端或全栈开发者习惯用 VS Code 的 Remote-SSH 插件连接服务器优点是可以在本地窗口里编辑服务器上的代码。需要注意的一点如果服务器 /root 目录下的某个应用占满了内存VS Code 远程服务也可能跟着卡死因为 VS Code Server 本身也会消耗资源。遇到这种情况先在本地终端用top看看是不是插件进程或 node 进程占用了资源。9.2 如果你正在搭建自己的 Git 服务器在一些内网开发环境下团队需要搭建自己的 Git 服务器。简单场景下不需要 GitLab一个裸仓库 git-shell就能满足需求。但要注意如果多个开发者同时推送代码磁盘空间和 Git 仓库权限是容易出问题的地方。建议定期执行git gc清理仓库同时给仓库目录设置磁盘配额。10. 总结从“干爆服务器”到“从容上线”回到文章开头的问题为什么“黑子”会把服务器干爆不是因为服务器太弱而是因为没有提前做容量评估、没有限制资源上限、没有故障预案。这三个环节恰恰是普通开发者和合格运维之间的分水岭。如果你现在正好有一台自己的服务器我建议按下面这个清单逐项自查是否已经用 SSH 密钥登录并禁用了密码登录是否设置了正确的服务器时区是否配置了 swap 分区是否用ulimit -n检查过文件描述符限制是否用ab工具对核心接口做过压测是否配置了日志轮转和定时备份是否知道服务器 CPU、内存、磁盘、带宽的使用情况是否想在出问题之前写一份故障排查手册不需要一次性做到完美但每项都是一条命。服务器运维不是一门“学了就会”的课程而是一门“踩坑后才懂”的手艺。这篇关于“服务器”的部署与排查文章是我能给出的最直接的实践路径环境初始化、部署流程、压力测试、问题定位、安全加固、备份恢复。建议收藏备用等下次项目上线前再逐条对照检查一遍。下一篇文章可以继续深入服务器集群与高可用架构也可以聊一聊容器化部署Docker/Kubernetes如何彻底改变应用的发布方式。选择哪条路取决于你现在的项目规模但前面这些基础始终是不可跳过的地基。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →