上一篇 下一篇 分享链接 返回 返回顶部

Linux海外服务器从首次登录到网站上线:新手操作步骤与验证方法

发布人:Minchunlin 发布时间:2026-10-03 21:17 阅读量:37

一台新开通的 Linux 海外服务器,完成部署的标准不是“能够 SSH 登录”,而是已经具备明确的运行环境,网站文件能够被 Web 服务正确读取,域名解析到服务器,HTTP/HTTPS 访问正常,并且每个关键环节都有可重复的验证方法。

下面以 Ubuntu Server 22.04/24.04 LTS、systemd、Nginx 和 PHP-FPM 为示例,目标是上线 example.com。静态网站只需要 Nginx;PHP 网站需要 PHP-FPM;需要保存业务数据时再增加 MariaDB。命令适用于 Ubuntu 系列,不要直接套用到使用 dnf 或其他初始化方式的发行版。

一、部署前准备

1. 明确目标环境

项目示例配置说明
操作系统Ubuntu Server 22.04/24.04 LTS使用 apt 管理软件包
远程管理SSH首次登录可使用临时密码或已有密钥
Web 服务Nginx监听 TCP 80 和 443
动态运行时PHP-FPM仅 PHP 网站需要
数据库MariaDB仅有数据库需求时安装
域名example.comDNS 的 A 记录指向服务器 IPv4
示例地址203.0.113.10文档保留地址,仅作为示例
上线结果HTTP/HTTPS 可访问主页、PHP、数据库和日志均能验证

在开始操作前,至少确认以下条件:

  • 已取得服务器公网 IPv4 地址、SSH 端口、初始登录账号和认证方式。
  • 域名可以修改 DNS 记录。
  • 有服务器控制台或快照能力,以便 SSH 配置或防火墙误操作时恢复。
  • 网站程序、依赖版本、数据库名称和数据库账号已经准备好。
  • 服务器磁盘空间和内存满足程序的基本运行要求。
  • 如果服务器上已经有其他网站,不要直接覆盖 Nginx 配置或 /var/www 下的现有文件。

首次登录后,先确认系统,而不是直接执行安装命令:

ssh root@203.0.113.10

如果 SSH 不是默认的 22 端口:

ssh -p 2222 root@203.0.113.10

登录后执行:

cat /etc/os-release
uname -m
df -h /
free -h
systemctl is-system-running

示例输出可能类似:

PRETTY_NAME="Ubuntu 24.04.1 LTS"
x86_64
active

如果系统不是 Ubuntu 22.04/24.04,先停止并按照对应发行版的包管理器和服务名称调整命令。

二、首次登录后的基础安全配置

1. 创建日常管理账号

长期使用 root 账号登录会增加误操作影响范围。先创建一个具有 sudo 权限的管理账号,但不要立即关闭 root 或密码登录,必须先验证新账号能够正常登录。

在当前 root 会话中执行:

adduser deploy
usermod -aG sudo deploy
id deploy

系统会要求设置该账号密码。密码只用于应急或控制台登录,日常 SSH 推荐使用密钥。

在本地电脑生成密钥:

ssh-keygen -t ed25519 -C "deploy@example.com"

如果本地环境有 ssh-copy-id,可以直接复制公钥:

ssh-copy-id deploy@203.0.113.10

如果没有该命令,也可以在服务器上手动配置。先创建目录:

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
nano /home/deploy/.ssh/authorized_keys

将本地公钥完整粘贴为一行,保存后设置权限:

chown deploy:deploy /home/deploy/.ssh/authorized_keys
chmod 600 /home/deploy/.ssh/authorized_keys

不要把私钥内容上传到服务器,也不要把公钥换行或截断。

保持当前 root 会话不关闭,另开一个本地终端验证:

ssh deploy@203.0.113.10
sudo id -u

预期结果为:

0

这表示 deploy 账号可以正常使用 sudo。

2. 更新软件包并检查时间

在新账号会话中执行:

sudo apt update
sudo apt full-upgrade -y
timedatectl status

full-upgrade 可能升级内核、重启服务,生产环境应先创建快照,并安排维护窗口。若提示需要重启,可以在确认 SSH 密钥和控制台均可用后执行:

sudo reboot

服务器重启后重新连接,并确认系统状态:

uptime
systemctl --failed

如果 systemctl --failed 没有列出失败服务,说明基础服务状态正常。时间同步也很重要,时间错误可能导致 HTTPS 证书、日志时间和数据库任务出现异常。

3. 配置防火墙

Ubuntu 常用 UFW 管理主机防火墙。启用前必须先放行当前 SSH 端口,否则可能把自己锁在服务器外。

默认 SSH 端口为 22 时:

sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

如果 SSH 实际使用 2222 端口,应把 22/tcp 改为:

sudo ufw allow 2222/tcp

