Table of Contents

  1. 背景
  2. 前期准备
  3. wordpress docker
  4. 域名+https
  5. 实用工具及插件

背景

2019双11买了阿里云的服务器,一直搁浅没有用,虽然便宜但不能一直放着吃灰。就从做最简单的服务—-个人博客,开始吧。


前期准备

  • 阿里云服务器: Ubuntu 18.04 64位 1核 2g
  • 域名:阿里云上买的,域名要先经过阿里云的审核(12天),就是上传个人信息和身份证。之后还要经过国家工信部备案系统的审核(12周),过了之后方可使用。
  • ssl证书:阿里云也提供免费的证书。DigiCert 免费版 SSL。在使用https时会需要该证书。
  • blog框架:自从在项目中接触了docker,仿佛发现了新大陆,快速搭建部署环境的利器,并且不会污染宿主环境。所以直接用wordpress的docker image来一键部署。

wordpress docker

wordpress基于apache+php+mysql,docker compose为多服务一键启动和管理提供了相当便利的操作。只需要一个docker-compose.yml文件。我使用的yml如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '3.3'
services:
db:
image: mysql:5.7 #先在本地机器查找mysql image,找不到就会去docker hub上pull
ports:
- "3306:3306" #绑定contanier中的3306端口到宿主机的3306端口
volumes:
- ./db_data:/var/lib/mysql
#将container中的目录挂载到宿主机本地,实现docker容器中的数据持久化,不会因为container的
# 重启而丢失数据
restart: always #自动重启container
environment: #给container增加环境变量
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db #depends_on 指示了服务start的顺序,先db,后wordpress
image: wordpress:latest
ports:
- "80:80"
- "443:443" #因为要开启https,所以绑定443
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- ./html:/var/www/html

start: $ docker-compose -f docker-compose.yml up -d

stop : $ docker-compose -f docker-compose.yml down

docker起来之后就可以,记得要去阿里云安全组规则中设置中开放相应的端口,默认是是开放了3389(远程桌面登录的默认端口),22(ssh端口)。所以增加80,443,3386端口。

之后就可以通过阿里云给分配的公网ip地址的方式访问wordpress了,最开始访问是进入wordpress的安装界面,填好相应的信息,就可以定制化你的博客了。


域名+https

虽然blog是在自己服务器上,别人也只是浏览一些静态页面,但是作为一家网络安全公司的员工,怎么能容忍数据在网络上裸奔呢?来,上https。(之后会专门写一篇关于加解密的扫盲级blog)。

这是我在阿里云上申请的免费证书,证书提供商是一家老牌的美国CA认证中心–DigiCert,小细节该免费证书在阿里云只能绑定域名,不能绑定ip,所以一开始域名还没通的时候,通过ip访问时https不work。

  • 服务端apache开启tls/ssl

    https是以tls/ssl作为支撑的,要实现https通信,首先确认服务端时候具备tls/ssl的条件,即是否开启了openssl服务(OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议)。

    1. 进入wordpress的container,查看openssl是否开启:

      进入container内部,测试后看出openssl是开的。

    2. 加载apache ssl模块

      1
      $ a2enmod ssl  

      a2enmod :enable or disable an apache2 module

    3. 修改 SSL 配置文件,绑定证书及打开 443 端口

      Apache 加载 SSL 模块后,会在 /etc/apache2/sites-available 下生成 default-ssl.conf 文件.

      编辑此文件,其中这两行就是放证书的地方,把从阿里云下载(下载证书时会选相应的http server类型,我们选择我们需要的apache)下来的证书放到某个位置(可以mount到宿主机可以直接cp到container里面)并更新位置。

      从阿里云下载下来的证书是一个key文件,两个crt文件,我们需要合并这两个crt到.pem,做法也很简单,用notepad++打开将_public.crt内容在前,换行,_chain.crt在后组织成.pem文件。
      从 apache 的配置文件 apache2.conf 可以看到,apache 只会读取 /etc/apache2/sites-enabled 目录的配置文件,所以需要把 /etc/apache2/sites-available 下的 default-ssl.conf 文件链接到 /etc/apache2/sites-enabled 目录下。

      1
      $ ln -s /etc/apache2/sites-available/default-ssl.conf \ /etc/apache2/sites-enabled/default-ssl.conf 
    4. http 请求强制跳转到 https

      编辑 /etc/apache2/sites-available/000-default.conf在 <VirtualHost *:80>  标签中增加下面的配置。重启容器,就是https啦!

  • wordpress 修改配置以及数据库修改

    server端已经就绪,但是访问网站,还需要在wordpress面板里的设置=>常规中修改下面两项来正确路由。

    由于https之前使用的是http+ip,开启https后,之前记录在数据库中使用http的协议的链接或者多媒体可能无法访问,需要更新下。
    update wp_posts set post_content = replace(post_content,’http://www.winterio.com.cn','https://www.winterio.com.cn');

  • 为什么是灰色🔒不是绿色🔒?

    再次访问已经https,灰色小锁,代表是安全的。
    之前访问一些https的网站时绿色小锁,查了一下原因,灰色是因为页面中有非https内容。打开我的网站首页,发现里面的html代码里有引用其他第三方库的js,这些链接是http,如何把这些第三方的不在自己数据库的非http链接的内容walk around掉,方法也有很多不赘述,google一下都有,我这边就没更改。


实用工具及插件

WP Statistics:wordpress 提供了很多插件,按需安装。WP Statistics,可以理解为网站的一个流量分析可视化工具。

sNa1XT.md.png

SQLyog:在操作数据库的时候,为了好操作,下了一个mysql的可视化客户端软件,远程连接到服务器docker中的mysql。

sNa8nU.md.png