1. 程式人生 > >nginx反向代理實現資源的動靜分離

nginx反向代理實現資源的動靜分離

nss name mark shadow 獲取 raid linux 格式 分享圖片

實驗拓撲圖:
技術分享圖片
一個網站的資源通常分為動態資源以及靜態資源兩種,這次我們來配置一下反向代理服務器實現資源的動靜分離。
將反向代理服務器配置成一個LNMP平臺,讓它即充當web網站的動態資源服務器又充當反向代理服務器,所有的動態請求都讓代理服務器自身來處理,同時將處理請求緩存下來。後端的upstream server配置成負載均衡的web靜態資源服務器同時實現基於cookie的客戶端session綁定。

首先準備基礎環境

反向代理服務器端配置:
yum install -y nginx    //安裝nginx服務
systemctl start nginx
systemctl enable nginx //設置開機自動啟動nginx服務
vim /etc/selinux/config
SELINUX=disabled    //關閉selinux功能
systemctl stop firewalld   //關閉防火墻
打開反向代理服務器的路由轉發功能
編輯/etc/sysctl.conf文件
添加net.ipv4.ip_forward=1
sysctl -p重讀文件
後端upstream server服務器配置:
yum install -y httpd  //兩臺服務器安裝httpd服務
vim /etc/selinux/config
SELINUX=disabled    //關閉selinux功能
systemctl stop firewalld   //關閉防火墻

接下來配置LNMP平臺,因為php與nginx只能使用fastcgi協議,所以這裏只能使用fastcgi_pass模塊與nginx對接。

yum install -y php-fpm  //安裝php模塊
systemctl restart php-fpm   //啟動服務
systemctl enable php-fpm  //設置開機自動啟動
配置反向代理功能
location ~ \.php$ {
                root  /usr/share/nginx/html;   //定義php程序文件的主目錄,所有php資源的請求都會從主目錄開始查找
                fastcgi_pass 127.0.0.1:9000;  //指名運行php-fpm程序的服務器是哪一臺,因為這裏是與代理服務器配置在同一臺主機上面所以此時使用本地回環地址。如果php-fpm程序使用的是單獨的服務器則需要更改對應的IP地址。
                fastcgi_index  index.php;   //定義訪問的主頁
                fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_nam;   //調用fastcgi_param配置文件中定義的配置參數
                include fastcgi_params;  //使用fastcgi_params配置文件
        }

技術分享圖片

重新啟動服務器並準備一個測試頁面
systemc restart nginx
cd /usr/share/nginx/html
將原來的index.html重命名然後重新創建一個index.php的測試頁面
<?php
    phpinfo();
?>
安裝mariadb數據庫並測試其連接性
安裝php-mysql 以及maraidb-server
編輯/usr/share/nginx/html/index.php
<?php
                $conn = mysql_connect(‘127.0.0.1‘,‘root‘,‘‘);
                if ($conn)
                      echo succ;
                else
                        echo fail;
                mysql_close();      
?>

技術分享圖片
技術分享圖片
此時我們已經實現了動靜分離,php資源的請求被發送到php-fpm服務器,靜態資源請求被發往upstream服務器,因為php-fpm跟ngxin安裝在同一臺服務器上,所以php資源調度請求都被發往負載均衡調度器,如果php-fpm部署在單獨的服務器,那麽php資源的請求將被發送到單獨部署的php服務器上。

配置動態資源的緩存

需要用到fastcgi_cache緩存模塊,配置格式同樣是定義在http字段中

fastcgi_cache_path  /cache/fastcgi  levels=1:1 keys_zone=fcgicache:10m  inactive=3m max_size=1g; 
在location中調用緩存功能
location ~ \.php$ {
                root  /usr/share/nginx/html;  
                fastcgi_pass 127.0.0.1:9000; 
                fastcgi_index  index.php;  
                fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_nam;  
                include fastcgi_params; 
                fastcgi_cache fcgicache;
                fastcgi_cache_vaild 200 301 302 10m;
                fastcgi_cache_valid any 1m;
                fastcgi_cache_use_stale error timeout 404; 
        }
保存重啟服務
創建目錄
mkdir /cache/fastcgi
更改文件屬主屬組
chown -R nginx:nginx /cache/fastcgi

進行壓力測試:

ab -n 1000 -c 100 http://172.161.1.132/index.php
當逐步提高並發量之後我們可以發現,開啟緩存功能跟不開啟緩存功能,請求響應的時間有明顯的差別。
為了驗證客戶端獲取的資源是從nginx反向代理服務器上獲取的,還可以在nginx配置文件中的server字段中定義兩個參數

add_header X-via $server_addr; 哪臺主機幫忙代理
add_header X-Cache $upstream_cache_status;返回的資源是否為緩存資源

然後使用客戶端向服務器請求資源同時打開瀏覽器的調試臺查看
技術分享圖片
可以看到我們獲取的資源確實為反向代理服務器的緩存提供的

接下配置兩臺靜態服務器並實現基於客戶端cookie的session綁定

為了驗證效果這次兩臺靜態服務器同樣使用不同的測試頁面
首先在主配置文件的http字段定義upstream負載均衡

upstream upservers {
            server 192.168.153.130 ;
            server 192.168.153.131 ;
            }
在location中進行調度
location /forum    {                    //這裏我們使用url重定向來定義
            proxy_pass http://upservers/;
         }

使用客戶端發送請求驗證
技術分享圖片
技術分享圖片
當我們每刷新一次,反向代理服務器就會根據算法調度將請求轉發到後端的upstream server服務武器上實現負載均衡。

配置基於cookie的session的會話綁定

因為nginx-sticky-module為第三方模塊所以需要將此功能編譯進nginx程序

首先安裝openssl-devel
yum install -y openssl-devel
解壓sticky安裝包
tar -zxvf nginx-goodies-nginx-sticky-module-ng-1e96371de59f.tar.gz
重命名目錄
mv nginx-goodies-nginx-sticky-module-ng-1e96371de59f nginx-sticky 
cd nginx-sticky
./configure --prefix=/etc/jack/nginx  --add-module=/etc/tools/nginx-sticky/
make編譯,然後將原來的/nginx/sbin目錄下的nginx程序替換掉
mv /etc/nginx/sbin/nginx    /etc//nginx/sbin/nginx.bak  #備份
cp /etc/tools/objs/nginx    /etc/nginx/sbin/
重新啟動服務
在location中定義會話保持參數
location /forum    {   
                        sticky;   //根據具體需求還可以設置expires,domain等信息
            proxy_pass http://upservers/;
         }

配置完成後我們在使用客戶端訪問的時候發現請求一直被調度到第一次訪問的服務器。這樣就實現了基於cookie的session會話綁定。

nginx反向代理實現資源的動靜分離