预期至少能看到 SSH、HTTP 和 HTTPS 规则。云平台如果另有安全组,也必须同时放行对应端口;主机防火墙允许但外层安全组拒绝时,网站仍然无法访问。

4. 关闭 root 和密码登录

只有在新账号密钥登录已经成功后,才执行此步骤。先备份 SSH 配置:

sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%F-%H%M%S)

创建独立配置文件:

sudo tee /etc/ssh/sshd_config.d/60-local-hardening.conf >/dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF

检查语法并重新加载 SSH 服务:

sudo sshd -t
sudo systemctl reload ssh

sshd -t 没有任何输出通常表示语法检查通过。重新打开一个终端,确认仍能使用密钥登录:

ssh deploy@203.0.113.10

不要关闭已经登录的会话,直到新会话验证成功。

如果配置错误导致无法登录,应通过服务器控制台进入系统,删除刚才新增的配置文件,再检查并重新加载:

sudo rm /etc/ssh/sshd_config.d/60-local-hardening.conf
sudo sshd -t
sudo systemctl reload ssh

这里的删除范围仅限新增的 SSH 配置文件,不要删除主配置文件。

三、安装运行环境并配置网站

1. 安装 Nginx 和 PHP-FPM

静态网站可以只安装 Nginx。PHP 网站则安装以下组件:

sudo apt update
sudo apt install nginx php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip -y

启动 Nginx:

sudo systemctl enable --now nginx
sudo systemctl is-active nginx

预期结果:

active

Ubuntu 不同版本可能安装不同的 PHP 小版本,不要凭经验直接填写 PHP-FPM 服务名。先查找实际安装的服务和套接字:

systemctl list-unit-files --type=service | awk '$1 ~ /^php[0-9.]+-fpm\.service$/ {print $1}'
find /run/php -maxdepth 1 -type s -name 'php*-fpm.sock' -print

可能得到类似结果:

php8.3-fpm.service
/run/php/php8.3-fpm.sock

根据实际输出启动服务:

sudo systemctl enable --now php8.3-fpm
sudo systemctl is-active php8.3-fpm

如果输出为空,说明 PHP-FPM 服务名称与示例不同,应以 systemctl list-unit-files 的结果为准,不要直接猜测。

2. 创建网站目录和测试页面

以下操作适用于新建站点。如果目录中已有正式程序,请先备份,不要用测试文件覆盖现有入口文件。

sudo install -d -o deploy -g www-data -m 0755 /var/www/example.com/public

创建一个临时 PHP 页面,用来验证 Nginx 到 PHP-FPM 的链路:

sudo tee /var/www/example.com/public/index.php >/dev/null <<'EOF'

设置文件所有者和权限:

sudo chown deploy:www-data /var/www/example.com/public/index.php
sudo chmod 0644 /var/www/example.com/public/index.php

生产环境不要使用 phpinfo() 作为测试页面,因为它可能暴露路径、编译参数和环境变量。正式程序上传后,应删除这个测试文件并替换为实际入口。

3. 配置 Nginx 站点

先备份现有站点配置目录:

sudo cp -a /etc/nginx/sites-available /etc/nginx/sites-available.backup.$(date +%F-%H%M%S)

