十分鐘讓你學會LNMP架構負載均衡

一、幾個基本概念

1、pv 值

pv 值(page views):頁面的瀏覽量

概念:一個網站的所有頁面,在一天內,被瀏覽的總次數。(大型網站通常是上千萬的級別)

2、uv值

uv值(unique visitor)獨立訪客

概念:一個網站,在一天內的用戶訪問數。(大型網站通常達10萬以上)

3、獨立IP

概念:一個網站,在一天內,有多少個獨立的ip地址來訪問。

鑒於一個區域網對外訪問時都是共用同一個公網IP的,因此UV值一般要略大於獨立ip值

可以通過愛站網 來查詢這些參數值

二、解決高併發思路

如果一個網站的uv,pv,獨立ip變大,則會導致高的併發,這時要對網站分層布局架構,採用負載均衡。

負載均衡

硬體:立竿見影,效果非常好,價格非常昂貴,比如F5-BIGIP

Advertisements

軟體:lvs(linux virtual server) ,nginx(web伺服器,負載均衡)

負載均衡實現策略

(1)輪詢,

負載均衡器把請求輪流轉發給後面的web伺服器。

(2)ip哈希,

同一個地址的客戶端,始終請求同一台主機。

(3)最少連接

負載均衡器把請求給負載最小的哪台伺服器。

架構圖如下:

如果併發數繼續增大,還可以藉助CDN來架構

三、nginx的介紹

1、常用web伺服器

apache:功能完善,歷史悠久,模塊支持非常豐富,屬於重量級產品,比較耗費內存。

缺點:處理每一個php比較費資源,導致如果高併發時會耗費伺服器資源無法處理更多請求。

lighttpd:內存開銷低,cpu佔用率低,效能好,模塊豐富等特點,輕量級web伺服器。

Advertisements

nginx:省資源,省cpu,所以在高併發時能夠處理更多的請求,高端能達到3萬到5萬的併發量。

IIS windows自帶的web伺服器軟體

Nginx的兩大應用:

(1) http的伺服器

(2)代理伺服器

正向代理

反向代理

2、選擇nginx理由

(1)它可以高併發連接,官方測試能夠支撐5萬併發連接,在實際生產環境中可以支撐2到4萬併發連接。

(2)內存消耗少

Nginx+php(FastCGI)伺服器在3萬併發連接下,開啟的10個Nginx進程消耗150MB內存(15MB*10=150MB)開啟的64個php-cgi進程消耗1280MB內存(20MB*64=1280MB)

(3)成本低廉

購買F5 BIG-IP ,NetScaler等硬體負載均衡交換機需要10多萬甚至幾十萬人民幣。而Nginx為開源軟體,可以免費試用,並且可用於商業用途。

(4)配置文件非常簡單:通俗易懂,即使非專業管理員也能看懂。

(5)支持 rewrite重寫規則:能根據域名、URL的不同,將HTTP請求分到不同的後端伺服器群組。

(6)內置的健康檢查功能:如果nginx proxy後端的某台伺服器宕機了,不會影響前端訪問。

(7)節省帶寬,支持gzip壓縮。

(8)穩定性高:用於反向代理,宕機的概率微乎其微。

(9)支持熱部署。在不間斷服務的情況下,對軟體版本升級。

nginx在反向代理,rewrite規則,穩定性,靜態化文件處理,內存消耗等方面,表現出了很強的優勢,選用nginx取代傳統的apache 伺服器,將會獲得多方面的性能提升。

(8)支持的操作系統

FreeBSD 3.x,4.x,5.x,6.x i386; FreeBSD 5.x,6.x amd64;Linux 2.2,2.4,2.6 i386; Linux 2.6 amd64;Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;MacOS X (10.4) PPC;

四、nginx的搭建

1、安裝

安裝前注意:

模塊依賴性:Nginx的一些模塊需要其他第三方庫的支持,例如gzip模塊需要zlib 庫,rewrite模塊需要pcre庫,ssl功能需要openssl庫等。

(1) 確保底層庫都已安裝

運行 yum install zlib* pcre* openssl*

(2) 創建一個用戶和用戶組

創建www組與www用戶 ,理論上來講用戶與用戶組的名稱無所謂,但盡量要有意義

groupadd www

useradd -g www -s /usr/sbin/nologin www

(3) 編譯安裝nginx

