从0到1搭建个人博客

hagermo 2026-6-6 32 6/6

零基础搭建个人博客:从买服务器到装好WordPress,我踩过的坑你都别踩了

说起来你可能不信,就为了搞一个自己能完全掌控的个人博客,我折腾了整整两个天。这两天里,我经历了域名备案被拒、Docker容器起不来、Nginx配置死活不生效、手机微信点开网站提示“未备案”……各种你能想到的、想不到的坑,我基本都踩了一遍。

所以今天这篇文章,我不想给你讲那些高大上的“高并发架构”或者“容器编排”,我就老老实实把我从零开始、到最后能够在浏览器里看到WordPress安装界面的每一步都写下来。包括我当时是怎么想的、哪里卡住了、最后怎么解决的。如果你是纯小白,跟着做就行;如果你已经有点基础,也可以看看有没有你曾经也困惑过的地方。

一、准备工作:买服务器和域名

一开始我以为写博客很简单,买个空间、装个WordPress,完事。结果打开阿里云一看,云服务器(ECS)的规格五花八门,什么共享型、计算型、通用型,还有什么vCPU、内存、带宽……头都大了。

最后选了最便宜的配置——2核CPU、2GB内存,Ubuntu 24.04系统,地点选在华南(深圳)。为什么选深圳?因为离我近,心里觉得快一点。后来才知道,选内地任何城市都得做ICP备案,而备案又是个麻烦事。如果你不想备案,直接选香港地域的服务器会省心很多,价格稍微贵一丢丢,但不用等那二十天。顺手在阿里云注册了一个 .xyz的域名,花了不到十块钱,名字叫 hagermo.xyz。为什么叫这个?因为我就是Hagermo。

第一个困惑

买完服务器后,我拿到一个公网IP(比如 47.107.83.8),然后用浏览器打开这个IP,啥也没有,就一个“无法访问此网站”。我当时以为服务器坏了,后来才知道——新买的服务器就是个空机器,里面什么都没有,当然看不到东西。你得自己装环境、配网站。

二、域名解析和备案,一开始我就被卡住了

域名买完了,得把它指向我的服务器IP。这个操作叫域名解析,在阿里云的“云解析DNS”里面添加一条A记录,主机记录填 www,记录值填你的服务器IP。再添加一条 @ 记录,让 hagermo.xyz 也能访问。这一步挺顺利的,等了几分钟,用 ping www.hagermo.xyz能看到返回的IP是服务器的,说明解析生效了。但是,当我兴奋地在浏览器输入 www.hagermo.xyz 时,出现的不是我的网站,而是一个大大的蓝色提示:“该域名暂时无法访问,请先完成ICP备案”。我当场懵了——什么备案?我买域名的时候没人跟我说啊。原来,只要服务器放在中国大陆境内,域名就必须在工信部备案,否则阿里云会直接拦截所有HTTP/HTTPS请求。我当时有两个选择:要么把服务器换成香港地域(不用备案,立刻能用),要么老老实实去备案。因为我已经付了一年的钱,退换麻烦,就选了备案。

备案流程本身不复杂:在阿里云备案系统里填个人信息、上传身份证、拍个视频验证。但有个坑让我反复被驳回——域名实名认证的信息和备案信息必须一字不差。我第一次填的时候,域名持有人写的是英文拼写,备案用的中文名,系统直接判不通过。第二次,证件号码里有个括号,中英文括号不对应,又驳回了。折腾了三次才通过,耗时一周多。

所以这里给你一个忠告,在买域名的时候,实名认证一定要用和身份证完全一致的姓名、证件类型、证件号码,标点符号都不能错。 如果你等不及备案,直接买香港服务器,省掉这个麻烦。

 三、到底用什么方式装WordPress?我纠结了很久

