上个月帮一个完全不懂代码的朋友把他的小站跑起来了,从买服务器到域名能访问,全程用了小半天。他问我:就这么简单?是的,就这个量级。个人网站搭建这件事本身并不难,难的是没人一次性把链路讲清楚。我在腾讯云上搭过十几个站,从最简单的Hexo博客,到WordPress内容站,再到前后端分离的Spring Boot+Vue应用,该踩的坑基本都踩过了。2026年了,网上的教程还停留在改宝塔面板端口、用root裸奔连服务器那套老路上。这篇文章就按我自己实际操作的顺序来写:买什么配置不亏、到手后怎么加固、用哪种方式部署最省心、域名和HTTPS怎么配、上线之后怎么维护。全文不会有一条多余的命令,照着做就能把网站跑起来。
1. 下单前先想清楚这三件事:配置、地域和续费
1.1 轻量应用服务器还是CVM云服务器?
腾讯云下有两类产品名字容易搞混:轻量应用服务器(Lighthouse)和云服务器CVM。
如果2026年还有人推荐新手去买按量计费的CVM,那基本是在坑你。CVM的优势是可自定义网络、磁盘、快照策略,适合要做复杂网络方案的场景。但个人网站用不上这些。轻量应用服务器把公网IP、带宽、防火墙、监控、快照打包在一起,购买时选一个套餐,开箱即用,价格常年比同配置CVM便宜一截。
| 对比项 | 轻量应用服务器 | CVM云服务器 |
|---|---|---|
| 价格 | 套餐制,便宜 | 组件拆分计费,偏贵 |
| 网络 | 固定带宽/流量包 | 按带宽计费,可弹性调整 |
| 防火墙 | 自带轻量防火墙 | 依赖安全组+系统防火墙 |
| 适用场景 | 个人网站、小型应用 | 企业级、复杂网络架构 |
个人用轻量,基本就是唯一正解。你要是真的需要自定义子网、独立安全组、弹性网卡这些能力,也不会来看这篇入门指南。
1.2 2核2G还是2核4G?带宽怎么选?
配置不用往高了堆,按站点类型对号入座:
- 静态博客(Hexo/Hugo/VuePress):2核2G + 3M带宽,绰绰有余
- WordPress/Typecho这类动态站:2核4G + 3~5M带宽,原因是PHP+MySQL在低配下遇到稍微大点的页面请求就容易卡,内存别省
- 打算跑前后端分离+容器化(Spring Boot/Vue/Docker):2核4G起步,有条件就4核8G,编译时差距非常大
带宽不用迷信大。3M带宽对个人网站意味着每秒最大约375KB的传输速度,文本页面几十KB一个,并发不高的情况下完全够用。真正吃带宽的是图片和视频,如果你有计划放大量高清图,再考虑升带宽或上CDN。
一个冷知识:很多人的网站卡不是因为服务器配置低,而是第一个请求就慢在数据库连接、缺少页面缓存、Nginx配置没调好。先按上面标准买,省下的钱后面再升级也不迟。
1.3 地域选择,以及备案这个绕不开的话题
地域建议选靠近绝大多数访问者的地方。你的朋友都是国内用户,就选上海、广州、成都这些国内节点,时延最低。
但这里有一个绕不开的流程:使用中国大陆地域的服务器,域名要完成ICP备案才能提供网页服务。备案不难,腾讯云控制台有「网站备案」入口,按向导填资料、传身份证、做人脸核验,一般审核周期几个工作日到二十天不等。个人网站的备案流程相对简单,只要网站内容符合规范,基本都能通过。备案通过后,域名才能正常解析到这台服务器上访问。
我建议你体面地把这件事做掉。它花不了太多时间,做完之后域名解析、端口、CDN这些都不会有后续麻烦。
1.4 新用户优惠价的续费陷阱(重点)
腾讯云对新人确实有非常狠的折扣,常见的是轻量应用服务器首年几十块钱。但一定要看清楚活动页的说明:续费价格是不是原价。很多"新人价"只保首年,第二年恢复原价,甚至翻倍。
到位做法是:买之前就规划好至少用一年。一年后要么接受原价续费,要么等新的活动——腾讯云的活动规律是"老用户"有时候也能领到不错的续费券,偶尔还有续费专场。不要因为首年便宜就一次性买三年,万一第二年你不想用了,退货和迁移都很费劲。
2. 服务器到手30分钟:SSH登录、密钥配置与基础加固
买了服务器的第一时间,先做三件事:改密码、配置密钥登录、创建普通用户。这几步做完,这台机器才算是"自己的"。
2.1 通过控制台重置密码和Web Shell登录
腾讯云轻量控制台里,可以点「重置密码」,设置root密码。然后可以直接用网页里的「登录」按钮打开Web Shell(基于浏览器的终端)。
Web Shell不依赖本机任何工具,适合在外网环境应急操作。但它有一个明显的缺点:浏览器里操作快捷键不顺手,复制粘贴还会偶尔出问题。所以它只能算临时入口,真正的日常操作应该放到本机终端里。
2.2 本机生成SSH密钥,实现免密登录
这一步会让后续所有SSH操作变得无比顺畅。本地终端执行:
ssh-keygen -t ed25519 -C "myname@example.com"一路回车,生成在~/.ssh/下。然后把公钥传到服务器:
ssh-copy-id root@你的服务器IP它会提示输入一次密码,之后ssh root@你的服务器IP就不再要密码了。
ed25519是目前主流推荐的非对称加密算法,密钥短、速度快,兼容性也完全够。2026年了就别再生成2048位的RSA了,除非你确实有老系统要兼容。
2.3 创建普通用户,关掉root密码登录
用root裸奔不是不行,而是风险不值得。SSH爆破是每天都会发生的脚本行为,虽然强密码能扛住,但多留一条安全边界总没错。
创建普通用户并赋予sudo权限:
useradd -m -s /bin/bash deploy passwd deploy usermod -aG sudo deploy然后把公钥复制给deploy用户:
mkdir -p /home/deploy/.ssh cp ~/.ssh/authorized_keys /home/deploy/.ssh/ chown -R deploy:deploy /home/deploy/.ssh修改SSH配置:
sudo vim /etc/ssh/sshd_config关键几项:
Port 2222 PermitRootLogin prohibit-password PasswordAuthentication no PubkeyAuthentication yes提醒一下:Port改成2222之后,测试连接成功之前,不要关闭当前SSH会话。很多人改完配置、忘了放行防火墙,直接把自己锁在门外。重启sshd后,新开一个终端用ssh -p 2222 deploy@服务器IP登录测试,成功后再回去关旧会话。
注意:如果使用了非默认SSH端口,腾讯云控制台的防火墙规则里一定要放行对应端口,否则外部无法访问。
2.4 顺手把系统更新和防火墙配好
sudo apt update && sudo apt upgrade -y sudo apt install ufw -y sudo ufw allow 2222/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enableUbuntu/Debian系的ufw非常直观,三条放行规则就把常用的端口开好,其余的一律默认拒绝。如果后面还要跑其他服务,再单独加规则。
3. 环境搭建不踩坑:Nginx手动部署、Docker还是宝塔面板?
很多人卡在这一步:环境到底怎么搭?我的建议是——先想清楚你要做什么站点,再选工具。三种方式各有适用场景,没有绝对的好坏。
3.1 三种方式怎么选
| 方式 | 上手难度 | 适用场景 | 我的看法 |
|---|---|---|---|
| 手动装Nginx/LNMP | 中 | 静态站、一个Nginx就能跑 | 学习价值高,推荐新手走一遍 |
| 宝塔面板 | 低 | WordPress/动态站点,不想碰命令行 | 效率高,但记得做安全设置 |
| Docker Compose | 中高 | 前后端分离、多组件应用 | 现代应用的最佳实践,值得学 |
3.2 手动部署Nginx:个人网站的第一块基石
如果只是放一个静态博客或HTML页面,Nginx就够了:
sudo apt update sudo apt install nginx -y sudo systemctl enable --now nginx装完浏览器访问服务器IP,如果能打开Nginx默认页面,就说明80端口通了。默认站点目录在/var/www/html,静态网页丢进去就能跑。
Nginx的默认配置路径是/etc/nginx/sites-available/和/etc/nginx/sites-enabled/,推荐在sites-available里写配置,再用软链接启用。这个习惯可以让你在机器上同时管理多个站点而不互相干扰。
3.3 想用宝塔面板:装之前想好安全问题
宝塔的价值在于把LNMP环境的安装、站点配置、数据库管理全部图形化,对不会命令行的人确实友好。安装命令直接在官网复制,运行后会给一个控制台地址和账号密码。
用宝塔有几个必须做的动作:
- 登录后立即改默认端口和默认账号密码
- 开启面板SSL
- 不要用面板自带的"极速安装"一键装一堆你用不上的组件,装Nginx、MySQL、PHP就够
- 入口路径改复杂一点,避免被扫描到后台登录页
宝塔确实方便,但它自带的管理程序和组件更新都需要关注,时不时会报安全补丁。如果不太熟悉Linux,装了宝塔之后更要保持系统和面板更新。
3.4 用Docker部署:一套配置到处跑
Docker适合更复杂的架构,比如前端Nginx容器、后端Spring Boot容器、MySQL容器,通过docker-compose.yml一键拉起。好处是环境隔离、可复制、不用在宿主机上脏装一堆依赖。
示例docker-compose.yml(一个Nginx + 一个后端服务):
version: '3.8' services: web: image: nginx:alpine container_name: nginx_web ports: - "80:80" - "443:443" volumes: - ./html:/usr/share/nginx/html - ./nginx/conf.d:/etc/nginx/conf.d - ./ssl:/etc/nginx/ssl restart: always app: build: ./app container_name: myapp expose: - "3000" restart: always个人博客如果只是静态站,其实用不上Docker,直接扔Nginx目录里就行。但如果你打算长期折腾技术、想在服务器上跑多个项目,Docker是未来最省心的解。
4. 把代码送上线:从本地上传到服务器部署的完整链路
环境搭好了,现在把网站文件弄到服务器上去。这一步有很多路径,我按实际操作频率从高到低写三个。
4.1 静态站最直接:scp/rsync上传
scp -P 2222 -r ./public deploy@你的IP:/var/www/html/小站点用scp没问题,文件多了建议用rsync,它只传输有差异的部分,还能删除远程多余文件:
rsync -avz --delete -e "ssh -p 2222" ./public/ deploy@你的IP:/var/www/html/-a保留文件属性,-z压缩传输,--delete让本地和远程保持一致——本地删掉的文件远程也同步删掉,这对发布新版本非常有用。
4.2 有代码仓库的项目:Git拉取部署
如果项目托管在GitHub/Gitee,服务器上装好Git,克隆一次,之后每次更新就是:
cd /var/www/myapp git pull origin main更进阶可以配Webhook:每次推送代码到仓库,仓库自动通知服务器的webhook接口,服务器脚本自动拉取、构建、重启服务。这一步适合有编程基础的人折腾,配上之后边写边发布,体验很好。
4.3 前后端分离项目:构建、打包、反向代理
前端项目(Vue/React)先在本机构建:
npm install npm run build得到dist目录,里面是纯静态文件。把这些文件传到服务器的一个目录下,比如/var/www/vue-app/,然后用Nginx提供一个入口。
后端项目(Spring Boot)打成jar包上传,Java应用推荐用systemd托管,写一个service文件:
[Unit] Description=My Spring Boot App After=network.target [Service] User=deploy WorkingDirectory=/home/deploy/myapp ExecStart=/usr/bin/java -jar myapp.jar --server.port=8080 Restart=always RestartSec=10 [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload sudo systemctl enable --now myappNginx里把/的请求反向代理到http://127.0.0.1:8080,用户访问的就是你的Java应用了。我把完整的Nginx反代配置放在下一章和域名绑一起讲,因为这两件事本来就该一起做。
5. 域名解析与HTTPS:给网站一个正式的身份
服务器IP不好记,别人也不该通过一长串数字访问你的网站。域名是门牌号,HTTPS是门锁,缺一不可。
5.1 买域名、配解析
域名在腾讯云或DNSPod购买,个人博客选.com、.cn、.dev之类都行,价格看后缀。买了之后进入DNS解析控制台,添加记录:
常用解析记录类型:
| 记录类型 | 含义 | 使用场景 |
|---|---|---|
| A记录 | 域名指向IPv4地址 | 最常用,example.com -> 服务器IP |
| CNAME | 域名指向另一个域名 | www -> example.com 这类别名 |
| MX | 邮件服务器记录 | 配置邮箱时用 |
| TXT | 任意文本记录 | 验证域名所有权、配置SPF等 |
具体操作:添加一条A记录,主机记录填@,记录值填服务器IP;再添加一条A记录,主机记录填www,同样指向服务器IP。TTL可以保持默认600秒,生效后域名就能访问到服务器。
5.2 备案的顺序和操作要点
回到第一章提过的事:用中国大陆地域的服务器提供网站服务,必须先完成ICP备案。实际操作的顺序建议是:
- 先买域名、先买服务器
- 在腾讯云控制台提交备案申请,按流程填主体信息(个人备案填身份证、联系方式)和网站信息
- 腾讯云初审通过后,进行短信核验/人脸核验,然后提交到管局
- 管局审核通过后会收到短信/邮件通知,备案号下来
备案期间,域名可以先不正式启用,等备案通过后再配置解析。这是标准合规流程,耐心走完就不用担心后面被拦截。
5.3 用acme.sh免费签发Let's Encrypt证书
HTTPS证书现在完全不需要花钱。Let's Encrypt的证书用acme.sh脚本自动签发和续期,已经是我长期使用的方案。
安装并签发:
curl https://get.acme.sh | sh acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html然后安装证书到Nginx使用的目录:
acme.sh --install-cert -d example.com \ --key-file /etc/nginx/ssl/example.com.key \ --fullchain-file /etc/nginx/ssl/example.com.pemacme.sh会自动续期,装上就基本不用管了。我遇到过唯一的问题是某些云厂商的DNS API权限没配好导致续期失败,如果你用DNS验证方式,记得检查API Token仍然有效。
5.4 Nginx站点配置:HTTP跳HTTPS + 反向代理一次讲清
在/etc/nginx/sites-available/创建你的站点配置文件:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; root /var/www/html; index index.html; # 纯静态网站就用这个 location / { try_files $uri $uri/ =404; } # 如果是反向代理到后端,比如Spring Boot # location / { # proxy_pass http://127.0.0.1:8080; # 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; # } }启用站点:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginxnginx -t是一个极其重要的习惯——改完配置先测试语法,再reload。直接reload如果配置有误,可能导致整个Nginx起不来,到时候所有站点全部挂掉就麻烦了。
6. 网站上线之后:日志、监控、备份与常见故障排查
很多人把网站跑起来就以为万事大吉了。实际上,真正考验运维水平的是上线之后那一堆琐碎事。
6.1 网站突然打不开:按这个顺序排查
我个人的排查链路是固定的,从外到内一层层剥:
- 本机
curl -I https://example.com,看返回码 ping 域名,确认DNS解析是否正常telnet 服务器IP 443,确认端口通不通- 腾讯云控制台看防火墙规则是否放行80/443
- 服务器上
sudo systemctl status nginx,确认真在跑 - 看Nginx错误日志
/var/log/nginx/error.log,多数答案在这里
这条链路能过滤掉80%的问题。最常见的是:域名解析改了没生效(TTL缓存)、防火墙没放行新端口、Nginx配置写错没reload。
6.2 磁盘空间:个人网站最容易忽略的杀手
个人网站流量不大,但日志和数据库文件会悄悄涨。尤其Nginx的access log,在没配轮转的情况下,几个月能攒几个G。
定期检查:
df -h sudo du -sh /var/log/nginx/*清理journal日志(systemd的日志也可能吃几G):
sudo journalctl --vacuum-size=100M配置日志轮转,编辑/etc/logrotate.d/nginx,默认的daily轮转基本够用,确保compress选项开着。
6.3 自动化备份:用crontab + 对象存储
这里提供一个简单可靠的备份方案。数据库用mysqldump导出,网站文件用tar打包,再上传到腾讯云对象存储COS。
#!/bin/bash BACKUP_DIR=/var/backups DATE=$(date +%F) # 备份网站文件 tar -czf $BACKUP_DIR/website-$DATE.tar.gz /var/www/html # 备份数据库,如果有的话 # mysqldump -u root -p'密码' mydb > $BACKUP_DIR/db-$DATE.sql # 上传到COS(用coscmd工具) coscmd upload $BACKUP_DIR/website-$DATE.tar.gz backup/ coscmd upload $BACKUP_DIR/db-$DATE.sql backup/ # 删除7天前本地备份 find $BACKUP_DIR -type f -mtime +7 -deletecrontab里加一行:
0 3 * * * /usr/local/bin/backup.sh每天凌晨3点自动备份。COS的存储费用很低,这个方案基本等于花几块钱买一年的网站保险。
6.4 监控:简单的就行,别一上来就上全家桶
个人网站不需要一开始就搭Prometheus + Grafana这种重量级监控。先用好腾讯云自带的监控面板,看CPU、内存、带宽、磁盘曲线够用了。
如果你想要更主动的告警,部署一个Uptime Kuma,每分钟探测你的网站是否返回200,挂了就发邮件/Telegram通知。它本身也是一个Docker容器,部署很轻量:
version: '3' services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma ports: - "3001:3001" volumes: - ./uptime-data:/app/data restart: always监控的意义不是让你时刻盯着,而是当网站挂了你能第一时间知道,而不是等用户来告诉你。
6.5 安全补强:做完这几件事,基本不用慌
个人网站的安全其实不需要过度紧张,但基础三件套建议安排上:
- 安装并启用UFW防火墙(第二章讲过)
- 定期
sudo apt update && sudo apt upgrade,把系统安全补丁打上 - 如果用了WordPress这类CMS,保持插件和主题更新,这是漏洞重灾区
如果网站只是展示信息、不涉及用户注册和登录,攻击面其实很小。反过来,如果有用户输入,至少要在应用层面对参数做校验,SQL注入和XSS的坑不能指望服务器层面来防。腾讯云也提供WAF(Web应用防火墙)这类安全防护产品,有需要可以接入,但就我自己的经验而言,个人网站先把基础和代码层面的问题处理好,比堆一堆安全产品更实际。
从买服务器到网站稳定跑起来,整个过程其实就是这几件事。你跟着走一遍,后面再遇到问题基本都能自己定位。我也建议把这几个步骤里用到的命令存成一个自己的部署笔记,下次再开新站,照着跑一遍就完事了。