部署LNMP动态网站及网站架构变迁
1:網站架構演變
學習從單機架構到集群架構的演變之路:
單機版LNMP
單機版網站,拓撲如圖所示。
 
 單機版網站服務器用戶量少時使用,簡單、成本低、存在單點故障。
獨立數據庫服務器
獨立數據庫服務器是將網站靜態文件、代碼文件等資料與數據庫分離的架構,當用戶量增加時單機的處理能力有限,PHP或JAVA代碼的執行需要消耗大量CPU資源,數據庫的增刪改查需要調用大量的內存資源,將兩者分離可以減輕服務器的壓力,其拓撲結構如圖所示。
 
 web服務器與數據庫分離
 Web服務器和數據庫服務器的壓力都可以得到有效改善,訪問量有所增加。但是服務器依然存在單點故障問題。
Web服務器集群與Session保持
我們可以通過Nginx、HAproxy代理服務器實現Web負載均衡集群,也可以使用LVS調度器實現Web負載均衡集群。部署完Web集群后還需要考慮如何進行Session會話保持,方法很多,如:根據源IP保持,代理服務器重寫Cookie信息,共享文件系統保存session,使用數據庫共享session等等。
 該架構拓撲如圖所示。
 
 但是如果只有一臺調度器依然會導致單點故障的問題,因此還需要使用Keepalived或Heartbeat之類的軟件進行高可用配置,如圖所示。
 
 對于網站內容而言可以分離為動態頁面和靜態頁面,靜態頁面就需要數據文件,動態頁面則需要CPU解析代碼,需要消耗大量的CPU資源,因此可以將靜態和動態分離為兩組服務器,動態頁面有腳本代碼組成,是一種基于網頁的應用程序,因此這一組服務器也稱為應用服務器,其架構如圖所示。
 
動靜分離、數據庫集群
隨著服務器的增加,雖然性能與并發量得到了明顯的提升,但是數據的一致性、管理的便利性成為了新的問題,因此就需要增加統一的存儲服務器,實現數據的同步一致,可以使用NFS,GlusterFS、Ceph等軟件實現該功能,其架構如圖所示。
 
此時所有應用服務器都連接一臺數據庫服務器進行讀寫操作,而且后期隨著數據庫中的數據不斷增加,會導致數據庫成為整個網站的瓶頸!這就需要我們對數據進行分庫分表,創建數據庫主從或者數據庫集群,實現讀寫分離,其拓撲如圖所示。
 
緩存服務器與業務模型
對于靜態數據我們可以通過varnish、squid或者nginx進行緩存,將數據緩存到距離用戶更近的位置,構建CDN(內容分發網絡)架構。
 對于傳統的SQL數據庫而言,我們也可以通過增加NoSQL數據庫,實現數據緩存的功能,提升數據庫的訪問速度。
 備注:數據庫相關知識在第三階段課程有詳細介紹,第二階段項目暫時不做數據庫優化。
 最后,基于前面的架構,我們還可以將網站按照公司的業務進行分離,每個業務都可以是一個獨立的集群,如圖所示。
 
案例1:部署LNMP動態網站
部署LNMP動態網站,實現以下目標:
安裝LNMP平臺相關軟件 配置Nginx實現動靜分離 配置數據庫,創建賬戶與密碼 上線Wordpress代碼 使用Wordpress后臺管理界面,調整Wordpress版式實驗拓撲如圖所示,做具體實驗前請先配置好環境。
 
步驟一:安裝部署LNMP軟件
備注:mariadb(數據庫客戶端軟件)、mariadb-server(數據庫服務器軟件)、mariadb-devel(其他客戶端軟件的依賴包)、php(解釋器)、php-fpm(進程管理器服務)、php-mysql(PHP的數據庫擴展包)。
附加知識:systemd!!!
 源碼安裝的軟件默認無法使用systemd管理,如果需要使用systemd管理源碼安裝的軟件需要手動編寫服務的service文件(編寫是可以參考其他服務的模板文件)。以下是nginx服務最終編輯好的模板。
 Service文件存儲路徑為/usr/lib/system/system/目錄。
修改配置文件,通過兩個location實現動靜分離,一個location匹配動態頁面,一個loation匹配其他所有頁面。
 注意修改默認首頁為index.php!
