1. 程式人生 > >Nginx作為動靜分離、緩存與負載均衡初探

Nginx作為動靜分離、緩存與負載均衡初探

yum 後端 don 巖機 cati max 需要 ssi 上線

一、概述:

我之前有一篇文章寫了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

動靜分離架構圖
技術分享圖片

二、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 如圖:
技術分享圖片
技術分享圖片
以上的兩個網頁中圖片靜態資源也能正常訪問,我們檢驗下靜態的圖片是不是從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 1月  11 17:05 .
drwxr-xr-x 4 root  root  34 1月  11 16:53 ..
drwx------ 3 nginx nginx 14 1月  11 17:05 d4
drwx------ 3 nginx nginx 14 1月  11 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、實現架構
技術分享圖片

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項目實現動靜分離;並分別使用緩存提交訪問效率;
結合upstream模塊來實現對後端服務器的調度,達到七層負載均衡作用;以上不免有遺漏之處,如有錯誤或遺漏之處,歡迎指正交流~謝謝

Nginx作為動靜分離、緩存與負載均衡初探