文件目录结构规划:
. ├── db-data ├── docker-compose.yaml ├── letsencrypt ├── logs │ ├── mysql │ ├── nginx ├── mysql │ └── my.cnf ├── nginx │ ├── conf.d │ └── nginx.conf └── webroot
docker-compose.yaml文件如下:
version: '3' services: mysql1: image: mariadb:latest restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress command: [--character-set-server=utf8mb4, --collation-server=utf8mb4_general_ci] ports: - "3307:3306" volumes: - ./db-data:/var/lib/mysql - ./logs/mysql:/var/logs/mysql - ./mysql/my.cnf:/etc/my.cnf networks: - wordpress_net wordpress: depends_on: - mysql1 image: wordpress:latest volumes: - ./webroot:/var/www/html - ./php-fpm/php.ini:/etc/php/php.ini:ro - ./logs/php/:/var/log/php/:rw - ./php-fpm/php-fpm.conf:/etc/php/php-fpm.conf:ro restart: always expose: - 80 environment: MYSQL_PORT_3306_TCP: 3307 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_HOST: mysql1 WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress networks: - wordpress_net nginx: image: nginx:latest volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./logs/nginx:/var/log/nginx - ./letsencrypt:/etc/letsencrypt depends_on: - wordpress ports: - 8081:8081 - 443:443 networks: - wordpress_net networks: wordpress_net: driver: bridge ipam: config: - subnet: 192.168.100.0/24
nginx.conf文件配置:
events { worker_connections 1000; } http { upstream wordpress { server wordpress:80; } server { listen 8081; location / { proxy_pass http://wordpress; proxy_set_header Host $http_host; proxy_set_header X-Forward-For $remote_addr; } fastcgi_connect_timeout 3000; fastcgi_send_timeout 3000; fastcgi_read_timeout 3000; } }
my.cnf
[mysqld] explicit_defaults_for_timestamp=true wait_timeout=86400 interactive_timeout=7200
踩坑一:
wordpress默认端口为80,我填的是8080,导致部署完成后一直报502错误
查看wordpress镜像描述文件才知道
docker inspect wordpress
踩坑二
Nginx——*5 connect() failed (111: Connection refused) while connecting to upstream
查询CSDN文章才知道,这两个没有配置:
proxy_set_header Host $http_host; proxy_set_header X-Forward-For $remote_addr;
nginx中proxy_set_header Host $host的作用
nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。
Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。
同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加上述两条配置,修改http的请求头。
这里的 h t t p h o s t 和 http_host和 httphost和remote_addr都是nginx的导出变量,可以再配置文件中直接使用。如果Host请求头部没有出现在请求头中,则 h t t p h o s t 值 为 空 , 但 是 http_host值为空,但是 httphost值为空,但是host值为主域名。因此,一般而言,会用 h o s t 代 替 host代替 host代替http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。
踩坑三
wordpress_1 | [22-Apr-2020 07:04:29 UTC] PHP Warning: mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22
查找网上的文章说是mysql容器没有完全启动完成,wordpress就启动了,
http://www.itkeyword.com/doc/6210487496492597359/docker-compose-wordpress-mysql-connection-refused
删掉已启动的wordpress容器,重新启动就好了
docker-compose restart wordpress
一切解决好后,输入相关配置,wordpress+nginx终于部署成功。
原文链接:https://blog.csdn.net/a200822146085/article/details/105684779?ops_request_misc=&request_id=3129e15c469e46738c4d3d49e8bdfaa1&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-19-105684779-null-null.268%5Ev1%5Econtrol&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81