024.掌握Pod-部署MongoDB

一 前期準備

1.1 前置條件


  • 集群部署:Kubernetes集群部署參考003——019。
  • glusterfs-Kubernetes部署:參考《附010.Kubernetes永久存儲之GlusterFS超融合部署》。

1.2 部署規劃


本實驗使用StatefulSet部署MongoDB集群,同時每個MongoDB實例使用glusterfs實現永久存儲。從而部署無單點故障、高可用、可動態擴展的MongoDB集群。

部署架構如下:

二 創建StatefulSet

2.1 創建storageclass存儲類型

  1 [root@k8smaster01 ~]# vi heketi-secret.yaml			#創建用於保存密碼的secret
  2 apiVersion: v1
  3 kind: Secret
  4 metadata:
  5   name: heketi-secret
  6   namespace: heketi
  7 data:
  8   # base64 encoded password. E.g.: echo -n "mypassword" | base64
  9   key: YWRtaW4xMjM=
 10 type: kubernetes.io/glusterfs


  1 [root@k8smaster01 heketi]# kubectl create -f heketi-secret.yaml	#創建heketi
  2 [root@k8smaster01 heketi]# kubectl get secrets -n heketi
  3 NAME                                 TYPE                                  DATA   AGE
  4 default-token-6n746                  kubernetes.io/service-account-token   3      144m
  5 heketi-config-secret                 Opaque                                3      142m
  6 heketi-secret                        kubernetes.io/glusterfs               1      3m1s
  7 heketi-service-account-token-ljlkb   kubernetes.io/service-account-token   3      143m
  8 [root@k8smaster01 ~]# mkdir mongo
  9 [root@k8smaster01 ~]# cd mongo


  1 [root@k8smaster01 heketi]# vi storageclass-fast.yaml
  2 apiVersion: storage.k8s.io/v1
  3 kind: StorageClass
  4 metadata:
  5   name: fast
  6 parameters:
  7   resturl: "http://10.254.82.26:8080"
  8   clusterid: "d96022e907f82045dcc426a752adc47c"
  9   restauthenabled: "true"
 10   restuser: "admin"
 11   secretName: "heketi-secret"
 12   secretNamespace: "default"
 13   volumetype: "replicate:3"
 14 provisioner: kubernetes.io/glusterfs
 15 reclaimPolicy: Delete
  1 [root@k8smaster01 heketi]# kubectl create -f storageclass-fast.yaml
  2 [root@k8smaster01 heketi]# kubectl get storageclasses/fast



2.2 授權ServiceAccount


本實驗2.4步驟需要使用mongo-sidecar的pod來配置管理mongo pod。

由於默認的service account僅僅只能獲取當前Pod自身的相關屬性,無法觀察到其他名稱空間Pod的相關屬性信息。如果想要擴展Pod,或者一個Pod需要用於管理其他Pod或者是其他資源對象,是無法通過自身的名稱空間的serviceaccount進行獲取其他Pod的相關屬性信息的,因此需要進行手動創建一個serviceaccount,並在創建Pod時進行定義。或者直接將默認的serviceaccount進行授權。

  1 [root@uk8s-m-01 mongo]# vi defaultaccout.yaml
  2 ---
  3 apiVersion: rbac.authorization.k8s.io/v1beta1
  4 kind: ClusterRoleBinding
  5 metadata:
  6   name: DDefault-Cluster-Admin
  7 subjects:
  8   - kind: ServiceAccount
  9     # Reference to upper's `metadata.name`
 10     name: default
 11     # Reference to upper's `metadata.namespace`
 12     namespace: default
 13 roleRef:
 14   kind: ClusterRole
 15   name: cluster-admin
 16   apiGroup: rbac.authorization.k8s.io
 17 
 18 [root@uk8s-m-01 mongo]# kubectl apply -f defaultaccout.yaml


2.3 創建headless Service

  1 [root@k8smaster01 mongo]# vi mongo-headless-service.yaml


略

提示:本實驗直接將headless結合在StatefulSet同一個yaml文件中,參考2.4。

