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

海外抖音业务如何自建服务器站点?从系统安装到域名、HTTPS部署

发布人:Minchunlin 发布时间:2026-10-04 00:01 阅读量:6

面向海外抖音业务时,服务器通常承载的是品牌官网、活动落地页、表单收集、内容管理后台或业务接口,而不是简单改变账号归属。只有在需要自有域名、持续运行的网站服务、接口回调或海外用户访问入口时,才有必要自建海外服务器站点;如果只是发布内容,并不意味着必须先部署一台服务器。

下面以 Ubuntu Server 22.04 LTS、Nginx、Node.js 20、单个 Node.js 网站应用 为例,完成从系统安装、运行环境准备,到域名解析、HTTPS上线、验证和回滚的完整流程。示例域名使用 example.com,实际操作时替换为自己的域名。该方案面向正常的网站和业务系统部署,不用于改变平台账号属性或规避平台规则。

引言与部署范围配图

一、明确上线目标和部署结构

本次部署完成后的请求链路如下:

一、明确上线目标和部署结构配图

访问者浏览器
    ↓ HTTPS 443
Nginx
    ↓ 本机反向代理
Node.js 应用 127.0.0.1:3000

公网只开放 SSH、HTTP 和 HTTPS,Node.js 应用只监听本机回环地址。这样可以避免应用端口直接暴露在公网,同时由 Nginx 统一处理域名、HTTPS、访问日志和请求转发。

1. 推荐的基础环境

项目示例配置
操作系统Ubuntu Server 22.04 LTS 64 位
Web服务器Nginx
应用运行环境Node.js 20、npm
应用监听地址127.0.0.1:3000
公网端口TCP 22、80、443
域名example.com、www.example.com
应用启动方式npm run start
应用构建方式npm run build

Node.js 版本应以业务项目的 package.json、锁定文件和框架要求为准。如果项目明确要求 Node.js 18 或其他版本,不要直接套用本文版本,应在安装前确认兼容性。

2. 开始前需要准备的内容

  • 一台已经可以通过 SSH 登录的海外服务器。
  • 服务器公网 IPv4 地址。
  • 已注册并可以修改 DNS 的域名。
  • 可以正常构建的 Node.js 项目代码。
  • 项目中的 package.json 和锁定文件,例如 package-lock.json。
  • 应用所需的环境变量、接口密钥和数据库连接信息。
  • 服务器快照或系统备份能力。
  • 确认服务器控制台的入站规则允许 TCP 22、80、443。

海外服务器的作用主要体现在网站部署位置、访问入口和业务服务运行位置。服务器位于海外,并不会自动改变账号所属地区,也不会替代平台本身的审核、认证或合规要求。

二、安装系统并完成基础安全设置

在服务器控制台中选择 Ubuntu Server 22.04 LTS,设置强随机密码或绑定 SSH 公钥,并记录公网 IP。首次连接时使用服务器初始化账号登录。

系统升级可能重启服务,生产环境应先创建快照或安排维护窗口:

sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt full-upgrade -y
sudo apt install -y ca-certificates curl gnupg nginx git unzip tar

确认系统版本:

cat /etc/os-release
uname -m

预期可以看到 Ubuntu 22.04 系列信息和 x86_64 或相应的 64 位架构。

1. 创建专用部署用户

不要长期使用 root 账号运行网站进程。创建一个用于部署和运行应用的用户:

sudo adduser deploy
sudo usermod -aG sudo deploy

如果本地已经配置 SSH 公钥,可以将公钥复制到新用户:

ssh-copy-id deploy@SERVER_IP

然后打开新的终端,用新用户测试登录:

ssh deploy@SERVER_IP

确认新用户能够登录后,再考虑限制 root 登录或关闭密码登录。修改 SSH 配置前必须保留当前会话,并使用第二个会话测试,避免因配置错误导致无法远程进入服务器。

2. 配置防火墙

先保存当前防火墙状态,再调整规则。以下命令适用于 Ubuntu 上的 UFW;如果服务器控制台还有一层安全组,也需要同步放行相同端口。

sudo ufw status numbered | tee "$HOME/ufw-before.txt"

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