第一步:下載nginx

wget

第二步:解壓並進入目錄

tar ….

Cd …

第三步:配置

先查看configure的配置項,並保存成一個幫助文檔

將常用的配置項保存成一個安裝腳本文件

Vim nginx_install.sh

內容如下:

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_image_filter_module --with-pcre --http-client-body-temp-path=/usr/local/nginx/tmp/client_body_temp --http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi_temp --http-proxy-temp-path=/usr/local/nginx/tmp/proxy_temp --http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/tmp/scgi_temp

給sh文件加上可執行的許可權

然後執行

第四步:編譯安裝

make && make install

2、管理

(1)查看幫助文檔

Cd /usr/local/nginx/sbin

./nginx -h

(2)啟動nginx

直接執行安裝目錄下的sbin目錄下的nginx

(3)關閉nginx

可以執行 nginx -s stop 或者 執行 pkill nginx

(4)熱啟動

可以執行 nginx -s reload (前提是nginx已經在運行中)

擴展:如果想用service 服務名 選項來重啟或停止nginx,可以按以下步驟操作:

知識點:service 服務名 能操作成功的前提是 /etc/rc.d/init.d目錄下要有與服務名同名的可執行文件

所以我們可以在這個目錄下新建nginx文件

vim /etc/rc.d/init.d/nginx

內容:

#!/bin/sh

# chkconfig: - 85 15

# description: nginx is a World Wide Web server. It is used to serve

start() {

echo 'Starting Nginx ...'

/usr/local/nginx/sbin/nginx > /dev/null 2>&1 &

}

stop() {

echo 'Stoping Nginx ...'

/usr/local/nginx/sbin/nginx -s stop > /dev/null 2>&1 &

}

reload() {

echo 'Reloading Nginx ...'

/usr/local/nginx/sbin/nginx -s reload

}

if [ $# -ne 1 ]

then

echo 'please input one params like start|restart|stop|reload'

exit 1

fi

case "$1" in

'start')

start

;;

'stop')

stop

;;

'restart')

stop

sleep 2

start

;;

'reload')

reload

;;

'*')

echo 'please input one params like start|restart|stop|reload'

;;

esac

記得給這個文件添加可執行許可權

chmod +x /etc/rc.d/init.d/nginx

加入到開機自啟動:

chkconfig --add nginx

chkconfig --level 345 nginx on

五、虛擬主機配置

1、配置文件介紹

Nginx的配置文件位於安裝目錄下的conf目錄下

可以用以下命令查看非註釋部分的內容

egrep -v '#|^$' nginx.conf

-v 代表取反(去掉匹配到的內容)

在配置文件中,http段裡面的server段是配置虛擬主機使用的。如果想要配置多個虛擬主機,則就在http段裡面創建多個 server段即可。

注意配置文件中,每一行要使用分號結束,指令與{之間有空格。

Listen 後面可以是埠號,也可以是IP:埠號

Server_name 後面可以是域名,多個域名之間空格隔開,也可以是IP地址

在 http{}代碼段里添加 client_max_body_size 200m; 以支持 php 上傳大文件。(請根據自己項目需求來定值)

六、編譯 php與nginx整合

1、編譯安裝php

(1) 第一步:安裝PHP

1) 下載php

shell># cd ~

shell># wget

2) 解壓並進入目錄

shell># tar zxf php-5.6.24.tar.gz

shell># cd php-5.6.24

3) 將configure參數及詳情解析另存為一個文件,以供學習參考用:

shell># ./configure --help > php_configure.txt

4) 編寫一個輔助shell文件,幫我們配置php

shell># vim php_install.sh

為了避免寫錯,建議大家直接複製以下內容(都寫在一行上,不要換行):

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --enable-opcache --with-zlib-dir --with-bz2 --with-libxml-dir=/usr --with-gd --with-freetype-dir --with-jpeg-dir --with-png-dir --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-iconv --disable-ipv6 --enable-static --enable-inline-optimization --enable-sockets --enable-soap --with-openssl --with-curl

以上內容的解釋如圖

把剛剛的shell文件加上可執行許可權:

shell># chmod +x ./php_install.sh

5) 執行shell文件進行軟體的配置和環境檢測

shell># ./php_install.sh

6) 編譯軟體並且進行安裝

shell># make && make install

(2) 第二步:配置

1) 複製配置文件