在等待备案的那几天,我闲着没事,开始研究怎么把WordPress装到服务器上。网上教程五花八门:有说用宝塔面板的,点几下鼠标就装好了;有说用LNMP一键脚本的;还有说手动编译Nginx、MySQL、PHP的。我一开始试了宝塔面板,确实方便,装完系统后一行命令就装上了宝塔,然后通过网页界面选LNMP环境,几分钟就好。但是用了一段时间发现,宝塔占内存不小,我的2GB服务器装完宝塔加MySQL加Nginx,空闲内存只剩三四百兆,偶尔还会卡顿。后来看到有人说用Docker,资源隔离好、迁移方便、占用也小。我想着反正以后可能换服务器,用Docker的话直接把整个目录打包带走就行,于是决定改用Docker。

第二个困惑

Docker是什么?我完全不懂。但跟着教程一行一行敲命令,发现也没那么难。Docker就像一个轻量级的虚拟机,你写好一个配置文件(叫docker-compose.yml),它就会自动帮你把Nginx、MySQL、PHP都跑起来,并且它们互相不干扰。

 四、写docker-compose.yml,我改了无数次

我先在服务器上创建了一个目录,叫~/wordpress-pro,所有的东西都放这里面。然后新建一个文件docker-compose.yml,内容如下。你可以直接复制,但记得把密码改成你自己的。

version: '3.8'

services:
  mysql:
    image: mysql:5.7
    container_name: wp-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 这里填你的root密码
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: 这里填wordpress用的密码
    volumes:
      - ./mysql:/var/lib/mysql
    command: --innodb_buffer_pool_size=256M
    deploy:
      resources:
        limits:
          memory: 384M

  php:
    image: wordpress:php8.2-fpm-alpine
    container_name: wp-php
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: 这里填上面wordpress用的密码
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress:/var/www/html
    depends_on:
      - mysql
    deploy:
      resources:
        limits:
          memory: 256M

  nginx:
    image: nginx:1.26-alpine
    container_name: wp-nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./wordpress:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
      - ./nginx/logs:/var/log/nginx
    depends_on:
      - php
    deploy:
      resources:
        limits:
          memory: 128M

 

这里有几个我当时很困惑的点

1.为什么MySQL要用5.7而不是8.0?

因为WordPress官方说MySQL 5.7兼容性最好,8.0也可以,但有些老主题可能会出问题。我选5.7图个稳。

2.为什么要给每个服务限制内存?

因为我的服务器只有2GB内存,不限制的话,MySQL可能会吃掉大半,导致PHP或者Nginx没内存可用,网站就挂了。我根据网上别人的经验,给MySQL 384MB、PHP 256MB、Nginx 128MB,这样加起来不到1GB,留了1GB给系统和缓存,还算够用。

3.volumes那块是什么意思?

就是把容器里面的目录映射到宿主机的目录。比如./wordpress:/var/www/html,意思是我当前目录下的wordpress文件夹会对应容器里的网站根目录。这样我修改文件或者备份,直接在宿主机操作就行,不用进容器。

 

写好这个文件后,我执行docker compose up -d。结果报错“Cannot connect to the Docker daemon”。我才想起来,新装的Ubuntu系统还没有Docker。于是先装Docker:

sudo apt update
sudo apt install docker.io docker-compose-plugin -y

 

装完再运行docker compose up -d,这次没报错,但MySQL容器起不来。看日志(docker logs wp-mysql)发现是权限问题——./mysql目录是root用户的,容器里的mysql用户写不进去。解决方法:删掉这个目录,让docker自动重建。

rm -rf ~/wordpress-pro/mysql
docker compose up -d

 

这次三个容器都成功跑起来了。用`docker ps`可以看到三个容器都在运行。

五、配置Nginx,让WordPress能通过域名访问

容器虽然跑起来了,但通过域名访问还是不行。因为Nginx容器里没有网站的配置文件。我需要写一个nginx.conf放在~/wordpress-pro/nginx/conf.d/目录下。

我新建了一个文件叫wordpress.conf

