Docker compose部署WordPress (Nginx+Mariadb+redis+WordPress)

1. 部署环境:

Ubuntu 22.04 server 64bit

2. docker-compose.yml:

#docker-compose.yml

services:
  nginx:
      depends_on:
        - wordpress
      image: nginx:latest
      container_name: nginx
      restart: always

      volumes:
        - ${PWD}/data/nginx/conf.d:/etc/nginx/conf.d # nginx配置
        - ${PWD}/data/nginx/nginx.conf:/etc/nginx/nginx.conf # nginx配置
        - ${PWD}/data/nginx/ssl:/etc/nginx/ssl # SSL证书
        - ${PWD}/data/nginx/html:/etc/nginx/html 
        - ${PWD}/data/nginx/logs:/var/log/nginx # 日志

      environment:
        TZ: Asia/Shanghai

      ports:
        - "80:80"
        - "443:443"

      networks:
        - wordpress_network
  
  mariadb:
    image: mariadb:10
    container_name: mariadb
    restart: always

    volumes:
      - ${PWD}/data/mariadb/conf:/etc/mysql/conf.d
      - ${PWD}/data/mariadb/logs:/logs
      - wordpress-db-data:/var/lib/mysql

    environment:
      MARIADB_DATABASE: wordpress  # 数据库名称
      MARIADB_USER: wordpress # 数据库用户名 !建议更改!
      MARIADB_PASSWORD: wordpress # 数据库用户密码 !建议更改!
      MARIADB_ROOT_PASSWORD: "123456" # 数据库ROOT用户密码 !建议更改!
      TZ: Asia/Shanghai

    ports:
      - "3306:3306" 

    networks:
      - wordpress_network
    
  redis:
    image: redis
    container_name: redis
    restart: always

    volumes:
      - ${PWD}/data/redis/log/redis.log:/etc/redis.log # redis日志
      - ${PWD}/data/redis/conf/redis.conf:/etc/redis/redis.conf # redis配置文件
      - ${PWD}/data/redis/data:/data # redis数据
    networks:
      - wordpress_network

  wordpress:          
    depends_on:       
      - mariadb
      - redis
    image: wordpress:latest    
    container_name: wordpress
    restart: always
    volumes:
      - ${PWD}/data/wordpress/html:/var/www/html # wordpress主目录
      - ${PWD}/data/wordpress/php/upload.ini:/usr/local/etc/php/conf.d/upload.ini # PHP配置 用于修改文件上传上限

    environment:        
      WORDPRESS_DB_HOST: mariadb # 目标数据库
      WORDPRESS_DB_USER: wordpress # 数据库用户名 !建议更改! 与mariadb块保持一致 
      WORDPRESS_DB_PASSWORD: wordpress # 数据库用户密码 !建议更改! 与mariadb块保持一致 
      WORDPRESS_DB_NAME: wordpress # 数据库名称 与mariadb块保持一致
      TZ: Asia/Shanghai

    networks:
      - wordpress_network

networks:
  wordpress_network:

volumes:
  wordpress-db-data:

3. Nginx配置

