[網站] 網域搬新家、升級 HTTPS 與 HTTP/2(長篇大論版)

各位新年快樂!寒假開始後,除了出一個星期的池上野外以外,也幫網站搬了個家,並且將網站增加了HTTPS (加密連線)與 HTTP/2 的支援(載入速度更快的樣子)。下面會大概記錄一下這次到底做了什麼~

購買網域(Domain)

網域就是家裡的門牌,也是一個網站最重要的東西,畢竟沒有好記的門牌,大家應該也記不住,也就不會常來了~

之前的就網域是 lcabon.ddns.net ,為什麼會這樣取,其實是因為希望網域念起來像 Carbon (碳),因為碳的多樣性的組合,各種有機物與無機物,讓我們的生活充滿了無限的可能,這個網域其實是 no-ip 提供的,在主機更新後,一直遇到 Domain 的問題(Jetpack 無法連線等),所以萌生申請新網域的念頭,還有一點就是:不能用 HTTPS!

要買網域,就開始上網找哪裡買,國內就中華電信、PCHome等,國外則是 GoDaddy、Google等,後來發現國內的其實沒有特別貴,「.tw」網域一年八百,「.idv.tw」則是一年四百,想說第一次買就買便宜一點的好了(雖然比較長啦,但是現在應該沒有人在記網址了,都用書籤了吧?),於是就買了 lcarbon.idv.tw 的網域啦(灑花🎉)

DNS 代管

DNS是一個幫你把網址變成 ip 位置的主機,打個比方的話就像查號台吧,你問 「google.com」的主機在哪,DNS 伺服器就會幫你查找,最後傳回電腦對應的 ip 位置。雖然 Hinet 可以代管DNS,可是他們家的 DDNS Client 在我的小主機(樹莓派)卻裝不起來(也很久沒維護的樣子了)。後來發現了 Cloudflare 這家公司,提供了免費的 DNS 代管,甚至還有三種不同模式 SSL 連線方式可以用,因此就決定是你了!

設定步驟也不難,申請完帳號以後,在 Hinet Domain 設定中,找到「DNS 異動與查詢」,將 Name Server (NS) 設定成 CloudFlare 的兩台主機:

DNS Server Name : IP Address
daisy.ns.cloudflare.com : 173.245.58.90
lynn.ns.cloudflare.com : 173.245.59.201

接著到 CloudFlare 的主控台,設定好 網域名稱 後,在「DNS」標籤下,增加兩筆 DNS Record :

Type/Name/Value/TTL
A / lcarbon.idv.tw / $Your_IP_Address / Automatic
A / www.lcarbon.idv.tw / $Your_IP_Address / Automatic

如果不知道自己的 ip 位置,可以到這邊查詢:http://ipv4.icanhazip.com

基本上,等 DNS 設定生效後,就算是完成工作了!不過,動態 DNS 怎麼辦呢?

動態 DNS (DDNS for CloudFlare.com)

因為使用撥皆的方式上網,是非固定制的連線,所以 ip 可能隨時間一直改變,這時候就要時常更新 DNS 的資料,才可以順利指到目前主機的位置。

CloudFlare 雖然沒有提供官方軟體,不過確有提供一個 API ,可以讓你使用 HTTP 的四種請求來取得或操作資料。我也用 Python 寫了一個讓主機自己更新 DNS 網址的小程式,雖然不太智慧,不會比較目前的 ip 是不是和網路上的紀錄相同,就直接要求更新,進而有時會傳回錯誤訊息,未來有時間再實做這部分的工作:

有些事前準備工作需要先完成:找到自己的 Zone ID(對應一組 Domain)與 API Key (這就像是你的密碼,不要隨意透露),並填入後面強調的 Python 程式碼中(10-13行):

找到對應自己網域的 Zone ID
找到對應自己獨特的 API key

DDNS 的 Python 程式碼如下:
測試版本:Python 3.5.1,不用安裝額外的 Library。
第 10-13 行請填入自己的資訊

使用 crontab 排程來自動更新

Linux 中例行性工作排程可以利用 crontab 指令完成,在 >鳥哥< 的網站有較詳細的介紹。

跑出一張表格後,在最下面加入一段工作的指令(擇一即可):

最後面請改成上面 Python 檔案路徑。存檔後系統就會定時上傳 IP 位置給 CloudFlare 了!

SSL 憑證

接下來是 HTTPS 化,簡而言之就是讓網頁伺服器加密與使用者端連線加密,讓資訊不要被洩漏出去,

一般而言,雖然可以自己核發簽證給主機用,但是因為沒有經過第三方認證,瀏覽器會跑出這是不安全的連線…原本在看 GoDaddy 的 SSL 憑證,一年大概兩千多台幣把,後來發現了 Let’s Encrypt 的網站,有免費的 CA 可以使用(詳細原理請見 >官網< )。

Let’s Encrypt 設定

