
1. 服务器选型别一上来就抢最高配1.1 实例规格到底怎么选我第一次买腾讯云服务器的时候内心活动很简单配置越高越好2核4G不够就上4核8G反正在打折。结果网站上线三个月后一看监控CPU使用率长期在5%以下徘徊内存占了不到2G纯属钱花在刀刃背面。个人网站和商用项目的流量模型完全不同。绝大多数个人博客、作品集、个人工具箱日活量级在几十到几百人之间峰值并发能同时有20个在线就已经很热闹了。这种场景下2核2G的基础款完全够用甚至2核4G已经属于比较宽裕的配置了。如果你只是放一个静态博客或者单页应用1核1G都绰绰有余。选配的关键指标其实是这两个一是内存Nginx PHP-FPM MySQL 这套经典组合跑起来2G内存能覆盖绝大多数情况如果用了Java技术栈或者容器化方案建议上4G二是带宽腾讯云轻量服务器默认的带宽在3Mbps到5Mbps左右个人网站访问量不大3Mbps足够但如果你要放视频或者大批量图片就得单独评估流量包了。1.2 系统镜像里的两个隐藏坑系统镜像的选择直接影响后续所有操作。腾讯云默认推荐的是公共镜像里的CentOS或者Ubuntu这里我给你的建议是直接选Ubuntu 22.04 LTS不要纠结。原因很简单CentOS 7已经停止维护CentOS Stream的定位又偏向滚动更新对个人站长不够友好。Ubuntu的LTS版本有五年更新保障社区资料多遇到问题搜出来的解决方案也相对靠谱这对新手来说就是最大的安全感。还有第二个坑很多教程会建议你在创建实例的时候顺带选择免费开通Cloud-init或者宝塔面板的镜像。Cloud-init没问题但宝塔这类第三方面板镜像我个人的建议是第一台服务器最好别用。不是说面板不好而是新手直接上手面板容易跳过对整个服务器文件结构、服务进程、端口关系的理解。等你哪天真需要手动排查问题的时候会发现对服务器的认知基本是黑的。先手动搭建一遍后面再用面板管理两条路都走过你才知道每个工具解决的是什么问题。1.3 地域选择不是想选哪就选哪地域这块有两个维度一个是离用户近不近另一个是备案和政策问题。如果你的网站主要面向大陆用户地域选腾讯云的上海、广州、北京这些节点没毛病网络延迟低。如果你是做跨境内容或者GitHub Pages的替代方案地域选香港或者新加坡可以省掉备案流程但访问速度在国内会有波动而且时不时的网络抖动会让你怀疑人生的。价格上新用户首单轻量应用服务器通常有差不多百十来块的优惠这算是入场的合理价位。额外提醒一句腾讯云的活动机往往不能退换地域选错了就只能重新买所以下单前把地域确认清楚别贪图便宜选了个冷门地域回头跨境访问体验不好得不偿失。2. 首次登录与安全加固别让你的服务器三分钟变肉鸡2.1 先用WebShell打通第一关拿到服务器IP和密码之后第一个动作是登录。腾讯云控制台自带WebShell浏览器里直接点就能进入终端这就够用。但很多新手从这一步就开始踩坑WebShell登录成功后看到命令行界面不知道下一步干嘛或者干脆把root密码复制粘贴的时候中间多了一个空格密码错误被锁个几分钟。第一次登录建议做三件事第一条命令跑一下whoami确认身份再看看系统版本cat /etc/os-release顺手用free -h和df -h确认一下资源配置。这不是摆拍是为了让你对这台机器有一个基础的感知知道内存、磁盘都处于什么状态。这里有个很重要的安全习惯不要在WebShell里长期用root操作。虽然腾讯云默认给你的是root登录权限个人服务器图省事一直都root也没什么大问题但如果你的网站被扫描到弱口令爆破root权限一旦泄露就是整台机器沦陷。最稳妥的方案是创建一个普通用户赋予sudo权限日常操作都用这个用户只有需要系统级变更时再切root。2.2 密钥登录一次配置终身省心密码登录最大的问题有两个一是弱口令容易被暴力破解二是每次登录都要输密码麻烦。密钥登录可以同时解决这两个问题。操作流程不复杂在你的本地电脑上生成一对密钥ssh-keygen -t ed25519 -C your_emailexample.com一路回车确认默认路径即可然后查看公钥内容cat ~/.ssh/id_ed25519.pub把输出的这段公钥复制下来在腾讯云控制台对应实例的密钥对里导入或者直接在服务器上执行下面的命令追加到认证文件mkdir -p ~/.ssh echo 你的公钥内容 ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys然后测试免密登录能通的话就可以考虑把密码登录关掉了。修改SSH配置文件sudo vim /etc/ssh/sshd_config找到PasswordAuthentication改成no然后重启SSH服务sudo systemctl restart sshd注意顺序很重要一定要先确认密钥登录能用了再关密码登录。我自己在好多台服务器上犯过同样的错误——改完配置没当前终端测试直接断开结果重新连的时候密码也登不上了只能靠控制台VNC救场。2.3 安全组和防火墙层层设卡很多人在这一步栽过跟头服务明明启动了浏览器里就是访问不了。查了一圈发现是腾讯云的安全组没有放行端口。腾讯云的安全组是云平台层面的防火墙在实例外面拦截流量Linux系统里的firewalld或者ufw是服务器内部的防火墙两层都要配置对。个人网站的常规端口就这么几个80HTTP、443HTTPS、22SSH。安全组规则就放行这三个其他端口一律不给入站规则。如果你后面跑了个3000端口的Node服务需要访问的时候再加用完了就删。服务器内层的防火墙用ufw比较直观sudo ufw allow OpenSSH sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable有一个细节容易被忽略云平台安全组里配置的时候来源地址如果写0.0.0.0/0意味着全世界都能访问这个端口。SSH端口如果暴露在全网每天会有大量扫描尝试虽然密钥登录解除了密码爆破的威胁但日志上那些非法尝试看着还是心烦。建议把SSH安全组的来源IP改成你常用的公网IP用curl ifconfig.me查一下自己的出口IP填到来源地址里。这样只有你的IP能连SSH日志安静很多。3. 网站环境部署Nginx PHP MySQL的手工搭建全流程3.1 为什么推荐LNMP组合而不是一键安装这个问题的答案分两层。对只想快速上线的人来说宝塔等面板的一键安装确实省事半小时跑完LNMP环境界面化管理数据库和站点这没什么不好。但我的建议是第一台服务器至少手动走一遍安装流程因为你后面遇到的大部分故障排查都建立在对这套环境组成关系的理解上Nginx监听端口收到请求交给PHP-FPM处理动态逻辑PHP再去MySQL查数据最后把结果一路返回到浏览器。绕开面板自己装一遍这个链路就在脑子里固化下来了。手动安装的核心步骤很清晰先更新系统然后装Nginxsudo apt update sudo apt upgrade -y sudo apt install nginx -y验证Nginx启动状态sudo systemctl status nginx装PHP和PHP-FPM的时候个人网站用到的扩展我建议一次性装齐sudo apt install php8.1-fpm php8.1-mysql php8.1-gd php8.1-xml php8.1-mbstring php8.1-curl php8.1-zip -y然后装MySQLsudo apt install mysql-server -y sudo mysql_secure_installationmysql_secure_installation这个交互式脚本会根据你的选择加固MySQL——删除匿名用户、禁用root远程登录、删除测试数据库。这些选项全部yes就完事唯一要注意的是密码强度设置建议选中级以上太弱的密码很容易在日志里留下可乘之机。装完以后分别验证nginx -v php -v mysql --version三个命令都有输出了基础环境就齐了。注意Nginx和PHP的关联点在于Nginx配置了PHP-FPM的socket路径默认在/run/php/php8.1-fpm.sock这个路径后面配置站点时会用到。3.2 Nginx虚拟主机配置一个IP挂多个站点在Nginx里配置网站核心概念是Server Block也就是虚拟主机。无论你是只做一个站还是以后打算扩展都应该先把配置文件的组织方式理解透。腾讯云Ubuntu的Nginx默认配置目录结构是这样的/etc/nginx/sites-available/存放站点配置/etc/nginx/sites-enabled/存放链接到可用配置的软链接。启用站点的命令是sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/新建一个站点配置sudo vim /etc/nginx/sites-available/example.com内容大致如下server { listen 80; server_name example.com www.example.com; root /var/www/example.com; index index.php index.html; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; location / { try_files $uri $uri/ 404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; } location ~ /\.ht { deny all; } }这个配置里三个细节值得说一下root路径要存在用sudo mkdir -p /var/www/example.com创建fastcgi_pass指向的是PHP-FPM的socket文件和你的PHP版本严格对应location ~ /\.ht是禁止访问隐藏文件防止.git目录或者.env文件被扫描下载。改完配置记得测试语法并重载sudo nginx -t sudo systemctl reload nginx3.3 MySQL建库建用户不要用root连接网站很多新手图省事直接在网站配置里用root账号连接数据库这是个大隐患。一旦网站代码存在SQL注入漏洞攻击者拿到的是MySQL root权限整个库都能拖走。正确的做法是给每个站点单独建一个数据库和一个专用用户CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER example_userlocalhost IDENTIFIED BY 一个较强的密码; GRANT ALL PRIVILEGES ON example_db.* TO example_userlocalhost; FLUSH PRIVILEGES;用utf8mb4字符集是个容易漏掉的坑。很多老教程写utf8但这个字符集不支持四字节的emoji和生僻字用户在你的网站评论区发个表情包数据库直接报错。utf8mb4才是MySQL的完整UTF-8实现从建库那天就选它最稳妥。到这里环境层面的内容就差不多齐了。把静态文件放进/var/www/example.com目录浏览器访问IP或者域名Nginx会把请求转发给PHP-FPM执行PHP再去操作数据库一个完整的动态网站就转起来了。4. 域名解析与ICP备案最容易被低估的时间账4.1 解析记录的原理A记录和CNAME别搞混域名解析就是把域名和IP对应起来的过程。在你注册域名的服务商后台如果域名也在腾讯云控制台里操作最方便配置解析记录。个人网站最常用到的是A记录和CNAME记录。A记录是直接指向服务器IPv4地址CNAME是把一个域名别名到另一个域名。顶层域名example.com用A记录指向你的云服务器IP是标准做法www.example.com可以加一条CNAME记录指向example.com也可以再加一条A记录。个人偏好在同一台服务器上直接用两条A记录简单、少一层跳转DNS解析速度微微快一点。TTL值新手阶段保持默认就行真正要改TTL的场景是你做域名迁移或者换服务器IP的时候想着提前把TTL调低到300秒切换后生效快用户体验损失小。平时不改没有意义。等下这里有一个反向操作被我漏了——应该先说解析生效验证再上线。配置完解析后用ping example.com或者在线工具确认域名能解析到你的服务器IP如果返回的IP和服务器一致解析就通了。4.2 ICP备案提前算好你的上线日期如果你的服务器在境内地域绑定域名提供Web服务ICP备案是绕不开的合规要求。这不是技术问题但是技术流程里必须留出的时间预算。备案审核周期通常在1到3周不等具体看管局和资料情况。这意味着从你开始动手到网站正式用域名访问至少要留出三周的提前量。腾讯云在控制台里有备案入口整个流程线上化程度很高。需要准备的材料包括身份证、域名实名认证信息可能还需要拍照核验。有两点提醒一是域名的实名认证主体要和备案主体一致这个不一致很常见、也让人头疼解决起来需要重新提交实名资料二是备案期间域名不能解析访问网站但服务器本身可以正常使用你完全可以先用IP地址测试网站功能做好充分准备备案下来当天就把解析切过去。所以我的建议是注册域名的那一刻就顺手启动备案流程不要等网站做好了再备。网站开发和备案并行推进两者互不耽误这样上线时间能压缩到最短。4.3 备案之后还有一步接入备案和变更备案很多从其他云厂商迁到腾讯云的朋友会忽略接入备案这回事。你的域名在阿里云已经备案过现在服务器换到腾讯云需要在腾讯云做一次接入备案——备案号不变但接入商信息要变。不做接入备案严格来说是存在风险的接入商会定期扫描未备案的域名解析IP发现之后会封禁相关端口影响业务。个人建站逐步走上正轨以后如果哪天你想换个网站名称或者主体信息变更需要在管局系统里发起变更备案。流程比首次备案快但也不是一键能完成的所以网站名称和主体信息好想清楚再提交减少来回折腾。5. HTTPS证书部署与强制跳转5.1 免费证书申请Lets Encrypt还是腾讯云免费证书2017年以来全站HTTPS是标配浏览器对没有HTTPS的网站会打上不安全的标签用户直接失去信任。证书申请有两条路一是腾讯云控制台里申请免费版SSL证书有效期一般是一年二是Lets Encrypt的证书有效期三个月要用certbot自动续期。个人网站我推荐用Lets Encrypt certbot的组合原因很实际免费证书到期后腾讯云控制台要手动申请新证书再下载、上传、替换一年折腾一次certbot配置好之后自动续期装完基本不用管。对你这种零基础用户来说最烦的其实是每过一年网站打不开了——大概率就是证书过期了。安装certbotsudo apt install certbot python3-certbot-nginx -y然后一条命令签发证书certbot会自动修改Nginx配置sudo certbot --nginx -d example.com -d www.example.com交互过程中会让你填邮箱用于接收证书到期提醒还有一个是否同意服务条款的确认选同意就签发了。证书签发成功后会提示证书路径和自动续期状态。手动测试续期是否正常sudo certbot renew --dry-run没有出现error输出就说明定时续期任务搭好了。5.2 Nginx迁移到HTTPS的配置细节certbot默认会帮你把HTTP自动跳转到HTTPS但它生成的配置有时候加了太多重定向逻辑想自己完全掌控的话也可以手动配置。核心配置如下server { listen 80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 其他原有配置 root /var/www/example.com; # ... }注意return 301这行这是把HTTP请求永久重定向到HTTPS。用301而不是302的原因在于301是永久重定向浏览器会记住这个跳转后续直接访问HTTPS地址省去一次跳转的往返时间。5.3 混合内容问题一个很隐蔽的坑HTTPS配置好了打开网站发现浏览器地址栏仍然显示不安全大概率是混合内容问题——页面本身通过HTTPS加载但资源图片、CSS、JS里有通过HTTP加载的请求。浏览器策略会默认拦截这种不安全的请求轻则样式错乱重则整个页面白屏。排查方法很直接F12打开开发者工具看Console和Network面板凡是提示混内容或者要求就直接把网站程序里所有http://写成相对路径或者https://。WordPress等系统在后台设置里把WordPress地址和站点地址都改成https开头的完整URL也能解决大部分问题。还有一个平时不起眼的坑如果你的网站用了一些第三方接口回调地址还是HTTP的记得去对接方后台同步改成HTTPS。不然用户支付完或者登录完回调到你的HTTP地址被浏览器拦住你还会莫名其妙地去排查半天Nginx配置结果方向完全错了。6. 日常运维与故障排查上线之后才是真的开始6.1 日志文件里藏着大多数问题的答案网站上线只是第一步日常运维才是重头戏。Nginx的日志文件通常是排查问题的第一现场配置里指定的访问日志和错误日志路径分别在/var/log/nginx/example.com.access.log和/var/log/nginx/example.com.error.log。遇到网站间歇性打不开先看错误日志sudo tail -f /var/log/nginx/example.com.error.log看到connect() failed (111: Connection refused)说明上游PHP-FPM挂了重启PHP-FPM试一下sudo systemctl restart php8.1-fpm看到upstream timed out说明PHP执行超过了Nginx代理的超时时间要么优化程序里的慢查询要么调整Nginx的proxy_read_timeout配置。访问日志里重点看状态码。出现大量502/503就先查PHP-FPM进程数和内存出现403大概率是站点目录权限不对——root目录的权限要是755文件得是644目录所属用户尽量和PHP-FPM运行用户一致否则程序写不了日志或者传不了文件。有个我踩过两次的坑是磁盘写满。日志文件增长快的话一个小博客一个月也能产生几GB日志个人服务器磁盘默认就40G-50G写满之后网站表现非常诡异开始是反应变慢后面直接白屏。建议看一眼磁盘占用df -h du -sh /var/log/nginx/*日志按天切割、保留30天配个logrotate就不会有这个问题。腾讯云服务器默认一般装了logrotate但要确认Nginx日志有没有被纳进轮转规则没有的话在/etc/logrotate.d/nginx里补一下配置你就当是给日志请了一个自动保洁员到期自动压缩归档。6.2 备份策略不备份等于裸奔个人网站的备份优先级经常被排到很后面直到某天手滑执行了rm -rf或者数据库被误删。数据备份最简单的方案是写个shell脚本每天凌晨用cron任务执行。备份数据库mysqldump -u example_user -p密码 example_db | gzip /backup/db_$(date %Y%m%d).sql.gz备份网站文件tar -zcf /backup/www_$(date %Y%m%d).tar.gz /var/www/example.com然后加一条cron任务crontab -e写入0 3 * * * /usr/local/bin/backup.sh这份备份存在本地磁盘如果磁盘坏了备份也一起丢所以理想方案是再同步一份到对象存储。腾讯云的COS可以用来做备份存储配置一个s3cmd或者直接用COSCMD工具把backup目录增量同步上去。对个人站长来说这一步能保证你的数据在服务器宕机或者误删之后还有恢复的可能性投入产出比极高。6.3 资源监控学会看懂你的服务器如果你觉得每天登录服务器太麻烦可以用腾讯云控制台的云监控CPU、内存、带宽这些指标都自动采集可以设置告警阈值。个人网站建议只设一个告警就好——CPU使用率持续5分钟超过90%或者磁盘使用率超过85%的时候通知你其他指标不用管免得天天收到告警邮件自己先烦了。我个人的习惯是在服务器上装一个htop日常登录之后扫一眼进程列表比云监控更直观地看到哪个进程在吃资源。另外养成分时间段看一眼日志的习惯比如每天早上花一分钟扫一眼昨天的访问日志数量和错误日志有没有新增异常比到出问题再排查要省力得多。关于性能优化个人网站阶段你真正要关注的瓶颈其实只有一个内存。Nginx、PHP-FPM、MySQL三个常驻进程加起来占用的内存决定了你服务器的水位线。如果内存总是不够先把PHP-FPM的pm.max_children调小再看MySQL的innodb_buffer_pool_size是不是设置得太高了。绝大多数个人网站的卡顿不是因为配置不够而是因为默认配置的参数不是为小站点场景调优的。最后给你一个启动清单把这一整套流程串起来从购买服务器到网站正式上线大概就是下面这张清单确定地域和配置购买腾讯云轻量应用服务器或CVM选择Ubuntu 22.04 LTS注册域名同步启动ICP备案流程通过WebShell或SSH登录服务器创建普通用户配置SSH密钥登录关闭密码登录配置安全组和ufw防火墙只放行22、80、443端口安装Nginx、PHP-FPM、MySQL并逐一验证创建网站目录和站点配置文件建立数据库和独立用户域名解析A记录指向服务器IP申请SSL证书并用certbot配置自动续期强制HTTPS跳转检查混合内容和静态资源加载配置日志轮转、数据库和文件备份、cron定时任务设置云监控告警这套流程我帮朋友走过不下五次了每次最花时间的往往不是技术操作而是备案等待和环境细节的排错。技术这块只要动手跟着做两三天就能全部跑通。如果你的第一台服务器已经买好了现在就登录上去把SSH密钥配了这是今天唯一一件值得马上去做的事。