Docker搭建WordPress个人博客

发布于 2022-02-01  158 次阅读


WordPress简介

  • 官网
  • 适合新手入门的博客框架,常用于个人博客的搭建,正如其名字一样,通过简单的几个word即可搭建出一个博客

太长不看版

  • 项目地址:Github
  • 功能:通过docker-compose,实现了利用容器搭建nginx+mariadb+wordpress的组合,在VPS中搭建个人博客
  • 运行方式:详情见项目的README.md
  • 环境依赖:docker
sudo apt install docker docker-compose
git clone https://github.com/xiabee/wordpress-docker
cd wordpress-docker

搭建HTTP服务

rm ./nginx/nginx_https.conf
# 删除https
docker-compose up -d
# 构建http服务

搭建HTTPS服务

如果要搭建https服务的话需要在nginx_https.conf中配置一下证书路径,并删除nginx.conf,重新构建服务。

rm ./nginx/nginx.conf
docker-compose up -d

代码详解

docker-compose.yml

  • 官方文档
  • 简言之:调用Docker服务的API进行容器管理,定义和运行多个Docker容器应用。

network模块这里直接跳过,就是定义一下网络类型和网络ID,这里不需要过多设置,我们直接跳到服务services模块

wordpress模块

wordpress:
        # 选中带有php-fpm 的版本
        image: wordpress:5.8.1-php8.0-fpm
        # 把wordpress的主体文件夹映射到本地 wordpress目录
        volumes:
            - ./wordpress:/var/www/html

        # 环境变量 设置密码
        environment:
            WORDPRESS_DB_HOST: mariadb:3306
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: wordpress-pass
            WORDPRESS_DB_NAME: wordpress
        # 设置依赖
        depends_on:
            - mariadb
        restart: always
        networks:
            - xiabee
  • image:这里选择带有FPMwordpress镜像,因为要配合nginx使用
  • volumes:建立目录映射,将容器目录映射到宿主机中,方便我们管理和维护容器的文件
  • environment:设置环境变量,用于设置数据库的密码
  • depends_on:设置依赖,这里wordpress需要依赖mariadb数据库启动
  • restart:设置重启方式,这里选择always,即挂掉就重启。
  • networks:这里直接用了前面定义的网络

mariadb

mariadb:
        image: mariadb:latest
        expose:
          - "3306"
        volumes:
          - ./mysql:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root-pass
            MYSQL_DATABASE: wordpress
            MYSQL_USER: wordpress
            MYSQL_PASSWORD: wordpress-pass
            MYSQL_RANDOM_ROOT_PASSWORD: 1
          # 使用随机root密码

        #这里使用命令登陆,删除后可能于新版mysql不兼容
        command: [--default-authentication-plugin=mysql_native_password, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci]
        #挂掉自动重启
        restart: always
        networks:
            - xiabee
  • command:使用命令方式登录,进行设置,避免BUG
  • 其他与wordpress的操作基本相同

nginx

nginx:
        image: nginx:latest
        ports:
            - '80:80'
            - '443:443'
        # 映射本地,加载本地的配置
        volumes:
            - ./nginx:/etc/nginx/conf.d    
            #注意服务器配置文件的映射位置,如果需要修改配置,直接修改映射的文件即可
            - ./logs/nginx:/var/log/nginx
            - ./wordpress:/var/www/html  
            #这里选择本地wordpress即 wordpress docker中的目录
        depends_on:
            - wordpress
        restart: always
        networks:
            - xiabee
  • 这里注意目录映射的位置就行,其他和wordpress的设置基本相同

nginx.conf

  • 这个文件用来配置http服务
  • 开启http服务时需要删除nginx_https.conf
server {
listen 80;              #设置监听端口,http默认端口为80
server_name localhost;

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

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
  • listen:监听端口
  • server_name:设置你的域名
  • root:根目录地址
  • location:设置访问的url,这里设置的是根目录的访问,即访问网站根目录时,跳转到/index.php
  • 第二个location用于监听9000端口的wordpress,对wordpress进行反向代理

nginx_https.conf

  • 这个文件用于构建https服务
  • 开启https需要提前拥有域名和证书
  • 开启https服务时需要删除nginx.conf

禁止IP直接访问

server {
    listen  80 default;
    server_name ~.*;
    return 500;
}   #禁止直接ip访问

这里创建一个server用于禁止IP直接访问

强制HTTPS

server {
  listen   80;
  server_name  domain name.com;     #这里的domain name.com换成您的域名
  return   301 https://$server_name$request_uri;
}   #强制全站使用https

这里的server用于强制全站使用https

设置证书文件

server {
    listen 443 ssl;
    server_name domain name.com; 
    #这里的domain name.com换成您的域名

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

    ssl_certificate ./conf.d/domain name.com;  
    #将domain name.pem替换成您的证书文件
    ssl_certificate_key ./conf.d/domain name.key;   
    #将domain name.key替换成您的密钥文件

    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  
    #使用此加密套件。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   
    #使用该协议进行配置。
    ssl_prefer_server_ciphers on;   

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}   #https服务器

这里需要把自己的证书添加到宿主机的nginx目录下,因为前面做了目录映射,所以证书会自动映射到容器的conf.d目录中

常见BUG

/docker/api/client.py错误

  • 容器服务没开......开启容器服务,重新运行 imagepng

数据库错误

  • docker-compose升级之后,environment的设置必须像仓库中那样以键值对的形式存在,不能直接输入一个字符串,否则会读不到环境变量,导致数据库密码设置错误,最终导致连不上服务器
  • 如果你是直接CV这个项目的话应该不会有问题,除非你数据库密码填错了(x)

nginx一直重启

  • 检查一下是不是配置了https但是证书没有复制到目录内......
imagepng
  • 如果不想设置https,那就直接把nginx_https.conf删掉,重启容器就行
imagepng

最终安装

如果所有容器都正常启动了,直接访问你的IP/域名应该就能看到安装界面了(https服务如果没有做强制跳转,则需访问你域名的443端口才能访问)

imagepng

安装完成之后,剩下的事情对着说明做就行了,如果实在看不懂就装个中文版的......

关于主题

  • xiabee.cn用的是樱花庄主题:个人感觉还算好看,就是不够简洁,所以转战hexo了哈哈哈(x)
imagepng
  • 不过之后可能会再找几个好看的主题

Be all you can be.