0x01 前言

我网站的域名从原来的proj.org.cn更换为现在的enginx.uk,依旧使用开源SSL项目Let’s Encrypt的数字证书提供HTTPS服务,而整个更改域名的过程仅仅用了不到10分钟。

0x02 准备

在正式切换域名之前要完成以下准备工作:

  1. 配置新域名的DNS指向
  2. 创建新域名的数字证书
  3. 创建新域名的nginx配置文件
  4. 创建新域名的apache配置文件
  5. 创建新域名的PHP配置文件
  6. 安装域名切换插件

0x03 实操

0x03.1 DNS

我使用DNSPod提供的免费DNS解析服务。首先需要在域名服务商处将DNS服务器更改为DNSPod的服务器:

#DNS Server1
f1g1ns1.dnspod.net.

#DNS Server2
f1g1ns2.dnspod.net.

修改DNS服务器的生效时间从10分钟到24小时不等,而我修改之后大概10分钟就生效了。然后添加DNS记录:

DNSPoD生效的速度还是挺快的,稍等几秒后通过dig命令即可查询是否生效:

MacBook-Air-Lan:~ terence$ dig enginx.uk

; <<>> DiG 9.8.3-P1 <<>> enginx.uk
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17908
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;enginx.uk.			IN	A

;; ANSWER SECTION:
enginx.uk.		3271	IN	A	103.231.253.45

;; Query time: 234 msec
;; SERVER: 10.1.1.1#53(10.1.1.1)
;; WHEN: Sat Dec 10 13:07:31 2016
;; MSG SIZE  rcvd: 43

MacBook-Air-Lan:~ terence$ dig www.enginx.uk

; <<>> DiG 9.8.3-P1 <<>> www.enginx.uk
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51974
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.enginx.uk.			IN	A

;; ANSWER SECTION:
www.enginx.uk.		3600	IN	CNAME	enginx.uk.
enginx.uk.		3267	IN	A	103.231.253.45

;; Query time: 67 msec
;; SERVER: 10.1.1.1#53(10.1.1.1)
;; WHEN: Sat Dec 10 13:07:35 2016
;; MSG SIZE  rcvd: 61

0x03.2 数字证书

数字证书我用的是Let’s Encrypt所签发的数字证书,在这篇文章里不涉及相关的内容。但如果你觉得这比较麻烦,可以尝试使用encryption everywhere的免费项目,可以获的由symantec签发的一年有效期的数字证书。

相对于Let’s Encrypt 90天有效期来说,一年期更有吸引力。这两个免费的项目都不支持签发泛域名数字证书,而且encryption everywhere项目仅支持单域名,如果你需要一张多域名(SAN SSL)数字证书,那么Let’s Encrypt是首选。

0x03.3 配置文件

我只需要将原来的配置文件复制一份并且修改域名即可完成对nginx的配置,因为nginx是作为前端服务器,所以修改完成后reload也不会对正在运行的网站有所影响。

#进入目录
[root@hk1 ~]# cd /usr/local/nginx/conf.d/

#复制文件
[root@hk1 conf.d]# cp proj.org.cn.ngx.conf enginx.uk.ngx.conf

#修改文件
[root@hk1 conf.d]# vim enginx.uk.ngx.conf

要确认server_name、证书路径、root路径正确,确认无误后即可reload nginx服务:

#重新加载nginx
[root@hk1 conf.d]# nginx -s reload

apache和PHP的操作方法和nginx一致,这里不再叙述。但不要急着重启apache和PHP服务!先进行下一步操作。

0x03.4 插件

以前使用Wordpress的时候如果需要更换域名,我需要对数据库进行操作。但现在通过插件即可完成所以域名的替换。推荐使用以下插件:

Automatic Domain Changer

安装完毕后在工具>change domain中修改:

一旦通过插件更换域名完毕后,即可重启apache和PHP服务。

0x04 其他

如果你和我一样使用WP Super Cache和Wordfence Security,那么你还需要注意以下内容:

#修改Wordpress配置文件wp-config.php
[root@hk1 public_html]# vim wp-config.php

#修正以下路径
define( 'WPCACHEHOME', '/usr/local/html/enginx.uk/public_html/wp-content/plugins/wp-super-cache/' ); //Added by WP-Cache Manager

因为Wordfence Security的需要,还需要修改php.ini文件:

#修改php.ini
[root@hk1 etc]# vim php.ini

#修正以下内容的路径
[HOST=enginx.uk]
auto_prepend_file = '/usr/local/html/enginx.uk/public_html/wordfence-waf.php'

还有很重要的一点,因为修改了域名,那我们肯定不想访客和搜索引擎的爬虫通过旧域名访问时返还404或403。为此我们需要修改旧的nginx配置文件,将从旧域名进入的访客重定向至新域名:

#修改文件
[root@hk1 ~]# vim /usr/local/nginx/conf.d/301-temp.ngx.conf

#修改内容如下
server {
    listen                  80;
    server_name             proj.org.cn www.proj.org.cn;

    rewrite ^/(.*)$ https://ngx.hk/$1 permanent;
}

server {
    listen                  443 ssl;
    server_name             proj.org.cn www.proj.org.cn;

    ssl                     on;
    ssl_certificate         /usr/local/nginx/ssl/proj.org.cn.crt;
    ssl_certificate_key     /usr/local/nginx/ssl/proj.org.cn.key;
    ssl_buffer_size         16k;
    ssl_ciphers             ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;
    ssl_prefer_server_ciphers   on;
    ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
    ssl_session_cache       builtin:20480 shared:SSL:10m;
    ssl_session_timeout     3h;
    ssl_stapling            on;
    ssl_session_tickets     on;
    add_header              X-Content-Type-Options nosniff;
    add_header              X-XSS-Protection "1; mode=block";
    add_header              Strict-Transport-Security "max-age=31536000; preload; includeSubDomains" always;

    rewrite ^/(.*)$ https://ngx.hk/$1 permanent;

}

完成后重新加载nginx即可:

[root@hk1 ~]# nginx -s reload

0x05 结语

一切顺利的话,10分钟即可完成域名的更换操作。