确认 SSH 使用的不是 22 端口时,应把 22 替换为实际端口。执行 ufw enable 前要确认 SSH 放行规则已经存在,否则可能会中断远程连接。

如果规则配置错误,可以先恢复 SSH 访问:

sudo ufw allow 22/tcp
sudo ufw reload

在确认服务器控制台具备带外管理能力后,也可以使用保存的规则记录逐项删除错误规则。不要直接关闭所有防护后长期运行。

三、安装 Node.js 和网站依赖

下面以 Node.js 20 为例。执行前先确认应用支持该版本。为避免直接执行未经查看的远程脚本,先下载到临时文件,再检查内容:

curl -fsSL https://deb.nodesource.com/setup_20.x -o /tmp/nodesource_setup.sh
less /tmp/nodesource_setup.sh
sudo bash /tmp/nodesource_setup.sh
sudo apt install -y nodejs

检查版本和安装路径:

node --version
npm --version
command -v node
command -v npm

示例结果可能类似:

v20.x.x
10.x.x
/usr/bin/node
/usr/bin/npm

版本号以实际安装结果为准,不要把示例版本当成固定要求。

同时设置 Nginx 开机启动:

sudo systemctl enable --now nginx
sudo systemctl status nginx --no-pager

如果 Nginx 状态不是 active (running),先执行:

sudo nginx -t
sudo journalctl -u nginx -n 50 --no-pager

四、上传并构建网站应用

以下示例假设项目具备以下 npm 脚本:

{
  "scripts": {
    "build": "构建命令",
    "start": "生产环境启动命令"
  }
}

实际项目的脚本名称可能不同,必须以项目文件为准。如果项目没有 build 或 start,应使用项目提供的生产部署命令。

1. 创建发布目录

sudo mkdir -p /var/www/overseas-site/releases/20261003-01
sudo mkdir -p /var/www/overseas-site/shared
sudo chown -R deploy:deploy /var/www/overseas-site

20261003-01 是示例发布编号,每次上线可以使用新的目录,保留旧目录用于回滚。

2. 上传代码

可以在本地项目目录打包代码,避免把本地依赖目录一并传上服务器:

tar --exclude=node_modules --exclude=.git -czf overseas-site.tgz .
scp overseas-site.tgz deploy@SERVER_IP:/tmp/

登录服务器后解压:

sudo -u deploy tar -xzf /tmp/overseas-site.tgz \
  -C /var/www/overseas-site/releases/20261003-01

如果使用代码仓库,也可以由 deploy 用户在发布目录执行 git clone。无论采用哪种方式,都应确认代码来源、依赖锁定文件和配置文件没有被错误覆盖。

3. 安装依赖和执行构建

npm ci 需要项目中存在有效的 package-lock.json。它会根据锁定版本安装依赖,比直接执行 npm install 更适合可重复部署。

sudo -u deploy bash -lc '
  cd /var/www/overseas-site/releases/20261003-01 &&
  npm ci &&
  npm run build
'

构建完成后,检查发布目录:

sudo -u deploy ls -la /var/www/overseas-site/releases/20261003-01

如果构建失败,先处理 Node.js 版本、依赖锁定文件或项目代码问题,不要把未完成的目录切换为线上版本。

4. 配置环境变量

创建应用环境文件。以下只放置通用示例,不要把真实密钥直接提交到代码仓库:

sudo tee /etc/overseas-site.env >/dev/null <<'EOF'
NODE_ENV=production
HOST=127.0.0.1
PORT=3000
EOF

sudo chown root:deploy /etc/overseas-site.env
sudo chmod 640 /etc/overseas-site.env

如果应用需要数据库、邮件服务或第三方接口,应根据项目实际变量增加配置,例如连接地址和密钥。生产密钥应通过安全方式写入,不要在聊天记录、代码仓库或公开日志中暴露。

将当前发布版本切换为 current:

sudo ln -sfn \
  /var/www/overseas-site/releases/20261003-01 \
  /var/www/overseas-site/current

切换前应确认目标目录已经存在,ln -sfn 会替换同名符号链接,适合发布切换,但不要把目标路径写错。

五、使用 systemd 管理 Node.js 应用

创建服务单元:

sudo tee /etc/systemd/system/overseas-site.service >/dev/null <<'EOF'
[Unit]
Description=Overseas Site Node.js Application
After=network.target

[Service]
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/var/www/overseas-site/current
EnvironmentFile=/etc/overseas-site.env
ExecStart=/usr/bin/npm run start
Restart=on-failure
RestartSec=5
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
EOF

如果 command -v npm 的结果不是 /usr/bin/npm,应把 ExecStart 改成实际路径。应用还必须能够读取 HOST 和 PORT 环境变量;如果项目使用其他变量名,应按项目要求调整。

加载并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable --now overseas-site.service
sudo systemctl status overseas-site.service --no-pager

先不经过域名和 Nginx,直接检查本机应用:

curl -i http://127.0.0.1:3000/
sudo ss -lntp | grep ':3000'

成功时通常会得到 HTTP 状态码,例如 200、301 或应用自身定义的其他正常状态,并且监听地址应为:

127.0.0.1:3000

如果没有监听,查看应用日志:

sudo journalctl -u overseas-site.service -n 100 --no-pager

常见原因包括启动脚本名称不对、生产环境变量缺失、Node.js 版本不兼容或构建产物路径错误。

六、配置域名和 Nginx 反向代理

1. 添加 DNS 记录

在域名管理后台添加以下记录:

类型主机记录值
A@服务器公网 IPv4
Awww服务器公网 IPv4

只有在服务器已经正确配置 IPv6、Nginx 也监听 IPv6 时,才添加 AAAA 记录。错误的 AAAA 记录可能导致部分访问者优先连接失败。

在服务器上安装 DNS 查询工具并检查:

sudo apt install -y dnsutils
dig +short example.com A
dig +short www.example.com A

返回的地址应与服务器公网 IPv4 一致。DNS 尚未生效时,不要急于申请 HTTPS 证书。

2. 创建 Nginx 站点配置

sudo tee /etc/nginx/sites-available/overseas-site >/dev/null <<'EOF'
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        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_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}
EOF

如果应用确实需要上传文件,可以在 server 块中增加类似配置,但应根据业务大小设置,不要盲目放大:

client_max_body_size 20m;

启用站点并检查配置:

sudo ln -sfn \
  /etc/nginx/sites-available/overseas-site \
  /etc/nginx/sites-enabled/overseas-site

sudo nginx -t
sudo systemctl reload nginx

预期结果应包含:

syntax is ok
test is successful

通过域名测试 HTTP:

curl -I http://example.com

如果 DNS 还未完全生效,也可以用 Host 请求头进行本机验证:

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

七、申请并启用 HTTPS

HTTPS 申请前必须满足以下条件:

  • 域名 A 记录已经指向当前服务器。
  • TCP 80 端口已开放。
  • Nginx 正常运行。
  • example.com 和 www.example.com 的站点配置没有写错。
  • 服务器没有被其他默认站点错误接管。

先备份当前配置:

sudo cp -a \
  /etc/nginx/sites-available/overseas-site \
  /etc/nginx/sites-available/overseas-site.before-certbot

安装证书工具:

sudo apt install -y certbot python3-certbot-nginx

申请证书并让工具修改 Nginx 配置:

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

--redirect 会把 HTTP 请求重定向到 HTTPS。证书工具修改配置前会进行检查,但上线前仍应自行验证:

sudo nginx -t
sudo systemctl reload nginx
curl -I https://example.com

检查证书续期任务:

sudo certbot renew --dry-run

如果测试成功,说明续期流程具备基本可用性。不要把证书文件复制到代码目录,也不要把私钥提交到仓库。

还可以检查 443 端口返回的证书信息:

openssl s_client \
  -connect example.com:443 \
  -servername example.com \
  /dev/null | openssl x509 -noout -subject -dates

输出中的域名和有效期应与实际站点匹配。

八、按现象定位常见失败

故障排查应先从 DNS、端口和 Nginx 等外层开始,再进入应用内部。