创建站点配置。下面的 php8.3-fpm.sock 必须替换成上一步实际查到的套接字名称;如果系统显示的是 php8.1-fpm.sock,就使用对应路径。

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/public;
    index index.php index.html;

    location ^~ /.well-known/acme-challenge/ {
        allow all;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

将配置保存到:

sudo nano /etc/nginx/sites-available/example.com

创建启用链接:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

如果提示链接已经存在,不要重复创建,先检查它指向的文件:

ls -l /etc/nginx/sites-enabled/example.com

先检查配置,再重新加载服务:

sudo nginx -t
sudo systemctl reload nginx

成功时通常会看到:

syntax is ok
test is successful

nginx -t 失败时不要 reload。常见原因包括 PHP-FPM 套接字路径写错、配置大括号缺失、站点文件路径不存在或端口重复监听。

4. 验证服务器本地响应

在服务器上使用 Host 请求,能够绕过 DNS,直接判断 Nginx 是否选择了正确的站点:

三、安装运行环境并配置网站 / 4. 验证服务器本地响应配图

curl -i -H 'Host: example.com' http://127.0.0.1/

PHP 测试页正常时,响应正文应包含:

app-ok

同时检查监听端口和服务:

ss -lntp | grep -E ':(80|443)\s'
systemctl is-active nginx
systemctl is-active php8.3-fpm

如果本地请求返回 200,说明 Nginx 已经找到站点并完成 PHP 转发。此时外部访问仍失败,问题通常在 DNS、云安全组、防火墙或访问端网络,而不是 PHP 页面本身。

5. 需要数据库时安装 MariaDB

静态网站和不需要持久化数据的 PHP 页面可以跳过本节。业务程序需要数据库时,安装并启动 MariaDB:

sudo apt install mariadb-server -y
sudo systemctl enable --now mariadb
sudo systemctl is-active mariadb

执行安全初始化向导:

sudo mariadb-secure-installation

根据实际需求处理匿名账号、测试数据库和远程 root 登录等选项。不要把数据库 root 账号直接写进网站配置。

进入数据库创建独立的库和账号:

sudo mariadb

在 MariaDB 提示符中执行,密码替换为随机生成的强密码:

CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '替换为随机强密码';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

验证账号和数据库:

mariadb -u appuser -p appdb -e 'SELECT 1;'

预期结果中应出现一行 1。数据库创建、授权和表结构变更会影响业务数据,执行前应有备份;不要为了排障随意执行 DROP DATABASE 或批量删除表。

四、配置域名和 HTTPS

1. 检查 DNS

在本地电脑或其他外部网络执行:

dig +short A example.com
dig +short A www.example.com
dig +short AAAA example.com

A 记录应返回服务器 IPv4 地址。若存在 AAAA 记录,服务器还必须正确配置 IPv6 并监听对应端口;如果服务器没有可用 IPv6,不要保留指向错误地址的 AAAA 记录,否则部分访问者可能优先走 IPv6 并得到超时。

DNS 修改后不一定立即在所有递归 DNS 中同步。在 DNS 生效期间,可以先用 --resolve 验证 Nginx:

curl -I --resolve example.com:80:203.0.113.10 http://example.com/

如果该命令返回 200、301 或 302,而普通域名访问仍不通,优先检查 DNS 缓存和记录值。

2. 申请并验证 HTTPS 证书

确认域名已经解析到服务器,并且 80、443 端口可以从外部访问后,安装证书工具:

sudo apt install certbot python3-certbot-nginx -y

Certbot 会修改 Nginx 配置。执行前可以备份:

sudo cp -a /etc/nginx /etc/nginx.backup-before-certbot.$(date +%F-%H%M%S)

申请证书并让工具更新 Nginx:

sudo certbot --nginx -d example.com -d www.example.com

完成后检查配置和自动续期演练:

sudo nginx -t
sudo systemctl reload nginx
sudo certbot renew --dry-run

外部检查:

curl -I https://example.com/

如果返回 200,说明首页可通过 HTTPS 访问。返回 301 或 302 也可能是正常的 HTTP 到 HTTPS 跳转,继续使用 curl -IL 查看完整跳转链:

curl -IL http://example.com/

五、使用 ping、traceroute 和 HTTP 检查定位问题

海外服务器上线后,不能只看 ping。不同工具验证的是不同层次。

1. ping:判断 ICMP 连通性和延迟

从访问网站的本地网络执行:

ping -c 4 example.com

重点看:

  • 是否全部超时;
  • 丢包率是否明显;
  • 往返时间是否在几次结果中保持相近。

示例结果:

4 packets transmitted, 4 received, 0% packet loss
round-trip min/avg/max = 42.1/44.7/48.3 ms

这只能说明 ICMP 请求和响应的情况,不能证明 TCP 80/443 端口开放,也不能证明 PHP 或数据库正常。服务器禁用 ICMP 时,ping 超时并不等于网站不可访问,应以 curl 结果为准。

2. traceroute:查看到服务器的路径变化

Linux 客户端没有该命令时安装:

sudo apt install traceroute -y

执行:

traceroute -n -q 3 -w 2 example.com

-n 表示不反向解析主机名,结果更容易阅读;-q 3 表示每一跳发送 3 次探测;-w 2 表示每次等待 2 秒。

traceroute 可以帮助判断请求在哪些网络节点附近开始大量超时或延迟升高,但不能单独证明故障位置。中间路由器可能限制探测包,出现 * 仍可能正常转发后续流量;返回路径也可能与去程不同。因此:

  • ping 正常、traceroute 中间有星号、HTTPS 正常:通常不影响网站上线。
  • ping 和 traceroute 都异常、HTTPS 也超时:检查访问端网络、服务器安全组、防火墙和监听端口。
  • ping 异常、HTTPS 返回 200:说明 ICMP 被限制,但 Web 服务正常。
  • traceroute 某一跳延迟高,但后续节点恢复:不能据此判断服务器本身故障。

3. curl 和端口检查:判断网站是否真的可用

从外部网络执行:

curl -I --connect-timeout 8 --max-time 15 https://example.com/

必要时分别检查 IPv4 和 IPv6:

curl -4 -I https://example.com/
curl -6 -I https://example.com/

常见状态码含义如下:

结果常见含义优先检查位置
200页面正常返回内容和应用日志
301/302正常跳转或强制 HTTPS跳转规则是否形成循环
403无访问权限或目录权限异常文件权限、Nginx 规则
404请求路径不存在或站点根目录错误root、入口文件、应用路由
502Nginx 无法连接 PHP-FPMFPM 状态、套接字路径、日志
504上游响应超时PHP 程序、数据库或外部依赖
连接超时请求未完成 TCP 连接DNS、安全组、防火墙、监听端口
TLS 错误证书、域名或系统时间问题证书覆盖范围、时间、SNI

六、常见失败处理

1. SSH 无法登录

按低风险顺序检查:

sudo systemctl is-active ssh
sudo ss -lntp | grep ':22'
sudo ufw status numbered

如果服务器使用非 22 端口,应检查实际端口。客户端提示 Permission denied,通常是账号、私钥或 authorized_keys 权限问题;提示 Connection timed out,优先检查云安全组、防火墙和公网地址;提示 Connection refused,通常表示端口没有服务监听或端口填错。

2. 本地 Nginx 正常,外部访问超时

依次确认:

dig +short A example.com
sudo ufw status verbose
sudo ss -lntp | grep -E ':(80|443)\s'

如果 DNS 地址不对,修正 A/AAAA 记录;如果本地没有 80 或 443 监听,检查 Nginx;如果本地监听正常但外部超时,检查云平台安全组和上层防火墙。

3. 返回 502 Bad Gateway

先看 PHP-FPM 是否运行:

systemctl is-active php8.3-fpm
find /run/php -maxdepth 1 -type s -name 'php*-fpm.sock' -print

再看日志:

sudo tail -n 50 /var/log/nginx/error.log
sudo journalctl -u php8.3-fpm -n 50 --no-pager

如果日志显示找不到套接字,把 Nginx 配置中的 fastcgi_pass 改为实际存在的 /run/php/*.sock 路径,然后执行:

sudo nginx -t
sudo systemctl reload nginx

4. 返回 403 或 404

检查站点根目录和入口文件:

ls -ld /var/www/example.com/public
ls -l /var/www/example.com/public
sudo nginx -T | grep -A8 -B3 'server_name example.com'

常见原因是:

  • root 指向了错误目录;
  • index.php 或 index.html 不存在;
  • 目录没有执行权限;
  • 正则规则误拦截了路径;
  • 请求落到了 Nginx 默认站点,而不是 example.com 的 server block。

不要为了快速解决而执行全盘 chmod 777。通常目录使用 755、文件使用 644 即可,只有程序确实需要写入的上传或缓存目录才单独赋予有限写权限。

5. HTTPS 申请失败

先确认:

dig +short A example.com
curl -I http://example.com/
sudo ufw status

域名未解析、80 端口被拦截、域名实际指向其他服务器,都会导致证书验证失败。确认条件满足后再重试,不要连续反复申请相同证书。

七、上线验收与回滚检查项

正式替换测试页面前,建议完成一次快照或备份,并记录当前配置版本:

sudo cp -a /etc/nginx/sites-available/example.com \
  /etc/nginx/sites-available/example.com.before-release

数据库网站还应执行逻辑备份,例如:

sudo mariadb-dump appdb > "$HOME/appdb-before-release.sql"

验收时逐项检查:

  • [ ] 新的 deploy 账号可以通过 SSH 密钥登录。
  • [ ] root 登录和密码登录的关闭操作已经验证,不会影响控制台应急登录。
  • [ ] systemctl --failed 没有关键失败服务。
  • [ ] UFW、安全组同时放行实际 SSH、80 和 443 端口。
  • [ ] nginx -t 返回成功。
  • [ ] PHP-FPM 或其他实际运行时处于 active 状态。
  • [ ] 本地 Host 请求和外部域名请求均返回预期状态码。
  • [ ] 页面不再显示临时测试内容。
  • [ ] 数据库账号可以连接,应用日志没有连接或权限错误。
  • [ ] HTTPS 证书覆盖实际访问域名。
  • [ ] certbot renew --dry-run 可以完成。
  • [ ] 访问日志、错误日志和应用日志能够定位后续问题。

如果新版本上线后出现问题,优先回滚应用文件或 Nginx 站点配置,不要先删除数据库。恢复旧配置后必须再次测试:

sudo cp -a /etc/nginx/sites-available/example.com.before-release \
  /etc/nginx/sites-available/example.com

sudo nginx -t
sudo systemctl reload nginx

如果需要暂时停用新站点链接,可以在确认该链接确实指向目标站点后执行:

sudo unlink /etc/nginx/sites-enabled/example.com
sudo nginx -t
sudo systemctl reload nginx

数据库回滚应使用经过验证的备份,并在维护窗口内执行;表结构变更不一定能够自动逆向恢复。DNS 回滚也不会立即对所有访问者生效,因此回滚前应保留旧服务器或旧站点的可用状态,直到外部解析和 HTTPS 访问均恢复到预期结果。