從零到一快速搭建我的博客網站(域名備案 + https免費證書)(一)

前言

       爲何選擇搭建我的博客?一方面是各個平臺常常下架原創文章,另外一個方面是爲了熟悉整個建站流程。
       經過搭建我的博客,咱們能夠自由的發表文章不用擔憂下架,並且能夠鍛鍊我的的SEO優化能力,不論是運維仍是運營這塊對我的的技術提高有着很大的幫助。html

       本篇文章記錄了網站從零到一的過程,但願你也能根據本篇文章搭建出屬於本身的網站。你們有疑問能夠一塊兒討論。python

       下面開始正題。mysql

環境介紹

資源 說明
centos v7.2
docker 快速部署項目環境
nginx 反向代理,同時配置https證書
halo v1.4.2,開源博客項目
Let's Encrypt 免費證書 配置https

效果演示

zandernginx

前置環境安裝

Docker安裝

       能夠參考博主之前的文章:Centos7.2 安裝docker、mysql和redisgit

halo安裝

準備halo配置文件

# 下載配置文件到 /home/halo/.halo 目錄
curl -o /home/halo/.halo/application.yaml --create-dirs https://dl.halo.run/config/application-template.yaml

       修改配置文件,將數據庫調整爲mysql,默認是h2(可選)
github

       將上面h2的數據庫註釋,並把mysql的配置打開,注意,須要提早在mysql創建數據庫 halodb,相關的數據庫表halo會自動生成,若是mysql 和 halo都是容器建立的,這裏配置的mysqlip應該是mysql容器內部的ip。redis

# 查看mysql容器的ip,mysql-prod替換成mysql容器名稱或者容器id
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql

       修改後:
算法

下載並安裝halo

# 拉取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

       正常狀況應該以下:

       通過上面的步驟建立的halo還不能經過外部ip訪問,咱們如今配置一個nginx進行代理sql

nginx安裝

# 下載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配置是否正確,最後再檢查防火牆和安全組。docker

域名及網站備案

       目前咱們只能經過ip訪問halo,咱們能夠經過配置域名進行訪問。
       首先咱們得申請一個域名:域名註冊
       申請完成後進行備案:備案
       備案注意事項:
              一、若是處於異地工做的狀況,建議備案地點選擇老家,並且手上要有老家的手機號,若是選擇異地的話,須要你提供臨時居住證之類比較麻煩。
              二、阿里雲備案時間在一週左右,通常提交申請會有人找你確認信息,以後按備案流程走就好了。

配置https

       通常狀況證書是須要購買的,可是也有一些平臺提供了免費證書,阿里雲也有一年的免費證書,可是阿里雲證書只能單個域名使用,若是要通配符證書是須要付費的。而Let’s Encrypt 證書便可以避免費申請證書,又支持通配符,是我的開發者的上選。

       這裏咱們經過github項目配置免費證書(也能夠手動安裝,不過自動安裝比較方便,下面兩種方式都會提到):letencrypt-certbot
       使用此項目前咱們配置一下前置環境:certbot 和 git

安裝git

yum install git

安裝certbot

# 安裝certbot,中間須要輸入y確認
yum install epel-release
yum install certbot 
# 查看版本,若是安裝正常會顯示版本號
certbot --version

申請證書

       特別注意的是,這裏須要主機把80端口和443端口開放,上面咱們已經開放了80端口,這裏開放443端口就好了

# 配置防火牆,注意,阿里雲鬚要同時配置安全組443端口
# 開放443端口
firewall-cmd --permanent --add-port=443/tcp
#重啓防火牆(修改配置後要重啓防火牆)
firewall-cmd --reload

       重要提示:爲避免遇到操做次數的限制,加入 dry-run 參數,能夠避免操做限制,等執行無誤後,再進行真實的 renew 操做

手動安裝證書+手動續期

# 申請證書,須要填入你的郵箱和域名, --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

       安裝過程當中,須要確認選項,講一下手動安裝的重點:

安裝成功後顯示:

       注意:證書90天后過時,咱們手動續期的話比較麻煩,並且每次須要手動去DNS解析列表建立對應的記錄,因此推薦下面的自動續期方式

經過apikey 和secret生成證書+自動續期

       首先獲取api key 和secret:阿里雲 API key 和 Secret 官方申請文檔,這種方式實際上是利用你開放的api key調用阿里雲提供的接口,因此保險起見咱們建立一個權限很小的用戶就好了。

流程:
       一、爲了安全,咱們須要先建立RAM用戶,配置一個權限小的用戶;
       二、給新建立的用戶配置 AliyunDNSFullAccess(管理雲解析(DNS)) 的權限;
       三、獲取apikey 和 secret。

# 新建一個目標,拉取項目
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 1075976874@qq.com  --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安裝證書

# 編輯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相關的路徑換成你的域名路徑。

# 爲了讓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項目以及二級域名的使用。

相關文章
相關標籤/搜索