為網站提前創建一個數據庫、添加賬戶并設置該賬戶有數據庫訪問權限。
[root@centos7 ~]# mysql MariaDB [(none)]> create database wordpress character set utf8mb4; MariaDB [(none)]> grant all on wordpress.* to wordpress@'localhost' identified by 'wordpress'; MariaDB [(none)]> grant all on wordpress.* to wordpress@'192.168.2.11' identified by 'wordpress'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exit提示:在mysql和mariadb中%代表匹配所有,這里是授權wordpress用戶可以從任意主機連接數據庫服務器,生產環境建議僅允許特定的若干主機訪問數據庫服務器。
步驟二:上線wordpress代碼
[root@client ~]# firefox http://192.168.2.11/
 第一次訪問服務器會自動進入config配置頁面,效果如圖-31所示。
 
 開發人員在寫代碼的時候并不知道未來數據庫服務器的IP、端口、數據庫名稱、賬戶等信息,該配置頁面主要的作用就是動態配置數據庫信息,根據前面步驟配置的數據庫信息填空即可,效果如圖-32所示。
 
 點擊提交即可完成數據庫的初始化工作,php動態腳本會自動在wordpress數據庫中創建若干數據表,后期網站的數據都會寫入對并的數據表中。效果如圖-33所示。
 
 第一次使用Wordpress需要給你的網站設置基本信息,如網站標題、網站管理員賬戶與密碼等信息,配置完成后點擊安裝wordpress即可,如圖-34所示。
 
步驟三:網站后臺管理
通常情況下,開發人員會開發一個后臺管理界面,當代碼上線后,普通用戶就可以管理和配置網站頁面(需要使用網站的超級管理員身份才可以進入后臺界面)。
[root@client ~]# firefox http://192.168.2.11訪問首頁后點擊如圖-35所示的登陸菜單,輸入賬戶和密碼進入后臺管理界面。
 
 或者直接在地址欄中輸入后臺管理界面的具體URL。
輸入管理員用戶名和密碼,效果如圖-36所示。登陸后臺管理界面效果如圖-37所示。
 
 2. 修改網站主題
Wordpress主題會影響網站的整體外觀,我們可以使用默認自帶的若干主題。
 后臺修改網站主題的菜單為<外觀>–<主題>,使用默認主題,點擊啟用即可,如圖所示。
 
 如果需要更多更新的主題,則可以去官網下載更多新的主題,默認下載的主題格式為zip壓縮包。
 官方網站主題鏈接:(https://cn.wordpress.org/themes/browse/popular/)。
 將主題下載到服務器本地后,可以在后臺管理界面添加主題,<外觀>–<主題>–<添加>–<上傳主題>–<瀏覽>–<現在安裝>,如圖所示。
 
 部署新主題的另一種方法是,直接將下載的zip主題包拷貝到wordpress代碼的特定目錄,如/usr/local/nginx/html/wp-content/themes/目錄,然后使用unzip解壓主題即可,效果如圖-40所示。
 
小工具是首頁中的各種常用功能菜單,可以添加和刪除。
 首先可以刪除一些不需要的小工具,如最近文章、最近評論等,如圖-41所示。
 
 Right、Legt、Header代表的是小工具的位置,使用鼠標拖動小工具可以移動位置,如圖-42所示。
 
 可以通過小工具為網站添加導航功能,使用鼠標將導航菜單拖動到合適的位置即可,默認沒有導航菜單,需要自定義創建,如圖-43所示。
 
 創建導航菜單后,可以繼續創建頁面,并將頁面添加到導航菜單中。<頁面>–<新建頁面>即可添加新的頁面,如圖-44和圖-45所示。新的頁面內容可以是段落、圖像、列表、引語等(每個人根據自己的需要自由發揮)。
 
 圖-44
 
 圖-45
 新的頁面添加完成后,可以將其添加到菜單中使用,如圖-46所示。訪問網站首頁即可查看導航菜單的效果,如圖-47所示。
 
 圖-46
 
案例2:LNP+Mariadb數據庫分離
2.1 問題
 部署LNP+Mariadb實現數據庫與Web服務器分離,實現以下目標:
2.2 方案
實驗拓撲如圖所示,做具體實驗前請先配置好環境。
 
 主機配置如表所示。
 
步驟一:部署數據庫服務器
登陸192.168.2.11主機,備份數據庫并拷貝給新的服務器,關閉舊的數據庫服務。
[root@centos7 ~]# mysqldump wordpress > wordpress.bak [root@centos7 ~]# scp wordpress.bak 192.168.2.21:/root/ [root@centos7 ~]# systemctl stop mariadb [root@centos7 ~]# systemctl disable mariadb登陸192.168.2.21主機,使用備份文件還原數據庫。
 創建空數據庫:
使用備份文件還原數據:
[root@database ~]# mysql wordpress < wordpress.bak重新創建賬戶并授權訪問:
[root@database ~]# mysql MariaDB [(none)]> grant all on wordpress.* to wordpress@'%' identified by 'wordpress'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exitWordpress在第一次初始化操作時會自動生產配置文件:wp-config.php,登陸192.168.2.11修改該文件即可調用新的數據庫服務。
[root@centos7 ~]# vim /usr/local/nginx/html/wp-config.php 修改前內容如下: define('DB_HOST', '192.168.2.11'); 修改后內容如下: define('DB_HOST', '192.168.2.21');步驟二:客戶端測試
案例3:Web服務器集群
3.1 問題
 使用HAProxy部署Web服務器集群,實現以下目標:
3.2 方案
 實驗拓撲如圖所示,做具體實驗前請先配置好環境。
 
 備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節約虛擬機資源)。
 主機配置如表所示。
 
