Windows Server系统的服务器虽然入门容易,但是后期维护特别麻烦,于是就想将网站转移至方便维护的Linux系统。
  本文主要包括Docker的安装,Docker下Wordpress及MySQL的建立,Https证书的申请,Nginx的反向代理设置。

  • 本文所有操作均在Root权限下完成。操作过程可以多次建立快照,防止操作失误。
  • Docker

    Dokcer Engine的安装

      如果你的服务器位于非中国大陆地区(港澳台及海外),你可以参考官方文档进行安装。如果你是国内用户,请参照清华源的docker-ce文档进行安装,以获取更快的配置速度。这里以Debian x64系统为例,其他系统或其他Debian请自行参考官方文档进行安装。

  • 安装前你应该确保你的系统为Debian 9+
  • 0.卸载旧版本
      Docker的旧版本被称为docker,docker.io或docker-engine,如果已安装,请卸载它们。如果之前从未安装过Docker请忽略这一步。

    apt-get remove docker docker-engine docker.io containerd runc

    1.设置Docker仓库
      更新apt,并允许使用HTTPS来获取仓库。

    apt-get update
    apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    

    2.添加Docker官方GPG密钥
      注意命令结尾有连词符‘-’。

    curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

      验证密钥9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的最后8位,来判断是否成功安装密钥。(这一步非必要)

    apt-key fingerprint 0EBFCD88
    

      你会得到类似下面结果。

    pub   4096R/0EBFCD88 2017-02-22
          Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid                  Docker Release (CE deb) 
    sub   4096R/F273FCD8 2017-02-22
    

    3.添加Docker稳定版仓库

    add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/debian \
       $(lsb_release -cs) \
       stable"

      如果你确定你的Debian 10的发行版本为buster。你也可以执行下面的命令,两者等效。

    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

    4.安装Docker
      自此,在更新apt后直接安装即可。

    apt-get update
    apt-get install docker-ce docker-ce-cli containerd.io

    Docker Engine的卸载

      如果不再使用Docker可以按照下面的命令进行卸载。
      1.卸载有关包。

    apt-get purge docker-ce docker-ce-cli containerd.io

      2.清除容器和镜像。

    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd

    数据库部分

    Docker下MySQL的安装

      安装最新的MySQL(MySQL 8)即可,即使你原先Wordpress的数据库为MySQL 5也可以成功导入。
      1.获取最新的MySQL镜像

    docker pull mysql

      2.启动MySQL

    docker run --restart=always --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

      相关参数:--restart=always代表开机启动。--name为容器重命名。-p端口映射,格式为本机端口:容器端口,3306为MySQL默认监听端口。MYSQL_ROOT_PASSWORD=123456代表MySQL的root账户密码为123456,建议设置一个复杂的密码,或者配置完成后进入容器内修改。

    MySQL数据备份

      Docker下MySQL数据备份可参考下面的命令:

    docker exec -it  mysql mysqldump -uroot -p123456 --all-databases > all.sql

      此命令可以将所有数据库内所有信息备份到当前目录下的all.sql,-u后面接数据库用户名root,无空格即可。-p后面接数据库密码123456。实际情况根据个人自行调整。--all-databases代表全部数据库,如果想导出某一数据库,输入数据库名称即可。mysql代表运行MySQL的Docker容器的名称。
      非Docker下(运行在本机)MySQL导出参考下面这个命令:

    mysqldump -uroot -p123456 --all-databases > all.sql

    MySQL用户创建及数据导入

      如果你搭建的Wordpress直接使用MySQL的root账号,且为新建站点,可忽略这一环节。
    1.将备份的数据导入容器(新建站点忽略这一步)
      进入备份数据存放的目录,执行下面的命令,将备份数据导入容器。wordpress.sql为备份文件的名称。

    docker cp wordpress.sql mysql:wordpress.sql

    2.进入容器,连接数据库

    docker exec -it mysql bash
    mysql -u root -p123456

    3.创建Wordpress数据库
      新建站点的话创建数据库名称随意。如果是旧站迁移,请参考wordpress目录下wp-config.php文件,里面包括原有的数据库名称DB_NAME、数据库用户DB_USER、数据库用户密码DB_PASSWORD等信息。旧站迁移,建议尽量与原有信息保持一致。
      在MySQL中执行下面语句完成数据库创建。wordpress为数据库名称。注意MySQL语句结尾有分号’;’。

    create database wordpress;

    4.创建wordpress数据库用户并授权。

    # 创建wordpress用户wordpressuser,密码为password。 @'%'表示允许任意地址登录。
    CREATE USER 'wordpressuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
    # 授权,将数据库wordpress的权限全部授予wordpressuser
    GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'%';
    # 刷新权限
    flush privileges;
    # 退出数据库连接。
    exit;
    

    5.导入数据库(新建站点忽略这一步)
      -D后面为数据库名称

    mysql -uwordpressuser -ppassword -D wordpress < wordpress.sql
    

    6.检查数据是否导入成功,并修改站点信息。(新建站点忽略这一步)

    # 登录数据库
    mysql -uwordpressuser -ppassword -A
    # 选择数据库
    use wordpress;
    # 检查是否有数据,如果返回有关信息则表示导入成功。
    show tables;
    # 修改域名重定向,根据个人情况自行修改。(如果域名没变则忽略这一步骤)
    update wp_options set option_value='https://wp.for-get.com' where option_name='siteurl';
    update wp_options set option_value='https://wp.for-get.com' where option_name='home';
    # 退出数据库
    exit;
    

    7.退出容器
      执行exit即可。

    WordPress部分

    Docker下Wordpress安装

    1.获取最新的wordpress镜像

    docker pull wordpress

    2.网站迁移(新建站点忽略这一步)
      进入到原先网站根目录,将原有网站打包压缩。

    cd /var/www/wp_for-get/
    tar -cvf wp_for-get.tar *
    

      解压至新目录

    tar -xvf  wp_for-get.tar -C /var/www/wp_for-get
    

    2.5设置权限(新建站点可忽略这一步)

    cd /var/www
    chown -R www-data:www-data /var/www/wp_for-get
    chmod -R 775 /var/www/wp_for-get
    chmod -R 777 /var/www/wp_for-get/wp-content/
    

    3.启动Wordpress容器。

    docker run --restart=always -d -p 7000:80 --name wp_for-get -v /var/www/wp_for-get/:/var/www/html/ wordpress

      相关参数:--restart=always代表开机启动。--name为容器重命名。-p端口映射,格式为本机端口:容器端口,这里是将容器内80也就是容器的http默认端口映射到宿主机的7000端口,为什么不直接映射80端口,这里是为后面多网站及https配置做准备。-v表示容器挂载宿主机的一个目录到容器。值得注意的是,如果这里宿主机目录为空,则wordpress会执行全新安装。到此你可以通过访问http://公网ip:7000/来进行访问wordpress。手动完成数据库配置。(由于数据库映射到了宿主机的3306,则数据库地址为172.17.0.1:3306,此地址有效的条件是你没有修改默认的docker网络配置)。

    注:

      1.如果更新提示填写FTP信息则在wp-config.php里添加如下代码:

    define(FS_METHOD, direct);
    define(FS_CHMOD_DIR, 0777);
    define(FS_CHMOD_FILE, 0777);
    

      2.如果下载插件失败可以在wp-config.php里添加如下代码:

    define('WP_TEMP_DIR', ABSPATH . 'wp-content/plugins');
    

      3.修改数据库连接地址,修改wp-config.php中的define('DB_HOST', 'mysql');define('DB_HOST', '172.17.0.1');

    HTTPS部署

      Https只需要部署在最外层的Nginx即可,无需对docker容器进行操作。保证客户端到服务端(Nginx)加密就足够了,服务器内部Nginx到Docker再进行加密,会显得有些多余。

    HTTPS证书申请

      这里以申请免费的let's encrypt为例。
    1.acme.sh下载
      直接使用git clone到本地就行了。

    git clone https://github.com/acmesh-official/acme.sh.git
    cd acme.sh

    2.获取DNS api
      这里以cloudflare为例。在cloudflare右上角-我的个人资料。选择API令牌标签,创建令牌。在API 令牌模板中找到编辑区域 DNS的模板,选择使用此模板。其配置情况如图。

      继续显示摘要,创建令牌。最后你就会到一串字符串,那就是Cloudflare API token。
    3.申请证书。
      继将刚刚得到的token导入变量。xxxxx为刚刚得到的token。

    export CF_Token="xxxxx"

      其他DNS服务商的api token导入方法可以参考acme.sh的说明文档
      然后利用acme.sh申请证书即可

    ./acme.sh --issue --dns dns_cf -d for-get.com -d wp.for-get.com
    

      -d参数后面为要申请证书的域名。多域名申请多添加参数-d xxx.xx即可,支持*泛解析。顺利的话一分钟内就可成功申请证书。

      1.证书默认保存在~/.acme.sh/。这里是使用root执行,故保存路径为/root/.acme.sh/。导入的token信息也将保存在此目录下的account.conf
      2.使用dnsapi申请证书,默认情况下会60天自动续期。如果想要取消自动续订可以执行

    ./acme.sh --upgrade --auto-upgrade 0

      恢复自动续订执行

    ./acme.sh --upgrade --auto-upgrade

    Nginx反向代理及HTTPS证书部署

      这一步解决域名绑定等问题。
    1.安装Nginx
      直接apt安装即可。

    apt update
    apt install nginx
    

      启动并添加开机启动Nginx

    systemctl enable nginx
    systemctl start nginx
    

    2.获取默认配置
      执行nginx -t会得到如下信息

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

      /etc/nginx/nginx.conf就是nginx的配置文件。去掉ssl_protocols后面的TLSv1.0 TLSv1.1,并加上TLSv1.3以获取更高的安全性。

    #ssl_protocols TLSv1.0 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    

    3.创建站点配置文件,完成反向代理及证书部署
      创建站点配置文件

    touch /etc/nginx/sites-available/wp_for-get
    ln -s /etc/nginx/sites-available/wp_for-get /etc/nginx/sites-enabled/wp_for-get

      编辑配置文件/etc/nginx/sites-available/wp_for-get内容如下

    # 将80端口(http)访问301重定向至https
    server {
            listen 80;
            listen [::]:80;
            # server_name为绑定的域名
            server_name  wp.for-get.com;
            return 301 https://$server_name$request_uri;
    }
    
    server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    
            # 证书文件位置,根据个人情况自行修改。
            ssl_certificate /root/.acme.sh/wp.for-get.com/wp.for-get.com.cer;
            ssl_certificate_key /root/.acme.sh/wp.for-get.com/wp.for-get.com.key;
    
            server_name wp.for-get.com;
    
            # 禁止纯ip访问。
            if ($host ~ "\d+\.\d+\.\d+\.\d") {
                return 400;
            }
    
            # 反向代理
            location / {
                    # 照抄就行,注意下面是http,端口号为wordpress映射到宿主机的端口号
                    proxy_pass http://172.17.0.1:7000;
                    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-Proto $scheme;
            }
    }
    

      执行nginx -s reload保存配置,如果没有报错,则站点https配置全部完成。新站点需要在后台修改站点地址、wordprerss地址。为了防止恶意访问,你需要在服务器运营商的防火墙禁用wordpress映射到宿主机的端口,比如我这里配置的7000端口。

      现在,你可以通过访问https://你的域名/来访问wordpress了。


      如果本文有错误的地方,欢迎在评论中指出。