本文使用docker-compose运行wordpress,使用已有的mysql数据库,外部的nginx开启https反向代理到wordpress。如果你的域名还没有备案请先去备案。
编写启动文件
编写docker-compose.yml,然后执行 docker-compose up -d 启动容器
因为我还又nextcloud云盘,因此已经有myqsl数据库了,可以直接连,172.18.0.1:3306是我自己的mysql地址
```
version: "3"
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
restart: always
volumes:
- ./wordpress:/var/www/html
environment:
- WORDPRESS_DB_HOST=172.18.0.1:3306
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
```
如果你之前没有现成的mysql数据库,可以按照官网的教程编写配置文件
```
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- /opt/mysql:/var/lib/mysql
```
这里需要去wordpress后台配置地址,修改为我们最后带域名的地址。
访问 ip:8077/admin
配置Nginx
这里使用nginx开启https并反向代理到worpress,如果没有安装nginx,请先安装nginx。HTTPS证书可以去阿里云申请免费的SSL证书,这里的坑比较多,请注意仔细看配置文件。
我们的案例域名是limvs.cn,无论是否带www,都会转发到内网的服务上。
因为我的nginx的配置文件最后下面这句
```
include /etc/nginx/conf.d/*.conf;
```
因此,我在conf.d文件夹下新建一个wordpress的配置文件
vi /etc/nginx/conf.d/wordpress_ng_443.conf
```
server {
listen 80;
server_name limvs.cn;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 80;
server_name www.limvs.cn;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 443 ssl http2 ;
server_name www.limvs.cn;
ssl_certificate certs/www.limvs.cn.pem;
ssl_certificate_key certs/www.limvs.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://**dockeip**:8077;
proxy_redirect off;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
server {
listen 443 ssl http2 ;
server_name limvs.cn;
ssl_certificate certs/limvs.cn.pem;
ssl_certificate_key certs/limvs.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://**dockeip**:8077;
proxy_redirect off;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
```
修改wordpress配置文件
如果直接代理过去,会有很多问题,比如循环重定向转发,js、css等资源走的是http请求,地址重定向为localhost,是踩了很多坑才配置好。
修改在/wordpress文件夹下的 wp-config.php,这个是docker容器挂载的卷,增加如下内容
新增的域名就是你接下来访问的主页域名,我的是www.limvs.cn
vi wp-config.php
```
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false){
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
define('WP_HOME','https://www.limvs.cn/');
define('WP_SITEURL','https://www.limvs.cn/');
```
以上配置后如果仍无法访问,就需要检查数据库数据是否正确
登录mysql,找到wordpress数据库
找到wp-options表,将option_name的site_url,和home,的值都修改成`https://www.limvs.cn/`
设置后重启容器,应该可以解决问题
### FTP账户信息问题
在服务器安装wordpress 后,
在后台自动升级时,或者更新、删除主题或者插件的时候,如果提示需要输入FTP账户信息,然而即使我们正确输入了FTP用户名和密码也无法完成升级,这个是服务器端的权限设置问题,不是用户的问题。
可以在wordpress安装路径下的配置文件wp-config.php的最后加入下面代码:
```
define("FS_METHOD", "direct");
define("FS_CHMOD_DIR", 0777);
define("FS_CHMOD_FILE", 0777);
```
问题就得到了解决。
上述代码实际上是为WordPress更新或下载插件时,提供了权限。
### 上传文件问题
无法将上传的文件移动至wp-content/uploads/
如果遇到以上问题,我们可以尝试以下解决方法:
找到 wp-config.php 配置文件;
找到 require_once(ABSPATH .’wp-settings.php’);
也可能是
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
在搜索的代码上方,添加以下语句:
```
define(‘CONCATENATE_SCRIPTS’, false );
```
参考文档
https://jingyan.baidu.com/article/495ba841e3f93938b30ede0a.html
### wp-config.php文件配置
根据上面的说明,到最后我的wp-config.php文件最后内容如下
```
-----以上省略默认内容---------
/** Sets up WordPress vars and included files. */
define(‘CONCATENATE_SCRIPTS’, false );
require_once ABSPATH . 'wp-settings.php';
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false){
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
define('WP_HOME','https://www.limvs.cn/');
define('WP_SITEURL','https://www.limvs.cn');
define("FS_METHOD", "direct");
define("FS_CHMOD_DIR", 0777);
define("FS_CHMOD_FILE", 0777);
```
参考文档
https://www.jianshu.com/p/fc5b6bd297b8?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin
http://www.mustenaka.cn/index.php/2020/04/06/stovewordpressneedauthorityin/
https://jingyan.baidu.com/article/495ba841e3f93938b30ede0a.html