步驟一:部署web2和web3服務器
web2修改默認首頁index.php,配置兩個location實現動靜分離。
[root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf location / {root html;index index.php index.html index.htm;} location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}web3修改默認首頁index.php,配置兩個location實現動靜分離。
[root@web3 ~]# vim /usr/local/nginx/conf/nginx.conf location / {root html;index index.php index.html index.htm;} location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}附加知識:systemd!!!
 源碼安裝的軟件默認無法使用systemd管理,如果需要使用systemd管理源碼安裝的軟件需要手動編寫服務的service文件(編寫是可以參考其他服務的模板文件)。以下是nginx服務最終編輯好的模板。
 Service文件存儲路徑為/usr/lib/system/system/目錄。
步驟二:部署NFS,將網站數據遷移至NFS共享服務器
NFS使用的是隨機端口,每次啟動NFS都需要將自己的隨機端口注冊到rpcbind服務,這樣客戶端訪問NFS時先到rpcbind查詢端口信息,得到端口信息后再訪問NFS服務。
[root@nfs ~]# systemctl restart nfs [root@nfs ~]# systemctl enable nfs將web1(192.168.2.11)上的wordpress代碼拷貝到NFS共享。
[root@web1 ~]# cd /usr/local/nginx/ [root@web1 nginx]# tar -czpf html.tar.gz html/ [root@web1 nginx]# scp html.tar.gz 192.168.2.31:/web_share/登陸nfs服務器,將壓縮包解壓
[root@nfs ~]# cd /web_share/ [root@nfs web_share]# tar -xf html.tar.gz步驟三:部署HAProxy代理服務器
安裝軟件,手動修改配置文件,添加如下內容。
[root@proxy ~]# yum -y install haproxy [root@proxy ~]# vim /etc/haproxy/haproxy.cfg listen wordpress *:80balance roundrobinserver web1 192.168.2.11:80 check inter 2000 rise 2 fall 3server web2 192.168.2.12:80 check inter 2000 rise 2 fall 3server web3 192.168.2.13:80 check inter 2000 rise 2 fall 3 [root@proxy ~]# systemctl start haproxy [root@proxy ~]# systemctl enable haproxy步驟三:部署DNS域名服務器
注意:保留文件權限。
[root@proxy named]# cp -p /var/named/named.localhost /var/named/lab.com.zone [root@proxy named]# vim /var/named/lab.zone $TTL 1D @ IN SOA @ rname.invalid. (0 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimum @ NS dns.lab.com. dns A 192.168.4.5 www A 192.168.4.5提示:做完實驗修改回原始內容。
[root@room9pc01 data]# cat /etc/resolv.conf # Generated by NetworkManager search tedu.cn nameserver 192.168.4.5 nameserver 172.40.1.10 nameserver 192.168.0.220步驟四:修改wordpress配置文件
在define(‘DB_NAME’, ‘wordpress’)這行前面添加如下兩行內容:
[root@web3 html]# vim /usr/local/nginx/html/wp-config.php define('WP_SITEURL', 'http://www.lab.com'); define('WP_HOME', 'http://www.lab.com');如果不添加這兩行配置,瀏覽器訪問網站某個子頁面后,URL會固定到某一臺后端服務器不輪詢。
案例4:Keepalived高可用
部署兩臺代理服務器,實現如下效果:
利用keepalived實現兩臺代理服務器的高可用 配置VIP為192.168.4.80 修改對應的域名解析記錄1.2 方案
 實驗拓撲如圖-1所示,做具體實驗前請先配置好環境。
 
 備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節約虛擬機資源)。
 主機配置如表-1所示。
 
