【修真院JAVA小課堂】nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?
大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。
今天給大家分享一下,修真院官網JAVA任務三的一個知識點:
nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?
課題:nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?
1.背景介紹
2.知識剖析
3.常見問題
4.解決方案
5.編碼實戰
6.擴充套件思考
7.參考文獻
8.更多討論
1.背景介紹
1.1 Nginx是什麼?
在傳統的Web伺服器體系結構中,每個客戶端連線作為一個單獨的程序或執行緒處理,隨著網站的流行度增加,併發連線數量的增加,Web伺服器減慢,延遲了對使用者的響應。
從技術的角度來看,產生一個單獨的程序/執行緒需要將CPU切換到新的任務並建立一個新的執行時上下文,消耗額外的記憶體和CPU時間,從而對效能產生負面影響。
Nginx (engine x) 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。其特 點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。
2 知識剖析
2.1.nginx伺服器有什麼作用?
2.2.什麼叫反向代理?
2.3.為什麼要使用反向代理?
2.4 什麼是負載均衡?負載均衡的作用是什麼?
2.5 什麼是動靜分離?動靜分離的作用?
2.1 nginx伺服器有什麼作用?
1、反向代理
2、負載均衡
3、動靜分離
2.2 什麼叫反向代理?
反向代理:反向代理(ReverseProxy)是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,簡單來說就是真實的伺服器不能直接被外部網路訪問,想要訪問必須通過代理。
2.3 為什麼要使用反向代理
1、防止主伺服器被惡意攻擊
2、為負載均衡和動靜分離提供實現支援
2.4 什麼是負載均衡?負載均衡的作用是什麼?
負載均衡:使用反向代理同時代理多個相同內容的應用伺服器(比如tomcat),將客戶端請求分發到各個應用伺服器上並接收響應返回給客戶端。對於Nginx而言,就是將收到的訪問請求分發給不同的Web伺服器, 以提高訪問效能以及可靠性。負載均衡可以有效防止一個伺服器宕機而導致服務停止。
負載均衡的作用是什麼?
當一臺伺服器的單位時間內的訪問量越大時,伺服器壓力就越大,大到超過自身承受能力時,伺服器就會崩潰。為了避免伺服器崩潰,讓使用者有更好的體驗,我們通過負載均衡的方式來分擔伺服器壓力。我們可以建立很多很多伺服器,組成一個伺服器叢集,當用戶訪問網站時,先訪問一箇中間伺服器,在讓這個中間伺服器在伺服器叢集中選擇一個壓力較小的伺服器,然後將該訪問請求引入該伺服器。如此一來,使用者的每次訪問,都會保證伺服器叢集中的每個伺服器壓力趨於平衡,分擔了伺服器壓力,避免了伺服器崩潰的情況。
2.5 什麼是動靜分離?動靜分離的作用?
動靜分離:運用Nginx的反向代理功能分發請求:所有動態資源的請求交給應用伺服器,而靜態資源的請求(例如圖片、視訊、CSS、JavaScript檔案等)則直接由Nginx返回到瀏覽器。
動靜分離的作用:
主要是nginx處理靜態頁面的效率遠高於tomcat的處理能力,使用c語言開發的nginx對靜態資源每秒的吞吐量是使用Java語言開發的tomcat的6倍,也遠高於其它應用伺服器。
nginx應用之所以廣泛,我認為這歸功於它的靈活配置,一個nginx.conf檔案解決大部分問題,不論是nginx建立虛擬伺服器、nginx的反向代理伺服器,還是nginx的負載均衡,幾乎都在這個配置檔案中進行。伺服器上只負責把nginx搭好,跑起來即可。而且它本身輕量級,不需要佔用伺服器太多資源就可以達到較好的效果,是一個非常值得推崇的伺服器。
3.常見問題
如何配置反向代理
如何配置負載均衡
如何配置動靜分離
4.解決方案
參見編碼實戰
4.1.
a.主要是對proxy_pass的使用
4.2.
a.兩臺或以上的應用伺服器
b.主要是upstream和反向代理的聯合使用
nginx的upstream常用分發策略
1)、輪詢(預設)——每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
2)、weight ——指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
3)、ip_hash ——每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器。
4)、backup——其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
5)、down——表示當前的server暫時不參與負載
4.3.
a、正則表示式匹配靜態資源字尾
b、找到靜態資源本地存放路徑
5.編碼實戰
6.擴充套件思考
什麼是正向代理:
是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。正向代理的典型用途是為在防火牆內的區域網客戶端提供訪問Internet的途徑。 正向代理還可以使用緩衝特性(由mod_cache提供)減少網路使用率。
7.參考文獻
CSDN、百度百科
8.更多討論
8.1 什麼是伺服器叢集?
伺服器叢集就是指將很多伺服器集中起來一起進行同一種服務,在客戶端看來就像是隻有一個伺服器。叢集可以利用多個計算機進行平行計算從而獲得很高的計算速度,也可以用多個計算機做備份,從而使得任何一個機器壞了整個系統還是能正常執行。
8.2 什麼是分散式
分散式系統(distributed system)是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是作業系統),而不是硬體。內聚性是指每一個數據庫分佈節點高度自治,有本地的資料庫管理系統。透明性是指每一個數據庫分佈節點對使用者的應用來說都是透明的,看不出是本地還是遠端。在分散式資料庫系統中,使用者感覺不到資料是分佈的,即使用者不須知道關係是否分割、有無副本、資料存於哪個站點以及事務在哪個站點上執行等。
8.3除了Nginx,還有哪些代理伺服器?
1、Varnish
Varnish是一款反向HTTP代理伺服器,提供加速設計給大流量的網站應用。
2、HAProxy
HAProxy是一個免費且開源的軟體。它提供3層(TCP)和7層(http)協議支援負載均衡以及反向代理伺服器功能。
#執行使用者
user www-data;
#啟動程序,通常設定成和cpu的數量相等
worker_processes 1;
#全域性錯誤日誌及PID檔案
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
#工作模式及連線數上限
events {
use epoll; #epoll是多路複用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上核心,可以大大提高nginx的效能
worker_connections 1024;#單個後臺worker process程序的最大併發連結數
# multi_accept on;
}
#設定http伺服器,利用它的反向代理功能提供負載均衡支援
http {
#設定mime型別,型別由mime.type檔案定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日誌格式
access_log /var/log/nginx/access.log;
#sendfile 指令指定 nginx 是否呼叫 sendfile 函式(zero copy 方式)來輸出檔案,對於普通應用,
#必須設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為 off,以平衡磁碟與網路I/O處理速度,降低系統的uptime.
sendfile on;
#tcp_nopush on;
#連線超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#開啟gzip壓縮
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#設定請求緩衝
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
#設定負載均衡的伺服器列表
upstream mysvr {
#weigth引數表示權值,權值越高被分配到的機率越大
#本機上的Squid開啟3128埠
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server {
#偵聽80埠
listen 80;
#定義使用www.xx.com訪問
server_name www.xx.com;
#設定本虛擬主機的訪問日誌
access_log logs/www.xx.com.access.log main;
#預設請求
location / {
root /root; #定義伺服器的預設網站根目錄位置
index index.php index.html index.htm; #定義首頁索引檔案的名稱
fastcgi_pass www.xx.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
#靜態檔案,nginx自己處理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/htdocs;
#過期30天,靜態檔案不怎麼更新,過期可以設大一點,如果頻繁更新,則可以設定得小一點。
expires 30d;
}
#PHP 指令碼請求全部轉發到 FastCGI處理. 使用FastCGI預設配置.
location ~ \.php$ {
root /root;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#設定檢視Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止訪問 .htxxx 檔案
location ~ /\.ht {
deny all;
}
}
如果要使用負載均衡的話,可以修改配置http節點如下:
#設定http伺服器,利用它的反向代理功能提供負載均衡支援
http {
#設定mime型別,型別由mime.type檔案定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日誌格式
access_log /var/log/nginx/access.log;
#省略上文有的一些配置節點
#。。。。。。。。。。
#設定負載均衡的伺服器列表
upstream mysvr {
#weigth引數表示權值,權值越高被分配到的機率越大
server 192.168.8.1x:3128 weight=5;#本機上的Squid開啟3128埠
server 192.168.8.2x:80 weight=1;
server 192.168.8.3x:80 weight=6;
}
upstream mysvr2 {
#weigth引數表示權值,權值越高被分配到的機率越大
server 192.168.8.x:80 weight=1;
server 192.168.8.x:80 weight=6;
}
#第一個虛擬伺服器
server {
#偵聽192.168.8.x的80埠
listen 80;
server_name 192.168.8.x;
#對aspx字尾的進行負載均衡請求
location ~ .*\.aspx$ {
root /root; #定義伺服器的預設網站根目錄位置
index index.php index.html index.htm; #定義首頁索引檔案的名稱
proxy_pass http://mysvr ;#請求轉向mysvr 定義的伺服器列表
#以下是一些反向代理的配置可刪除.
proxy_redirect off;
#後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允許客戶端請求的最大單檔案位元組數
client_body_buffer_size 128k; #緩衝區代理緩衝使用者端請求的最大位元組數,
proxy_connect_timeout 90; #nginx跟後端伺服器連線超時時間(代理連線超時)
proxy_send_timeout 90; #後端伺服器資料回傳時間(代理髮送超時)
proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)
proxy_buffer_size 4k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #設定快取資料夾大小,大於這個值,將從upstream伺服器傳
}
}
}
Nginx負載均衡是通過upstream模組來實現的,內建實現了三種負載策略,配置還是比較簡單的。官網負載均衡配置說明:http://nginx.org/en/docs/http/load_balancing.html
- 輪循(預設)
Nginx根據請求次數,將每個請求均勻分配到每臺伺服器 - 最少連線
將請求分配給連線數最少的伺服器。Nginx會統計哪些伺服器的連線數最少。 - IP Hash
繫結處理請求的伺服器。第一次請求時,根據該客戶端的IP算出一個HASH值,將請求分配到叢集中的某一臺伺服器上。後面該客戶端的所有請求,都將通過HASH演算法,找到之前處理這臺客戶端請求的伺服器,然後將請求交給它來處理。
今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。
這裡是技能樹.IT修真院,成千上萬的師兄在這裡找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。
快來與我一起學習吧~http://www.jnshu.com/login/1/12744596
騰訊視訊:https://v.qq.com/x/page/k0754yntl75.html