3.1 nginx.conf:

 #./data/nginx/nginx.conf
 user  nginx;
 #nginx进程数,建议设置为等于CPU总核心数。
 worker_processes  auto;
 
 error_log  /var/log/nginx/error.log notice;
 pid        /var/run/nginx.pid;
 
 # 事件区块开始
 events {
    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
     worker_connections  1024;
 }
 
 #设定http服务器,利用它的反向代理功能提供负载均衡支持
 http {
    #include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中
     include       /etc/nginx/mime.types;
    #默认文件类型
     default_type  application/octet-stream;
    #日志格式
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
    #访问记录
     access_log  /var/log/nginx/access.log  main;
 
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
     sendfile        on;
     #tcp_nopush     on;
 
    #长连接超时时间,单位是秒
     keepalive_timeout  65;
     client_max_body_size 100m;
     #gzip  on;

    # 隐藏响应头信息 Nginx版本号 HTTPS相关
     server_tokens off;
 
     include /etc/nginx/conf.d/*.conf;
 }

3.2 wordpress.conf:

#./data/nginx/conf.d/wordpress.conf

  # wordpress server
  
  # HTTPS施工中
  server {
  listen 443 ssl;
  server_name <...>; # 你要配置的域名
  
  # 你的 ssl 证书在 nginx 容器中的路径,一般只需要将最后面的换成你的证书文件名称即可
  ssl_certificate       /etc/nginx/ssl/<...>.crt; 
  ssl_certificate_key  /etc/nginx/ssl/<...>.key;
  
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers on;
  
  gzip on; # 默认off,是否开启gzip
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

  # 处理静态资源
  location / {

        proxy_pass   http://wordpress;   # 需要反向代理的地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        add_header X-Content-Type-Options nosniff;
        add_header Content-Security-Policy "upgrade-insecure-requests" always; #将HTTP请求提升为HTTPS请求

        client_max_body_size 100m;
      }

}
  
server{
  listen 80;
  server_name <...>;
  # rewrite ^(.*)$ https://$host$1; # 将所有HTTP请求通过rewrite指令重定向到HTTPS。
  gzip on; # 默认off,是否开启gzip
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  
  location / {
        	# add_header Access-Control-Allow-Origin *;
	        # add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
	        # add_header Access-Control-Allow-Headers '*';
	        # if ($request_method = 'OPTIONS') {
          #   return 204;
          # }

        proxy_pass   http://wordpress;   # 需要反向代理的地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        client_max_body_size 100m;
      }
}

注: 需要将./data.nginx/conf.d/default.conf 注释掉,会导致无法访问,怀疑会覆盖掉wordpress.conf中的服务

4. Redis配置

4.1创建日志文件

touch ./data/redis/log/redis.log

4.2 修改redis配置文件

因为docker部署的redis并不自带redis.conf文件,需要自己下载:http://download.redis.io/redis-stable/redis.conf

# ./data/redis/conf/redis.conf

# 让外部设备连接
bind 0.0.0.0
 
# 关闭保护模式
protected-mode no
 
# 关闭后台运行(避坑提示,因为docker运行就已经有后台守护,改为yes会启动不了redis)
daemonize no

# 设置日志文件路径(避坑提示,此路径为容器内的路径,切勿当成宿主路径)
logfile "/etc/redis.log"

# 设置 Redis 的内存上限,防止内存溢出
maxmemory 1gb 

# 设置 Redis 的缓存淘汰策略。可以选择 volatile-lru(最近最少使用的键被淘汰)等策略
maxmemory-policy allkeys-lru 

 # 每900秒内如果至少有1个键被修改,则进行快照
save 900 1 

4.3 赋予配置文件和日志文件权限:

chmod 777 ./data/redis/conf/redis.conf ./data/redis/log/redis.log

4.4 wordpress redis插件配置

github安装指导

4.4.1 修改 wp-config.php

在 require_once ABSPATH . 'wp-settings.php'; 之前添加:

// ./data/wordpress/html/wp-config.php

// 启用 Redis 缓存
define('WP_CACHE_KEY_SALT', 'your_domain:');  // 修改为你的域名,以便生成唯一的缓存键
define('WP_REDIS_HOST', 'redis');        // Redis 服务器地址,如果 Redis 在本地运行,保持不变 
define('WP_REDIS_PORT', 6379);               // Redis 默认端口
define('WP_REDIS_TIMEOUT', 1);               // Redis 超时时间设置
define('WP_REDIS_READ_TIMEOUT', 1);          // 读超时时间
define('WP_REDIS_DATABASE', 0);              // Redis 使用的数据库编号

4.4.2 最后从插件市场下载 Redis Object Cache 插件 并启用

5. HTTPS SSL

施工中...

Really Simple SSL插件

如何追踪混合内容或不安全的内容 - Really Simple Security

6. 解除wordpress文件上传上限:

# ./data/wordpress/php/upload.ini
file_uploads = On
memory_limit = 500M
upload_max_filesize = 100M # 上传最大文件大小
post_max_size = 100M 
max_execution_time = 600

7. run/down脚本:

# ./run.sh
docker compose  -p wordpress up -d

 

#./down.sh
docker compose down

8. 插件推荐:

UpdraftPlus-备份/恢复
文派头像 解决头像问题

参考教程:

1. 通过 Docker 部署 WordPress 搭建博客保姆级教程 - -Xiaoyang- - 博客园
2. 如何配置 Redis 缓存以加速 WordPress:详细教程与实战指南_wordpress开启redis缓存-CSDN博客
3. Docker部署redis,并挂载存储,日志,配置文件_dockers 安装redis日志在哪里-CSDN博客
4.如何更改WordPress站点的域名:完全指南_wordpress更换域名-CSDN博客
5.