shell># cp php.ini-production /usr/local/php/etc/php.ini

shell># cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm

賦予其可執行許可權

shell># chmod +x /etc/rc.d/init.d/php-fpm

拷貝產生php-fpm的配置文件

shell># cd /usr/local/php/etc

shell># cp php-fpm.conf.default php-fpm.conf

2) 配置php.ini

shell># vim php.ini

· 找到;date.timezone = 修改為 date.timezone = Asia/Shanghai

· 根據自己的需求調整以下選項的值

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

display_errors = On

max_execution_time = 60

max_input_time = 60

memory_limit = 256M

post_max_size = 256M

upload_max_filesize = 256M

3) 配置php-fpm.conf

shell># vim php-fpm.conf

· 找到user = nobody 和 group = nobody,將nobody改成www

· 找到listen.owner=nobody和listen.group= nobody,將nobody改成www

4) 將php-fpm加入服務並自動啟動

shell># service php-fpm start

shell># chkconfig --add php-fpm

shell># chkconfig --level 345 php-fpm on

2、配置nginx支持php

第一步:在nginx.conf中找到location ~ \.php$

複製並去掉註釋,將root改成你的虛擬主機的路徑

保存並重載配置文件,

shell># /usr/local/nginx/sbin/nginx -s reload

在html目錄下新建一個PHP文件,代碼如下:

在瀏覽器輸入php頁面的網址,可以發現並不能訪問

原因是官方給的默認配置文件中,

要求要把php文件放到/scripts目錄下。其實這個要求我們不一定要遵從。

改進的方案如下:

保存並重載

就可以讓nginx支持訪問類似http://www.a.com/index.php以及http://www.a.com/index.php?id=5這樣的頁面了。

3、優化nginx配置文件

第二步:優化

如果把所有的server代碼段都放在nginx.conf裡面的話,會讓nginx.conf顯得又臃腫又亂。建議把它們分離去。

例如,直接把所有的server代碼段都剪切到/usr/local/nginx/conf/vhost.conf裡面

然後在nginx.conf裡面換成

include vhost.conf

虛擬主機的代碼都移到了vhost.conf裡面了

至此,nginx.conf已經很優化了,我們再來優化vhost.conf

第三步:優化vhost.conf

將root語句和 index語句都提取到location外面

第四步:再一次優化vhost.conf

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

這兩個語句都剪切到fastcgi.conf裡面去

只留下include fastcgi.conf;

fastcgi.conf文件中新增了以下兩句:

至此,nginx已經支持訪問php頁面,並且nginx.conf和vhost.conf已經很優化了。

只是還無法支持像thinkphp的pathinfo形式的訪問

http://www.a.com/index.php/Admin/public/login

4、與ThinkPHP整合

第一步:將vhost.conf的location ~ \.php$ { 的$去掉

可以發現能支持pathinfo的訪問方式,但是無法識別出模塊、控制器和方法

然後將location代碼段寫成

location ~ \.php {

fastcgi_split_path_info ^(.+\.php)(/.*)$;

fastcgi_param PATH_INFO $fastcgi_path_info;

include fastcgi.conf;

保存並重載nginx

就可以支持thinkphp的pathinfo形式的訪問

第二步:優化vhost.conf

將這兩句

fastcgi_split_path_info ^(.+\.php)(/.*)$;

fastcgi_param PATH_INFO $fastcgi_path_info;

都剪切到 fastcgi.conf裡面,只留下include fastcgi.conf; 語句即可

第三步:開啟偽靜態功能

在server裡面的location / { 代碼段里,寫上

try_files $uri /index.php$uri;

保存並重載nginx

就可以支持thinkphp的rewrite訪問

http://www.a.com/Admin/public/login

七、負載均衡

1、負載均衡原理圖

2、實現一個簡單的負載均衡

伺服器列表

本機 192.168.81.1

VM 192.168.81.6

騰訊雲 123.207.231.180

負載均衡器的配置

upstream demo {

server 192.168.81.1;

server 123.207.231.180;

}

server {

listen 80;

server_name fzjh.com;

location / {

proxy_pass http://demo;

proxy_set_header Host $host;

proxy_set_header X-Peal-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}}

並且要確保 fzjh.com要解析到負載均衡器的IP地址

保存配置文件,並且重載

訪問效果:

Advertisements

你可能會喜歡