一、nginx代理的概述 概述:nginx是一款自由的、開源的、高性能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;nginx可以作為一個內部網路代理上網的代理伺服器,另外nginx可以作為反向代理進行負載均衡的實現。 二、nginx之正向代理 解析:在如今的 ...
一、nginx代理的概述
概述:nginx是一款自由的、開源的、高性能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;nginx可以作為一個內部網路代理上網的代理伺服器,另外nginx可以作為反向代理進行負載均衡的實現。
二、nginx之正向代理
解析:在如今的網路環境下,我們如果由於技術需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作FQ進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求發送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的數據傳遞給我們!上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的伺服器地址;伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
三、nginx之反向代理
第一層:client,客戶端層,發出http請求的單位;
第二層:反向代理層,agent層,負責將client客戶端的請求,代理轉發到第三層(real server)真實的伺服器的節點,並且保證real server節點不暴露在client前;
第三層:real server,伺服器層,真實負責處理cleint客戶端的請求,通常在此為多台伺服器構成,形成負載均衡之效果;
四、nginx之負載均衡
概述:nginx扮演了反向代理伺服器的角色,它是以依據什麼樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否可以控制呢?
實現方式:
硬體負載均衡:也稱為硬負載,如F5負載均衡,相對造價昂貴成本較高,但是數據的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司才會選擇硬負載進行操作;
軟體負載均衡:更多的公司考慮到成本原因,會選擇使用軟體負載均衡,軟體負載均衡是利用現有的技術結合主機硬體實現的一種消息隊列分發機制;
nginx的負載均衡演算法:
1.weight輪詢(預設):接收到的請求按照順序逐一分配到不同的後端伺服器。這種方式下,可以給不同的後端伺服器設置一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重數據越大,被分配到請求的幾率越大;
2.ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後端伺服器,這也在一定程度上解決了集群部署環境下session共用的問題;
3.fair:智能調整調度演算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種調度演算法。但是需要註意的是nginx預設不支持fair演算法,如果要使用這種調度演算法,請安裝upstream_fair模塊;
4.url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在nginx作為靜態伺服器的情況下提高緩存效率。同樣要註意nginx預設不支持這種調度演算法,要使用的話需要安裝nginx的hash軟體包;
五、案例:結合nginx反向代理構建nginx+lamp實現動靜頁面分離以及php伺服器的負載均衡
案例拓撲:
案例環境:
系統類型 |
IP地址 |
主機名 |
記憶體 |
所需軟體 |
Centos 7.4 1708 64bit |
192.168.100.101 |
www.linuxfan.cn |
1G |
nginx-1.12.2.tar.gz |
Centos 6.5 64bit |
192.168.100.150 |
real1.linuxfan.cn |
1G |
httpd-2.2.17.tar.gz、 cmake-2.8.6.tar.gz、 mysql-5.5.22.tar.gz、 libmcrypt-2.5.8.tar.gz、 mcrypt-2.6.8.tar.gz、 mhash-0.9.9.9.tar.gz、 php-5.3.28.tar.gz、 ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz |
Centos 6.5 64bit |
192.168.100.151 |
real2.linuxfan.cn |
1G |
httpd-2.2.17.tar.gz、 cmake-2.8.6.tar.gz、 mysql-5.5.22.tar.gz、 libmcrypt-2.5.8.tar.gz、 mcrypt-2.6.8.tar.gz、 mhash-0.9.9.9.tar.gz、 php-5.3.28.tar.gz、 ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz |
案例步驟:
- 部署real1.linuxfan.cn節點的lamp服務
- 部署real2.linuxfan.cn節點的lamp服務
- 安裝www.linuxfan.cn節點的nginx服務
- 配置nginx節點的反向代理服務
- 客戶端訪問測試代理集群
- 查看日誌分析訪問情況
部署real1.linuxfan.cn節點的lamp服務
[root@real1 ~]# ls lamp_install_publis-app-2015-07-16.tar.xz [root@real1 ~]# tar Jxvf lamp_install_publis-app-2015-07-16.tar.xz [root@real1 ~]# cd bin/ [root@real1 bin]#./apache_install.sh &&./mysql_install.sh &&./mysql_config.sh &&./php_install.sh &&./php_config.sh &&./lamp_config.sh [root@real1 bin]# cd [root@real1 ~]# netstat -utpln |grep 80 tcp 0 0 :::80 :::* LISTEN 50971/httpd [root@real1 ~]# netstat -utpln |grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6693/mysqld [root@real1 ~]# rm -rf /usr/local/httpd/htdocs/index.html [root@real1 ~]# vi /usr/local/httpd/htdocs/index.php <?php session_start(); $_SESSION['time'] =date("Y:m:d:H:s",time()); echo "本次訪問時間"."<font color=red>".$_SESSION['time']."</font>"."<br>"; echo "訪問的伺服器地址是"."<font color=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>"; echo "訪問的伺服器功能變數名稱是"."<font color=red>".$_SERVER['SERVER_NAME']."</font>"."<br>"; echo "SESSIONNAME是"."<font color=red>".session_name()."</font>"."<br>"; echo "SESSIONID是"."<font color=red>".session_id()."</font>"."<br>"; ?>
客戶端訪問測試:
部署real2.linuxfan.cn節點的lamp服務
[root@real2 ~]# ls lamp_install_publis-app-2015-07-16.tar.xz [root@real2 ~]# tar Jxvf lamp_install_publis-app-2015-07-16.tar.xz [root@real2 ~]# cd bin/ [root@real2 bin]#./apache_install.sh &&./mysql_install.sh &&./mysql_config.sh &&./php_install.sh &&./php_config.sh &&./lamp_config.sh [root@real2 bin]# cd [root@real2 ~]# netstat -utpln |grep 80 tcp 0 0 :::80 :::* LISTEN 50971/httpd [root@real2 ~]# netstat -utpln |grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6693/mysqld [root@real2 ~]# rm -rf /usr/local/httpd/htdocs/index.html [root@real2 ~]# vi /usr/local/httpd/htdocs/index.php <?php session_start(); $_SESSION['time'] =date("Y:m:d:H:s",time()); echo "本次訪問時間"."<font color=red>".$_SESSION['time']."</font>"."<br>"; echo "訪問的伺服器地址是"."<font color=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>"; echo "訪問的伺服器功能變數名稱是"."<font color=red>".$_SERVER['SERVER_NAME']."</font>"."<br>"; echo "SESSIONNAME是"."<font color=red>".session_name()."</font>"."<br>"; echo "SESSIONID是"."<font color=red>".session_id()."</font>"."<br>"; ?>
客戶端訪問測試:
安裝www.linuxfan.cn節點的nginx服務
[root@www ~]# hostnamectl set-hostname www.linuxfan.cn [root@www ~]# hostname www.linuxfan.cn [root@www ~]# yum -y install pcre-devel zlib-devel [root@www ~]# useradd -M -s /sbin/nologin nginx [root@www ~]# tar zxvf nginx-1.12.2.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/nginx-1.12.2/ [root@www nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module [root@www nginx-1.12.2]# make && make install [root@www nginx-1.12.2]# cd [root@www ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@www ~]# vi /usr/lib/systemd/system/nginx.service [Unit] Description=nginxapi After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=kill -s HUP $(cat /usr/local/nginx/logs/nginx.pid) ExecStop=kill -s QUIT $(cat /usr/local/nginx/logs/nginx.pid) PrivateTmp=Flase [Install] WantedBy=multi-user.target [root@www ~]# systemctl start nginx [root@www ~]# systemctl enable nginx [root@www ~]# netstat -utpln |grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3538/nginx: master
客戶端訪問測試:
配置nginx節點的反向代理服務
[root@www ~]# vi /usr/local/nginx/conf/nginx.conf 34 upstream lamp_server { ##在http區域內,server區域上 35 server 192.168.100.150:80 weight=1; 36 server 192.168.100.151:80 weight=1; 37 } 47 location / { 48 root html; 49 index index.html index.htm; 50 } 51 location ~ \.(asp|aspx|php|jsp|do)$ { ##在server區域內添加 52 proxy_pass http://lamp_server; 53 } [root@www ~]# systemctl stop nginx [root@www ~]# systemctl start nginx
客戶端訪問測試代理集群
客戶端訪問測試html站點:
客戶端訪問測試php站點:
查看日誌分析訪問情況
[root@www ~]# tail -3 /usr/local/nginx/logs/access.log 192.168.100.1 - - [16/Jul/2018:17:01:34 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" 192.168.100.1 - - [16/Jul/2018:17:02:02 +0800] "GET /index.php HTTP/1.1" 200 797 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" 192.168.100.1 - - [16/Jul/2018:17:02:11 +0800] "GET /index.php HTTP/1.1" 200 797 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" [root@real1 ~]# tail -3 /usr/local/httpd/logs/access_log 192.168.100.102 - - [16/Jul/2018:17:07:55 +0800] "GET /index.php HTTP/1.0" 200 797 192.168.100.102 - - [16/Jul/2018:17:07:56 +0800] "GET /index.php HTTP/1.0" 200 797 192.168.100.102 - - [16/Jul/2018:17:09:03 +0800] "GET /index.php HTTP/1.0" 200 797 [root@real2 ~]# tail -3 /usr/local/httpd/logs/access_log 192.168.100.102 - - [16/Jul/2018:17:07:56 +0800] "GET /index.php HTTP/1.0" 200 797 192.168.100.102 - - [16/Jul/2018:17:07:56 +0800] "GET /index.php HTTP/1.0" 200 797 192.168.100.102 - - [16/Jul/2018:17:09:12 +0800] "GET /index.php HTTP/1.0" 200 797