现象优先检查可能原因
dig 没有返回地址DNS 记录记录未生效、主机记录写错或使用了错误的域名
HTTP 访问超时防火墙和控制台入站规则80 端口未放行或服务器网络未就绪
返回 Nginx 默认页面server_name 和站点链接域名没有匹配到目标站点
返回 502 Bad Gateway本机 3000 端口和 systemd 日志Node.js 未启动、监听地址错误或端口不一致
HTTPS 申请失败DNS、80 端口、域名配置证书验证请求无法访问服务器
页面打开但静态资源失败浏览器开发者工具和应用公共路径构建时的域名、路径或 HTTPS 配置不一致
服务反复重启journalctl环境变量缺失、启动命令错误或应用启动后主动退出

502 错误应先执行:

curl -i http://127.0.0.1:3000/
sudo systemctl status overseas-site.service --no-pager
sudo journalctl -u overseas-site.service -n 100 --no-pager

如果本机请求也失败,问题在 Node.js 应用或 systemd;如果本机请求成功而域名返回 502,再检查 Nginx 的 proxy_pass、端口和配置加载状态。

Nginx 配置错误时不要直接覆盖线上配置,先查看具体行号:

sudo nginx -t
sudo tail -n 100 /var/log/nginx/error.log

权限问题不要用 chmod -R 777 处理。先确认目录归属:

sudo namei -l /var/www/overseas-site/current
sudo -u deploy test -r /var/www/overseas-site/current && echo "readable"

九、上线验收和失败回滚

1. 上线验收清单

逐项确认以下结果:

sudo systemctl is-enabled nginx
sudo systemctl is-active nginx

sudo systemctl is-enabled overseas-site.service
sudo systemctl is-active overseas-site.service

sudo ss -lntp | grep -E ':(22|80|443|3000)\b'

正常情况下:

  • Nginx 和 Node.js 服务均为 active。
  • 80、443 对外提供访问。
  • 3000 只监听 127.0.0.1,没有直接暴露给公网。
  • http://example.com 可以跳转到 HTTPS。
  • https://example.com 返回正常页面。
  • 页面中的静态资源、表单和必要接口均能通过 HTTPS 工作。
  • Nginx 日志和应用日志没有持续增长的错误。

查看最近访问记录:

sudo tail -n 50 /var/log/nginx/access.log
sudo tail -n 50 /var/log/nginx/error.log
sudo journalctl -u overseas-site.service -n 50 --no-pager

如果应用提供健康检查接口,可以额外执行:

curl -i https://example.com/healthz

没有该接口时,不要为了验收临时伪造路径,以首页、关键业务页面和实际接口为准。

2. 应用版本回滚

新版本启动失败或页面异常时,不要立即删除旧版本。先查看当前链接和已有发布目录:

九、上线验收和失败回滚配图

readlink -f /var/www/overseas-site/current
ls -lah /var/www/overseas-site/releases

确认旧版本目录后,将 current 切回旧版本:

sudo ln -sfn \
  /var/www/overseas-site/releases/20261002-02 \
  /var/www/overseas-site/current

sudo systemctl restart overseas-site.service
sudo systemctl status overseas-site.service --no-pager
curl -i http://127.0.0.1:3000/

这里的 20261002-02 只是旧版本示例,应替换为实际存在且已经验证过的目录。确认线上恢复后,再处理失败版本,不要在回滚前删除发布文件。

3. Nginx 配置回滚

如果证书工具或手工配置导致 Nginx 无法加载,可以恢复此前保存的站点配置:

sudo cp -a \
  /etc/nginx/sites-available/overseas-site.before-certbot \
  /etc/nginx/sites-available/overseas-site

sudo nginx -t
sudo systemctl reload nginx

配置回滚可能暂时恢复为 HTTP 状态,证书文件本身不会因为恢复 Nginx 配置而自动撤销。确认站点可用后,再重新整理 HTTPS 配置。

4. DNS 回滚

如果服务器切换后出现大范围访问异常,可将域名 A 记录改回原地址。DNS 回滚受 TTL 和缓存影响,不会立即对所有访问者同步。修改前应记录原有解析值,避免因误删记录而无法恢复。

完成以上验收后,保留至少一个已验证的旧发布版本、Nginx 配置备份和系统快照,再进入常态化运营。这样即使新代码、环境变量或证书配置出现问题,也能按照“应用版本—Nginx配置—DNS记录”的顺序快速退回可用状态。

目录结构
全文