1. 程式人生 > >從零到一快速搭建個人部落格網站(域名備案 + https免費證書)(一)

從零到一快速搭建個人部落格網站(域名備案 + https免費證書)(一)

## 前言        為什麼選擇搭建個人部落格?一方面是各個平臺經常下架原創文章,另一個方面是為了熟悉整個建站流程。        通過搭建個人部落格,我們可以自由的發表文章不用擔心下架,而且可以鍛鍊個人的SEO優化能力,不管是運維還是運營這塊對個人的技術提升有著很大的幫助。        本篇文章記錄了網站從零到一的過程,希望你也能根據本篇文章搭建出屬於自己的網站。大家有疑問可以一起討論。        下面開始正題。 ## 環境介紹 |資源|說明| |--|--| | centos | v7.2 | | docker|快速部署專案環境 | | nginx| 反向代理,同時配置https證書 | | halo| v1.4.2,開源部落格專案 | | Let's Encrypt 免費證書|配置https | ## 效果演示 [zander](https://yangwq.cn/) ## 前置環境安裝 ### Docker安裝        可以參考博主以前的文章:[Centos7.2 安裝docker、mysql和redis](https://www.cnblogs.com/winkin/p/14083574.html) ### halo安裝 #### 準備halo配置檔案 ```powershell # 下載配置檔案到 /home/halo/.halo 目錄 curl -o /home/halo/.halo/application.yaml --create-dirs https://dl.halo.run/config/application-template.yaml ```        修改配置檔案,將資料庫調整為mysql,預設是h2(可選) ![](https://img2020.cnblogs.com/blog/1116838/202012/1116838-20201214205839216-1011592214.png)        將上面h2的資料庫註釋,並把mysql的配置開啟,注意,需要提前在mysql建立資料庫 halodb,相關的資料庫表halo會自動生成,如果mysql 和 halo都是容器建立的,這裡配置的mysqlip應該是mysql容器內部的ip。 ```powershell # 檢視mysql容器的ip,mysql-prod替換成mysql容器名稱或者容器id docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql ```        修改後: ![](https://img2020.cnblogs.com/blog/1116838/202012/1116838-20201214205855514-1938268269.png) #### 下載並安裝halo ```powershell # 拉取halo映象 docker pull ruibaby/halo # 執行halo # -p 8090:8090 指定宿主機埠與容器埠對映,這裡是將宿主機的8090對映到docker的8090 # -v /home/halo/.halo:/root/.halo 掛載halo配置檔案,我們在上一步下載了配置檔案在宿主機的/home/halo/.halo docker run --rm -it -d --name halo -p 8090:8090 -v /home/halo/.halo:/root/.halo ruibaby/halo ## 檢視容器狀態,確認halo是否啟動成功,如果啟動失敗需要檢查下資料庫連線 docker ps # 配置防火牆,注意,阿里雲需要同時配置安全組8090埠 # 開放8090埠 firewall-cmd --permanent --add-port=8090/tcp #重啟防火牆(修改配置後要重啟防火牆) firewall-cmd --reload ```        正常情況應該如下: ![](https://img2020.cnblogs.com/blog/1116838/202012/1116838-20201214205907455-926728768.png)        經過上面的步驟建立的halo還不能通過外部ip訪問,我們現在配置一個nginx進行代理 ### nginx安裝 ```powershell # 下載nginx映象 docker pull nginx # 啟動nginx docker run -p 80:80 --name nginx -d nginx # 我們需要nginx使用我們自定義的配置,最方便的方法將nginx現在有的配置複製一份到宿主機目錄 /home/nginx docker container cp nginx:/etc/nginx /home/nginx # 移除我們剛建立的nginx,重新以宿主機配置目錄啟動 docker stop nginx docker rm nginx # 編輯 conf.d 下的default.conf 檔案,預設轉發到halo埠,ip地址為本機ip location / { root /usr/share/nginx/html; index index.html index.htm; } 改為,10.0.2.5 為本機ip,通過命令 ip addr 檢視,埠是halo的埠: location / { proxy_pass http://10.0.2.5:8090; } # 重新建立nginx docker run -p 80:80 --name nginx \ -v /home/nginx/logs:/var/log/nginx \ -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/conf.d:/etc/nginx/conf.d \ -d nginx # 配置防火牆,注意,阿里雲需要同時配置安全組80埠 # 開放80埠 firewall-cmd --permanent --add-port=80/tcp #重啟防火牆(修改配置後要重啟防火牆) firewall-cmd --reload # 到這裡,我們可以通過ip訪問halo了 ```        到這一步如果不能使用ip直接訪問,首先確定halo啟動成功沒,然後檢視nginx配置是否正確,最後再檢查防火牆和安全組。 ## 域名及網站備案        目前我們只能通過ip訪問halo,我們可以通過配置域名進行訪問。        首先我們得申請一個域名:[域名註冊](https://wanwang.aliyun.com/domain)        申請完成後進行備案:[備案](https://beian.aliyun.com/)        備案注意事項:               1、如果處於異地工作的情況,建議備案地點選擇老家,而且手上要有老家的手機號,如果選擇異地的話,需要你提供臨時居住證之類比較麻煩。               2、阿里雲備案時間在一週左右,一般提交申請會有人找你確認資訊,之後按備案流程走就行了。 ## 配置https        一般情況證書是需要購買的,但是也有一些平臺提供了免費證書,阿里雲也有一年的免費證書,但是阿里雲證書只能單個域名使用,如果要萬用字元證書是需要付費的。而Let’s Encrypt 證書即可以免費申請證書,又支援萬用字元,是個人開發者的上選。        這裡我們通過github專案配置免費證書(也可以手動安裝,不過自動安裝比較方便,下面兩種方式都會提到):[letencrypt-certbot](https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au)        使用此專案前我們配置一下前置環境:certbot 和 git ### 安裝git ```powershell yum install git ``` ### 安裝certbot ```powershell # 安裝certbot,中間需要輸入y確認 yum install epel-release yum install certbot # 檢視版本,如果安裝正常會顯示版本號 certbot --version ``` ### 申請證書        特別注意的是,這裡需要主機把80埠和443埠開放,上面我們已經開放了80埠,這裡開放443埠就行了 ```powershell # 配置防火牆,注意,阿里雲需要同時配置安全組443埠 # 開放443埠 firewall-cmd --permanent --add-port=443/tcp #重啟防火牆(修改配置後要重啟防火牆) firewall-cmd --reload ```        重要提示:為避免遇到操作次數的限制,加入 dry-run 引數,可以避免操作限制,等執行無誤後,再進行真實的 renew 操作 ### 手動安裝證書+手動續期 ```powershell # 申請證書,需要填入你的郵箱和域名, --dry-run 測試使用不會生成證書,我們先用這個命令看是否成功 certbot certonly --email 你的郵箱@qq.com -d *.域名.cn -d 域名.cn --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --dry-run # 如果沒有錯誤資訊,去掉--dry-run真正生成證書 certbot certonly --email 你的郵箱@qq.com -d *.域名.cn -d 域名.cn --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory # 手動續期 certbot renew ```        安裝過程中,需要確認選項,講一下手動安裝的重點: ![](https://img2020.cnblogs.com/blog/1116838/202012/1116838-20201214205935718-1311414800.png) 安裝成功後顯示: ![](https://img2020.cnblogs.com/blog/1116838/202012/1116838-20201214205955794-949468795.png)        注意:證書90天后過期,我們手動續期的話比較麻煩,而且每次需要手動去DNS解析列表建立對應的記錄,所以推薦下面的自動續期方式 ### 通過apikey 和secret生成證書+自動續期        首先獲取api key 和secret:[阿里雲 API key 和 Secret 官方申請文件](https://help.aliyun.com/knowledge_detail/38738.html),這種方式其實是利用你開放的api key呼叫阿里雲提供的介面,所以保險起見我們建立一個許可權很小的使用者就行了。 流程:        1、為了安全,我們需要先建立RAM使用者,配置一個許可權小的使用者;        2、給新建立的使用者配置 AliyunDNSFullAccess(管理雲解析(DNS)) 的許可權;        3、獲取apikey 和 secret。 ```powershell # 新建一個目標,拉取專案 mkdir /home/certbot cd /home/certbot git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au cd certbot-letencrypt-wildcardcertificates-alydns-au chmod 0777 au.sh # 編輯au.sh,加入我們上面申請的key vi au.sh #填寫阿里雲的AccessKey ID及AccessKey Secret #如何申請見https://help.aliyun.com/knowledge_detail/38738.html ALY_KEY="" ALY_TOKEN="" # 執行命令,加上--dry-run 測試,如果沒問題去掉 --dry-run 執行,指令碼目錄就是我們上面建立的 /home/certbot/certbot-letencrypt-wildcardcertificates-alydns-au certbot certonly -d *.yangwq.cn -d yangwq.cn --manual --preferred-challenges dns-01 --email [email protected] --manual-auth-hook "/指令碼目錄/au.sh python aly add" --manual-cleanup-hook "/指令碼目錄/au.sh python aly clean" --dry-run; # 配置自動續期,使用crontab實現 vi /etc/crontab # 加入以下命令,這個命令就是每週執行一次指令碼,如果需要續期就會自動更新 0 0 * * 0 root certbot renew --manual --preferred-challenges dns --deploy-hook "docker restart nginx" --manual-auth-hook "/指令碼目錄/au.sh python aly add" --manual-cleanup-hook "/指令碼目錄/au.sh python aly clean" --manual-public-ip-logging-ok; ``` 到這一步我們證書生成成功了,同樣存放在 /etc/letsencrypt/live/yangwq.cn/ 目錄,注意這裡的檔案是軟連結,我們實際上的檔案在 etc/letsencrypt/archive/yangwq.cn 目錄 ### nginx安裝證書 ```powershell # 編輯conf.d 下的default.conf server { listen 80 default; server_name yangwq.cn; # http自動轉https rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443 ssl; server_name yangwq.cn; # 配置站點證書檔案地址 ssl_certificate /etc/letsencrypt/archive/yangwq.cn/fullchain1.pem; # 配置證書私鑰 ssl_certificate_key /etc/letsencrypt/archive/yangwq.cn/privkey1.pem; # 配置伺服器可使用的加密演算法 ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # 指定伺服器密碼演算法在優先於客戶端密碼演算法時,使用 SSLv3 和 TLS 協議 ssl_prefer_server_ciphers on; # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2 # ie6 只支援 SSLv2,SSLv3 但是存在安全問題, 故不支援 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 配置 TLS 握手後生成的 session 快取空間大小 1m 大約能儲存 4000 個 session ssl_session_cache shared:SSL:50m; # session 超時時間 ssl_session_timeout 1d; # 負載均衡時使用 此處暫時關閉 詳情見 https://imququ.com/post/optimize-tls-handshake.html # 1.5.9 及以上支援 ssl_session_tickets off; # 瀏覽器可能會在建立 TLS 連線時線上驗證證書有效性,從而阻塞 TLS 握手,拖慢整體速度。OCSP stapling 是一種優化措施,服務端通過它可以在證書鏈中封裝證書頒發機構的 OCSP(Online Certificate Status Protocol)響應,從而讓瀏覽器跳過線上查詢。服務端獲取 OCSP 一方面更快(因為服務端一般有更好的網路環境),另一方面可以更好地快取 以上內容來自 https://imququ.com/post/my-nginx-conf-for-wpo.html # 1.3.7 及以上支援 ssl_stapling on; ssl_stapling_verify on; # 根證書 + 中間證書 ssl_trusted_certificate /etc/letsencrypt/archive/yangwq.cn/fullchain1.pem; # HSTS 可以告訴瀏覽器,在指定的 max-age 內,始終通過 HTTPS 訪問該域名。即使使用者自己輸入 HTTP 的地址,或者點選了 HTTP 連結,瀏覽器也會在本地替換為 HTTPS 再發送請求 相關配置見 https://imququ.com/post/sth-about-switch-to-https.html add_header Strict-Transport-Security max-age=60; # 在此填寫原本 http 協議中的配置 location / { # 定義首頁索引目錄和名稱 proxy_pass http://172.24.35.32:8080; } error_page 500 502 503 504 /50x.html; location = /50x.html { #重定向錯誤頁面到 /50x.html root /usr/share/nginx/html; } } ``` 注意:將上面yangwq.cn相關的路徑換成你的域名路徑。 ```powershell # 為了讓nginx能訪問到我們剛生成的證書,需要重新掛載證書路徑到nginx docker stop nginx docker rm nginx # 執行nginx,此處加入了443埠和證書路徑 docker run -p 80:80 -p 443:443 --name nginx \ -v /home/nginx/logs:/var/log//nginx \ -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/conf.d:/etc/nginx/conf.d \ -v /etc/letsencrypt/archive/:/etc/letsencrypt/archive/ \ -d nginx ``` 此時我們就可以通過https域名訪問專案了,而且這個時候也可以新建二級域名訪問專案的(二級域名同樣是https)。 ## 總結 實際部署過程中博主是遇到很多問題的,比如專案訪問不了、https證書失敗、二級域名不生效等。本篇文章是經過實踐後得出的流程,如果中間有碰到問題可以在下方評論我們可以一起解決。下一篇會介紹如何使用Jenkins 流水線自動釋出halo專案以及二級域名的使用。