它是什么:GCP 上的 VM 不是传统虚拟主机
一句话说清:使用GCP建立虚拟主机VM,通常指在 Compute Engine 创建一台可远程登录的 Linux 云服务器。它是一整台电脑,不是只放网页的共享小格子。
打开控制台右上角的 Cloud Shell(>_),下面这段可直接复制执行,也当「零件清单」看;首次提示启用 Compute Engine API,按确认即可:
gcloud compute instances create my-first-vm
--project="$(gcloud config get-value project)"
--zone=asia-east1-b
--machine-type=e2-micro
--image-family=debian-12
--image-project=debian-cloud
--tags=http-server
带这些参数,是为了逐个对上核心部件,也避开新手常踩的坑:
- 项目:资源、配额、账单都挂这儿。坑:没切对,机器开进旧测试项目,还以为没成功;所以用
$(gcloud config get-value project)自动取值,免得抄错 ID。 - 区域:大地理范围,选离访客近的,延迟低。
- 可用区:区域里的一栋机房,如
asia-east1-b。坑:磁盘和 IP 锁在区里,换区基本得重建。 - 机型:
e2-micro够练手;顺手选高配,账单会吓人。 - 启动磁盘镜像:
debian-12决定开机是 Linux、用apt;误选 Windows,登录和费用全变。 - VPC 网络:内网网线,默认走
default。坑:删了它,新 VM 没网卡、分不到 IP。 - 外部 IP:默认是临时的,重启可能变;别急着写进域名解析,做站要另留静态 IP。
- 防火墙规则:
http-server只是贴纸,还要规则放行 80(22 默认已放行)。网页打不开,先查端口,别急着怪机器没开。
最要紧的差别:它给完整服务器权限,能 sudo、改系统、开端口;共享主机由商家兜底补丁和防破解,这里得自己管系统与安全。点「SSH」登进这台 VM 后再复制:
sudo apt update
sudo apt upgrade -y
强调「登进去后」,是因为不少人把它跑在 Cloud Shell 里,只改了临时操作台,VM 纹丝不动。练完记得删,否则一直计费:
gcloud compute instances delete my-first-vm --zone=asia-east1-b --quiet
解决什么问题:什么时候该自己建 VM
先别急着点“创建实例”。把使用GCP建立虛擬主機VM想成:在云上租一台能远程登录、自己装系统的 Linux 电脑。你只问一句:我要的是“能改、能装、能一直跑服务的机器”,还是只是“把文件放上网”?
- 适合自己建:小项目后台、接口、爬虫、测试环境;
怎么上手:从零创建并连接 VM
先别急着点“创建实例”。使用GCP建立虛擬主機VM前,先注册/登录 GCP 账号,新建项目并绑定结算信息;项目管资源和账单,没结算通常不能开 VM。控制台到「API 和服务 > 库」启用 Compute Engine API(API 是功能开关,不启用就调不动服务),或点右上角 Cloud Shell 执行:
gcloud config list
gcloud services enable compute.googleapis.com
坑:Cloud Shell 跟随控制台当前项目,选错会把机器和账单开到别处;免费额度、机型价格会变,别顺手选大规格。
创建时选区域、可用区、机型、Ubuntu 或 Debian 镜像、启动磁盘、VPC 子网、外部 IP、网络标记与防火墙规则。新手建议 asia-east1/asia-east1-b、e2-micro、20GB 平衡盘、default 子网、临时外部 IP,并打 http-server,ssh-server 标签;下面用 Debian 12,控制台选 Ubuntu 22.04 LTS 也不影响后续命令。区域影响延迟和费用,外部 IP 才能公网访问,标签让防火墙只作用于这批 VM:
gcloud config set compute/region asia-east1
gcloud config set compute/zone asia-east1-b
create_rule() {
local name="$1" ports="$2" tags="$3"
if ! gcloud compute firewall-rules describe "$name" >/dev/null 2>&1; then
gcloud compute firewall-rules create "$name"
--allow="$ports"
--target-tags="$tags"
--source-ranges=0.0.0.0/0
fi
}
create_rule allow-ssh-web tcp:22 ssh-server
create_rule allow-http-web tcp:80 http-server
create_rule allow-https-web tcp:443 http-server
if ! gcloud compute instances describe web-vm --zone=asia-east1-b >/dev/null 2>&1; then
gcloud compute instances create web-vm
--zone=asia-east1-b
--machine-type=e2-micro
--image-family=debian-12
--image-project=debian-cloud
--boot-disk-size=20GB
--boot-disk-type=pd-balanced
--subnet=default
--tags=http-server,ssh-server
--address=ephemeral
fi
坑:22 端口开放全网只适合练习,上线前把 source-ranges 改成自己的公网 IP;临时 IP 重启可能变,正式站点用静态 IP。没有 default 子网就先按控制台提示建 VPC 子网。
连接可在「Compute Engine > VM 实例 > web-vm > SSH」点浏览器 SSH;本机用密钥登录时,gcloud 会自动生成并上传密钥:
gcloud compute ssh web-vm --zone=asia-east1-b
进入 VM 后按顺序做:更新补漏洞、建普通用户并复制当前公钥、配置两层防火墙、再部署网站或服务。注意 GCP 规则和 VM 内 UFW 都要放行;先放行 OpenSSH 再启用 UFW,否则容易把自己锁门外。
sudo apt update && sudo apt upgrade -y
id deploy >/dev/null 2>&1 || sudo adduser --disabled-password --gecos "" deploy
sudo usermod -aG sudo deploy
if [ -f ~/.ssh/authorized_keys ]; then
sudo mkdir -p /home/deploy/.ssh
sudo cp ~/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
sudo chown -R deploy:deploy /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh
sudo chmod 600 /home/deploy/.ssh/authorized_keys
fi
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status verbose
sudo apt install -y nginx
sudo systemctl enable --now nginx
echo "<h1>Hello from GCP VM</h1>" | sudo tee /var/www/html/index.html
访问外部 IP 看到 Hello 即成功;换成 Node、Python、Docker 也一样是先开端口再启动服务。坑:打不开时依次查外部 IP、GCP 规则、UFW、服务是否监听 80。
与替代方案对比:VM、共享主机和托管平台
在使用 GCP 建立虚拟主机 VM 之前,先别急着点「创建实例」。很多小白一上来就开机器,后来发现多花了钱还天天熬夜运维。咱们用几行命令把差别摸清楚,再决定也不迟。
先在你现在能登录的任意 Linux 终端里复制这句:
whoami && uname -a
如果显示 root、内核版本随便看,说明你拿的是「整台机器」。共享虚拟主机通常只给一个 FTP 账号和固定好的 PHP 版本,便宜、省心,商家连补丁都替你打了,但装不了新软件、改不了环境。GCP VM 正好反过来:自由度拉满,代价是打补丁、备份、监控全归自己。在 VM 里补系统就跑这句:
sudo apt update && sudo apt upgrade -y
为什么这么做:共享主机是商家在后台默默做了这件事,VM 没人替你做。小白常踩的坑:别在网站正忙时执行,升级可能顺手重启服务;跑完再用下面这句看一眼,列表空着就等于「根本没备份」,删错文件哭都来不及。
gcloud compute snapshots list
再往上一步是 App Engine、Cloud Run 这类托管平台:传代码就跑,扩缩容、补丁一概不用管,最适合无状态应用。坑也恰恰在这——实例一重启,你写进本地磁盘的日志和用户上传的图片就没了。要是你需要 SSH 进去挂个常驻进程,或者调特殊内核参数,就只能回 VM:
sudo sysctl -w net.ipv4.ip_forward=1
这句在托管平台根本没权限执行,在 VM 里却是一句话的事(重启后失效,拿来试手很安全)。常驻脚本、内核调优、要一直挂着的服务,都选 VM。
最后对比本地物理机:机器在手边前期最可控,可想加内存得下单、等快递、关机插条子,扩容按天算。VM 按量计费,改个机型几分钟生效,镜像和快照还能随时克隆一台。但两个钱坑要盯死:出站流量单独算钱,图片被猛刷账单会跳;忘了关的机器一直按秒扣。定期复制这句体检一下:
gcloud compute instances list --format="table(name,status,creationTimestamp)"
看到建立时间很久、又用不上的,就去控制台停掉。注意:状态变成 TERMINATED 才停计算费,挂着的磁盘仍收一点点存储费,真不用了要连磁盘一起删。
一句话记:图省心、纯跑网页 → 共享主机或 Cloud Run;要 SSH、要常驻、要改内核 → 用 GCP VM;几乎不扩容、就爱机器在手边 → 物理机也行。只要开了 VM,就默认自己顺便兼任了运维。
最佳实践:安全、成本与运维一次做对
先收紧「谁能碰 VM」。在 IAM 页面别给协作者 Owner/Editor:只看给 Compute Viewer,只管理实例给 Compute Instance Admin (v1),要 SSH 再叠 OS Login 和 IAP-secured Tunnel User。权限给大,误删、乱开端口、误开机都会算进账单。先在 Cloud Shell 右上角选好项目,再查现状:
gcloud projects get-iam-policy "$(gcloud config get-value project)" --flatten="bindings[].members" --format="table(bindings.role,bindings.members)"
gcloud compute firewall-rules list --format="table(name,direction,allowed,sourceRanges,targetTags)"
gcloud compute instances list --format="table(name,zone,machineType,status)"
坑:默认 VPC 常带 0.0.0.0/0 开 22,别以为没建规则就安全。到 VPC 网络 > 防火墙把 22 收窄到本机 IP,或走 IAP TCP 转发;网站只开 80/443,数据库别上公网。优先用 SSH 密钥,先用密钥开一个新会话成功,再在 VM 的 SSH 窗口禁用密码:
sudo sed -i -E -e 's/^[[:space:]]*#?[[:space:]]*PasswordAuthentication[[:space:]]+.*/PasswordAuthentication no/' -e 's/^[[:space:]]*#?[[:space:]]*PubkeyAuthentication[[:space:]]+.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
grep -qE '^[[:space:]]*PasswordAuthentication' /etc/ssh/sshd_config || echo 'PasswordAuthentication no' | sudo tee -a /etc/ssh/sshd_config
sudo mkdir -p /etc/ssh/sshd_config.d
sudo find /etc/ssh/sshd_config.d -type f -name '*.conf' -exec sed -i -E -e 's/^[[:space:]]*#?[[:space:]]*PasswordAuthentication[[:space:]]+.*/PasswordAuthentication no/' -e 's/^[[:space:]]*#?[[:space:]]*PubkeyAuthentication[[:space:]]+.*/PubkeyAuthentication yes/' {} +
sudo systemctl restart ssh || sudo systemctl restart sshd
否则容易把自己锁门外;这几行也补掉默认没写该项、Ubuntu 放在 sshd_config.d 子配置里的坑。开了 OS Login 时,公钥要配合 IAM 登录权限。
省钱别靠感觉。新站先选 e2-small/e2-medium 和离用户近、价格合适的区域,别一上来高配或 GPU;跨区出网也收费。临时机器「停止」,长期不用先快照再删除。到「结算 > 预算和提醒」设 50%/80%/100% 邮件提醒,注意它只提醒不自动关机。每月在 Cloud Shell 跑:
gcloud compute disks list --format="table(name,zone,sizeGb,users)"
gcloud compute addresses list --format="table(name,region,address,status)"
gcloud compute snapshots list --format="table(name,creationTimestamp,storageBytes)"
USERS 为空或 [] 的磁盘、RESERVED 的静态外部 IP、过期快照,确认无用再删。坑:VM 停机后磁盘和保留 IP 仍计费,快照留太久也累积费用。
可恢复可观测要一次补齐:在 Compute Engine > 磁盘 > 快照计划给启动盘设计划并设保留天数,别靠手动想起来;在 Cloud Shell 开启 Cloud Monitoring 和 Cloud Logging 的 API:
gcloud services enable monitoring.googleapis.com logging.googleapis.com
再到 VM 的 SSH 窗口装 Ops Agent,否则常没有内存曲线和系统日志:
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install
sudo systemctl is-active google-cloud-ops-agent
服务账号只补日志写入、监控指标写入权限,别给 Editor。用模板记录机型、镜像、端口、软件版本和还原顺序:
printf '%sn' '项目/区域/可用区:' '机型与镜像:' '开放端口与来源 IP:' '安装的软件和版本:' '快照计划名称:' '还原顺序:' | tee ~/deploy-notes.txt
打补丁前先做一次快照或确认计划快照成功,Ubuntu/Debian 再执行:
sudo apt update
sudo apt upgrade -y
坑:内核升级可能重启,没设开机自启的服务会像「挂了」,所以备份、记录、监控要一起做。
常见问题(FAQ)
新手第一次建 VM 要选什么系统?
建议选 Ubuntu 或 Debian 长期支持版,资料多、包管理简单,适合新手练手。
为什么创建后 SSH 连不上?
先查实例状态、22 端口、防火墙、外部 IP 和 IAM 权限是否配置正确。
VM 会不会很贵?
小机型按需使用不算贵,但长期开机、磁盘、快照和出站流量会累积,建议设预算提醒。
只想放一个静态网站还需要 VM 吗?
通常不需要,静态站用 Cloud Storage 更省心,除非要跑后端或自定义服务。
如何避免被攻击?
只开必要端口,禁用密码登录,及时打补丁,用快照和日志监控异常登录。
不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。
