这个教程要解决的问题很明确:让普通用户也能拥有一个全天候在线的云服务器环境,具备公网访问能力,支持快速部署各类应用镜像,同时提供便捷的网页管理终端。这相当于把你的个人电脑搬到了云端,随时随地都能通过浏览器访问和管理。
我自己从2016年开始接触云服务器,踩过无数坑之后总结出这套方案。相比传统方式,它有三大不可替代的优势:
国内主流云平台我都实测过,新手建议关注这几个核心指标:
避坑提示:千万不要选那些不知名小厂商的"永久免费"套餐,我遇到过三次跑路情况
以Ubuntu 22.04为例,创建实例后必须做的几件事:
bash复制# 更新软件源并升级系统
sudo apt update && sudo apt upgrade -y
# 安装基础工具包
sudo apt install -y curl wget git vim tmux
# 修改SSH端口(重要安全措施)
sudo sed -i 's/#Port 22/Port 你的端口号/' /etc/ssh/sshd_config
sudo systemctl restart sshd
防火墙配置是很多新手容易忽略的,这里给出我的标准配置模板:
bash复制# 清空现有规则
sudo iptables -F
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放自定义SSH端口
sudo iptables -A INPUT -p tcp --dport 你的端口号 -j ACCEPT
# 保存规则(Ubuntu需额外安装iptables-persistent)
sudo netfilter-persistent save
虽然云服务器有固定IP,但配合DDNS可以实现更多玩法。以阿里云DNS为例:
bash复制wget https://github.com/NewFuture/DDNS/releases/download/v1.0.0/ddns -O /usr/local/bin/ddns
chmod +x /usr/local/bin/ddns
ini复制[General]
interval = 300
debug = false
[Service]
provider = aliyun
access_id = 你的AccessKey
access_secret = 你的SecretKey
domain = 你的域名
sub_domains = @,www
实测这个方案比花生壳稳定得多,更新延迟在10秒以内。
有些场景需要暴露多个服务端口,但云平台默认只开放部分端口。我的解决方案是:
nginx复制stream {
server {
listen 50001;
proxy_pass 内网IP:3306; # MySQL转发示例
}
}
bash复制sudo iptables -A INPUT -p tcp --dport 50001 -s 你的办公IP -j ACCEPT
官方的一键安装脚本其实隐藏了很多坑,推荐这样部署:
bash复制# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
# 添加官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装引擎
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 配置镜像加速(国内必备)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://你的镜像加速地址.mirror.aliyuncs.com"]
}
EOF
sudo systemctl restart docker
WordPress全栈方案:
bash复制mkdir -p ~/wordpress && cd ~/wordpress
cat > docker-compose.yml <<EOF
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 你的密码
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
EOF
docker-compose up -d
Nextcloud私有云:
bash复制docker run -d \
--name nextcloud \
-p 8080:80 \
-v nextcloud:/var/www/html \
-v /mnt/data:/var/www/html/data \
nextcloud:latest
测试过三种主流方案后,我的推荐排序:
bash复制docker run -d \
--restart always \
-p 7681:7681 \
-v /:/host \
-v /var/run/docker.sock:/var/run/docker.sock \
tsl0922/ttyd \
ttyd -p 7681 bash
网页终端必须配合以下安全措施:
bash复制sudo apt install apache2-utils
htpasswd -c /etc/nginx/.htpasswd 用户名
nginx复制location /webshell {
access_log /var/log/nginx/webshell.log main;
deny all; # 仅允许特定IP
allow 你的IP;
}
避免单个容器吃光资源:
bash复制docker update \
--memory 512M \
--memory-swap 1G \
--cpus 0.5 \
容器名
推荐使用cAdvisor+Prometheus+Grafana组合:
yaml复制version: '3'
services:
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
cadvisor:
image: gcr.io/cadvisor/cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
image: grafana/grafana
ports:
- 3000:3000
配套的prometheus.yml配置:
yaml复制global:
scrape_interval: 15s
scrape_configs:
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
问题1:SSH连接超时
问题2:Docker镜像拉取失败
bash复制docker pull registry.cn-hangzhou.aliyuncs.com/library/镜像名
问题3:磁盘空间不足
bash复制docker system prune -a --volumes
bash复制journalctl --vacuum-size=200M
根据我的实测数据,这样配置最经济:
每月成本可以控制在:
最后分享一个监控脚本,每小时检查费用并发送邮件提醒:
bash复制#!/bin/bash
balance=$(curl -s "https://billing.console.aliyun.com/api" | jq '.data.availableAmount')
if (( $(echo "$balance < 50" | bc -l) )); then
echo "当前余额仅剩¥$balance" | mail -s "云服务器余额告警" 你的邮箱
fi