Nginx 高階篇(十一)叢集搭建實戰

huxiaobai_001發表於2020-03-23

我們在Nginx 高階篇(九)單機併發 1 萬 10 萬次請求解決和優化方案這篇文章當中已經講過了Nginx的1萬併發20萬次請求的優化方案,因為Nginx始終是擋在最前面的一道防線,首先Nginx必須得抗揍才行!這也是叢集化部署的第一步!
首先我們來看一下整個叢集是如何部署的?

光Nginx強大是沒用的,可能讓使用者只訪問一個靜態頁面吧,動態資料還是php去處理,php去請求mysql,請求memcache等,所以今天我們來講講高併發下各個環節如何配置和優化?

memcache方向上:
我們在圖上畫了多臺memcache伺服器,Nginx 高階篇(六)第三方模組的安裝以及一致性雜湊演算法的應用這篇文章當中講過memcache叢集的搭建必須要結合一致性雜湊演算法來搞定,自己去看吧!每臺memcache伺服器上我們可以儘可能的多開memcache的程式,程式多了處理起來當然也就快了!
我們是通過Nginx直接連線到memcache上去的,可以設定upstream組,配置memcache叢集,再利用一致性雜湊演算法,完成Nginx直連Memcache的請求,當然你Memcache伺服器越多,每臺Memcache伺服器程式開的越多,處理起來也就快嘍!看我是咋搞的(一臺機器上咔咔起了多個Memcache程式):
Nginx 高階篇(十一)叢集搭建實戰
當Nginx從Memcache當中拿不到資料的時候會去回撥php指令碼,那麼在php的程式碼當中我們也是利用了一致性雜湊演算法,這個在前邊部落格當中也講過的,在用php連結memcache的時候採用持久化連結,加上個true就完事,不會自己去百度吧,redis也一樣,可以實現持久化連結!

PHP方向上:
我沒那麼多伺服器 我是弄到了一臺伺服器裡面 9000 和 9001埠 分別起了15個ph-fpm子程式
Nginx 高階篇(十一)叢集搭建實戰
如圖所示來了php的請求之後會分發到9000和9001埠上邊去 9000和9001的埠上的15+15=30個php-fpm子程式會對php請求進行處理!
php啟動之後會有一個master主程式 管理著幾個子程式 都監聽著9000埠 來一個請求起一個php-fpm子程式去處理 不用了自己就消失了
對於高併發來說 php方向上沒必要搞子程式回收 只需要弄幾個php-fpm子程式在那等著就行 來活就去處理 不來活就等著 但是不消失
一個php起30個子程式 一個子程式大概佔用記憶體20 30M左右 30個就接近1G的記憶體
9000 9001 9002分別起30個 那就是會佔用3G的記憶體 大概哈!所以哈你的記憶體得跟上!
我們需要做的是什麼?
a./usr/local/php/etc/php-fpm.conf當中載入了同目錄下的php-fpm.d裡面的www.conf
修改www.conf檔案:
listen 監聽的埠號是9000 前邊的ip地址不要寫127.0.0.1 而是要寫真實的ip地址不然會報錯
Nginx 高階篇(十一)叢集搭建實戰
另外pm生成子程式的形式為靜態 固定的多少個
Nginx 高階篇(十一)叢集搭建實戰
另外設定靜態生成的php-fpm子程式的個數
Nginx 高階篇(十一)叢集搭建實戰
b.拷貝/usr/local/php/etc/php-fpm.conf為/usr/local/php/etc/php-fpm9001.conf
在php-fpm9001.conf當中include另外的www9001.conf
Nginx 高階篇(十一)叢集搭建實戰
然後去/usr/local/php/etc/php-fpm.d/目錄下去拷貝www.conf為www9001.conf
Nginx 高階篇(十一)叢集搭建實戰
另外pm生成子程式的形式為靜態 固定的多少個
Nginx 高階篇(十一)叢集搭建實戰
另外設定靜態生成的php-fpm子程式的個數
Nginx 高階篇(十一)叢集搭建實戰
然後殺死現有的所有的php程式:

pkill -9 php

然後啟動php程式:

cd /usr/local/php
./sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf
./sbin/php-fpm -y /usr/local/php/etc/php-fpm9001.conf

看,這麼多php-fpm子程式在等待處理程式:
Nginx 高階篇(十一)叢集搭建實戰
這麼搞的話 你的記憶體要足夠大哈!別光php-fpm就吃光了你的記憶體!

mysql方向上:
對於 nginx + php-fpm 的情況,其實是保持了 php-fpm 子程式與mysql的長連線。 前端的http請求被分配給哪個 php-fpm子程式,該子程式就重用自己與mysql 的長連線。
也就是說php在操作mysql的時候最好保持長連線或者最好有資料庫連線池,這樣就避免了mysql的連結斷開浪費伺服器資源的情況發生,至於如何保持長連線或者使用mysql連線池請自行百度

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章