从零开始用云服务器搭建个人博客:选型、部署与安全实践 决定用云服务器搭建个人博客意味着你正式告别了“注册即用”的平台托管模式。域名要自己买解析要自己配安全组端口要自己放行连数据库密码都要自己设——听起来麻烦但换来的是对整台机器和全部数据的掌控。这篇文章会从选服务器开始一路讲到博客在公网稳定访问、HTTPS证书上齐、备份和安全基本到位覆盖我实际部署时踩过的坑和最后采用的稳定方案。适合手里有云服务器但不知道从哪下手的新手也适合已经装好环境、想在选型和安全上再补一课的朋友。1. 为什么我把博客从免费托管迁到了云服务器1.1 免费方案到底卡在哪里最开始我写博客用的是各种免费方案直接在博客平台发文章、用纯静态生成器打包上传到对象存储、或者挂在代码托管平台的静态页面服务上。前两者胜在零成本但对于一个想长期维护内容的人来说有三个问题绕不开。第一是数据归属。写在第三方平台导出文章虽然不难但评论、访问统计、自定义主题这些数据散落各处想整体搬迁非常痛苦。静态方案倒是文件全在本地但评论系统要额外接第三方服务哪天第三方服务调整规则你的评论区就跟着瘫痪。第二是自由度。想在文章页里插入自定义脚本、改一下页面加载顺序、给不同分类配不同模板平台会限制你托管服务也会限制你。不是技术做不到而是别人平台规则不允许。第三是访问体验不稳定。免费服务偶尔抽风夜间维护、某个地区线路拥堵你都只能干等。云服务器把这三件事一次性解决了。机器是你的操作系统是你装的Web服务器、数据库、博客程序全部由你掌控。出问题可以登录上去看日志想优化可以调参数这恰恰是个人博客最有趣的部分运营一个站点本身就成了持续学习的过程。1.2 云服务器给博客带来的实际自由度有了云服务器等于你在公网上有了一台24小时开机的电脑。除了跑博客它还能干很多事挂一个个人导航页、搭建私有文件同步服务、跑自动化脚本定时抓取数据、甚至部署小型的开发测试环境。这可能就是热搜里“云服务器安装thingsboard”“railway部署云服务器”这类词热度一直不低的原因——服务器的玩法太多了博客只是最经典的入门场景。以博客为核心需求的话云服务器带来的具体收益包括数据库完全自持文章、评论、配置随时可以整体导出。可以自由安装插件和主题不受平台审核约束。能自己调整Nginx、PHP、数据库的参数针对访问量做精细优化。域名、HTTPS证书、CDN加速这些周边设施全部可以自己对接。1.3 谁适合走这条路谁不建议我的判断标准很简单如果你只是想把文字发出来让朋友看到没有折腾服务器的兴趣那免费方案已经够用完全没必要上云服务器。但如果你对建站过程本身有好奇心愿意接受“部署一次、长期受益”的前期投入或者你的内容涉及较多自定义功能云服务器就是值得走的路。2. 服务器选型配置、系统和预算怎么权衡2.1 主机商大厂活动价是最优选现在做云服务器的厂商很多阿里云、腾讯云、华为云这些大厂有成熟的控制台、稳定的线路和完善的文档适合新手。个人博客不追求极致性能追求的是稳定和售后所以我基本只推荐大厂入门级产品。选购时要留意的不是原价而是新用户活动价和续费价。很多大厂的轻量应用服务器新用户首年能拿到很低的折扣但续费会回到原价。我的建议是把活动价当作试用成本重要的是在一年内确认这台服务器的配置和系统是否满足你的需求到期后再决定是续费还是换新账号重新上车。另外国内大厂的控制台里通常有“轻量应用服务器”和“云服务器ECS”两类产品。个人博客优先选轻量应用服务器。它的镜像市场里甚至自带WordPress、Typecho等博客环境点几下就能装好基础环境省去手动编译的功夫自定义能力虽然比ECS弱一些但对博客场景绰绰有余。2.2 配置怎么定1核2G还是2核4G这个问题经常被问。直接给结论纯写作场景访问量每天几百上下的个人博客1核2G起步足够。后台要装WordPress且希望保留数据库和PHP-FPM同时跑的余量建议2核4G。如果还计划在服务器上跑其他服务比如同步盘、监控脚本直接上2核4G别犹豫。以2G内存跑WordPress为例实际观察到的内存占用大概在800MB到1.5G之间波动。装好Nginx、PHP-FPM、MySQL之后空闲状态下内存就去了大半一旦访问量上来PHP进程一多很容易触发OOM。我的解决方案是给系统加swap文件把内存压力转移到磁盘上同时给PHP-FPM设置合理的进程上限这两个动作能大幅减少低配机器宕机的概率。具体参数后面第6节会讲。磁盘方面个人博客40GB SSD起步就够用。博客的文字、图片在站点文件里占比很小真正吃空间的是日志、备份文件以及数据库的二进制日志。注意定期清理40GB用上两三年没压力。带宽也要提一句。国内大厂轻量服务器通常是固定带宽3Mbps到5Mbps对博客足够。如果买的是按流量计费的机器那就要注意一个坑图片被盗链、日志被爬虫狂扫流量会悄悄跑掉。建议上线后给Nginx加简单的防盗链规则或者干脆把所有图片走对象存储加CDN流量费用会可控很多。2.3 系统选哪个Ubuntu的表现更稳定我推荐Ubuntu 22.04 LTS或24.04 LTS。理由很实际社区活跃遇到问题搜一下就有答案软件源更新及时安全补丁来得快而且大部分博客程序的官方文档默认就是Ubuntu/Debian的安装命令照着抄不容易翻车。CentOS以前是服务器主流但CentOS 7已经停止维护Stream版本滚动更新的模式对新手不够友好。如果你的主机商只有CentOS选项也可以用但我会建议尽早切换到Debian系。我自己在低配机器上对比过两者的空闲内存占用Ubuntu Server的默认优化对小型站点更友好。2.4 免费云服务器的真实代价热搜里“免费云服务器”热度很高我也被这个关键词吸引过去看过。事实是市场上几乎没有真正永久的免费云服务器。常见套路有三种试用型给7到30天试用期到期后必须付费但试用期间可以测试性能。活动型新用户首年低价或免费续费恢复原价本质是拉新。限制型免费但限制CPU、内存、带宽只能跑轻量任务跑博客经常卡顿。免费额度适合用来“个人博客系统测试”把博客程序装起来跑一跑看资源占用和访问响应等确定方案后再购买正式机器。不建议直接在免费机器上长期运营否则一个访问高峰就能把体验打回原形。3. 博客程序选型WordPress、Typecho还是Halo3.1 动态博客三巨头的差异装好系统后下一个关键决定就是博客程序。国内市场常见的动态博客就三类WordPress、Typecho、Halo。它们的核心差异我整理成一个表对比项WordPressTypechoHalo技术栈PHP MySQLPHP SQLite/MySQLJava Spring Boot资源占用较高低中高Java运行时占内存主题插件生态最丰富较少但够用中等更新活跃上手难度低中文资料多低低适合场景功能扩展需求大的站点低配服务器、纯写作喜欢Java生态和后台体验WordPress胜在生态想要什么功能基本都有人写好了插件商城、会员、SEO、缓存一句话的事。代价是它为了通用性做了大量抽象底层查询重、依赖多低配机器上需要认真调优。Typecho是一个国产轻量级博客程序安装包只有两三MB界面简洁适合认真写字的人。它在1核1G的机器上都能流畅跑后台响应速度快数据量不大的时候查询性能也很好。缺点是插件和主题数量没法和WordPress比想要复杂功能时需要自己动手。Halo是Java系博客的代表后台界面现代插件机制设计得不错最近几年社区活跃度很高。但Java程序天然吃内存推荐2G内存起步低配机器慎选。3.2 静态博客值得考虑的另一种路线如果你对动态程序不感冒还可以走静态博客路线代表工具是Hexo、Hugo。所有文章在本地构建成纯HTML文件然后推送到服务器上由Nginx直接提供服务。这种方式不需要PHP、不需要数据库服务器资源占用极低安全性也高。静态博客的短板是评论、搜索、后台管理这些动态能力缺失。评论可以接第三方服务可以用Git仓库管理文章。它更像一个“程序员式”的写作工作流适合熟悉Git和命令行的人。我在云服务器上初期就用了Hugo后来因为想深度定制页面逻辑才切换到动态博客。3.3 我最终的方案低配先Typecho升级后转WordPress我的实际路径是一开始在1核2G机器上用Typecho后台响应飞快文章写作体验纯粹。后来站点功能需求变多需要更灵活的插件体系我把机器升级到2核4G然后迁移到了WordPress配合缓存插件后访问速度同样可以做到秒开。如果你预算有限或者不喜欢折腾Typecho是性价比极高的选择如果你希望后续功能扩展空间大直接上WordPress更省心。两条路线在云服务器上的部署流程几乎一样唯一区别是安装包的下载和数据库初始化步骤。4. 部署实操从一台裸机到博客能正常访问4.1 第一步不是装软件而是放行端口这是新手最容易卡住的地方。很多人照着教程装好了Nginx、启动了服务然后浏览器一打开IP地址页面转圈半天没有反应。原因十有八九是云平台的安全组没有放行80端口和443端口。云服务器的网络策略有两层一层是云厂商控制台的“安全组”一层是操作系统自己的防火墙。两层都必须允许外部访问控制台安全组在服务器实例的安全组规则里添加放行规则协议选择TCP端口填入80/443来源IP填0.0.0.0/0。系统防火墙以Ubuntu为例sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status22端口是SSH远程连接用的必须放行但建议在第6节里把它改到高位端口并限制来源IP降低被暴力破解的风险。安全组规则修改后会立即生效不需要重启服务器。4.2 LNMP环境的搭建我推荐使用LNMP路线Linux Nginx MySQL/MariaDB PHP。相比ApacheNginx对静态文件处理更高效内存占用也更低适合个人博客。下面以Ubuntu 22.04为例完整命令如下sudo apt update sudo apt upgrade -y sudo apt install nginx mariadb-server php8.1-fpm php8.1-mysql \ php8.1-gd php8.1-curl php8.1-xml php8.1-mbstring php8.1-zip -y这里装的是MariaDB而不是MySQL两者对博客程序完全兼容但MariaDB是社区驱动版本内存占用略低在低配机器上表现更好。装完后检查关键服务是否启动sudo systemctl status nginx sudo systemctl status mariadb sudo systemctl status php8.1-fpm然后运行数据库初始化脚本设置root密码、移除匿名用户sudo mysql_secure_installation按提示一路选择即可密码务必设置复杂一些这个root账号将来只用于管理不要直接给博客程序用。4.3 创建数据库与最小权限原则博客程序连接数据库时不应该使用root账号而是单独建一个专用账号并只授予它操作这一个数据库的权限。这样可以控制风险即使博客程序被入侵攻击者拿到的数据库权限也是受限的。登录数据库并执行CREATE DATABASE blog_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER blog_userlocalhost IDENTIFIED BY 你的强密码; GRANT ALL PRIVILEGES ON blog_db.* TO blog_userlocalhost; FLUSH PRIVILEGES; EXIT;这里用utf8mb4字符集是为了完整支持生僻字和emoji。很多人这一步直接选了默认的latin1后续写中文内容全是乱码排查起来非常痛苦。4.4 下载并安装博客程序以WordPress为例下载中文版安装包并解压到网站目录cd /var/www sudo wget https://cn.wordpress.org/latest-zh_CN.tar.gz sudo tar -xzf latest-zh_CN.tar.gz sudo mv wordpress blog sudo chown -R www-data:www-data /var/www/blog chmod -R 755 /var/www/blog目录属主设置为www-data是因为PHP-FPM默认以www-data用户运行这样WordPress在后台安装主题和插件时才有权限写文件。这一步没做对的话后面后台会出现“需要FTP凭证”的报错。如果是Typecho则下载Typecho的zip包解压到同样目录然后通过浏览器访问http://服务器IP/install.php按向导执行。WordPress同理浏览器访问http://服务器IP/就会进入安装界面填写刚才创建的数据库名、用户名和密码即可。4.5 Nginx站点配置与伪静态默认的Nginx配置只能展示静态页面要让PHP请求正确转发给PHP-FPM必须添加站点配置。新建配置文件sudo vim /etc/nginx/sites-available/blog.conf内容如下server { listen 80; server_name yourdomain.com www.yourdomain.com; root /var/www/blog; index index.php index.html; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\.ht { deny all; } location /favicon.ico { log_not_found off; access_log off; } }启用配置并重载sudo ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/ sudo rm -f /etc/nginx/sites-enabled/default sudo nginx -t sudo systemctl reload nginxtry_files $uri $uri/ /index.php?$args;这行是WordPress伪静态的核心请求的路径不是真实文件时统一交给index.php处理这样文章链接、分类页才能正常跳转。没有这行博客首页能打开但点进任何一篇文章都是404。5. HTTPS、域名解析和访问体验优化5.1 域名选择和备案流程不能跳过用IP访问博客只是测试阶段的事情正式上线前必须绑定域名。域名注册选正规注册商即可后缀推荐.com或.xyz价格透明。个人博客用不到多复杂的域名策略记住一个好记的主域名就行然后顺便把www、blog这些想要的前缀也解析过来。对于中国大陆机房的服务器域名上线前需要完成ICP备案这是网站能够正常解析和访问的前提。流程在云厂商控制台的备案入口提交全程免费按提示填主体信息、上传证件一般一到两周可以办结。如果选择境外区域机房通常可以跳过这一步但国内访问速度会打折扣两者怎么取舍你自己权衡。5.2 解析记录配置在域名注册商的控制台添加解析记录类型选择“A记录”主机记录填记录值填服务器的公网IP。再添加一条主机记录为www的A记录同样指向服务器IP。解析生效一般几分钟到几十分钟不等可以用本地命令行验证ping yourdomain.com能解析到你的服务器IP说明解析已生效。这时候把浏览器地址栏改成域名如果跳转到了博客安装界面说明域名和服务器已经打通。5.3 Certbot一键签发HTTPS证书没有HTTPS的博客浏览器会直接标记为“不安全”SEO权重也吃亏。现在申请证书已经非常简单Certbot配合Nginx插件可以全自动完成签发、配置和续期sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com按提示输入邮箱并同意协议Certbot会自动检测Nginx配置里的server_name自动申请证书并改写配置来启用HTTPS。最后跑一次强制续期测试sudo certbot renew --dry-run没问题的话证书到期前会自动续期你就再也不用管证书了。这比手动上传证书文件的方式省力太多我强烈推荐。5.4 访问速度优化缓存插件和静态资源HTTPS配好之后博客可以正式对外了这时候值得做两步优化。第一步是给WordPress装缓存插件我用的是带页面缓存的插件方案第一次有人访问时生成静态HTML副本之后相同页面直接返回静态文件PHP不再参与处理响应时间能从几百毫秒降到几十毫秒。装好后在插件设置里开启“页面缓存”和“浏览器缓存”即可。Typecho也有类似的缓存插件原理一致。第二步是按需开启Gzip压缩和静态资源过期时间。Nginx里添加几行配置就能显著减少页面传输体积gzip on; gzip_types text/plain text/css application/json application/javascript text/xml;静态资源缓存可以在Nginx的location块里加location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; }做完这两步再用无痕浏览器打开文章页Network面板里的耗时数据会让你有直观的体感差异。6. 上线之后备份、监控与安全加固不能省6.1 系统安全SSH密钥登录和禁用root密码登录博客上线意味着公网IP暴露在外日志里几乎每天都会有自动脚本尝试SSH登录。必须做的第一件事就是改用SSH密钥登录在本地生成密钥并上传公钥ssh-keygen -t ed25519 -C your_emailexample.com ssh-copy-id user你的服务器IP确认使用密钥能登录后编辑服务器上的SSH配置sudo vim /etc/ssh/sshd_config修改两处PermitRootLogin prohibit-password PasswordAuthentication no然后重启SSH服务。注意先别断开当前连接另开一个终端测试新配置能正常登录再收工否则配置写错导致所有连接断开就得去控制台用VNC救援了这是个极其常见的翻车点。6.2 定期备份数据库和站点文件博客最宝贵的资产是数据库里的文章和评论。我的备份方案是在服务器上写一个简单的脚本用cron每天早上4点执行#!/bin/bash BACKUP_DIR/var/backups/blog DATE$(date %F) mkdir -p $BACKUP_DIR mysqldump -u blog_backup -p密码 blog_db | gzip $BACKUP_DIR/db_$DATE.sql.gz tar -czf $BACKUP_DIR/files_$DATE.tar.gz -C /var/www blog find $BACKUP_DIR -type f -mtime 30 -delete这里单独建了一个只有备份权限的数据库账号blog_backup避免在命令行里暴露主账号密码。文件清理规则是保留30天既控制磁盘占用又保留足够的历史版本。配置定时任务crontab -e 0 4 * * * /usr/local/bin/backup_blog.sh脚本备份在服务器本地后建议再同步一份到对象存储或自己的另一台机器上避免服务器整体故障时备份也一起丢失。低成本的方案是装rclone把它指向你的对象存储桶每天把备份文件同步过去。6.3 低配机器的性能调优swap和PHP-FPM参数2G内存的机器跑WordPress如果不做调整高峰期很容易内存耗尽。第一步是创建swap文件给内存一个缓冲空间sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile为了让重启后依然生效把以下内容追加到/etc/fstab/swapfile none swap sw 0 0第二步是调整PHP-FPM的进程管理参数。编辑/etc/php/8.1/fpm/pool.d/www.confpm dynamic pm.max_children 10 pm.start_servers 2 pm.min_spare_servers 1 pm.max_spare_servers 5每个PHP-FPM进程平均占40MB到80MB内存max_children设为10配合swap2G内存的机器能稳定扛住日常访问。参数调完记得重启PHP-FPMsudo systemctl restart php8.1-fpm6.4 运维中的常见问题定位思路自己跑运维免不了遇到各种奇怪状况。这里把我碰到过的高频问题整理成一张排查表方便你对照症状可能原因排查命令 / 处理方式域名打不开IP可以打开解析未生效或备案未通过ping域名验证解析确认备案状态打开页面是Nginx欢迎页站点配置文件未生效或指向路径错误nginx -t检查配置确认root路径页面空白或502PHP-FPM没有运行或socket路径不匹配systemctl status php8.1-fpm对比配置文件里的socket路径上传图片提示失败目录权限不对或PHP上传限制过小检查www-data对uploads目录的权限修改upload_max_filesize和post_max_size后台访问极慢PHP进程占满或数据库锁表top查看CPU/内存占用mysqladmin processlist查慢查询服务器被暴力破解SSH密码登录未关闭检查/var/log/auth.log确认禁止密码登录已生效这些问题的共性是不要凭感觉改配置先看日志。Nginx错误日志在/var/log/nginx/error.logPHP-FPM日志在/var/log/php8.1-fpm.log数据库日志在/var/log/mysql/。日志会直接告诉你哪一步出了问题省下大量瞎猜的时间。写在最后我自己的博客从零开始到现在稳定运行几年最深的体会是云服务器建博客难的不是某个单点技术而是把域名、解析、安全组、Web服务、数据库、证书、备份这些散件全部串成一个完整闭环。这中间任何一环断了博客就用不起来。但只要你按着“先放行端口、再装环境、再配站点、再上证书、最后做安全”的顺序走一遍整个过程其实比想象中顺。遇到问题不要慌登录服务器看日志日志会告诉你答案。我个人最后想分享一个习惯每次改动配置前先复制一份原配置文件再动手。博客折腾得越多你越会感谢这个两秒钟的备份习惯。