Nginx作為動靜分離、快取與負載均衡初探

餘二五發表於2017-11-15

一、概述:

我之前有一篇文章寫了Nginx作為web伺服器的http與https的初探 作為nginx基礎介紹,作為web伺服器使用;今天要介紹的是nginx作為代理伺服器和七層排程負載均衡的入門介紹;
實現內容:

通過nginx代理後端phpadmin網站,並通過nginx的代理達到動靜內容分離;在代理上做快取;

實驗環境:

proxy:Centos7 模擬外網ip:172.16.3.152 內網Lan ip:192.168.56.254

後端靜態節點n1.pkey.cn:

CentOS7 內網Lan ip:192.168.56.11

後端靜態節點n2.pkey.cn:

CentOS7 內網Lan ip:192.168.56.12

測試客戶端:ubuntu 16.04 ip:172.16.3.140

動靜分離架構圖
Nginx作為動靜分離、快取與負載均衡初探

二、ngin代理之動靜分離

這回我們動態內容是php php-fpm mariadb phpadmin

動態web 的配置
1、軟體安裝配置

#軟體安裝
[root@n2 ~]# yum install php php-fpm php-mysql php-mbstring php-mcrypt mariadb-server -y
#配置php-fpm
[root@n2 ~] cat  /etc/php-fpm.d/www.conf
[www]
listen = 0.0.0.0:9000
listen.allowed_clients = any
user = apache
group = apache
pm = dynamic
pm.max_children = 150
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.status_path = /status
ping.path = /ping
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
#建立對應的php session目錄
[root@n2 ~]# mkdir /var/lib/php/session -pv
[root@n2 ~]# chown apache:apache /var/lib/php/session

2、安裝phpadmin

