一、一个烂摊子
部门此前寻找网站供应商制作了产品网站,其交付网站架构较为老旧,网站基于WordPress 5.0版本构建,PHP版本要求为不高于7.3,MySQL版本5.7。
就是这种要求在回迁公司服务器时也出现了各种问题。由于公司服务器环境过于杂乱,连mysql5.7的数据库都无法顺利导入。
这里面也有供应商的一些问题,例如交付的WordPress配置文件与数据库表头不匹配,数据库时间配置错误等。
在我的帮助下,数据库和配置文件都得以修改正常,网站终于部署上线,但是系统环境导致包含中文文件名的文件无法被解析,在调整Nginx配置无效后,IT让我修改中文名文件,我。。。
二、服务器和Docker
借由新ECS服务器和公司官网的搭建,考虑把产品网站也纳入部门服务器的管理。
但供应商的环境版本老久,为了避免产品网站潜藏的漏洞影响整体服务器的稳定,我使用了Docker来为产品网站配置环境。
中间也考虑使用LXD来实现,但是网络环境始终无法配置完成,因此不再浪费时间,使用Docker实现功能。
三、Docker的问题
最大的问题是镜像源,国内能搜索到的镜像源很多都停止了服务。因此需要在/etc/docker/daemon.json里配置可以访问的镜像源,这个不再赘述。
四、部署
将供应商的WP文件夹上传到服务器,可以在同位置配置Docker的yml文件。
version: '3.7'
services:
wordpress:
build: .
container_name: wordpress-container
ports:
- "8000:80" # WordPress 端口
volumes:
- /# 本地 WordPress 目录 wp:/var/www/html # 本地 WordPress 目录
networks:
- wordpress_network
depends_on:
- mariadb # 依赖 MariaDB 服务
environment:
WORDPRESS_DB_HOST: mariadb:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: # 用户名
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD} # 从 .env 读取密码
restart: always
mariadb:
image: mariadb:latest
container_name: mariadb-container
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 从 .env 读取密码
MYSQL_DATABASE: wordpress
MYSQL_USER: # 用户名
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mariadb_data:/var/lib/mysql # 使用 Docker Volume 代替宿主机路径
- # 初始数据库地址:/docker-entrypoint-initdb.d/#初始数据库.sql # 初始 SQL 数据
ports:
- "3307:3306"
networks:
- wordpress_network
restart: always
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin-container
environment:
PMA_HOST: mariadb
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 从 .env 读取密码
ports:
- "8081:80"
networks:
- wordpress_network
restart: always
networks:
wordpress_network:
driver: bridge
volumes:
mariadb_data:
从.env文件读取密码:
MYSQL_ROOT_PASSWORD=# 密码1
MYSQL_PASSWORD=# 密码2
如果是使用mariadb,则需要在WP的Config文件中修改配置:
define('DB_HOST', 'mariadb');
后端启动之后,我们可以通过IP+端口来进行服务的测试,如果没有问题,就可以通过主机的Nginx代理,来配置域名访问。
server {
listen 80;
server_name #域名;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name #域名;
ssl_certificate /etc/letsencrypt/live/#域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/#域名/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8000;#映射docker端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
}
五、其他注意事项:
1、如果WP的重写规则不可用,检查WP文件夹权限。
2、如果配置HTTPS发现页面正常,但是管理界面出现问题,考虑是配置文件问题,参考官方说明配置。
define( 'FORCE_SSL_ADMIN', true );
// in some setups HTTP_X_FORWARDED_PROTO might contain
// a comma-separated list e.g. http,https
// so check for https existence
if( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false )
$_SERVER['HTTPS'] = 'on';
发表回复