2.4 創建StatefulSet

  1 [root@k8smaster01 mongo]# vi statefulset-mongo.yaml
  2 ---
  3 apiVersion: v1
  4 kind: Service
  5 metadata:
  6   name: mongo
  7   labels:
  8     name: mongo
  9 spec:
 10   ports:
 11   - port: 27017
 12     targetPort: 27017
 13   clusterIP: None
 14   selector:
 15     role: mongo
 16 ---                                  #以上為headless-service
 17 apiVersion: apps/v1beta1
 18 kind: StatefulSet
 19 metadata:
 20   name: mongo
 21 spec:
 22   serviceName: "mongo"
 23   replicas: 3
 24   template:
 25     metadata:
 26       labels:
 27         role: mongo
 28         environment: test
 29     spec:
 30       terminationGracePeriodSeconds: 10
 31       containers:
 32         - name: mongo
 33           image: mongo:3.4             #新版可能不支持smallfiles參數,因此指定為3.4版本
 34           command:
 35             - mongod
 36             - "--replSet"
 37             - rs0
 38             - "--bind_ip"
 39             - 0.0.0.0
 40             - "--smallfiles"           #使用較小的默認文件
 41             - "--noprealloc"           #禁用數據文件預分配
 42           ports:
 43             - containerPort: 27017
 44           volumeMounts:
 45             - name: mongo-persistent-storage
 46               mountPath: /data/db
 47         - name: mongo-sidecar
 48           image: cvallance/mongo-k8s-sidecar
 49           env:
 50             - name: MONGO_SIDECAR_POD_LABELS
 51               value: "role=mongo,environment=test"
 52             - name: KUBERNETES_MONGO_SERVICE_NAME
 53               value: "mongo"
 54   volumeClaimTemplates:
 55   - metadata:
 56       name: mongo-persistent-storage
 57       annotations:
 58         volume.beta.kubernetes.io/storage-class: "fast"
 59     spec:
 60       accessModes: [ "ReadWriteOnce" ]
 61       resources:
 62         requests:
 63           storage: 2Gi



釋義:

  1. 該StatefulSet定義了兩個容器:mingo和mongo-sidecar。mongo是主服務程序,mongo-sidecar是將多個mongo實例進行集群設置的工具。同時mongo-sidecar中設置了如下環境變量:


    • MONGO_SIDECAR_POD_LABELS:設置為mongo容器的標籤,用於sidecar查詢它所要管理的MongoDB集群實例。
    • KUBERNETES_MONGO_SERVICE_NAME:它的值為mongo,表示sidecar將使用mongo這個服務名來完成MongoDB集群的設置。


  1. replicas=3表示MongoDB集群由3個mongo實例組成。
  2. volumeClaimTemplates是StatefulSet最重要的存儲設置。在annotations段設置volume.beta.kubernetes.io/storage-class=”fast”表示使用名為fast的StorageClass自動為每個mongo Pod實例分配後端存儲。
  3. resources.requests.storage=2Gi表示為每個mongo實例都分配2GiB的磁盤空間。




  1 [root@k8smaster01 mongo]# kubectl create -f statefulset-mongo.yaml	#創建mongo


提示:由於國內mongo鏡像可能無法pull,建議通過VPN等方式提前pull鏡像,然後上傳至所有node節點。

  1 [root@VPN ~]# docker pull cvallance/mongo-k8s-sidecar:latest
  2 [root@VPN ~]# docker pull mongo:3.4.4
  3 [root@VPN ~]# docker save -o mongo-k8s-sidecar.tar cvallance/mongo-k8s-sidecar:latest
  4 [root@VPN ~]# docker save -o mongo_3_4_4.tar mongo:3.4.4
  5 [root@k8snode01 ~]# docker load -i mongo-k8s-sidecar.tar
  6 [root@k8snode01 ~]# docker load -i mongo.tar
  7 [root@k8snode01 ~]# docker images



創建異常可通過如下方式刪除,重新創建:

  1 kubectl delete -f statefulset-mongo.yaml
  2 kubectl delete -f mongo-headless-service.yaml
  3 kubectl delete pvc -l role=mongo


三 確認驗證

3.1 查看資源

  1 [root@k8smaster01 mongo]# kubectl get pod -l role=mongo			#查看集群pod
  2 NAME      READY   STATUS    RESTARTS   AGE
  3 mongo-0   2/2     Running   0          9m44s
  4 mongo-1   2/2     Running   0          7m51s
  5 mongo-2   2/2     Running   0          6m1s



