服务器怎么搭建?从零开始教程

结论: 从零搭建一台服务器,标准流程是六个阶段——选购配置、安装操作系统、配置远程连接与安全加固、安装运行环境、部署应用、绑定域名并配置 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,地域选离用户最近的节点。

选购时需要确定的四件事:

  1. 配置:CPU、内存、磁盘、带宽。个人博客 2 核 4 GB 足够;企业官网 2~4 核 8 GB;数据库或 Java 应用 4 核 8 GB 起步。
  2. 地域与线路:国内业务选国内地域(须完成 ICP 备案才能用 80/443 端口对外服务),跨境或免备案需求选中国香港、新加坡、日本、美国等地域。
  3. 操作系统:新手推荐 Ubuntu 24.04 LTS 或 Rocky Linux 9;需要跑 ASP.NET、MSSQL、远程桌面的选 Windows Server 2022/2025。
  4. 计费方式:长期稳定业务选包年包月,临时测试选按量付费。

价格参考(截至 2026 年):入门级 2 核 4 GB 云服务器,包年包月大致在 300~1200 元/年区间,新用户常有首年优惠;同配置物理服务器托管年费通常在 3000~8000 元区间。实际以官网实时报价为准。

下单后记下三样东西:公网 IP 地址、root(或 Administrator)初始密码、控制台登录地址。这三者是后面所有操作的前提。

阶段二:安装操作系统——云服务器重装与物理机安装

先给结论:云服务器不需要自己装系统,在控制台"重装系统/更换镜像"即可;物理服务器需要用 U 盘启动盘安装。

云服务器重装系统

在云厂商控制台找到目标实例,选择"停止 → 更换操作系统",镜像选 Ubuntu 24.04 LTS 64位,勾选"重置 root 密码"或配置 SSH 密钥对。等待 3~5 分钟即可完成。

建议优先使用 SSH 密钥对而非密码登录,安全性高一个量级。本地生成密钥对:

bash
# 在本地电脑上生成 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 盘启动后按安装向导操作。分区建议:

挂载点建议大小文件系统说明
/boot1 GBext4引导分区
/boot/efi512 MBFAT32UEFI 引导必需
swap4~8 GBswap见内存章节
/40~80 GBext4 或 xfs系统与软件
/data剩余全部xfs(大文件友好)业务数据与日志

安装完成后确认系统版本:

bash
cat /etc/os-release
uname -a

阶段三:远程连接与首次安全加固

先给结论:连上服务器后,第一件事不是装软件,而是做安全加固——建普通用户、禁用 root 密码登录、改 SSH 端口、开防火墙。这一步跳过,服务器平均存活时间以小时计。

连接服务器

bash
# 密码方式连接(首次)
ssh root@你的公网IP

# 密钥方式连接
ssh -i ~/.ssh/id_ed25519 root@你的公网IP

# Windows 用户可用 PowerShell 自带的 OpenSSH,或用 PuTTY / Xshell
ssh root@你的公网IP

创建 sudo 用户并禁用 root 登录

bash
# 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 配置

bash
sudo vim /etc/ssh/sshd_config

修改或新增以下项:

bash
Port 2222                      # 改掉默认 22 端口,减少扫描爆破
PermitRootLogin no             # 禁止 root 直接登录
PasswordAuthentication no      # 禁用密码登录,只用密钥
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy              # 只允许指定用户登录
bash
# 检查语法是否有误
sudo sshd -t

# 重启 SSH 服务(Ubuntu)
sudo systemctl restart ssh

# Rocky / AlmaLinux 上服务名为 sshd
sudo systemctl restart sshd

配置防火墙

bash
# 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),在控制台配置。安全组和系统防火墙是串联的两道门,两边都要放行端口才能访问。

系统更新与时区

bash
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/应用)

bash
# 安装 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(推荐,环境隔离、便于迁移)

bash
# 安装 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 + 应用的骨架:

yaml
# /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: bridge
bash
cd /home/deploy && docker compose up -d
docker compose ps
docker compose logs -f web

阶段五:部署应用——上传代码并让它跑起来

先给结论:部署的核心是三件事:代码放到哪、进程怎么启动、日志往哪写。 把这三件事理清楚,换任何语言都一样。

上传代码

bash
# 方式一: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 站点

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;
}
bash
# 检查配置语法
sudo nginx -t

# 平滑重载(不断连接)
sudo systemctl reload nginx

用 systemd 托管应用进程

直接 nohup 跑进程在重启后会丢失,正确做法是写 systemd 单元:

ini
# /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.target
bash
sudo 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你的公网 IP600
wwwA你的公网 IP600

验证解析是否生效:

bash
# 查看解析结果
dig example.com +short
nslookup example.com

# 检查是否已生效(DNS 传播通常 1~10 分钟)
ping -c 3 example.com

注意:国内服务器使用 80/443 端口对外提供 Web 服务需要先完成 ICP 备案,备案通常需要 5~20 个工作日,域名实名认证完成后才能提交。

申请 Let's Encrypt 免费证书

bash
# 安装 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 任务定期续期。确认一下:

bash
systemctl list-timers | grep certbot
# 或
cat /etc/cron.d/certbot

强制 HTTPS 与跳转

nginx
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;
}
bash
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 无法直接登录
3SSH 仅密钥登录ssh -o PreferredAuthentications=password deploy@IP被拒绝
4防火墙已启用sudo ufw status仅放行必要端口
5安全组已放行云控制台查看80/443/SSH 端口已开
6时区正确timedatectlAsia/Shanghai
7时间同步timedatectl timesync-statusNTP 已同步
8服务开机自启systemctl is-enabled nginx myappenabled
9HTTPS 可访问curl -I https://域名返回 200
10HTTP 已跳转curl -I http://域名返回 301
11证书自动续期certbot renew --dry-run成功
12日志可写且轮转ls /var/log/nginx/ + logrotate -d正常
13备份已配置crontab -l有定时备份任务
14监控告警已接云监控或 PrometheusCPU/内存/磁盘有阈值

补一条备份的定时任务,作为收尾:

bash
# 创建备份脚本
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