它是什么
先把名词说清楚:这里的虚拟主机不是传统共享主机,也不是买一个「空间」后进 cPanel 上传文件;它指 Google Cloud Compute Engine 里的一台 Linux VM。说人话,就是先租一台云端电脑,CPU、内存
解决什么问题
做「虛擬主機如何建置Wordpress環境」这件事,先别急着装 WordPress。它解决的是个人站、企业展示站、博客上线时最常见的三类问题:缺少可控服务器、权限混乱、扩容困难。只买共享空间时,站点像放在别人柜子里,面板按钮有限;账号随手给同事,FTP、数据库、插件目录权限混在一起,谁改了文件说不清;访问量一上来,CPU、内存、磁盘或连接数不够,只能被动搬家。
自己管理一台 VM,核心是把关键位置握在自己手里:系统版本、PHP/Nginx/Apache 版本,wp-content/plugins 目录,MySQL/MariaDB 数据库账号,访问日志和错误日志,以及防火墙规则。以后升级、回滚、查 500 错误、只开放 80/443 和 SSH,都不用等客服;流量变大时,也能按控制台加 CPU、内存、云盘或做镜像。在云服务器的 SSH 窗口里先复制下面这段做低风险体检,看清楚机器现状;它不会删文件,只会创建一个备份目录。
echo "1) 系统版本"
cat /etc/os-release
echo "2) 磁盘和内存"
df -h /
free -h
echo "3) 当前账号和目录权限"
whoami
id
pwd
ls -la
echo "4) 正在监听的端口"
(ss -tulpen || netstat -tulpen) 2>/dev/null || echo "没有 ss/netstat,先记下待安装"
echo "5) 防火墙状态"
(sudo ufw status || sudo firewall-cmd --state) 2>/dev/null || echo "没有 ufw/firewalld,或当前账号没有 sudo 权限"
echo "6) 准备备份目录"
mkdir -p "$HOME/wp-backups"
ls -ld "$HOME/wp-backups"
echo "7) 常见日志位置"
ls -ld /var/log /var/log/nginx /var/log/apache2 /var/log/httpd /var/log/mysql 2>/dev/null || true
为什么先体检?因为小白最容易一上来就把目录权限全开、用 root 跑网站、把 3306 数据库端口对全网开放,或者为了“能访问”直接关防火墙。能看到版本、资源、账号和端口,才知道该补哪一项,而不是凭感觉乱改。看到密码提示别慌,它只是读取状态。
上线前还要把四件事写成固定流程:备份(数据库加 wp-content,至少保留 7 天,另存一份并演练恢复)、监控(磁盘、内存、进程、首页状态码)、HTTPS(证书自动续期,别等浏览器报警)、更新(先备份,先到测试环境,再更新核心、主题、插件,最后记下回滚办法)。这样做是为了避免网站真宕机、证书过期、日志把磁盘撑满后,才临时找教程补救。记住:备份没恢复成功过,就等于没有备份。
怎么上手
先别急着装 WordPress:先有能上网的 Linux 服务器,再装网页服务、PHP、数据库,最后接域名和证书。控制台按同样参数点也行,下面用 Cloud Shell 的 gcloud 建 Ubuntu VM 更快。
-
先在控制台开通结算(绑定付款方式),否则建不了 VM;下面会建项目并自动链接第一个结算账号。地区选离访客近的
asia-east1,练习用e2-small够便宜,同时放行 80/443。export PROJECT_ID="wp-demo-$(date +%s)" export REGION="asia-east1" export ZONE="$REGION-b" export MACHINE_TYPE="e2-small" export VM_NAME="wp-vm" export BILLING_ACCOUNT_ID="$(gcloud beta billing accounts list --format='value(name)' | head -n1 | sed 's#billingAccounts/##')" gcloud projects create "$PROJECT_ID" --name="WordPress Demo" gcloud config set project "$PROJECT_ID" gcloud beta billing projects link "$PROJECT_ID" --billing-account="$BILLING_ACCOUNT_ID" gcloud services enable compute.googleapis.com gcloud compute instances create "$VM_NAME" --zone="$ZONE" --machine-type="$MACHINE_TYPE" --image-family=ubuntu-2204-lts --image-project=ubuntu-os-cloud --boot-disk-size=20GB --tags=web-server gcloud compute firewall-rules create allow-web --allow=tcp:80,tcp:443 --target-tags=web-server --source-ranges=0.0.0.0/0坑:项目 ID 要全局唯一;防火墙规则重名就换名字。外部 IP 可能随重建变化,正式站建议改静态 IP。
-
别关 Cloud Shell,继续 SSH 登录;后面命令都在这个窗口里跑,别粘到自己电脑。数据库只给本机程序用,别把 3306 开到公网。
gcloud compute ssh "$VM_NAME" --zone="$ZONE"登录后安装 Nginx、PHP、MariaDB,并建 WordPress 专用库和用户。
sudo apt update && sudo DEBIAN_FRONTEND=noninteractive apt install -y nginx mariadb-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-intl php-zip unzip curl sudo systemctl enable --now nginx mariadb sudo systemctl enable --now php8.1-fpm sudo mysql -e "CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'WpPass_ChangeMe_123'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; FLUSH PRIVILEGES;"坑:示例密码只适合练习,上线前换成长随机密码并保存好。
-
下载 WordPress、写
wp-config.php、设权限,再让 Nginx 把 PHP 交给 PHP-FPM;755/644 就够,别设 777。cd /tmp && curl -LO https://wordpress.org/latest.tar.gz && tar xzf latest.tar.gz sudo mkdir -p /var/www/wordpress sudo cp -a wordpress/. /var/www/wordpress/ sudo cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php sudo sed -i "s/database_name_here/wordpress/; s/username_here/wpuser/; s/password_here/WpPass_ChangeMe_123/" /var/www/wordpress/wp-config.php sudo chown -R www-data:www-data /var/www/wordpress sudo find /var/www/wordpress -type d -exec chmod 755 {} ; sudo find /var/www/wordpress -type f -exec chmod 644 {} ; sudo tee /etc/nginx/sites-available/wordpress > /dev/null <<'EOF' server { listen 80; server_name _; root /var/www/wordpress; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; } location ~ /.ht { deny all; } } EOF sudo ln -sf /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress sudo rm -f /etc/nginx/sites-enabled/default sudo nginx -t && sudo systemctl reload nginx坑:配置测试报错先停下,多半少分号;上线前用官方密钥替换盐值。
-
在域名商后台把 A 记录指向下面查到的外部 IP。DNS 生效后再申请 SSL;证书失败通常是 80 没放行或解析没生效。
curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip"read -p "请输入已解析到本机外部 IP 的域名(如 example.com): " DOMAIN read -p "请输入接收证书通知的邮箱: " EMAIL sudo sed -i "s/server_name _;/server_name $DOMAIN;/" /etc/nginx/sites-available/wordpress sudo nginx -t && sudo systemctl reload nginx sudo DEBIAN_FRONTEND=noninteractive apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d "$DOMAIN" --email "$EMAIL" --agree-tos --no-eff-email --redirect -
最后在浏览器打开
https://你的域名,按向导选简体中文,填站点标题、管理员账号、密码、邮箱并安装。管理员别叫admin,密码别同数据库;装完发一篇文章确认正常。
与替代方案对比
很多人搜「虚拟主机怎么建 WordPress 环境」,其实卡住的不是不会装,而是不知道该选哪条路。别先急着翻教程,花 10 秒跑一下下面这句,先搞清楚你买到的机器「能不能自己动配置」:
whoami; sudo -n true 2>/dev/null && echo "✅ 有 root 权限,能改 php.ini、能重启服务" || echo "⚠️ 权限受限,改配置多半得找客服"
为什么先跑这个?因为下面几种方案最大的差别不是价格,是你手上有多少控制权。小白最容易踩的坑就是:照着 Compute Engine 的教程去改共享主机的 php.ini,改了半天不生效,还以为自己命令敲错了——其实是根本没那个权限,看到第二句提示就别再折腾了。
- 传统共享虚拟主机:最省心,面板点几下、FTP 一传就能开站,系统补丁都不用管。但资源是跟别人挤的,邻居站点流量一爆你就跟着卡;SSH 通常只给个受限终端,OPcache、PHP-FPM 进程数这类性能调优基本没空间,想放宽上传大小也只能提工单。
- 托管 WordPress / 市场一键镜像:部署最快,适合「我只想写文章,不想维护系统」的人,备份和 SSL 人家帮你兜了。代价是可定制性弱:想装个冷门 PHP 扩展、改一条 Nginx 缓存规则,常会发现目录被锁,或者一升级就被覆盖回原样。
- 自己用 Compute Engine 装:反而最推荐新手先走一遍。Web、PHP、数据库都在同一台机子上看得见摸得着,哪环断了查哪环,全链路一次就懂了,以后迁移也不慌。
- Cloud Run / App Engine:更适合后期做现代化改造、按流量自动伸缩。但别一上来就用:它们是无状态的,WordPress 默认把图片存本地
wp-content/uploads,实例一重启图就全丢,还得额外接对象存储,很容易被「现代化」三个字带进坑里。
自己装完可以用这句验收,服务都亮 active、本地再返回 200,才算真跑通了:
sudo systemctl is-active nginx mysql php*-fpm 2>/dev/null; curl -I http://127.0.0.1 | head -n 1
最后给个不纠结的结论:只想快速试水,直接选一键镜像,半小时上线先找感觉;打算长期运维,别怕麻烦,老老实实自己掌握一遍 Linux 配置。镜像省的是今天的时间,欠下的是出故障那天看不懂日志的账。
最佳实践
先把「门」关好:网站只需要 80/443,SSH 的 22 只给自己的公网 IP,3306、8080 这类管理或测试端口不要对公网开。原因很简单,扫描器每天试密码,少一个入口就少一次被撞库。先在你要发起 SSH 的电脑或 Cloud Shell 执行,并确认项目选对:
MY_IP=$(curl -fsS https://ipinfo.io/ip)/32
gcloud compute firewall-rules update default-allow-ssh --source-ranges "$MY_IP" 2>/dev/null || gcloud compute firewall-rules create allow-ssh-from-my-ip --allow tcp:22 --source-ranges "$MY_IP"
gcloud compute firewall-rules create allow-http-https --allow tcp:80,tcp:443 --source-ranges 0.0.0.0/0 || true
gcloud compute firewall-rules list --format='table(name,allowed,sourceRanges)'
执行后到防火墙列表删掉其余入站规则。坑:家里宽带 IP 会变,变了要重跑第一条;别在 A 电脑查 IP、却用 B 电脑登录,也别把 22 开给 0.0.0.0/0。
然后在服务器 SSH 窗口执行下面命令,禁用密码登录、改用 SSH 密钥。执行前一定先在 GCP「元数据 → SSH 密钥」上传公钥,并用新窗口试登录;旧窗口别关,否则可能把自己锁在外面。WordPress 后台管理员和 GCP 账号都要开双重验证,优先用验证器 App,备用码不要放服务器。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
sudo sed -i -E '/^#?[[:space:]]*(PasswordAuthentication|KbdInteractiveAuthentication|PermitRootLogin)[[:space:]]+/d' /etc/ssh/sshd_config
printf '%sn' 'PasswordAuthentication no' 'KbdInteractiveAuthentication no' 'PermitRootLogin no' | sudo tee -a /etc/ssh/sshd_config >/dev/null
if sudo sshd -t; then sudo systemctl restart ssh || sudo systemctl restart sshd; fi
坑:如果 sshd -t 报错,先按提示修配置,别重启服务器。
第二步是勤更新、能回滚。系统安全补丁和 WordPress 核心、插件、主题更新能堵已知漏洞;但更新可能改坏主题,所以要先备份。下面适合 Debian/Ubuntu 常见镜像,站点目录按 /var/www/html:
sudo apt-get update
sudo apt-get install -y unattended-upgrades php-cli curl
sudo dpkg-reconfigure --priority=low unattended-upgrades
curl -fsSL https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -o /tmp/wp-cli.phar
sudo install -m 0755 /tmp/wp-cli.phar /usr/local/bin/wp
cd /var/www/html
wp core update --allow-root
wp plugin update --all --allow-root
wp theme update --all --allow-root
( crontab -l 2>/dev/null; echo "0 4 * * * cd /var/www/html; /usr/local/bin/wp core update --allow-root; /usr/local/bin/wp plugin update --all --allow-root; /usr/local/bin/wp theme update --all --allow-root >> /var/log/wp-update.log 2>/dev/null" ) | crontab -
数据库和 wp-content/uploads 也要每天自动备份到 Cloud Storage,别只存在本机系统盘;每月找一台临时站点导入 SQL、解压 uploads 并打开几张图片,才算真的演练恢复。坑:cron 常找不到 wp 或 gsutil,脚本里已写 PATH;Bucket 名全球唯一,若被占用要在控制台改名。
sudo mkdir -p /var/backups/wordpress
printf '%sn'
'#!/bin/bash'
'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin'
'PROJECT_ID=$(gcloud config get-value project 2>/dev/null)'
'BUCKET="gs://${PROJECT_ID}-wp-backup"'
'gsutil mb -l asia-east1 "$BUCKET" 2>/dev/null || true'
'STAMP=$(date +%F_%H%M)'
'cd /var/www/html || exit 1'
'wp db export "/var/backups/wordpress/db_${STAMP}.sql" --allow-root'
'tar -czf "/var/backups/wordpress/uploads_${STAMP}.tar.gz" wp-content/uploads'
'gsutil -m cp "/var/backups/wordpress/db_${STAMP}.sql" "/var/backups/wordpress/uploads_${STAMP}.tar.gz" "${BUCKET}/${STAMP}/"'
'find /var/backups/wordpress -type f -mtime +14 -delete' | sudo tee /usr/local/bin/wp-backup.sh >/dev/null
sudo chmod +x /usr/local/bin/wp-backup.sh
( crontab -l 2>/dev/null; echo "0 3 * * * /usr/local/bin/wp-backup.sh >> /var/log/wp-backup.log 2>/dev/null" ) | crontab -
/usr/local/bin/wp-backup.sh
第三步是用 Cloud Monitoring 和日志告警盯 CPU、磁盘、HTTP 5xx 错误码:建 CPU 超过 80% 持续 5 分钟、磁盘超过 85%、PHP Fatal 或 5xx 突增的告警。错误码变多通常比用户投诉更早。大促、投放、流量增长前先跑一次备份,再在 Cloud Shell 做快照;确保虚拟机名字含 wordpress:
gcloud compute instances list --filter='name~wordpress' --format='value(name,zone)' | while read VM ZONE; do DISK=$(gcloud compute instances describe "$VM" --zone "$ZONE" --format='value(bootDisk.source)' | awk -F/ '{print $NF}'); gcloud compute disks snapshot "$DISK" --zone "$ZONE" --snapshot-names "wp-$(date +%m%d%H%M)-$VM"; done
快照不等于数据库一致性备份;若提示权限不足,给服务账号加快照权限,或在控制台点创建快照。
最后,别让一台虚拟机又跑 PHP、又跑 MySQL、又扛图片。把数据库迁到 Cloud SQL,静态资源交给 Cloud Storage 或 CDN,可降低单点压力,虚拟机坏了也更容易换机。坑:Cloud SQL 不要把 3306 开到公网,用内网 IP 或 Cloud SQL Auth Proxy;改 wp-config.php 的 DB_HOST,媒体 URL 和 CDN 缓存也要一起更新,否则图片可能 404。
常见问题(FAQ)
小白一定要会 Linux 命令吗?
不必精通,按步骤复制命令即可;至少要懂 SSH、目录、权限和重启服务。
GCP VM 和传统虚拟主机有什么区别?
VM 给你完整系统权限,传统主机多只给面板;前者更灵活,也更需维护。
WordPress 数据库应该放本机还是 Cloud SQL?
练手可放本机,正式站建议 Cloud SQL,便于备份、扩容和权限管理。
网站变慢先查什么?
先看 CPU、内存、磁盘、数据库慢查询和插件,再决定是否升配或加缓存。
必须配置 SSL 证书吗?
必须,HTTPS 能保护登录与表单数据,也利于搜索收录和浏览器信任。
不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。