[root@n2 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/4.0.10.20/phpMyAdmin-4.0.10.20-all-languages.tar.gz

[root@n2 ~]# mkdir -pv /data/apps

[root@n2 ~]# tar xvf phpMyAdmin-4.0.10.20-all-languages.tar.gz -C /data/apps/

[root@n2 apps]# ln -sv phpMyAdmin-4.0.10.20-all-languages/ pma

[root@n2 pma]# cp config.sample.inc.php config.inc.php

#只需要修改17行

$cfg[`blowfish_secret`] = `a8bdafda7c6d`; /

3、資料庫配置

[root@n2 ~]# vim /etc/my.cnf.d/server.cnf
新增以下兩行
[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON
啟動資料庫
[root@n2 ~]# systemctl restart mariadb
[root@n2 ~]# systemctl enable mariadb
#設定root密碼
MariaDB [(none)]> set password for root@localhost=password("redhat");
Query OK, 0 rows affected (0.00 sec)

4、靜態web配置

[root@n1 ~]# yum install nginx -y
[root@n1 ~]# mkdir -pv /data/nginx/html
[root@n1 ~]# cd /data/nginx/html
[root@n2 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/4.0.10.20/phpMyAdmin-4.0.10.20-all-languages.tar.gz
[root@n1 ~]# tar xvf phpMyAdmin-4.0.10.20-all-languages.tar.gz -C /data/nginx/html
[root@n1 ~]# cd /data/nginx/html
[root@n1 ~]# ln -sv phpMyAdmin-4.0.10.20-all-languages/ pma
[root@n2 pma]# cp config.sample.inc.php config.inc.php
#只需要修改17行
$cfg[`blowfish_secret`] = `a8bdafda7c6d`; /     #可與動態上的不一樣內容

#nginx配置
cat /etc/nginx/conf.d/phpadmin.conf
server{
    listen 80;
    server_name 192.168.56.11;
    root  /data/apps;

}

靜態web中的作用就是提供phpadmin的靜態內容 ,如html和圖片等靜態內容~

5、nginx proxy配置

安裝nginx並配置代理

[root@proxy ~]# yum  install nginx -y
cat /etc/nginx/conf.d/phpadm.conf
server{
        listen 80;
        server_name phpadmin.pkey.cn;
        index index.php index.html;
        location / {
           root /data/nginx/html;
           proxy_pass http://192.168.56.11:80;   #靜態反代到n1
        }
        location ~* .php$ {
            fastcgi_pass 192.168.56.12:9000;     #php動態反代到n2
            fastcgi_index  index.php;
            include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME        /data/apps/$fastcgi_script_name;
        }
}

##檢查並啟動nginx服務
[root@proxy ~]#  nginx -t 
[root@proxy ~]# systemctl start nginx

以上配置說明了:凡是php結尾的動態請求都發往192.168.56.12:9000處理;其他的則發往192.168.56.11:80來處理;

我的測試 是在ubuntu下的的

新增172.16.3.172 phpadmin.pkey.cn 條目到/etc/hosts中

開啟瀏覽器訪問:http://phpadmin.pkey.cn/pma/index.php 如圖:
Nginx作為動靜分離、快取與負載均衡初探
Nginx作為動靜分離、快取與負載均衡初探

以上的兩個網頁中圖片靜態資源也能正常訪問,我們檢驗下靜態的圖片是不是從n1的網站提供的;

到n1.pkey.cn靜態web上看日誌 :

[root@n1 conf.d]# tail -f /var/log/nginx/access.log 
192.168.56.254 - - [11/Jan/2018:02:58:11 -0500] "GET /pma/themes/dot.gif HTTP/1.0" 200 43 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"
192.168.56.254 - - [11/Jan/2018:02:58:11 -0500] "GET /pma/themes/pmahomme/img/ajax_clock_small.gif HTTP/1.0" 200 1810 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"
.......以下省略.......

可以看在重新整理http://phpadmin.pkey.nc/pma/index.php時日誌上都是”GET /pma/themes/dot.gif”型別的圖片檔案訪問記錄另外看到日誌上的訪問是代理的內網ip即:192.168.56.254,如何給出真實請求ip?

6、代理轉發客戶端請求真實ip

需要在nginx proxy上新增如下資訊:

      location / {
           root /data/nginx/html;
           proxy_pass http://192.168.56.11:80;   #靜態反代到n1
                     proxy_set_header  X-Forwarded-For $remote_addr;
        }

重新載入nginx

再次訪問http://phpadmin.pkey.cn/pma/index.php

檢視n1上的日誌資訊:

[root@n1 nginx]# tail -f access.log
192.168.56.254 - - [11/Jan/2018:03:23:35 -0500] "GET /pma/themes/dot.gif HTTP/1.0" 200 43 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "172.16.3.140"
192.168.56.254 - - [11/Jan/2018:03:23:35 -0500] "GET /pma/themes/pmahomme/img/sprites.png HTTP/1.0" 200 61899 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "172.16.3.140"
192.168.56.254 - - [11/Jan/2018:03:25:40 -0500] "GET /pma/themes/pmahomme/jquery/jquery-ui-1.9.2.custom.css HTTP/1.0" 404 169 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "172.16.3.140"
192.168.56.254 - - [11/Jan/2018:03:25:40 -0500] "GET /pma/themes/pmahomme/img/logo_right.png HTTP/1.0" 404 169 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "172.16.3.140"
192.168.56.254 - - [11/Jan/2018:03:25:40 -0500] "GET /pma/themes/dot.gif HTTP/1.0" 404 169 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0" "172.16.3.140"

可以看到日誌每條的最後面都有172.16.3.140 這個地址就是我的測試機器的ip;

7、給代理伺服器加上快取

a、針對靜態內容的cache,由ngx_http_proxy_module模組中的 proxy_cache_path 指令實現,必須放在http區域中

以下是應用例項:

[root@proxy ~]# cat /etc/nginx/nginx.conf
...
http{
...
proxy_cache_path  /data/nginx/cache levels=1:2 keys_zone=scache:10m inactive=3m max_size=2g;
...
}
[root@proxy ~]# mkdir -pv /data/nginx

proxy_cache_path引數說明:

/data/nginx/cache #快取路徑

levels=1:2 #路徑的結構

keys_zone=scache:10m #鍵區域名及大小

inactive=3m #活動時間

max_size=2g #使用2g硬碟做快取

更詳細使用說明了看官方文件

b、php-fpm fastcgi快取配置

針對動態的php 快取配置同樣需要配置在http區域中如下:

[root@proxy ~]# cat /etc/nginx/nginx.conf
...
http{
...
proxy_cache_path  /data/nginx/cache levels=1:2 keys_zone=scache:10m inactive=3m max_size=2g;
fastcgi_cache_path  /data/nginx/fcgicache levels=2:1 keys_zone=fcache:10m max_size=2g;
...
}
[root@proxy ~]# mkdir -pv /data/nginx

這裡的快取名叫fcache

引數意義與靜態的意義類似更多的使用說明請看官方文件

最終proxy 上phpadmin.conf配置檔案如下:


[root@proxy ~]#cache /etc/nginx/conf.d/phpadmin.conf
server{
        listen 80;
        server_name phpadmin.pkey.cn;
        index index.php index.html;
        location / {
           proxy_pass http://192.168.56.11:80;   #靜態反代到n1
       proxy_set_header  X-Forwarded-For $remote_addr;
           proxy_cache   scache;      #啟用定義快取
       proxy_cache_valid 200 302 10m;        #各狀態快取時間
       proxy_cache_valid 301      1h;
           proxy_cache_valid any      1m;
        }

        location ~* .php$ {
            fastcgi_pass 192.168.56.12:9000;     #php動態反代到n2
            fastcgi_index  index.php;
            include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME        /data/apps/$fastcgi_script_name;
            fastcgi_cache   fcache;          #啟用定義好的快取
            fastcgi_cache_key $request_uri;
        fastcgi_cache_valid 200 302 10m;       #各狀態快取時間
        fastcgi_cache_valid 301    1h;
        fastcgi_cache_valid any     1m;
        }
}

#檢查配置並重啟nginx服務
[root@proxy ~]# nginx -t 
[root@proxy ~]# systemctl restart nginx

再次請求訪問http://phpadmin.pkey.cn/pma/index.php

檢視快取:

[root@proxy nginx]# cd cache/
[root@proxy cache]# ls
2  6  9  d  e
[root@proxy cache]# cd ../fcgicache/
[root@proxy fcgicache]# ls -alh
總用量 0
drwx------ 4 nginx root  24 111 17:05 .
drwxr-xr-x 4 root  root  34 111 16:53 ..
drwx------ 3 nginx nginx 14 111 17:05 d4
drwx------ 3 nginx nginx 14 111 17:05 d7

可以看出訪問的內容已經被快取;以上就是動靜分離並分別快取的例項!

可以自行在其他客戶端上用ab工具測試,使用與不使用快取訪問的效率與速度 

ab -c 100 -n 2000 http://phpadmin.pkey.cn/pma/index.php

這裡就不貼過程了,效果還是很明顯的!

三、nginx負載均衡實現

1、實現內容:

nginx通過ngx_http_upstream_module模組實現(七層)負載均衡向後端排程主機;可以定義權重,自動檢測後端主機健康狀態;通過nginx實現負載均衡訪問後端服務,兩臺後端服務提供一致內容;這裡是測試 所以人為讓兩臺服務提供不一樣的內容以示區別;

2、實驗環境:

upstream:Centos7 模擬外網ip:172.16.3.152 內網Lan ip:192.168.56.254

後端節點n1.pkey.cn:

CentOS7 內網Lan ip:192.168.56.11

後端節點n2.pkey.cn:

CentOS7 內網Lan ip:192.168.56.12

測試客戶端:ubuntu 16.04 ip:172.16.3.140

3、實現架構
Nginx作為動靜分離、快取與負載均衡初探

4、兩臺後臺主機配置

兩臺upstream後端主機
#yum install httpd -y
分別
#cat /var/www/html/index.html
<h1>Upstream Server 1</h1>
<h1>Upstream Server 2</h1>
分別重啟兩臺httpd
#systemctl restart httpd

5、nginx排程器配置

同樣也是要配置在http區域,以下是配置

[root@upstream ~]# cat /etc/nginx/nginx.conf
http{
...
upstream websrvs {   #定義排程 group
        server 192.168.56.11:80;
        server 192.168.56.12:80;
        }
    ...省略...
    }

具體網站負載配置檔案

cat /etc/nginx/conf.d/pkey.cn.conf

server{
    listen 80;
    server_name www.pkey.cn;
    location /{
        root /data/nginx/html;
        proxy_pass http://websrvs;#引用upstream group

    }

}

測試 :

以ubuntu測試機上的/etc/hosts中新增

172.16.3.152 www.pkey.cn

san@ubuntu:~$ for i in {1..10};do curl http://www.pkey.cn;done
<h1>Upstream Server 1</h1>
<h1>Upstream Server 2</h1>
<h1>Upstream Server 1</h1>
<h1>Upstream Server 2</h1>
<h1>Upstream Server 1</h1>
<h1>Upstream Server 2</h1>
<h1>Upstream Server 1</h1>
<h1>Upstream Server 2</h1>
<h1>Upstream Server 1</h1>
<h1>Upstream Server 2</h1>

從測試結果看預設權重一樣的,是輪循高度演算法;

5、upstream 中重要的引數說明


 upstream websrvs {   #group
    ip_hash;
  server 192.168.10.11:80 fail_timeout=1 max_fails=3;
  server 192.168.10.12:80 weight=2;
    server 127.0.0.1:80 backup;
    keepalive 32;  
        }

#ip_hash 基於訪問客戶端ip來始終排程到同一個後端伺服器;類似於lvs中的sh演算法

#fail_timeout =1 max_fails=3 表示超時1s 最多3次 此臺主機失效

#weight=2 權重為2 預設權重為1

#backup 表示此臺主機在所有其他主機都巖機不可訪問時 上線,一般用來做臨時維護頁

#keepalive 表示排程代理與後端主機每個worker保持多少個連線數

#down 可以人為的讓某主機下線,不參與排程

更多配置參見官方文件另外有些功能是在企業版中才有的!

總結:

本文對nginx做代理伺服器時使用proxy_pass指令;使用phpamin專案實現動靜分離;並分別使用快取提交訪問效率;

結合http模組下的upstream模組來實現對後端伺服器的排程,達到七層負載均衡作用;之所以說是七層負載均衡排程方案,因為最新的nginx版本(1.9.2之後)有單獨的stream模組可實現類似四層排程負載方案;後期補上!以上不免有遺漏之處,如有錯誤或遺漏之處,歡迎指正交流~謝謝

本文轉自 dyc2005 51CTO部落格,原文連結:http://blog.51cto.com/dyc2005/2059950,如需轉載請自行聯絡原作者


相關文章