博客大事记之迁移博客到香港主机
個人博客:https://rebootcat.com/2020/11/10/move_blog_hk/
前言
之前其實已經寫過一篇博文: 遷移博客到香港虛擬空間,那為什么又要寫這篇博客呢?
上次其實是把我的博客遷移到一個香港的虛擬空間里,但是不到半年的時間已經出現過 4 次宕機事件,每次持續時間 4~5 小時,阿里云 和 UpTimeRobot 的監控報警報了一大堆,郵箱都快塞滿了。想著宕機就宕機吧,至少還能恢復,還能湊合用,結果呢,就在前幾天當時購買虛擬空間的官網都 GG 了,管理員跑路了。。。
可能他沒掙到錢吧,買一臺服務器打算開很多共享的虛擬空間來賣,可能也只有我買了一個,因為我后來看了下我的博客同 IP 的網站就兩個,好嘛,結果就跑路了。。。這里就不點名是哪一家了,八字開頭的一個云。
好吧,言歸正傳,正好雙 11,那就干脆直接買服務器吧,所以就購買了騰訊的一臺輕量級云服務器,峰值 30Mbps,月流量 1024G,能滿足我的需求,況且有了服務器,能做的事情就很多了。比如我還有其他的博客也可以解析到這里,比如可以定制化一些動態博客,比如可以使用自動化發布等。
那本文大致就記錄下遷移的一些過程以及踩坑優化等:
- 服務器購買以及初始化
- 安裝部署 nginx
- 部署博客源碼
- 解析域名
- 設置 https 證書
- 綁定多個域名
- 使用 github actions 自動化部署博客(踩坑)
- https 性能優化
服務器購買及初始化
雙 11 活動,購買了一臺輕量級的騰訊云服務器。然后就是初始化服務器,登錄服務器,設置 ssh key 登錄等。
注意這里一定要設置 ssh key 登錄,因為后面用的到。
安裝部署 nginx
安裝
$ yum install nginx -y
啟動
$ systemctl start nginx
然后瀏覽器訪問:
$ curl http://your_public_ip
如果一切正常,說明 nginx 啟動正常。接下來把 nginx 添加到系統啟動項隨開機啟動:
$ systemctl enable nginx.service
部署博客源碼
博客采用的是 hexo 生成的靜態博客,所以只需要把博客倉庫克隆下來就行:
安裝 git
$ yum install git -y
克隆博客網站源碼到某個目錄:
$ git clone https://github.com/smaugx/smaugx.github.io.git /root/
設置 nginx 配置文件中 80 端口的 root 為博客源碼的目錄:
# nginx.conf
root /usr/share/nginx/html/smaugx.github.io;
重啟 nginx:
$ systemctl restart nginx
驗證博客是否正常:
$ curl http://your_public_ip
正常能看到博客的主頁了。
解析域名
接下來是把域名 rebootcat.com 解析到這臺機器上, 如下:
主機|類型|線路|記錄值|MX優先級|TTL|備注|狀態
@ NS 默認 f1g1ns1.dnspod.net. 0 86400 正常
@ NS 默認 f1g1ns2.dnspod.net. 0 86400 正常
@ A 默認 101.33.123.30 0 600 正常
@ TXT 默認 google-site-xxx 86400 正常
www A 默認 101.33.123.30 0 600 正常
@ TXT 默認 mP8ROM8AEYs9Zxxxx 0 600 正常
解析生效之后,驗證是否成功:
$ curl http://rebootcat.com
設置 https 證書
全程參考這篇博文:
Linux CentOS 7 下 Nginx 安裝使用 Let’ s Encrypt 證書的完整過程
這篇文章已經寫的很清楚了,照著操作就行。
設置完成應該就能使用 https 訪問了:
$ curl https://rebootcat.com
綁定多個域名
我還把 loveyxq.online 也解析到了這臺機器上,這是我另外一個博客,給我女朋友用的一個。
nginx 的配置見后文。
使用 github actions 自動化部署博客(踩坑)
經過了上面的步驟,博客已經算是遷移完成了,不過每次更新博客能否直接部署道這臺機器上呢?
答案是能的,而且方法很多種。我采用的是 github 自家的持續部署工具 Github Actions.
添加 github 倉庫配置
如上圖所示,分別在 Secrets 項添加 3 個變量:
- BLOG_DEPLOY_PRI_KEY : ssh 私鑰
- BLOG_HOSTNAME : rebootcat.com
- BLOG_USER : root
編寫工作流文件
在博客網站源碼倉庫創建文件:.github/workflows/deploy.yml,內容如下:
name: Deploy site fileson:push:branches:- master # 只在master上push觸發部署paths-ignore: # 下列文件的變更不觸發部署,可以自行添加- LICENSEjobs:deploy:runs-on: ubuntu-latest # 使用ubuntu系統鏡像運行自動化腳本steps: # 自動化步驟- uses: actions/checkout@v2 # 第一步,下載代碼倉庫- name: Deploy to Server # 第二步,rsync推文件uses: AEnterprise/rsync-deploy@v1.0 # 使用別人包裝好的步驟鏡像env:DEPLOY_KEY: ${{ secrets.BLOG_DEPLOY_PRI_KEY }} # 引用配置,SSH私鑰ARGS: -avz --delete --exclude='*.pyc' # rsync參數,排除.pyc文件SERVER_PORT: '22' # SSH端口FOLDER: ./ # 要推送的文件夾,路徑相對于代碼倉庫的根目錄SERVER_IP: ${{ secrets.BLOG_HOSTNAME }} # 引用配置,服務器的host名(IP或者域名domain.com)USERNAME: ${{ secrets.BLOG_USER }} # 引用配置,服務器登錄名SERVER_DESTINATION: /usr/share/nginx/html/smaugx.github.io/ # 部署到目標文件夾- name: Restart server # 第三步,重啟服務uses: appleboy/ssh-action@masterwith:host: ${{ secrets.BLOG_HOSTNAME }} # 下面三個配置與上一步類似username: ${{ secrets.BLOG_USER }}key: ${{ secrets.BLOG_DEPLOY_PRI_KEY }}# 重啟的腳本,根據自身情況做相應改動,一般要做的是migrate數據庫以及重啟服務器script: |echo "update rebootcat.com blog" >> /tmp/github/blog.log
上述文件記得 push 到遠端倉庫。然后你可以隨便修改一下博客源碼并且 push 到遠端,正常的話應該能看到如下的輸出:
hexo deploy 踩坑
重點來了,上面兩部其實是經過了 hexo deploy 的踩坑的。為啥?
由于 hexo generate 默認會忽略隱藏文件,所以生成的網站源碼就會忽略 .github/workflows/deploy.yml,所以要設置一下博客根目錄的 _config.yml:
# Include / Exclude file(s)
## include:/exclude: options only apply to the 'source/' folder
include:- ".github/*"- ".github/**/*"
exclude:
ignore:
很重要!!!
OK,現在你可以放心大膽的使用 hexo generate 來生成博客源碼了,但是當你使用 hexo deploy 的時候問題又來了, hexo deploy 默認也是忽略隱藏文件的,而且好像上面那個配置對 hexo deploy 無效。
搜索了很多,沒有找到針對 hexo deploy 如何避免忽略隱藏文件的解決方案,于是探索了一下:
$ hexo deploy
INFO Deploying: git
INFO Clearing .deploy_git folder...
INFO Copying files from public folder...
INFO Copying files from extend dirs...
On branch master
nothing to commit, working tree clean
...
可以看到,上面執行 hexo deploy 命令后的輸出有一個 “.deploy_git folder”,看了一下真有這個隱藏目錄,想必 hexo deploy 是把 public 目錄與較舊的(上一次發布的)目錄 .deploy_git 做比較,然后增量上傳文件。
所以我直接把 .github/workflows/deploy.yml 拷貝到了 .deploy_git 目錄,然后執行 hexo deploy 成功。
哈哈哈!!!
所以記住,如果后期修改了這個 deploy.yml ,需要手動拷貝一下,但是基本上不會再動這個文件了。
到這里,基本上就解決了利用github actions 自動化部署博客的問題了。
實測 push 倉庫后到服務器上的網站源碼成功替換時間很快,大概一分鐘左右,Good!
https 性能優化
上面的一切搞定后,體驗了一天訪問我的博客 https://rebootcat.com,使用 chrome 控制臺發現 ssl 握手時間很慢,第一次訪問基本都要 3 ~ 4 s左右,無法忍受,再次訪問就快了。
所以網上搜索了下關于 Let’s Encrypt 的優化,找到了一些解決方案以及 nginx 的配置優化等:
# config file name: /etc/nginx/nginx.confuser root;
worker_processes 2;error_log /var/log/nginx/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;pid /var/run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#access_log /var/log/nginx/access.log main;sendfile on;tcp_nopush on;tcp_nodelay on;#keepalive_timeout 0;keepalive_timeout 65;types_hash_max_size 2048;gzip on;gzip_vary on;gzip_min_length 1k; #不壓縮臨界值,大于1k的才壓縮,一般不用改gzip_buffers 4 16k;gzip_comp_level 6; #壓縮級別,數字越大壓縮的越好gzip_types text/plain application/javascript application/x-javascript application/json text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-icon text/xml;#記錄160000個請求 超過將返回失敗limit_conn_zone $binary_remote_addr zone=addr:10m;#單個請求小于20r/slimit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;server {listen 80;server_name www.rebootcat.com rebootcat.com;rewrite ^ https://$server_name$request_uri? permanent;access_log /var/log/nginx/access_rebootcat.log main;}# HTTPS serverserver {listen 443 http2 ssl;server_name www.rebootcat.com rebootcat.com;access_log /var/log/nginx/access_rebootcat.log main;charset utf-8;root /usr/share/nginx/html/smaugx.github.io;limit_conn addr 10;location /api {limit_req zone=one burst=10;# 真實的客戶端IPproxy_set_header X-Real-IP $remote_addr;# 請求頭中Host信息proxy_set_header Host $host;# 代理路由信息,此處取IP有安全隱患proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 真實的用戶訪問協議proxy_set_header X-Forwarded-Proto $scheme;}location ~.*\.(js|css|ico|png|jpg)${expires 3d;}location /js{#add_header Cache-Control no-cache;}location / {limit_req zone=one burst=30;index index.html index.htm;}error_page 404 /404.html;# redirect server error pages to the static page /50x.htmlerror_page 500 502 503 504 /50x.html;# 開啟 ssl#ssl on;# letsencrypt生成的文件ssl_certificate /etc/letsencrypt/live/rebootcat.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/rebootcat.com/privkey.pem;ssl_session_timeout 20m;ssl_session_cache shared:SSL:50m;# 由客戶端保存加密后的session信息ssl_session_tickets on;ssl_dhparam /etc/ssl/private/dhparam.pem;# 開啟OCSP Stapling,由服務器驗證證書在線狀態,提高TLS握手效率ssl_stapling on;ssl_stapling_verify on;# 開啟HSTS,緩存http重定向到https,以防止中間人攻擊# 不包含子域(寶塔界面是http的)# 不預加載(預加載要在https://hstspreload.org/中添加)add_header Strict-Transport-Security "max-age=63072000;" always;# 開啟TLS False Startssl_prefer_server_ciphers on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# 一般推薦使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLSssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';}server {listen 80;server_name www.loveyxq.online loveyxq.online;rewrite ^ https://$server_name$request_uri? permanent;access_log /var/log/nginx/access_loveyxq.log main;}# HTTPS serverserver {listen 443 http2 ssl;server_name www.loveyxq.online loveyxq.online;access_log /var/log/nginx/access_loveyxq.log main;charset utf-8;root /usr/share/nginx/html/smaugx.github.io;limit_conn addr 10;location /api {limit_req zone=one burst=10;# 真實的客戶端IPproxy_set_header X-Real-IP $remote_addr;# 請求頭中Host信息proxy_set_header Host $host;# 代理路由信息,此處取IP有安全隱患proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 真實的用戶訪問協議proxy_set_header X-Forwarded-Proto $scheme;}location ~.*\.(js|css|ico|png|jpg)${expires 3d;}location /js{#add_header Cache-Control no-cache;}location / {limit_req zone=one burst=30;index index.html index.htm;}error_page 404 /404.html;# redirect server error pages to the static page /50x.htmlerror_page 500 502 503 504 /50x.html;# 開啟 ssl#ssl on;# letsencrypt生成的文件ssl_certificate /etc/letsencrypt/live/loveyxq.online/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/loveyxq.online/privkey.pem;ssl_session_timeout 20m;ssl_session_cache shared:SSL:50m;# 由客戶端保存加密后的session信息ssl_session_tickets on;ssl_dhparam /etc/ssl/private/dhparam.pem;# 開啟OCSP Stapling,由服務器驗證證書在線狀態,提高TLS握手效率ssl_stapling on;ssl_stapling_verify on;# 開啟HSTS,緩存http重定向到https,以防止中間人攻擊# 不包含子域(寶塔界面是http的)# 不預加載(預加載要在https://hstspreload.org/中添加)add_header Strict-Transport-Security "max-age=63072000;" always;# 開啟TLS False Startssl_prefer_server_ciphers on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# 一般推薦使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLSssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';}}
重啟 nginx 之后,再次使用 chrome 無恒模式打開控制臺看一下訪問速度,是不是有所好轉。
或者直接使用 curl 命令:
$ curl -X GET -w '\n\n time_namelookup: %{time_namelookup}time_connect: %{time_connect}time_appconnect: %{time_appconnect}time_pretransfer: %{time_pretransfer}time_redirect: %{time_redirect}time_starttransfer: %{time_starttransfer}----------time_total: %{time_total}\n' -H 'Cache-Control: no-cache' -o /dev/null -s "https://rebootcat.com"
輸出如下:
time_namelookup: 0.005120time_connect: 0.257869time_appconnect: 0.492787time_pretransfer: 0.492887time_redirect: 0.000000time_starttransfer: 0.751222----------time_total: 1.339793
上面的 time_appconnect 減去 time_connect 的耗時就是 ssl 握手的耗時 0.2349s,比之前好了很多。
The END
OK,到這里算是把博客正式的遷移到騰訊云香港服務器上了,以后就一直打算用自己的服務器托管博客了。
參考
使用 GitHub Actions 實現博客自動化部署
提高https載入速度,記一次nginx升級優化
Blog:
-
rebootcat.com
-
email: linuxcode2niki@gmail.com
2020-11-10 于杭州
By 史矛革
總結
以上是生活随笔為你收集整理的博客大事记之迁移博客到香港主机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: free not return memo
- 下一篇: TCP全连接和半连接的问题探讨