StatefulSet會用volumeClaimTemplates中的定義為每個Pod副本都創建一個PVC實例,每個PVC的名稱由StatefulSet定義中volumeClaimTemplates的名稱和Pod副本的名稱組合而成。

  1 [root@k8smaster01 mongo]# kubectl get pvc



  1 [root@k8smaster01 mongo]# kubectl get pods mongo-0 -o yaml | grep -A 3 volumes	#查看掛載


3.2 查看mongo集群


登錄任意一個mongo Pod,在mongo命令行界面用rs.status()命令查看MongoDB集群的狀態,該mongodb集群已由sidecar完成了創建。在集群中包含3個節點 每個節點的名稱都是StatefulSet設置的DNS域名格式的網絡標識名稱:

mongo-0.mongo.default.svc.cluster.local

mongo-1.mongo.default.svc.cluster.local

mongo-2.mongo.default.svc.cluster.local

同時,可以查看每個mongo實例各自的角色(PRIMARY或SECONDARY)。

  1 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo
  2 ……
  3 rs0:PRIMARY> rs.status()




四 集群常見管理

4.1 MongoDB擴容


運行環境過程中,若3個mongo實例不足以滿足業務的要求,可對mongo集群進行擴容。僅需要通過對StatefulSet進行scale操作,從而實現在mongo集群中自動添加新的mongo節點。

  1 [root@k8smaster01 ~]# kubectl scale statefulset mongo --replicas=4	#擴容為4個
  2 [root@k8smaster01 ~]# kubectl get pod -l role=mongo
  3 NAME      READY   STATUS    RESTARTS   AGE
  4 mongo-0   2/2     Running   0          105m
  5 mongo-1   2/2     Running   0          103m
  6 mongo-2   2/2     Running   0          101m
  7 mongo-3   2/2     Running   0          50m


4.2 查看集群成員

  1 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo
  2 ……
  3 rs0:PRIMARY> rs.status()
  4 ……



4.3 故障自動恢復


若在系統運行過程中,某個mongo實例或其所在主機發生故障,則StatefulSet將會自動重建該mongo實例,並保證其身份(ID)和使用的數據(PVC) 不變。以下為mongo-0實例發生故障進行模擬,StatefulSet將會自動重建mongo-0實例,併為其掛載之前分配的PVC“mongo-persistent-storage-mongo-0”。新的服務“mongo-0”在重新啟動后,原數據庫中的數據不會丟失,可繼續使用。

  1 [root@k8smaster01 ~]# kubectl get pvc
  2 [root@k8smaster01 ~]# kubectl delete pod mongo-0
  3 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo
  4 ……
  5 rs0:PRIMARY> rs.status()
  6 ……





提示:進入某個實例查看mongo集群的狀態,mongo-0發生故障前在集群中的角色為PRIMARY,在其脫離集群后,mongo集群會自動選出一個SECONDARY節點提升為PRIMARY節點(本例中為mongo-2)。重啟后的mongo-0則會成為一個新的SECONDARY節點。本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

[ch02-01] 線性反向傳播

系列博客,原文在筆者所維護的github上:,
點擊star加星不要吝嗇,星越多筆者越努力。

2.1 線性反向傳播

2.1.1 正向計算的實例

假設我們有一個函數:

\[z = x \cdot y \tag{1}\]

其中:

\[x = 2w + 3b \tag{2}\]

\[y = 2b + 1 \tag{3}\]

計算圖如圖2-4。

圖2-4 簡單線性計算的計算圖

注意這裏x, y, z不是變量,只是計算結果。w, b是才變量。因為在後面要學習的神經網絡中,我們要最終求解的是w和b的值,在這裏先預熱一下。

當w = 3, b = 4時,會得到圖2-5的結果。

圖2-5 計算結果

最終的z值,受到了前面很多因素的影響:變量w,變量b,計算式x,計算式y。常數是個定值,不考慮。

2.1.2 反向傳播求解w

求w的偏導

目前的z=162,如果我們想讓z變小一些,比如目標是z=150,w應該如何變化呢?為了簡化問題,我們先只考慮改變w的值,而令b值固定為4。

如果想解決這個問題,我們可以在輸入端一點一點的試,把w變成4試試,再變成3.5試試……直到滿意為止。現在我們將要學習一個更好的解決辦法:反向傳播。

我們從z開始一層一層向回看,圖中各節點關於變量w的偏導計算結果如下:

\[因為z = x \cdot y,其中x = 2w + 3b,y = 2b + 1\]

