Nginx作為動靜分離、快取與負載均衡初探
一、概述:
我之前有一篇文章寫了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專案實現動靜分離;並分別使用快取提交訪問效率;
結合http模組下的upstream模組來實現對後端伺服器的排程,達到七層負載均衡作用;之所以說是七層負載均衡排程方案,因為最新的nginx版本(1.9.2之後)有單獨的stream模組可實現類似四層排程負載方案;後期補上!以上不免有遺漏之處,如有錯誤或遺漏之處,歡迎指正交流~謝謝
相關文章
- Nginx 動靜分離與負載均衡的實現Nginx負載
- Nginx—tomcat負載均衡動靜分離群集NginxTomcat負載
- Nginx使用篇:實現負載均衡、限流與動靜分離Nginx負載
- Nginx+Tomcat負載均衡,動靜分離群集部署解析NginxTomcat負載
- Nginx+Tomcat實現負載均衡、動靜分離叢集部署NginxTomcat負載
- 帶你瞭解Nginx+Tomcat負載均衡,動靜分離群集NginxTomcat負載
- 伺服器群集—Nginx+Tomcat+keepalived負載均衡、動靜分離群集伺服器NginxTomcat負載
- Tomcat+Nginx實現動靜分離和負載均衡架構部署TomcatNginx負載架構
- 代理與反向代理、負載均衡和快取負載快取
- 《Nginx系列》之青銅入門篇 反向代理 負載均衡 動靜分離就是這麼簡單Nginx負載
- 循序漸進nginx(二):反向代理、負載均衡、快取服務、靜態資源訪問Nginx負載快取
- Nginx搭建反向代理負載均衡和web快取伺服器Nginx負載Web快取伺服器
- 11,nginx動靜分離Nginx
- nginx負載均衡Nginx負載
- 【Nginx】負載均衡Nginx負載
- NGINX 負載均衡Nginx負載
- Nginx入門到實戰(3)負載均衡和快取服務Nginx負載快取
- 013.Nginx動靜分離Nginx
- Nginx負載均衡模式Nginx負載模式
- openGauss JDBC客戶端負載均衡與讀寫分離JDBC客戶端負載
- 資料庫的讀寫分離與負載均衡策略資料庫負載
- 負載均衡之LVS與Nginx對比負載Nginx
- nginx負載均衡原理分析到手動編寫簡易負載均衡器Nginx負載
- 負載均衡和動態負載均衡分別是什麼?-VeCloud負載Cloud
- MySQL Route負載均衡與讀寫分離Docker環境使用MySql負載Docker
- AutoScaling彈性伸縮附加與分離負載均衡例項負載
- Nginx負載均衡高可用Nginx負載
- 012.Nginx負載均衡Nginx負載
- Nginx負載均衡詳解Nginx負載
- nginx實現負載均衡Nginx負載
- nginx面試題-nginx負載均衡與正反向代理Nginx面試題負載
- 介紹下Nginx 反向代理與負載均衡Nginx負載
- nginx+consul做動態負載均衡(docker)Nginx負載Docker
- 做了反向代理和負載均衡的nginx配置檔案簡單示例(nginx.conf) HTTP負載均衡/TCP負載均衡負載NginxHTTPTCP
- Nginx+Tomcat實現動靜分離NginxTomcat
- 使用nginx進行負載均衡Nginx負載
- 負載均衡之--Nginx、LVS、HAProxy負載Nginx
- Nginx/Httpd負載均衡tomcat配置Nginxhttpd負載Tomcat
- Nginx+Tomcat部署負載均衡NginxTomcat負載