步驟一:配置第二臺代理服務器
安裝軟件,手動修改配置文件,添加如下內容。
[root@proxy2 ~]# yum -y install haproxy [root@proxy2 ~]# vim /etc/haproxy/haproxy.cfg listen wordpress *:80balance roundrobinserver web1 192.168.2.11:80 check inter 2000 rise 2 fall 3server web2 192.168.2.12:80 check inter 2000 rise 2 fall 3server web3 192.168.2.13:80 check inter 2000 rise 2 fall 3 [root@proxy2 ~]# systemctl start haproxy [root@proxy2 ~]# systemctl enable haproxy步驟二:為兩臺代理服務器配置keepalived
!!!重要!!!
 在全局配置global_defs{}中手動添加vrrp_iptables,即可解決防火墻的問題。
!!!重要!!!
 在全局配置global_defs{}中手動添加vrrp_iptables,即可解決防火墻的問題。
步驟三:修改DNS服務器
192.168.4.5為DNS服務器。
[root@proxy ~]# vim /var/named/lab.com.zone $TTL 1D @ IN SOA @ rname.invalid. (0 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimum @ NS dns.lab.com. dns A 192.168.4.5 www A 192.168.4.80案例5:部署Ceph分布式存儲
部署Ceph分布式存儲,實現如下效果:
使用三臺服務器部署Ceph分布式存儲 實現Ceph文件系統共享 將網站數據從NFS遷移到Ceph存儲方案
 實驗拓撲如圖所示,做具體實驗前請先配置好環境。
 
 備注:實際操作中DNS服務代理服務器部署在同一臺主機上(節約虛擬機資源)。
 主機配置如表-2所示。
 
