Nginx架構拆分集群
1、拆分數據庫至獨立服務器
1.1 為何要拆分數據庫
單臺服務器運行整個LNMP架構會導致網站訪問緩慢,當系統內存被吃滿時,很容易導致系統出現oom,從而kill掉MySQL數據庫,為了避免這種情況的發生,我們可以將數據庫服務拆分到獨立的服務器上部署。拆分數據庫可以帶來以下好處:
? 1.緩解web網站的壓力;
? 2.增強數據庫讀寫性能;
? 3.提高用戶訪問的速度;
1.2 數據庫拆分架構
image.png
1.3 數據庫拆分環境
系統環境 | 主機名稱 | 應用環境 | 外網地址 | 內網地址 |
RockyLinux9 | web01.newy.net | nginx+php | 10.0.0.7 | 172.16.1.7 |
RockyLinux9 | db01.newy.net | mysql | 10.0.0.51 | 172.16.1.51 |
1.4 拆分數據庫實踐
要將數據庫服務遷移到一個獨立的服務器運行,可以按照如下步驟進行操作:
? 1、首先,我們需要備份當前 Web 服務器上 MySQL 的數據。然后將備份的文件拷貝到新的數據庫服務器。
? 2、在新服務器上安裝 MySQL ,并導入剛才備份的數據,確保數據庫內容是最新的。
? 3、在新的 MySQL 服務上創建一個遠程可以訪問數據庫的用戶,并賦予對應的權限。
? 4、最后將應用程序數據庫的連接地址,指向新的數據庫服務器地址。
1、備份web服務器上的數據庫,然后將備份的文件拷貝到新的數據庫服務器上;
[root@web01 ~]# mysqldump -uroot -p'newy.net'-B wordpress zh > app-database.sql [root@web01 ~]# scp app-database.sql root@172.16.1.51:/tmp
2、在新的數據庫服務器上安裝MySQL,然后導入數據
[root@db01 ~]# yum install mysql-server -y [root@db01 ~]# systemctlenablemysqld --now [root@db01 ~]# mysql -uroot < /tmp/app-database.sql
3、在新的MySQL服務上創建一個能通過遠程訪問的用戶
CREATE USER'app'@'%'IDENTIFIED BY'newy.net'; grant all privileges ON *.* TO'app'@'%'; flush privileges;
4、修改代碼指向新的數據庫
# wordpress [root@web01 ~]# vim /code/wordpress/wp-config.php define('DB_NAME','wordpress'); define('DB_USER','app'); define('DB_PASSWORD','newy.net'); define('DB_HOST','172.16.1.51'); # wecenter [root@web01 zh]# grep -iR"newy.net"|grep -v cache system/config/database.php: 'password'=>'newy.net', [root@web01 zh]# vim /code/zh/system/config/database.php 'host'=>'172.16.1.51', 'username'=>'app', 'password'=>'newy.net', 'dbname'=>'zh',
2、擴展多臺相同的Web應用
2.1 為何要擴展多臺web節點
目前站點僅運行在一臺服務器上,那么它能夠同時處理的用戶數量是有限的。為了讓網站能夠接收更多的用戶請求,我們需要配置多臺服務器,來共同提供支撐。這樣做有幾個好處:
? 1、單臺web節點如果故障,會導致業務整體down機;
? 2、多臺web節點能保證業務的持續穩定,擴展性高;
? 3、多臺web節點能有效的提升用戶訪問網站的速度;
2.2 擴展多web節點架構
image.png
2.3 擴展多web節點環境
系統環境 | 主機名稱 | 應用環境 | 外網地址 | 內網地址 |
RockyLinux9 | web01.newy.net | nginx+php | 10.0.0.7 | 172.16.1.7 |
RockyLinux9 | web02.newy.net | nginx+php | 10.0.0.8 | 172.16.1.8 |
RockyLinux9 | db01.newy.net | mysql | 10.0.0.51 | 172.16.1.51 |
2.4 擴展多web節點實踐
基于現有的web01節點,快速擴展一臺web02的節點,數據庫統一使用db01
1、安裝LNP環境
2、將web01節點的Nginx、PHP配置文件拷貝至web02節點
3、將web01節點的代碼拷貝至web02節點
4、啟動服務,而后使用客戶端進行驗證服務;
1、安裝LNP環境(創建用戶、安裝軟件)
[root@web02 ~]# groupadd -g666 www [root@web02 ~]# useradd -u666 -g666 www [root@web02 ~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/ [root@web02 ~]# yum install -y nginx php php-fpm php-cli php-common php-devel php-embedded php-gd php-mcrypt php-bcmath php-mbstring php-pdo php-xml php-mysqlnd php-opcache php-pecl-zip php-pecl-redis php-pecl-mongodb
2、使用 scp 或 rsync 將web01的nginx、php配置文件拷貝到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/ [root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/ [root@web02 ~]# scp -rp root@172.16.1.7:/etc/php.ini /etc/
3、使用 scp 或 rsync 將web01的代碼拷貝到web02服務器上
[root@web01 ~]# tar czf code.tar.gz /code [root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp [root@web02 ~]# tar xf /tmp/code.tar.gz -C /
4、啟動nginx與php-fpm并加入開機自啟
[root@web02 ~]# systemctlenablenginx php-fpm --now
3、拆分靜態資源至獨立服務器
3.1 為何要拆分靜態資源
當前后端有多臺web節點,會導致用戶上傳的圖片、視頻附件等內容僅上傳到了一臺web服務器,那么其他的web服務器則無法訪問到該圖片。為了解決這個問題,我們可以使用NFS共享存儲。這么做有幾個好處:
? 1、保證了多臺web節點靜態資源一致。
? 2、有效節省多臺web節點的存儲空間。
? 3、后期通過自動化更新代碼,只需要考慮更新代碼的變動,而無需考慮靜態資源。
3.2 拆分靜態資源架構
image.png
3.3 增加共享存儲環境
系統環境 | 主機名稱 | 應用環境 | 外網地址 | 內網地址 |
RockyLinux9 | web01.newy.net | nginx+php | 10.0.0.7 | 172.16.1.7 |
RockyLinux9 | web02.newy.net | nginx+php | 10.0.0.8 | 172.16.1.8 |
RockyLinux9 | nfs.newy.net | nfs | 10.0.0.22 | 172.16.1.22 |
RockyLinux9 | db01.newy.net | mysql | 10.0.0.51 | 172.16.1.51 |
3.4 增加共享存儲實踐
配置共享存儲實現思路;
? 1、首先增加一臺獨立的服務器,然后安裝好對應的NFS,并對外共享目錄;
? 2、找到應用存儲靜態資源的路徑,而后將靜態資源全部同步到NFS存儲中;
? 3、將應用站點的靜態目錄,掛載到NFS存儲對應的目錄上;
1、安裝NFS
[root@nfs ~]# yum install nfs-utils -y [root@nfs ~]#cat/etc/exports /data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) /data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) [root@nfs ~]#mkdir/data/{blog,zh} -p [root@nfs ~]#chown-R www.www /data/ [root@nfs ~]# systemctl restart nfs-server
2、將靜態資源文件同步到共享存儲中
[root@web01 ~]# scp -rp /code/wordpress/wp-content/uploads/* root@172.16.1.22:/data/blog
3、各個節點掛載對應的存儲
[root@web01 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/ [root@web02 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/
4、問題思考
4.1 如何快速擴展新節點
如果我們添加了一臺C應用服務器,如何能實現快速擴展?
? 1.準備LNP環境,(手動 | Ansible)
? 2.拷貝任意A或B上的配置文件,代碼
? 3.掛載NFS存儲
4.2 多節點該如何訪問
現在有多個WEB服務器,該如何進行訪問?
1、DNS輪詢
? (1)需要所有的web節點具備公網IP地址
? (2)公網獨立IP需要費用,而且不便宜。
? (3)所有的web節點有公網IP,不安全。
? (4)DNS只有輪詢機制,沒有 健康檢查功能。
2、負載均衡
? (1)所有的web節點不需要有公網IP,能節省成本、并保證安全
? (2)能夠對后端的web節點進行健康檢查機制;
? (3)負載均衡有多種調度算法來滿足企業不同需求;
image.png
4.3 Nginx負載均衡配置
wordpress的配置
[root@proxy01 ~]#cat/etc/nginx/conf.d/proxy_blog.newy.net.conf upstream blog { server 172.16.1.7:80; server 172.16.1.8:80; } server { listen 80; server_name blog.newy.net; location / { proxy_pass http://blog; proxy_set_header Host$http_host; proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for; } }
zh的配置
[root@proxy01 ~]#cat/etc/nginx/conf.d/proxy_zh.newy.net.conf upstream zh { server 172.16.1.7:80; server 172.16.1.8:80; } server { listen 80; server_name zh.newy.net; location / { proxy_pass http://zh; proxy_set_header Host$http_host; proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for; } }
6.Nginx負載均衡會話共享
6.1 什么是會話保持
當用戶登陸一個網站服務器,網站服務器會將用戶的登陸信息存儲下來(存儲下來的內容叫Session),以保證我們能夠一直處于”登陸在線“狀態。
6.2 為什么需要會話保持
由于我們使用的是負載均衡輪詢機制,會導致用戶請求分散在不同的節點,從而造成會話無法保持。
假設用戶A,通過負載均衡登陸了網站,此時會話信息存儲在A節點,那么當它一刷新,負載均衡會將請求分發給B節點,那么B節點沒有用戶A的登陸信息,就會提示用戶A登陸,當A用戶點擊登陸時又會將請求分發給C節點,從而造成用戶A無法實現會話保持。
6.3 如何實現會話保持
? 1、粘性session:指Ngnix每次都將同一用戶的所有請求轉發至同一臺服務器上,及Nginx的 IP_hash。
? 2、session復制:每次session發生變化,就廣播給集群中的服務器,使所有的服務器上的session相同。
? 3、session持久化:將session存儲至數據庫中,像操作數據一樣操作session。
? 4、session共享:將session至內存數據庫中,使用redis,memcached實現。
? 5、Cookies植入: 使用負載均衡來實現,例如Haproxy;(在nginx中暫不實現)
6.4 會話保持場景演示
6.4.1 配置web節點
1.首先安裝并配置phpmyadmin
[root@web01 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip [root@web01 ~]# unzip phpMyAdmin-5.2.1-all-languages.zip -d /code/ [root@web01 ~]#ln-s /code/phpMyAdmin-5.2.1-all-languages/ /code/phpmyadmin
2.修改phpmyadmin連接遠程的數據庫
[root@web01 code]#cd/code/phpmyadmin [root@web01 phpmyadmin]#cpconfig.sample.inc.php config.inc.php [root@web01 phpmyadmin]# vim config.inc.php /* Server parameters */ $cfg['Servers'][$i]['host'] ='172.16.1.51';
3.在多臺web上準備phpmyadmin的nginx配置文件*
[root@web01 phpmyadmin]#cat/etc/nginx/conf.d/phpmyadmin.newy.net.conf server { listen 80; server_name admin.newy.net; root /code/phpmyadmin; location / { index index.php index.html; } location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } #重啟Nginx服務 [root@web01 ~]# systemctl restart nginx
6.4.2 配置負載均衡
1.編寫一份proxy負載均衡的配置文件,將請求調度到后端web節點
[root@proxy01 ~]#cat/etc/nginx/conf.d/proxy_php.com.conf upstream php { server 172.16.1.7:80; server 172.16.1.8:80; } server { listen 80; server_name php.newy.net; location / { proxy_pass http://php; proxy_set_header Host$http_host; } }
2.檢查語法并重載nginx
[root@proxy01 conf.d]# nginx -t [root@proxy01 conf.d]# systemctl restart nginx
6.4.3 配置Redis服務
1.安裝redis內存數據庫
[root@db01 ~]# yum install redis -y
2.配置redis監聽在本地的內網網卡上
[root@db01 ~]# sed -i'/^bind/c bind 127.0.0.1 172.16.1.51'/etc/redis.conf
3.啟動redis
[root@db01 ~]# systemctl start redis [root@db01 ~]# systemctlenableredis
6.4.4 配置php連接Redis
1.修改/etc/php.ini文件。[所有節點都需要操作]
[root@web ~]# vim /etc/php.ini session.save_handler = redis session.save_path ="tcp://172.16.1.41:6379" ;session.save_path ="tcp://172.16.1.41:6379?auth=123"#如果redis存在密碼,則使用該方式
2.注釋php-fpm.d/www.conf里面的兩條內容,否則session內容會一直寫入/var/lib/php/session目錄中,從而造成會話共享失敗。[所有節點都需要操作]
[root@web ~]# vim /etc/php-fpm.d/www.conf ;php_value[session.save_handler] = files ;php_value[session.save_path] = /var/lib/php/session
3.重啟php-fpm服務。[所有節點都需要操作]
[root@web ~]# php-fpm -t [root@web ~]# systemctl restart php-fpm
鏈接:https://blog.csdn.net/Sunfeiyanghtml/article/details/140270815
-
服務器
+關注
關注
13文章
9752瀏覽量
87556 -
數據庫
+關注
關注
7文章
3908瀏覽量
65967 -
nginx
+關注
關注
0文章
169瀏覽量
12540
原文標題:零宕機!Nginx集群化部署與高可用架構設計
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
nginx重啟命令linux步驟是什么?
nginx重啟命令linux步驟是什么?
Linux高級架構師資料分享
模擬集群和數字集群之間的區別和特點
copy模式的DRDS集群
搭建Keepalived+Lvs+Nginx高可用集群負載均衡

評論