Docker部署WordPress+Nginx开启HTTPS

本文使用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

你可能感兴趣的:(Docker部署WordPress+Nginx开启HTTPS)