我的伺服器是 Ubuntu + Apache2 ,因為有 Shell Access(可以自己執行指令),所以就藉由 Certbot 這個軟體的幫忙來取的 SSL。(連結 >這邊請<

基本上是先安裝必要的程式:

接下來就有點不一樣了,因為 CloudFlare 似乎無法使用網頁的方法完成設定(這邊不太懂為什麼…)錯誤訊息的範例如下:

在網路論壇(>這邊<)找到一個對應的解決辦法:

這邊說明一下要改的參數:

  • –webroot-path 這個後面要接你的網頁的根目錄在哪(這邊是 Apache2 預設值)。
  • –email 後面接你常用的 Email ,因為憑證只有 90 天的有效期,所以到期要手動更新(或是排程)。
  • -d 後面填入你的網域,最好是所有子網域都填上,比如我的網站是 www.lcarbon.idv.tw 與 lcarbon.idv.tw

如果成功了,大概可以看到以下的訊息:

接著,我們看一下 /etc/letsencrypt/live/www.lcarbon.idv.tw/ 到底有什麼:

這邊記下三個重要的檔案的路徑,等一下會用到:cert.pem、fullchain.pem、privkey.pem

要更新憑證時,則使用以下的指令:(未測試)

Apache2 設定

首先,要先啟動 SSL 模組(我被這邊弄三四個小時找不到哪裡錯,所以一定要先記得做這件事!!!!!)

接著重新啟動 Apache2 的服務:

然後我們就可以設定一下 apache2 的 site configuration (在 /etc/apache2/sites-available/ 裡面):

請注意:要註解(#)掉原本預設的 SSLCertificateFile、SSLCertificateChainFile、SSLCertificateKeyFile 三項參數的路徑,換成上面 Let’s Encrypt 得到的路徑!

接著啟用設定:

到這邊基本上完成伺服器端的 SSL 設定,可以測試一下將自己的網站由 http 改為 https 以後能不能工作!

更改 WordPress 文件夾中 wp-config 與 .htaccess 檔案來使用 https

這邊有幾個東西要改為 https: WordPress 設定 與 .htaccess 設定。

WordPress 設定:

在主控台右方「設定 > 一般」中,找到「WordPress 位址(URL)」與「網站位址(URL)」的欄位,將 「 http:// 」 改為 「 https:// 」。

.htaccess 設定

在 .htaccess 中插入下面的片段,來將 http 的要求全部轉到 https:

如果只想要在登入畫面使用 https

在 wp-config.php 加入下面一行:

.htaccess 的設定忘記了,有找到再貼上來…

Apache2 重起時如果出現錯誤…使用 systemctl status apache2.service 指令來看為什麼吧!

HTTP/2 協議

目前主流的網路協定使用 HTTP/1 、 HTTP/1.1 ,經過十幾年的時間終於在 2015 年訂定了新的標準 HTTP/2 ,主要可以加速網路傳輸的速度,並且不用改變已經開發的程式,因為不是自己專業,請自己上網找一下相關的文章,( >這邊有有趣的網站比較載入速度<

首先要更新 Apache2 :

加入下面的來源來獲得最新的 Apache2 程式:

接著更新:

系統應該會自動安裝所需要的程式。

安裝完成後,就要來啟用啦!

然後我們要在 apache2 的 site configuration (在 /etc/apache2/sites-available/ 裡面)設定一下:

在 Port 80 (http)的 VirtualHost(如: 000-default.conf ),加入:

在 Port 443 (https) 的 VirtualHost(如:default-ssl.conf ),加入:

最後,在使 Apache2 重新讀取設定:

如此一來就完成啦!!

結語

維護一個網站真的不是一件簡單的事,不過最後成功升級到 SSL + HTTP2 ,真是喜事一件!!

祝大家新年快樂,萬事順心啦~

參考資料:

  1. TWNIC DDNS 設定等說明 : https://rs.twnic.net.tw/tw-dyndn.html
  2. 使 Let’s Encrypt 程式可以順利取的利用 CloudFlare.com DNS代管功能網站的方法:https://support.cloudflare.com/hc/en-us/articles/214820528-How-to-Validate-a-Let-s-Encrypt-Certificate-on-a-Site-Already-Active-on-CloudFlare
  3. Apache2 啟用 SSL :http://www.arthurtoday.com/2011/11/ubuntu-apache-ssl-self-signed.html
  4. 更改 .htaccess 檔案強制轉址到 https:http://www.inmotionhosting.com/support/website/ssl/how-to-force-https-using-the-htaccess-file
  5. 比較 HTTP1.1 與 HTTP2 的載入速度網站:https://http2.akamai.com/demo
  6. HTTP2 on Wikipedia :https://en.wikipedia.org/wiki/HTTP/2
  7. Apache2 的 mod_http2 介紹:https://httpd.apache.org/docs/2.4/mod/mod_http2.html

2 則迴響

  • 好奇訪客

    2017-03-03

    你文中寫採用 Let’s Encrypt SSL 但是瀏覽器上確是 COMODO ??

    回復
    • Sun

      2017-03-03

      因為我用 CloudFlare 的 CDN 服務,而且 SSL 是用 Full 的方案(我的主機連到 CF 主機有加密,CF 主機對外也有加密),所以對外的話應該是看到 CF 的認證,之前還沒開啟 CDN 的時候認證的確是 Let’s Encrypt SSL。

      回復

請多多指教!

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料