十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

土豆服务器逆袭:低配Linux服务器优化与联机服务部署实战

土豆服务器逆袭:低配Linux服务器优化与联机服务部署实战 之前联机游戏卡顿掉线大家总爱骂一句“又是土豆服务器”。可真当自己手里只剩一台低配 VPS 或者老旧的 mini 主机时才发现“土豆”两个字并不是玩笑而是每天都要面对的 CPU 与内存余额。本文是《冰岛入与土豆服务器的爱情故事》系列第 3 期前两期讲完了硬件选型与基本网络概念这一期直接落到实操如何把一台公认很“土豆”的低配服务器从系统初始化、Swap 配置、游戏服务端部署一路做到监控、排错和安全加固。文章会避开花里胡哨的架构只用最朴素的 Linux 命令和 systemd 服务把一台服务器救活。适合刚接触服务器的新手也适合已经有一台随时吃灰的云主机、想让它真正跑点东西的折腾型玩家。读完你至少能拥有一个稳定运行的小型联机服务器并且以后遇到服务器卡顿、连不上、内存爆掉之类的问题不至于手忙脚乱。1. 土豆服务器到底“土豆”在哪里1.1 土豆服务器一词的来源“土豆服务器”并不是一个严谨的技术名词而是玩家圈子里对性能较差、连接不稳定、动不动就回档的服务器的一种戏称。早期国外玩家吐槽游戏联机服务器时常说“Potato Server”意思是这个服务器弱得像一颗土豆带不动太多人也扛不住稍微复杂的运算。但这个梗传开之后越来越多个人玩家发现自己租来的廉价 VPS 或者宿舍里翻出来的旧电脑其实真的就是一颗土豆。CPU 核心不多内存 2GB 甚至 1GB硬盘还是机械盘带一个几人的小型联机服务已经很吃力。换个角度想把一颗土豆调教成勉强能稳定服务的“生产环境”对后端运维、Linux 命令、系统调优的理解会提升得非常快。本文不追求高性能而是追求“在极低配置下仍然能稳定运行”。1.2 本文的技术边界很多教程一上来就讲 Docker、Kubernetes、微服务这些内容对于一台 2GB 内存的服务器来说本身就是负担。本文的技术边界很明确操作系统使用 Ubuntu Server LTS 版本这是个人服务器和小型团队最常用的系统之一所有部署都直接使用系统命令与 systemd 管理不引入容器层以部署一个 Minecraft Java 版服务端作为完整实战案例因为“土豆服务器”这个词本身就来自游戏场景而且 Minecraft 服务端对 CPU 和内存要求不低很适合用来演示低配置优化监控和运维只用系统自带工具不部署厚重的监控平台。如果你手上有一台 1 核 2GB 的云服务器或者一台树莓派都可以跟着本文操作。如果配置更低、只有 1GB 内存也可以做但要接受人数更少、地图更小的限制。2. 环境准备与版本说明2.1 硬件最低配置建议先说清楚本文示例面向“小型联机服务器”目标在线人数 1 到 10 人。这个规模下硬件最低需求可以参考下面的表格项目最低要求推荐配置CPU1 核2 核以上内存2GB4GB硬盘10GB 可用空间20GB SSD带宽5Mbps 上行10Mbps 以上操作系统Ubuntu 22.04 LTS / 24.04 LTS同左如果你用的是云服务器购买时选择 Ubuntu Server 镜像即可。如果用旧电脑或迷你主机建议安装 Ubuntu Server 版本而非桌面版桌面环境会吃掉大量本就不富裕的资源。2.2 需要提前准备的工具整个实操过程需要以下几种工具一台已经安装好 Ubuntu Server 的机器或者一台已经开通的云服务器本机终端Windows 可以使用 PowerShell 或 Windows TerminalmacOS 直接使用系统自带终端SSH 客户端如果希望用图形化方式连接可以准备 VS Code并安装“Remote - SSH”插件一个备忘文档用于记录服务器 IP、端口、用户名等信息。版本方面Ubuntu 22.04 LTS 与 24.04 LTS 都可以下面命令以 Ubuntu 22.04 LTS 为例。如果你的系统版本不同个别软件源地址可能需要微调但整体操作思路是一致的。2.3 初始项目结构规划我们不要把所有文件都堆在用户目录下先规划一个清晰的结构。后面所有操作都会用到这个目录规划/home/你的用户名/ ├── minecraft/ # Minecraft 服务端目录 │ ├── server.jar # 服务端核心文件 │ ├── eula.txt # 协议确认文件 │ ├── server.properties # 服务器配置文件 │ └── logs/ # 日志目录 ├── backups/ # 备份目录 └── scripts/ # 管理脚本这样的好处是之后写 systemd 服务、写定时备份脚本时路径都非常明确不会出现“找不到文件”的尴尬。3. 从零初始化一台干净的 Linux 服务器3.1 通过 SSH 连上服务器拿到服务器之后第一件事是登录系统。假设你的服务器公网 IP 是1.2.3.4用户是root在终端执行ssh root1.2.3.4如果是第一次连接系统会提示确认 host key输入yes回车即可。随后输入密码登录。如果你希望在 VS Code 里直接编辑服务器上的文件、执行命令推荐安装 Remote - SSH 插件。它的使用方式很简单在 VS Code 中按CtrlShiftP输入Remote-SSH: Connect to Host输入ssh root1.2.3.4选择服务器系统类型后即可进入远程开发界面。用 VS Code 的好处是复制本地代码到服务器、查看日志文件、编辑配置时会非常直观尤其适合新手。3.2 创建普通用户并配置 sudo很多教程默认用 root 用户继续操作但出于安全考虑不建议日常使用 root 登录。root 拥有服务器最高权限一旦命令写错或者被入侵后果会很严重。我们自己练习可以灵活一点但生产服务器必须遵循最小权限原则。创建一个普通用户例如tudouadduser tudou系统会提示输入密码和一些用户信息密码必须设置其他信息可以直接回车跳过。然后把用户加入 sudo 组使它拥有执行管理命令的权限usermod -aG sudo tudou之后切换到新用户su - tudou后续所有命令都尽量在这个普通用户下执行。如果某条命令需要管理员权限在命令前加sudo即可。3.3 配置 SSH 密钥登录密码登录虽然方便但容易成为暴力破解的目标。更推荐的做法是使用 SSH 密钥对登录。密钥登录的原理是本机保存私钥服务器保存公钥登录时通过密钥机制验证身份比密码更安全也省去每次输入密码的麻烦。首先在本机生成密钥对。如果本机已经存在~/.ssh/id_rsa或~/.ssh/id_ed25519可以跳过生成步骤ssh-keygen -t ed25519一路回车即可默认会生成~/.ssh/id_ed25519私钥和~/.ssh/id_ed25519.pub公钥。然后把公钥上传到服务器。在服务器上执行mkdir -p ~/.ssh chmod 700 ~/.ssh echo 这里粘贴你的公钥内容 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys公钥内容可以通过cat ~/.ssh/id_ed25519.pub查看。注意上面的chmod权限设置不能省略authorized_keys权限过宽会导致 SSH 拒绝使用密钥登录。配置完成后重新打开一个终端窗口执行ssh tudou1.2.3.4如果不用输密码就能直连说明密钥登录成功。3.4 系统更新和基础软件安装刚装好的系统第一件事是更新软件包索引并升级现有软件sudo apt update sudo apt upgrade -y这一步耗时取决于服务器带宽但必须执行。很多安全问题都来自未打补丁的系统组件。随后安装一些常用工具sudo apt install -y curl wget git htop unzip zip各工具用途如下curl和wget下载文件和请求接口git拉取代码与配置文件htop交互式查看 CPU、内存和进程unzip和zip解压和压缩文件。3.5 设置时区并同步系统时间服务器的默认时区可能跟你的所在地不一致这会导致日志时间看起来非常混乱。例如你下午三点看的日志服务器记录时间却是上午七点。所以必须统一时区。在服务器上执行sudo timedatectl set-timezone Asia/Shanghai时区名可以替换成你所在地区比如Asia/Shanghai、Asia/Tokyo、UTC等。执行完可以用timedatectl查看当前系统时间timedatectl云服务器一般默认配置了 NTP 时间同步也就是自动从时间服务器校准系统时间。如果担心校时失败可以再确认一下systemd-timesyncd是否启用timedatectl show-timesync如果时间长期不准确会直接影响日志分析和 SSL 证书校验这一点很多新手容易忽略。4. 给“土豆”增加内存缓冲Swap 配置4.1 为什么要配置 SwapSwap 是 Linux 中的交换分区也可以是一个交换文件。它把硬盘上的一部分空间当作内存来用当物理内存不足时系统可以把不常用的内存数据临时挪到 Swap 中。对于一台内存只有 2GB 的“土豆服务器”启动操作系统、Java 服务、数据库等进程后物理内存很容易被吃满。没有 Swap 的情况下系统可能直接触发 OOMOut Of Memory表现为进程被杀死服务突然中断。配置 Swap 后即使内存吃紧系统也能通过交换空间勉强维持运行。不过要注意Swap 的性能远低于物理内存它只是“应急”方案不是银弹。频繁使用 Swap 说明内存确实不够用后续还是应该优化配置或升级内存。4.2 手工创建 Swap 文件检查系统当前是否已经有 Swapfree -h如果Swap一行的total是 0说明没有配置。下面创建一个 2GB 的 Swap 文件sudo fallocate -l 2G /swapfile如果fallocate不支持可以改用sudo dd if/dev/zero of/swapfile bs1M count2048设置正确的权限Swap 文件中可能包含敏感数据不能让普通用户直接读取sudo chmod 600 /swapfile格式化为 Swap 文件系统sudo mkswap /swapfile启用 Swapsudo swapon /swapfile此时再执行free -h应该能在 Swap 行看到 2G 的总量。为了让服务器重启后自动启用 Swap还需要写入/etc/fstabecho /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab4.3 调整 Swap 使用策略Linux 有一个swappiness参数表示系统倾向于使用 Swap 的程度取值范围是 0 到 100。默认值通常是 60对于低内存机器建议稍微调低一些避免系统过早把进程挤到 Swap 上sudo sysctl vm.swappiness10这只是临时生效要想永久生效编辑/etc/sysctl.conf文件在文件末尾追加vm.swappiness10然后执行sudo sysctl -p4.4 使用 Swap 的注意事项Swap 适合解决“内存瞬时不足”问题但如果服务器长期 Swap 占用居高不下说明物理内存严重不足这时候需要精简系统服务关闭不用的后台进程降低 Java 等应用的内存占用考虑升级内存或更换更高配置的服务器。如果 SSD 空间有限Swap 文件也不宜设置过大一般设置在物理内存的 1 到 2 倍即可。5. 实战部署在土豆服务器上开一个 Minecraft 服务端Minecraft 服务器是“土豆服务器”梗的天然试验场。下面我们把一台 2GB 内存的 Ubuntu 服务器部署成一个小型联机服务器。整个过程可以推广到其他 Java 服务的部署思路。5.1 安装 Java 运行环境Minecraft Java 服务端是一个 Java 程序所以第一步是安装 JDK。不同版本的 Minecraft 服务端对 Java 版本要求不同旧版本1.12 以前通常需要 Java 81.13 到 1.16 一般需要 Java 8 或 Java 111.17 到 1.20 一般需要 Java 17最新版本则需要 Java 21。建议先确认你的服务端版本再决定安装哪个 JDK。本文以 Java 17 为例sudo apt install -y openjdk-17-jdk-headless安装完成后验证java -version看到类似openjdk version 17.0.x的输出说明安装成功。5.2 下载服务端核心文件到 Minecraft 官方网站或第三方服务端项目页面下载服务端 jar 包。这里以官方原版服务端为例先创建目录mkdir -p ~/minecraft cd ~/minecraft下载时使用你从官网复制的实际链接。例如wget https://piston-data.mojang.com/v1/objects/xxx/server.jar需要注意的是Minecraft 服务端的下载地址并不固定官方页面会随着版本更新替换路径所以不要照抄网上的过期链接。最稳妥的方式是登录 Minecraft 官方下载页面直接复制当前版本的下载地址。下载完成后在~/minecraft目录下有一个server.jar文件。5.3 首次启动并接受 EULA 协议首次启动服务端java -Xmx1024M -Xms1024M -jar server.jar nogui启动过程中会生成一些配置文件并且提示需要接受 EULA 协议。停止服务端后修改目录下的eula.txtnano ~/minecraft/eula.txt把eulafalse改为eulatrue然后保存退出。5.4 修改核心配置编辑server.properties文件这是 Minecraft 服务器最重要的配置文件nano ~/minecraft/server.properties对于低配服务器有几个参数需要重点调整# 最大在线人数低配服务器建议设置为 5 到 10 max-players5 # 服务器端口默认 25565 server-port25565 # 游戏模式0 是生存1 是创造 gamemodesurvival # 视距低配服务器建议调低到 4 到 6 view-distance6 # 模拟距离这个参数对 CPU 消耗影响很大建议调低 simulation-distance4 # 允许飞行 allow-flighttrue # 是否开启正版验证如果只是内网朋友联机可以设为 false online-modefalse其中online-mode参数需要注意如果设为false意味着服务器不向 Minecraft 官方验证玩家账号非正版玩家也能进入。这样虽然方便但安全性会降低只建议在可信的小范围网络中使用。如果服务器暴露在公网且面向陌生人强烈建议保持online-modetrue。5.5 使用 systemd 托管 Minecraft 服务直接用命令行启动服务端会有一个问题一旦 SSH 断开服务进程就会被终止。这时需要借助 systemd让服务在后台稳定运行并且实现开机自启和异常退出自动重启。创建一个 systemd 服务文件sudo nano /etc/systemd/system/minecraft.service内容如下[Unit] DescriptionMinecraft Server Afternetwork.target [Service] Typesimple Usertudou WorkingDirectory/home/tudou/minecraft ExecStart/usr/bin/java -Xmx1024M -Xms1024M -jar server.jar nogui Restarton-failure RestartSec10 [Install] WantedBymulti-user.target注意把User和WorkingDirectory以及 Java 路径改成你实际的环境。Java 路径可以通过which java查看。重新加载 systemd 并启动服务sudo systemctl daemon-reload sudo systemctl start minecraft sudo systemctl enable minecraft查看服务状态sudo systemctl status minecraft如果状态显示active (running)说明服务已经在后台正常运行了。5.6 放行防火墙端口如果你开启了 UFW 防火墙默认情况下所有外部连接都会被拒绝。先不说复杂规则直接放行 Minecraft 服务端口和 SSH 端口sudo ufw allow 25565/tcp sudo ufw allow 22/tcp sudo ufw enable注意在云服务器控制台也可能有安全组规则如果服务器在云上还需要登录云控制台在安全组中放行 TCP 25565 端口否则即使系统防火墙放行公网也无法访问。5.7 验证联机本机可以用 Minecraft 客户端添加服务器地址填你的服务器IP:25565然后尝试连接。如果连接失败按下面顺序排查是否已经接受 EULA 并成功启动服务端本机能否ping通服务器 IP端口是否有监听ss -lntp | grep 25565防火墙是否放行 25565 端口云安全组是否放行对应端口。6. 让土豆跑得更稳低配服务优化策略6.1 JVM 内存参数调整Java 服务的最大内存由-Xmx参数控制。对 2GB 内存的服务器分配 1024MB 给 Minecraft 是一个比较平衡的选择。如果还想给系统留更多余地可以改成 768MBjava -Xmx768M -Xms768M -jar server.jar nogui-Xms是最小堆内存。把最小和最大设置成一样可以减少运行中动态扩容带来的性能抖动。如果你的服务端支持 Aikars Flags 这类 JVM 调优方案可以参考社区反馈调优但不要盲目堆参数每台机器的 CPU 和内存都不一样最后还是要以实际稳定性为准。6.2 预生成地图Minecraft 服务器启动后玩家探索新地图时服务端需要实时生成区块这对 CPU 是非常大的考验。低配服务器很容易出现“走到哪里卡到哪里”的情况。解决思路是提前用服务端预生成一片区域。进入服务端控制台后可以使用指令强制加载区块也可以通过安装预生成插件或模组来完成。对于原版服务器最简单的办法是在server.properties中调低view-distance和simulation-distance减小实时生成的压力。地图预生成的具体操作建议查阅服务端核心的官方文档因为不同核心支持的指令不完全一样但总体思路是一致的提前把出生点周围若干范围的区块生成好玩家进入后直接读取不需要临时计算。6.3 定时重启释放内存Java 服务长时间运行后即使有 GC垃圾回收内存碎片和未释放的资源也可能越积越多。一个很实用的土办法是每天凌晨定时重启一次服务。创建重启脚本nano ~/scripts/restart_minecraft.sh内容#!/bin/bash sudo systemctl restart minecraft给脚本执行权限chmod x ~/scripts/restart_minecraft.sh然后添加定时任务crontab -e写入下面一行表示每天凌晨 4 点重启0 4 * * * /home/tudou/scripts/restart_minecraft.sh /home/tudou/scripts/restart.log 21定时重启对低配服务器非常有效能让系统保持在较清爽的状态。6.4 查看资源占用排查服务器卡顿问题时常用命令如下。查看整体内存free -h查看 CPU 和内存占用最高的进程top或者更直观的htop查看磁盘占用df -h查看端口监听情况ss -lntp养成随手看这些命令的习惯能更快定位“是内存满了还是 CPU 满了还是磁盘满了”。7. 常见问题与排查思路下面总结一下低配服务器运行过程中最常遇到的几类问题。问题现象常见原因解决思路SSH 连接超时或卡在登录安全组或防火墙未放行 22 端口检查云安全组、UFW 防火墙、SSH 服务状态键登录不生效仍需密码authorized_keys权限过宽设置~/.ssh为 700~/.ssh/authorized_keys为 600服务器启动后进程被杀内存不足触发 OOM配置 Swap降低 JVM-Xmx内存分配玩家连接进不来25565 端口未放行用ss -lntp检查监听检查 UFW 和云安全组玩家走动时大量卡顿区块即时生成 CPU 不足降低视距和模拟距离预生成地图服务端控制台无法输入命令使用了nogui但没有交互输入环境通过 systemd 管理使用systemctl或附加输入管道服务器频繁自动重启内存溢出导致 Java 崩溃查看journalctl -u minecraft日志调整内存和系统参数系统时间不对时区未设置或 NTP 同步失败使用timedatectl set-timezone检查时间同步服务局域网能连公网不能连云安全组限制或运营商封端口登录云控制台检查安全组入站规则登录后终端卡顿服务器负载过高或 Swap 频繁读写用htop查看负载考虑降低服务人数或升级配置这里特别说明一个排查技巧所有异常都要先看日志。systemd 管理的服务日志可以用下面的命令查看sudo journalctl -u minecraft -n 100它会显示服务最近 100 行日志。对于 SSH 问题可以查看sudo journalctl -u ssh -n 100日志里往往直接写了报错原因比自己瞎猜高效得多。8. 安全加固与备份8.1 配置 UFW 防火墙前面已经介绍了 UFW 的基本放行。这里再补充一条原则只放行确实需要的端口其他端口全部拒绝。sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 25565/tcp sudo ufw enable注意顺序很重要。先设置默认拒绝入站再放行指定端口。执行后服务器未明确放行的端口都不可从外网访问。8.2 加固 SSH 登录编辑 SSH 配置文件sudo nano /etc/ssh/sshd_config建议把下面的配置项改掉# 禁止 root 用户密码登录 PermitRootLogin no # 允许密钥登录 PubkeyAuthentication yes # 禁止密码登录密钥登录成功后可以做务必先确认密钥能连上 PasswordAuthentication no修改完成后重启 SSH 服务sudo systemctl restart ssh需要特别提醒把PasswordAuthentication设为no之前一定要先确认密钥登录已经完全可用否则新开的 SSH 连接会全部失败。如果是在云服务器上操作万一配置错了可以通过云控制台的 VNC 连接到服务器进行恢复。8.3 安装 fail2ban 防范暴力破解即使关闭了密码登录也不能忽略其他端口和服务可能存在的暴力破解。fail2ban会自动扫描日志发现多次登录失败的 IP 就临时封禁。安装 fail2bansudo apt install -y fail2ban启动服务sudo systemctl enable fail2ban sudo systemctl start fail2ban它的默认配置已经能够监测 SSH 登录失败。实际使用中可以按需调整封禁时长和重试次数但新手使用默认配置就足够了。8.4 定期备份服务器数据服务器上最重要的不是系统本身而是数据。Minecraft 世界的存档、玩家的建筑、容器里的物品一旦丢失就很难找回。写一个简单的备份脚本nano ~/scripts/backup_minecraft.sh内容如下#!/bin/bash BACKUP_DIR/home/tudou/backups WORLD_DIR/home/tudou/minecraft/world TIMESTAMP$(date %Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR # 停止服务保证存档一致性 sudo systemctl stop minecraft # 压缩世界存档 tar -czf $BACKUP_DIR/world_$TIMESTAMP.tar.gz -C /home/tudou/minecraft world # 重新启动服务 sudo systemctl start minecraft # 清理7天前的备份保留最近7份即可 find $BACKUP_DIR -name world_*.tar.gz -mtime 7 -delete给脚本加执行权限并加入 crontabchmod x ~/scripts/backup_minecraft.sh crontab -e添加定时任务每天凌晨 3 点备份0 3 * * * /home/tudou/scripts/backup_minecraft.sh /home/tudou/scripts/backup.log 21备份策略的原则很简单备份文件要放到与运行目录不同的位置。如果服务器硬盘损坏备份在同一块硬盘上也救不回来。有条件的话可以把备份同步到另一台机器或者云对象存储中。涉及生产环境时务必在测试环境验证备份与恢复流程不要等数据丢失了才后悔。9. 总结与下一步学习方向这一期内容多但不复杂。我们从一台刚装好系统的“土豆服务器”出发完成了用户创建、SSH 密钥登录、系统更新、时区同步、Swap 配置然后部署了 Minecraft Java 服务端并用 systemd 托管接着做了 JVM 内存优化、定时重启、日志排查最后补上了防火墙、SSH 加固和定时备份。所有这些操作加起来本质上是在训练一种工程习惯一个长期运行的服务器服务必须同时考虑稳定、资源、安全和数据可恢复四个维度。如果你手里的服务器还没有跑任何业务建议先按本文流程完整操作一遍即使不玩 Minecraft也可以把思路迁移到部署一个网页服务或者一个简单的数据库服务上。对“土豆服务器”而言最怕的不是性能低而是不稳定和不可恢复。下一步你可以继续学习三层内容第一层深入 Linux 系统管理包括用户权限、进程管理、磁盘分区、网络配置第二层学习脚本自动化把日常重复操作全部脚本化减少人为失误第三层了解容器和编排工具但不要一上来就上 Kubernetes先从 Docker 单机部署开始等你理解了进程、端口、日志这些底层概念后再进阶。最后留一个日常维护清单每天看一次htop了解负载每周检查一次日志和磁盘占用每月验证一次备份文件能否正常解压恢复。坚持下去你会发现“土豆服务器”并没有想象中那么弱真正决定服务器上限的往往不是配置而是维护它的方法与耐心。
返回列表