步驟一:準備實驗環境
提示:ceph10.iso在/linux-soft/02目錄。
[root@room9pc01 ~]# mkdir /var/ftp/ceph [root@room9pc01 ~]# mount ceph10.iso /var/ftp/ceph/提示:默認真實物理機已經配置為NTP服務器。
[root@node1 ~]# vim /etc/chrony.conf … … server 192.168.2.254 iburst [root@node1 ~]# for i in 41 42 43 doscp /etc/chrony.conf 192.168.2.$i:/etc/ssh 192.168.2.$i "systemctl restart chronyd" done每臺虛擬機添加2塊20G的磁盤。
步驟二:部署ceph集群
提示:下面的步驟在所有主機都需要操作(node1,node2,node3)
#臨時修改權限: [root@node1 ceph-cluster]# chown ceph.ceph /dev/vdb1 #永久修改權限: [root@node1 ceph-cluster]# vim /etc/udev/rules.d/70-vdb.rules ENV{DEVNAME}=="/dev/vdb1",OWNER="ceph",GROUP="ceph"步驟三:部署ceph文件系統
步驟四:遷移網站數據到ceph集群
暫停服務防止有人實時讀寫文件。
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s stop [root@web2 ~]# /usr/local/nginx/sbin/nginx -s stop [root@web3 ~]# /usr/local/nginx/sbin/nginx -s stop [root@web1 ~]# umount /usr/local/nginx/html [root@web2 ~]# umount /usr/local/nginx/html [root@web3 ~]# umount /usr/local/nginx/html [root@web1 ~]# vim /etc/fstab #192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0 [root@web2 ~]# vim /etc/fstab #192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0 [root@web3 ~]# vim /etc/fstab #192.168.2.31:/web_share/html /usr/local/nginx/html/ nfs defaults 0 0在任意ceph節點,如node1查看ceph賬戶與密碼。
[root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring [client.admin]key = AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==/etc/rc.local是開機啟動腳本,任何命令放在該文件中都是開機自啟。[root@web1 ~]# mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ \-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==[root@web1 ~]# echo 'mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ \-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==' >> /etc/rc.local[root@web1 ~]# chmod +x /etc/rc.local[root@web2 ~]# mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ \-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==[root@web2 ~]# echo 'mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ \-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==' >> /etc/rc.local [root@web2 ~]# chmod +x /etc/rc.local[root@web3 ~]# mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ \-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==[root@web3 ~]# echo 'mount -t ceph 192.168.2.41:6789:/ /usr/local/nginx/html/ \-o name=admin,secret=AQA0KtlcRGz5JxAA/K0AD/uNuLI1RqPsNGC7zg==' >> /etc/rc.local [root@web3 ~]# chmod +x /etc/rc.local另一種解決方案,還可以通過fstab實現永久掛載。
 提示:如果希望使用fstab實現永久掛載,客戶端需要額外安裝libcephfs1軟件包。
第三種掛載方案:對于高可用的問題,可以在mount時同時寫入多個IP。
臨時命令: [root@web1 ~]# mount -t ceph \ 192.168.2.41:6789,192.168.2.42:6789,192.168.2.43:6789:/ /usr/local/nginx/html \ -o name=admin,secret=密鑰 永久修改: [root@web1 ~]# vim /etc/fstab 192.168.2.41:6789,192.168.2.42:6789,192.168.2.43:6789:/ /usr/local/nginx/html/ \ ceph defaults,_netdev,name=admin,secret=密鑰 0 0登陸NFS服務器備份數據,將備份數據拷貝給web1或web2或web3,tar備份數據時注意使用-f選項保留文件權限。
[root@nfs ~]# cd /web_share/html/ [root@nfs html]# tar -czpf /root/html.tar.gz ./* [root@nfs html]# scp /root/html.tar.gz 192.168.2.11:/usr/local/nginx/html/登陸web1將數據恢復到Ceph共享目錄
[root@web1 html]# tar -xf html.tar.gz [root@web1 html]# rm -rf html.tar.gz案例6:部署Git版本控制系統
部署Git版本控制系統,管理網站代碼,實現如下效果:
基于SSH協議的服務器 基于Git協議的服務器 基于HTTP協議的服務器 上傳代碼到版本倉庫生產環境應該有一臺獨立的Git服務器,這里為了節約主機資源,我們使用數據庫主機同時做完Git服務器,如圖所示。
 
 主機配置如表所示。
 
步驟一:部署SSH協議的版本控制服務器
步驟二:部署Git協議的版本控制服務器
在web2執行clone等同于是把代碼又備份了一份。
[root@web2 ~]# cd /var/ [root@web2 var]# git clone git://192.168.2.21/wordpress.git步驟三:部署HTTP協議的版本控制服務器
訪問網頁可以查看到wordpress倉庫,點擊tree菜單后可以看到如圖所示的代碼。
案例7:優化Web服務器
 優化Web服務器,實現如下效果:
步驟一:自定義404錯誤頁面
步驟二:升級nginx版本,開啟status模塊
注意:必須在nginx-1.15.8源碼包目錄下執行make upgrade命令。
[root@web1 nginx-1.15.8]# make upgrade或者手動執行killall命令殺死進程后重新啟動
[root@web1 ~]# killall nginx [root@web1 ~]# /usr/local/nginx/sbin/nginx步驟三:編寫日志切割腳本
步驟四:對頁面進行壓縮處理
步驟五:服務器內存緩存
總結
以上是生活随笔為你收集整理的部署LNMP动态网站及网站架构变迁的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Zerotier免费的虚拟局域网
- 下一篇: 小度路由madplay和mpd本地音乐播