server {
    listen 80;
    server_name www.hagermo.xyz hagermo.xyz;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.hagermo.xyz;

    ssl_certificate /etc/nginx/ssl/www.hagermo.xyz.pem;
    ssl_certificate_key /etc/nginx/ssl/www.hagermo.xyz.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

 

注意到我配置了HTTPS强制跳转,并且引用了ssl目录下的证书文件。证书我是从阿里云申请的个人免费测试证书(90天有效期),下载后把.pem和.key文件放到~/wordpress-pro/nginx/ssl/目录下。

这里有个大坑

我配置完以后重启Nginx容器(docker restart wp-nginx),然后访问https://www.hagermo.xyz,浏览器提示“连接不安全”。检查了半天,发现是我把证书放错了位置——我放的是~/nginx/ssl,但是Nginx容器里挂载的是./nginx/ssl:/etc/nginx/ssl,而我的docker-compose.yml里写的挂载路径是./nginx/ssl:/etc/nginx/ssl,正确。但证书文件名大小写写错了,配置里写的是www.hagermo.xyz.pem,实际文件是www.hagermo.xyz.PEM,Linux区分大小写,导致找不到证书。改过来就好了。

另外,别忘了在阿里云安全组里开放443端口。默认只开了22(SSH)和80(HTTP),443需要手动添加入方向规则。

 六、终于看到WordPress安装界面了

把上面的配置都搞定后,我再访问https://www.hagermo.xyz,终于看到了WordPress经典的安装界面——选择语言、填站点标题、设置管理员用户名和密码。那一刻,我差点在电脑前鼓掌。但是注意,因为我还没有完成ICP备案,域名在外网访问仍然被阿里云拦截。我是在服务器本地用curl命令测试的

curl -H "Host: www.hagermo.xyz" http://localhost

 

如果返回的是WordPress安装页面的HTML代码,说明Nginx转发没问题,只是备案拦截。如果你实在等不及备案,可以像我后来做的那样——把服务器迁到香港地域,然后重新解析域名,就不用备案了。

七、安装主题和插件,顺便解决一个小权限问题

安装完WordPress后,我登录后台,想去上传一个喜欢的主题。我在网上下载了一个叫Qzdy的主题(一个国人大佬开发的免费主题,样式挺清爽),ZIP包上传到后台时,提示“无法创建目录”。这是因为PHP容器的运行用户是www-data,但是宿主机上~/wordpress-pro/wordpress目录的所有者是root(因为之前用root用户创建和运行docker),www-data没有写入权限。解决方法很简单,在服务器上执行

sudo chown -R www-data:www-data ~/wordpress-pro/wordpress/wp-content

 

这样wp-content目录下就可以正常上传主题、插件、图片了。

还有一个事情

WordPress默认的上传文件大小限制是2MB,如果你要上传大一点的主题包或者图片,可能会失败。可以在php容器里修改配置,或者直接在docker-compose.yml的php部分增加一行

    command: sh -c "docker-entrypoint.sh && echo 'upload_max_filesize = 64M' > /usr/local/etc/php/conf.d/upload.ini && echo 'post_max_size = 64M' >> /usr/local/etc/php/conf.d/upload.ini"

 

不过这个有点复杂,新手可以先不管,2MB对于大多数主题也够用了。

八、总结一下,其实没那么难

回头看我走过的路,最大的障碍不是技术,而是那些看似不起眼的小细节:域名实名和备案信息不一致、Docker目录权限、Nginx配置语法错误、安全组没开端口、证书大小写……任何一个都会让你的网站开不起来,而且报错信息往往模棱两可,新手很容易劝退。

但是只要你愿意一点一点排查,看日志、搜关键字、对比教程,总能解决。我把自己踩过的坑全写在这里了,希望你能直接绕过去。

最后,如果你只是想写博客,不想折腾服务器,也可以直接用WordPress.com或者国内的轻量应用服务器一键部署。但如果你和我一样,喜欢自己掌控一切的感觉,那就跟着这篇教程,从零开始,把你的博客搭起来吧。

- THE END -

hagermo

6月07日12:25

最后修改:2026年6月7日
2

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论