结论: 从零搭建一台服务器,标准流程是六个阶段——选购配置、安装操作系统、配置远程连接与安全加固、安装运行环境、部署应用、绑定域名并配置 HTTPS。一台云服务器的完整搭建通常在 1~2 小时内可以完成,物理服务器还需额外的上架与系统安装时间。本文按这六个阶段给出可复制执行的命令。
"从零开始搭服务器"听起来庞大,其实拆开就是六件事:买机器、装系统、连上去、装软件、放代码、配域名。真正卡住新手的往往不是某一步有多难,而是不知道下一步该干什么、以及每一步做完该怎么验证是否成功。本文以最常见的组合为例——一台 2 核 4 GB(或更高)的云服务器 + Ubuntu 24.04 LTS + Nginx + 一个 Web 应用——把全流程走一遍。每一步都给出验证方法,做到哪一步卡住就回头查哪一步。
阶段一:选购——先确定配置、地域与线路
先给结论:新手第一台服务器建议选云服务器(ECS/CVM/LightNode 等),2 核 4 GB 起步、系统盘 60~100 GB SSD、带宽 5~10 Mbps,地域选离用户最近的节点。
选购时需要确定的四件事:
- 配置:CPU、内存、磁盘、带宽。个人博客 2 核 4 GB 足够;企业官网 2~4 核 8 GB;数据库或 Java 应用 4 核 8 GB 起步。
- 地域与线路:国内业务选国内地域(须完成 ICP 备案才能用 80/443 端口对外服务),跨境或免备案需求选中国香港、新加坡、日本、美国等地域。
- 操作系统:新手推荐 Ubuntu 24.04 LTS 或 Rocky Linux 9;需要跑 ASP.NET、MSSQL、远程桌面的选 Windows Server 2022/2025。
- 计费方式:长期稳定业务选包年包月,临时测试选按量付费。
价格参考(截至 2026 年):入门级 2 核 4 GB 云服务器,包年包月大致在 300~1200 元/年区间,新用户常有首年优惠;同配置物理服务器托管年费通常在 3000~8000 元区间。实际以官网实时报价为准。
下单后记下三样东西:公网 IP 地址、root(或 Administrator)初始密码、控制台登录地址。这三者是后面所有操作的前提。
阶段二:安装操作系统——云服务器重装与物理机安装
先给结论:云服务器不需要自己装系统,在控制台"重装系统/更换镜像"即可;物理服务器需要用 U 盘启动盘安装。
云服务器重装系统
在云厂商控制台找到目标实例,选择"停止 → 更换操作系统",镜像选 Ubuntu 24.04 LTS 64位,勾选"重置 root 密码"或配置 SSH 密钥对。等待 3~5 分钟即可完成。
建议优先使用 SSH 密钥对而非密码登录,安全性高一个量级。本地生成密钥对:
# 在本地电脑上生成 ED25519 密钥对(比 RSA 更安全更快)
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
# 查看公钥内容,把它粘贴到云控制台的"SSH 密钥"里
cat ~/.ssh/id_ed25519.pub物理服务器安装系统
物理机需要制作 U 盘启动盘(用 Rufus、Ventoy 或 balenaEtcher 写入 ISO),从 U 盘启动后按安装向导操作。分区建议:
| 挂载点 | 建议大小 | 文件系统 | 说明 |
|---|---|---|---|
/boot | 1 GB | ext4 | 引导分区 |
/boot/efi | 512 MB | FAT32 | UEFI 引导必需 |
swap | 4~8 GB | swap | 见内存章节 |
/ | 40~80 GB | ext4 或 xfs | 系统与软件 |
/data | 剩余全部 | xfs(大文件友好) | 业务数据与日志 |
安装完成后确认系统版本:
cat /etc/os-release
uname -a阶段三:远程连接与首次安全加固
先给结论:连上服务器后,第一件事不是装软件,而是做安全加固——建普通用户、禁用 root 密码登录、改 SSH 端口、开防火墙。这一步跳过,服务器平均存活时间以小时计。
连接服务器
# 密码方式连接(首次)
ssh root@你的公网IP
# 密钥方式连接
ssh -i ~/.ssh/id_ed25519 root@你的公网IP
# Windows 用户可用 PowerShell 自带的 OpenSSH,或用 PuTTY / Xshell
ssh root@你的公网IP创建 sudo 用户并禁用 root 登录
# 1. 创建普通用户(以 deploy 为例)
adduser deploy
# 2. 赋予 sudo 权限
usermod -aG sudo deploy
# 3. 把本地公钥写入该用户的 authorized_keys
mkdir -p /home/deploy/.ssh
vim /home/deploy/.ssh/authorized_keys # 粘贴 id_ed25519.pub 的内容
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh重要:先用新开一个终端窗口测试 ssh deploy@你的IP 能登录成功,再继续下面的禁用操作,否则可能把自己锁在门外。
修改 SSH 配置
sudo vim /etc/ssh/sshd_config修改或新增以下项:
Port 2222 # 改掉默认 22 端口,减少扫描爆破
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 禁用密码登录,只用密钥
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy # 只允许指定用户登录# 检查语法是否有误
sudo sshd -t
# 重启 SSH 服务(Ubuntu)
sudo systemctl restart ssh
# Rocky / AlmaLinux 上服务名为 sshd
sudo systemctl restart sshd配置防火墙
# Ubuntu 使用 ufw(简单)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable
sudo ufw status verbose
# Rocky / AlmaLinux 使用 firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all注意:云服务器还有一层"安全组"(Security Group),在控制台配置。安全组和系统防火墙是串联的两道门,两边都要放行端口才能访问。
系统更新与时区
sudo apt update && sudo apt upgrade -y # Ubuntu / Debian
# sudo dnf update -y # Rocky / AlmaLinux
sudo timedatectl set-timezone Asia/Shanghai
timedatectl status
sudo hostnamectl set-hostname web-prod-01阶段四:安装运行环境——LNMP 与 Docker 二选一
先给结论:新手推荐两种路线:要么用面板/一键包快速搭 LNMP,要么用 Docker 部署,二者不要混用来管理同一批服务。
路线 A:传统 LNMP(Linux + Nginx + MySQL + PHP/应用)
# 安装 Nginx
sudo apt install -y nginx
sudo systemctl enable --now nginx
nginx -v
# 安装 MySQL 8.4(Ubuntu 24.04 默认源版本)
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
sudo mysql_secure_installation # 交互式安全初始化
mysql --version
# 安装 PHP-FPM(WordPress 等 PHP 应用需要)
sudo apt install -y php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip
sudo systemctl enable --now php8.3-fpm
php -v
# 安装 Node.js 22 LTS(Node 应用)
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node -v && npm -v
# 安装 Python 环境
sudo apt install -y python3 python3-pip python3-venv
python3 --version路线 B:Docker(推荐,环境隔离、便于迁移)
# 安装 Docker Engine(官方脚本方式)
curl -fsSL https://get.docker.com | sudo sh
# 把当前用户加入 docker 组,免 sudo
sudo usermod -aG docker $USER
newgrp docker
# 安装 Docker Compose 插件
sudo apt install -y docker-compose-plugin
# 设置开机自启并验证
sudo systemctl enable --now docker
docker version
docker compose version用 Docker Compose 起一个 Nginx + 应用的骨架:
# /home/deploy/docker-compose.yml
services:
web:
image: nginx:1.27-alpine
container_name: web
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./www:/usr/share/nginx/html:ro
- ./certs:/etc/nginx/certs:ro
networks:
- appnet
app:
image: myapp:latest
container_name: app
restart: unless-stopped
expose:
- "8080"
environment:
- TZ=Asia/Shanghai
networks:
- appnet
networks:
appnet:
driver: bridgecd /home/deploy && docker compose up -d
docker compose ps
docker compose logs -f web阶段五:部署应用——上传代码并让它跑起来
先给结论:部署的核心是三件事:代码放到哪、进程怎么启动、日志往哪写。 把这三件事理清楚,换任何语言都一样。
上传代码
# 方式一:scp 上传压缩包
scp ./dist.tar.gz deploy@你的IP:/home/deploy/
# 方式二:rsync 增量同步(推荐,第二次起只传差异)
rsync -avz --delete -e "ssh -p 2222" ./dist/ deploy@你的IP:/home/deploy/www/
# 方式三:服务器上直接 git clone
cd /home/deploy && git clone https://github.com/your/repo.git app配置 Nginx 站点
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /home/deploy/www;
index index.html index.htm;
# 前端路由应用需要这条,避免刷新 404
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理到后端应用(如 Node/Java 监听 8080)
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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_read_timeout 60s;
}
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}# 检查配置语法
sudo nginx -t
# 平滑重载(不断连接)
sudo systemctl reload nginx用 systemd 托管应用进程
直接 nohup 跑进程在重启后会丢失,正确做法是写 systemd 单元:
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/home/deploy/app
ExecStart=/usr/bin/node /home/deploy/app/server.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production
Environment=TZ=Asia/Shanghai
StandardOutput=append:/var/log/myapp/out.log
StandardError=append:/var/log/myapp/err.log
[Install]
WantedBy=multi-user.targetsudo mkdir -p /var/log/myapp && sudo chown deploy:deploy /var/log/myapp
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp
journalctl -u myapp -f阶段六:域名与 HTTPS——让外界能正规访问
先给结论:先在域名注册商处把域名 A 记录解析到服务器公网 IP,再用 Let's Encrypt 免费证书开启 HTTPS,最后把 HTTP 301 跳转到 HTTPS。
配置 DNS 解析
在域名控制台添加两条记录:
| 主机记录 | 记录类型 | 记录值 | TTL |
|---|---|---|---|
@ | A | 你的公网 IP | 600 |
www | A | 你的公网 IP | 600 |
验证解析是否生效:
# 查看解析结果
dig example.com +short
nslookup example.com
# 检查是否已生效(DNS 传播通常 1~10 分钟)
ping -c 3 example.com注意:国内服务器使用 80/443 端口对外提供 Web 服务需要先完成 ICP 备案,备案通常需要 5~20 个工作日,域名实名认证完成后才能提交。
申请 Let's Encrypt 免费证书
# 安装 certbot(Ubuntu 24.04)
sudo apt install -y certbot python3-certbot-nginx
# 自动申请并为 Nginx 配置 HTTPS(需先确保 80 端口可访问且域名已解析到本机)
sudo certbot --nginx -d example.com -d www.example.com
# 仅申请证书,不自动改配置
sudo certbot certonly --nginx -d example.com
# 测试续期流程(正式续期前先干跑一次)
sudo certbot renew --dry-run证书有效期 90 天,certbot 安装后会自动创建 systemd timer 或 cron 任务定期续期。确认一下:
systemctl list-timers | grep certbot
# 或
cat /etc/cron.d/certbot强制 HTTPS 与跳转
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /home/deploy/www;
index index.html;
}sudo nginx -t && sudo systemctl reload nginx
# 验证 TLS
curl -I https://example.com
openssl s_client -connect example.com:443 -servername example.com /dev/null | openssl x509 -noout -dates上线检查清单
| # | 检查项 | 验证命令 / 方法 | 达标标准 |
|---|---|---|---|
| 1 | 系统已更新 | apt list --upgradable | 无待更新关键包 |
| 2 | 普通用户 + sudo 可用 | ssh deploy@IP 登录成功 | root 无法直接登录 |
| 3 | SSH 仅密钥登录 | ssh -o PreferredAuthentications=password deploy@IP | 被拒绝 |
| 4 | 防火墙已启用 | sudo ufw status | 仅放行必要端口 |
| 5 | 安全组已放行 | 云控制台查看 | 80/443/SSH 端口已开 |
| 6 | 时区正确 | timedatectl | Asia/Shanghai |
| 7 | 时间同步 | timedatectl timesync-status | NTP 已同步 |
| 8 | 服务开机自启 | systemctl is-enabled nginx myapp | enabled |
| 9 | HTTPS 可访问 | curl -I https://域名 | 返回 200 |
| 10 | HTTP 已跳转 | curl -I http://域名 | 返回 301 |
| 11 | 证书自动续期 | certbot renew --dry-run | 成功 |
| 12 | 日志可写且轮转 | ls /var/log/nginx/ + logrotate -d | 正常 |
| 13 | 备份已配置 | crontab -l | 有定时备份任务 |
| 14 | 监控告警已接 | 云监控或 Prometheus | CPU/内存/磁盘有阈值 |
补一条备份的定时任务,作为收尾:
# 创建备份脚本
sudo mkdir -p /data/backup
cat > /home/deploy/backup.sh <<'EOF'
#!/bin/bash
DATE=$(date +%F)
tar -czf /data/backup/www-$DATE.tar.gz /home/deploy/www
mysqldump -u root -p'你的密码' --all-databases | gzip > /data/backup/db-$DATE.sql.gz
find /data/backup -type f -mtime +7 -delete
EOF
chmod +x /home/deploy/backup.sh
# 每天凌晨 3 点执行
(crontab -l 2>/dev/null; echo "0 3 * * * /home/deploy/backup.sh") | crontab -
crontab -l
企业QQ咨询