所以:

\[\frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}=y \cdot 2=18 \tag{4}\]

其中:

\[\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x \cdot y)=y=9\]

\[\frac{\partial{x}}{\partial{w}}=\frac{\partial{}}{\partial{w}}(2w+3b)=2\]

圖2-6 對w的偏導求解過程

圖2-6其實就是鏈式法則的具體表現,z的誤差通過中間的x傳遞到w。如果不是用鏈式法則,而是直接用z的表達式計算對w的偏導數,會是什麼樣呢?我們來試驗一下。

根據公式1、2、3,我們有:

\[z=x \cdot y=(2w+3b)(2b+1)=4wb+2w+6b^2+3b \tag{5}\]

對上式求w的偏導:

\[ {\partial z \over \partial w}=4b+2=4 \cdot 4 + 2=18 \tag{6} \]

公式4和公式6的結果完全一致!所以,請大家相信鏈式法則的科學性。

求w的具體變化值

公式4和公式6的含義是:當w變化一點點時,z會發生w的變化值的18倍的變化。記住我們的目標是讓z=150,目前在初始狀態時是162,所以,問題轉化為:當我們需要z從162變到150時,w需要變化多少?

既然:

\[ \Delta z = 18 \cdot \Delta w \]

則:

\[ \Delta w = {\Delta z \over 18}={162-150 \over 18}= 0.6667 \]

所以:

\[w = w – 0.6667=2.3333\]
\[x=2w+3b=16.6667\]
\[z=x \cdot y=16.6667 \times 9=150.0003\]

我們一下子就成功地讓z值變成了150.0003,與150的目標非常地接近,這就是偏導數的威力所在。

【課堂練習】推導z對b的偏導數,結果在下一小節中使用

2.1.3 反向傳播求解b

求b的偏導

這次我們令w的值固定為3,變化b的值,目標還是讓z=150。同上一小節一樣,先求b的偏導數。

注意,在上一小節中,求w的導數只經過了一條路:從z到x到w。但是求b的導數時要經過兩條路,如圖2-7所示:

  1. 從z到x到b
  2. 從z到y到b

圖2-7 對b的偏導求解過程

從複合導數公式來看,這兩者應該是相加的關係,所以有:

\[\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=63 \tag{7}\]

其中:

\[\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x \cdot y)=y=9\]
\[\frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x \cdot y)=x=18\]
\[\frac{\partial{x}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(2w+3b)=3\]
\[\frac{\partial{y}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(2b+1)=2\]

我們不妨再驗證一下鏈式求導的正確性。把公式5再拿過來:

\[z=x \cdot y=(2w+3b)(2b+1)=4wb+2w+6b^2+3b \tag{5}\]

對上式求b的偏導:

\[ {\partial z \over \partial b}=4w+12b+3=12+48+3=63 \tag{8} \]

結果和公式7的鏈式法則一樣。

求b的具體變化值

公式7和公式8的含義是:當b變化一點點時,z會發生b的變化值的63倍的變化。記住我們的目標是讓z=150,目前在初始狀態時是162,所以,問題轉化為:當我們需要z從162變到150時,b需要變化多少?

既然:

\[\Delta z = 63 \cdot \Delta b\]

則:

\[ \Delta b = {\Delta z \over 63}={162-150 \over 63}=​0.1905 \]

所以:
\[ b=b-0.1905=3.8095 \]
\[x=2w+3b=17.4285\]
\[y=2b+1=8.619\]
\[z=x \cdot y=17.4285 \times 8.619=150.2162\]

這個結果也是與150很接近了,但是精度還不夠。再迭代幾次,應該可以近似等於150了,直到誤差不大於1e-4時,我們就可以結束迭代了,對於計算機來說,這些運算的執行速度很快。

【課題練習】請自己嘗試手動繼續迭代兩次,看看誤差的精度可以達到多少?

這個問題用數學公式倒推求解一個二次方程,就能直接得到準確的b值嗎?是的!但是我們是要說明機器學習的方法,機器並不會解二次方程,而且很多時候不是用二次方程就能解決實際問題的。而上例所示,是用機器所擅長的迭代計算的方法來不斷逼近真實解,這就是機器學習的真諦!而且這種方法是普遍適用的。

2.1.4 同時求解w和b的變化值

這次我們要同時改變w和b,到達最終結果為z=150的目的。

已知\(\Delta z=12\),我們不妨把這個誤差的一半算在w賬上,另外一半算在b的賬上:

\[\Delta b=\frac{\Delta z / 2}{63} = \frac{12/2}{63}=0.095\]

\[\Delta w=\frac{\Delta z / 2}{18} = \frac{12/2}{18}=0.333\]

  • \(w = w-\Delta w=3-0.333=2.667\)
  • \(b = b – \Delta b=4-0.095=3.905\)
  • \(x=2w+3b=2 \times 2.667+3 \times 3.905=17.049\)
  • \(y=2b+1=2 \times 3.905+1=8.81\)
  • \(z=x \times y=17.049 \times 8.81=150.2\)

【課堂練習】用Python代碼實現以上雙變量的反向傳播計算過程

容易出現的問題:

  1. 在檢查Δz時的值時,注意要用絕對值,因為有可能是個負數
  2. 在計算Δb和Δw時,第一次時,它們對z的貢獻值分別是1/63和1/18,但是第二次時,由於b和w值的變化,對於z的貢獻值也會有微小變化,所以要重新計算。具體解釋如下:

\[ \frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=3y+2x \]
\[ \frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{w}}=y \cdot 2+x \cdot 0 = 2y \]
所以,在每次迭代中,要重新計算下面兩個值:
\[ \Delta b=\frac{\Delta z}{3y+2x} \]
\[ \Delta w=\frac{\Delta z}{2y} \]

以下是程序的運行結果。

沒有在迭代中重新計算Δb的貢獻值:

single variable: b -----
w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000
delta_b=0.190476
w=3.000000,b=3.809524,z=150.217687,delta_z=0.217687
delta_b=0.003455
w=3.000000,b=3.806068,z=150.007970,delta_z=0.007970
delta_b=0.000127
w=3.000000,b=3.805942,z=150.000294,delta_z=0.000294
delta_b=0.000005
w=3.000000,b=3.805937,z=150.000011,delta_z=0.000011
delta_b=0.000000
w=3.000000,b=3.805937,z=150.000000,delta_z=0.000000
done!
final b=3.805937

在每次迭代中都重新計算Δb的貢獻值:

single variable new: b -----
w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000
factor_b=63.000000, delta_b=0.190476
w=3.000000,b=3.809524,z=150.217687,delta_z=0.217687
factor_b=60.714286, delta_b=0.003585
w=3.000000,b=3.805938,z=150.000077,delta_z=0.000077
factor_b=60.671261, delta_b=0.000001
w=3.000000,b=3.805937,z=150.000000,delta_z=0.000000
done!
final b=3.805937

從以上兩個結果對比中,可以看到三點:

  1. factor_b第一次是63,以後每次都會略微降低一些
  2. 第二個函數迭代了3次就結束了,而第一個函數迭代了5次,效率不一樣
  3. 最後得到的結果是一樣的,因為這個問題只有一個解

對於雙變量的迭代,有同樣的問題:

沒有在迭代中重新計算Δb,Δw的貢獻值(factor_b和factor_w每次都保持63和18):

double variable: w, b -----
w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000
delta_b=0.095238, delta_w=0.333333
w=2.666667,b=3.904762,z=150.181406,delta_z=0.181406
delta_b=0.001440, delta_w=0.005039
w=2.661628,b=3.903322,z=150.005526,delta_z=0.005526
delta_b=0.000044, delta_w=0.000154
w=2.661474,b=3.903278,z=150.000170,delta_z=0.000170
delta_b=0.000001, delta_w=0.000005
w=2.661469,b=3.903277,z=150.000005,delta_z=0.000005
done!
final b=3.903277
final w=2.661469

在每次迭代中都重新計算Δb,Δw的貢獻值(factor_b和factor_w每次都變化):

double variable new: w, b -----
w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000
factor_b=63.000000, factor_w=18.000000, delta_b=0.095238, delta_w=0.333333
w=2.666667,b=3.904762,z=150.181406,delta_z=0.181406
factor_b=60.523810, factor_w=17.619048, delta_b=0.001499, delta_w=0.005148
w=2.661519,b=3.903263,z=150.000044,delta_z=0.000044
factor_b=60.485234, factor_w=17.613053, delta_b=0.000000, delta_w=0.000001
w=2.661517,b=3.903263,z=150.000000,delta_z=0.000000
done!
final b=3.903263
final w=2.661517

這個與第一個單變量迭代不同的地方是:這個問題可以有多個解,所以兩種方式都可以得到各自的正確解,但是第二種方式效率高,而且滿足梯度下降的概念。

參考資料

代碼位置

ch02, Level1

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

Jetpack 提供免費 Asset CDN 為你的 WordPress 核心檔案分流加速

如果有經常閱讀免費資源網路社群的架站相關教學,應該知道我相當重視速度,而提升網站載入速度方法很多,最基本的是使用更快、更好的網站空間,例如 Cloudways 協助使用者部屬最佳化 WordPress 環境,除此之外,選用 Cloudflare 這類 CDN 服務不但能強化網站安全,更重要的是利用各區域節點達到加速、節省流量等效果,對於架站的基礎建設來說是非常值得投入的選項。

如果你本身使用 WordPress 架站,特別推薦官方提供的 Photon CDN 免費功能(這是包含在 Jetpack 外掛程式的其中一個模組),可針對圖片分流加速,雖然會犧牲圖片品質,但能大幅降低流量耗費,如果搭配延遲載入(Lazy Load)等功能將有非常棒的效果,不過也不是毫無缺點,例如圖片會因壓縮而稍微降低畫質,除此之外,快取(Cache)期限永久不失效,若是圖片編輯更新,只能重新命名圖片才能獲取新的圖片檔案。

以往 Photon CDN 只能針對 PNG、JPG 或 GIF 圖片格式進行處理,最近在 Jetpack 6.6 更新後確定加入一項全新「Asset CDN」模組,簡單來說,這是對 WordPress 核心和 Jetpack 相關檔案進行分流加速的新功能,可以透過 WordPress 官方的 CDN 伺服器處理 CSS、JS 檔案,不過僅止於 WordPress 核心及 Jetpack 檔案,像是 jQuery、Genericons、Dashicons 和一些在 Jetpack 外掛模組中會用到的檔案。

雖然 Asset CDN 不支援佈景主題或第三方檔案,但站長們會發現 WordPress 網站開啟時會載入不少核心檔案,如果又有使用 Jetpack 外掛的話那麼檔案會更多,開啟 Asset CDN 將能夠直接取代鏈結並改由 WordPress CDN 提供檔案,降低主機負載,獲取檔案也有加速及壓縮效果。

目前這個模組還在測試階段,必須透過特殊方式才能將它啟用,或許也還不夠完善,有興趣的話可以照著本文教學將它啟用,即可在網站中測試這個全新的加速功能。

外掛名稱:Jetpack by WordPress
外掛鏈結:https://zh-tw.jetpack.com/

使用教學

STEP 1

開啟 WordPress 控制台,從「外掛」的「安裝外掛」中找到 Jetpack by WordPress.com 功能,接著點選「立即安裝」即可將它下載、安裝到你的網站中。

如果沒有外掛選項,有可能你使用的是 WordPress.com,WordPress.com 和 WordPress 不同,可以參考「當 WordPress 遇上 WordPress.com:它們是相同的嗎?」瞭解兩者的差異。

STEP 2

啟用後會先出現 Jetpack 設定畫面,點選「設定 Jetpack」開始進行,這個外掛比較特別的是必須連結使用者的 WordPress.com 帳號,如此一來才能使用相關模組。

WordPress.com 免費註冊、申請帳號過程並不算太困難,連結後會跳出是否允許以某個身分連結 WordPress 網站的提示訊息,核准後會跳到方案規格,目前免費版在頁面下方,點選「免費開始使用」就能跳過付費並免費使用 Jetpack 相關功能。

STEP 3

設定完 Jetpack 並在網站中開始運作後,點選 WordPress 控制台左側選單的 Jetpack 並找到「設定」選項,接著將網頁拉到最下方,點選「偵錯」鏈結(灰色文字不是很明顯請自己找一下)。

稍待片刻,Jetpack 會測試網站是否可以正常連接,這部分結果無論為何並不影響到接下來的使用,有些伺服器可能會有防火牆或一些阻擋規則,但只要能將網站和 WordPress 帳號連接就沒問題。

將頁面往下拖曳,點選「存取您網站上可用的 Jetpack 完整模組清單」鏈結。

STEP 4

從模組列表中找到「Asset CDN」並點選「啟用」後就能開啟此功能,因為這個模組還在測試階段,必須使用此方法才能找到開啟,未來如果加入 Jetpack 成為正式版就不用這麼做,直接於控制台將它啟用即可。

開啟 Asset CDN 後,返回 WordPress 前台檢視原始碼,就能看到原有 WordPress 核心檔案及 Jetpack 相關檔案路徑改為從 https://c0.wp.com/ 獲取檔案,看起來會像這樣:

本站聲明:網站內容來源免費資源網路社群https://free.com.tw,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

帶您來看台北網站建置、套版網頁設計、台北網站改版設計、台北RWD響應式網頁設計,各種案例分享

廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

CommentBox.io 沒有廣告、不追蹤用戶隱私的網站留言系統

通常做了一個網站後,開發者會加入互動功能,最常見的包括社交網站按鈕和留言討論區,如果你是使用 WordPress 架站,預設情況下就已經內建迴響機制,若你覺得功能太陽春還可以透過 Jetpack Comments 模組強化,讓留言者使用自己的社交網站帳號登入,不用重新註冊帳號,當然也有不少提供留言框的服務,例如老牌的 Disqus,後來被收購後已經不太推薦使用。

其實最簡單、快速的方法是使用 Facebook Comments 留言外掛程式,但我知道有些人堅持不用臉書,而且沒有 Facebook 帳號又無法匿名回覆,因此臉書留言框可能不適合所有網站類型使用。如果你想找一個更穩定、可靠的第三方留言功能,可以研究一下這個新服務。

本文要推薦的「CommentBox.io」是一款第三方留言外掛,功能淺顯易懂,就是讓使用者可以在頁面下方留言或進行討論,設計風格簡約,適用於各種網站樣式,更重要的是 CommentBox.io 沒有廣告、不收集使用者 Email,任何人都可以透過和第三方服務帳戶連結,快速登入進行留言。也支援匿名留言功能。

如果你未來想轉換到其他留言平台,CommentBox.io 亦能將留言備份匯出,不會將使用者綁在平台上進退兩難,這些都可以在控制台內自行操作完成。

CommentBox.io 本身提供免費和付費方案(每月 $10 美元),兩者差別在於免費方案有每個月最多一百篇留言的限制,不過對於小網站或單一頁面來說其實沒什麼影響,如果需要更強大的留言審核功能,還可考慮付費升級 Moderation Plus,一般來說預設的留言管理工具就已經很夠用。

網站名稱:CommentBox.io
網站鏈結:https://commentbox.io/

使用教學

STEP 1

首先開啟 CommentBox.io 網站,點選右上角的 Dashboard 或找到 Sign Up 註冊帳號按鈕,有四種註冊方式,包括使用第三方 Facebook、Twitter 或 Google 帳戶登入或是以 Email 註冊,無論使用那一種方式仍必須回到信箱點選信中的確認鏈結。

STEP 2

註冊登入 CommentBox.io 控制台,第一次使用必須先建立一個專案,填入你的網站名稱和網域名稱,先設定一下 Email 通知功能,看看有沒有需要在自動核准留言、有留言等待審核或有留言被標記為垃圾訊息時收取郵件提醒。

預設情況下所有留言都會自動核准、出現在留言系統中,如果你希望可以手動審核每一則留言,可調整成「Manual」,在沒有審核通過前不會顯示出來,不過缺點就是會比較耗費時間,留言也無法即時,另有折衷方案「Granular」只在內容包括鏈結、留言者被其他網站封鎖或匿名留言等情況下才會需要手動審核。

STEP 3

建立專案後 CommentBox 會給出一個「Project ID」,每個使用者每個網站的 ID 都是獨一無二,稍候在將留言框加入網站時會用到。

STEP 4

點選「Embed Instructions」查看網站提供的內嵌說明,裡頭會有各種在網站放入留言框的方式,簡單來說,只要塞入一個 .js 文件,以 HTML 方式放入一個特定 div 標籤即可在該位置載入 CommentBox.io 留言框。

想測試留言框也可以在 CommentBox.io 網站首頁下方找到這項功能。

 

本站聲明:網站內容來源免費資源網路社群https://free.com.tw,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

帶您來看台北網站建置、套版網頁設計、台北網站改版設計、台北RWD響應式網頁設計,各種案例分享

廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

NGINXConfig 網頁伺服器 NGINX 設定檔產生器,依需求產生各種 conf 檔

十年前開始自己研究架站,跟很多人一樣都是從 Apache 開始,後來出現 Nginx 後普遍的作法是將它拿來做反向代理(Reveres Proxy),既有的網頁伺服器就會退居後端,由前端的 Nginx 負責相關工作,依照經驗可以提升網站速度,亦能降低負載,在原有硬體規格上承載更多的訪客同時上線(Nginx 本身還能夠針對靜態檔案進行快取)。因為我最初是從 Apache 開始學習,早期都得和設定檔奮戰,一直到 Nginx 我才發現它的設定檔夠簡潔,簡單到我好像無法直接編修。

這可能是許多 Nginx 使用者的心聲,即使設定檔很簡潔但在編寫時並不那麼容易,必須去找一些範例動手修改,尤其是從 Apache 轉到 Nginx 都很希望有個轉換工具將設定檔轉為 Nginx 適用版本,可惜大多數情況下還是得花時間自行檢視和編寫,後來我乾脆都用 ServerPilot 或 Cloudways 這類自動化佈署服務,可以省下更多時間,避免出錯。

不過如果你想研究架站,想要手動建置 Nginx 網頁伺服器,即使再困難的設定檔都得硬著頭皮挑戰一下,接下來「NGINXConfig.io」是你必須收藏起來的「神兵」!

這是一款開放原始碼免費線上工具,用途是讓使用者快速產生 Nginx 所需要的各種設定檔,聽起來非常酷對吧?NGINXConfig 透過網頁介面讓使用者進行相關設定,最終產生對應的各個 .conf 檔,還能將產生的所有設定檔下載備份。

依照 NGINXConfig 說明,這個工具可以設定的項目包括網站基本選項、HTTPS、安全相關選項、PHP、Python、Routing、Cache、Reverse Proxy、Logging 等等,已經內建幾種常用的架站項目,例如前後端、Node.js、單頁面應用程式、WordPress、Drupal 和 Magento,點選後可針對該項需求先啟用特定選項。

網站名稱:NGINXConfig
網站鏈結:https://nginxconfig.io/

使用教學

STEP 1

下圖就是 NGINXConfig 操作介面,主要設定選項集中在網頁上半部,中間有一些常用到的指令和說明註解。

在上方選項進行相關設定,下方的 .conf 設定檔就會即時更新。

STEP 2

NGINXConfig 主要設定項目都以標籤方式顯示於上方,包括一般網站設定、HTTPS、安全性、PHP、Python、Routing、Cache 和 Reverse Proxy 等等,如果有架站經驗的話應該不會太難懂,比較棒的是欄位上也有範例格式可供參考。

如果 Nginx 網頁伺服器要拿來運作特定程式,NGINXConfig 也提供一些選項,點選後就會預先選取所需的相關功能,例如選取 WordPress 後會啟用 WordPress 規則。

STEP 3

NGINXConfig 特色是讓原有的 Nginx 設定檔變得更容易理解。

像是 HTTPS、HTTP/2、Force HTTPS、HSTS 等等選項可能在 Nginx 都不是那麼容易編寫,透過 NGINXConfig 讓選項變成互動式開關,只要在網頁中切換,下方的設定檔就會即時更新。

最後,將 .conf 設定檔複製、貼回自己網頁伺服器對應的路徑,重新啟動 Nginx 就能夠完成套用修改。當然細節部分我就不在文章裡多做闡述,本文是想推薦 NGINXConfig 這款 Nginx 設定檔產生器,至於要怎麼樣安裝、架設 Nginx 伺服器可能得自行去其他更專業的網站爬文。

STEP 4

如果你想將辛苦修改好的設定檔備份、保存下來,切換到「Tools」可以找到打包下載為 ZIP 格式的下載工具,比較特別的是 NGINXConfig 內建分享功能,找到底下的分享網址還能將相關設定值透過鏈結傳給其他人檢視。

值得一試的三個理由:

  1. 協助使用者快速產生 Nginx 設定檔
  2. 可針對特定需求或程式先起用特定選項
  3. 設定檔可下載備份為 Zip 格式或產生分享鏈結

推薦閱讀:

本站聲明:網站內容來源免費資源網路社群https://free.com.tw,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

帶您來看台北網站建置、套版網頁設計、台北網站改版設計、台北RWD響應式網頁設計,各種案例分享

廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益