Nginx(二):反向代理原理 与 配置文件详解
?
相關閱讀:
Nginx(一):Nginx原理概述 與 安裝步驟詳解
Nginx(二):反向代理原理 與 配置文件詳解
Nginx(三):負載均衡策略 與 Nginx靜態服務器
Nginx(四):Nginx配置實戰
?
Nginx概述:
Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;nginx可以作為一個HTTP服務器進行網站的發布處理,另外nginx可以作為反向代理進行負載均衡的實現。
本文主要通過以下幾個方面介紹nginx:
- 反向代理:
- 核心配置文件:
在說反向代理之前,我們先了解一下什么是代理服務器和正向代理。
一、代理服務器:
1、什么是代理服務器:
代理服務器,客戶機在發送請求時,不會直接發送給目的主機,而是先發送給代理服務器,代理服務器接受客戶機請求之后,再向主機發出,并接收目的主機返回的數據,存放在代理服務器的硬盤中,再發送給客戶機。
2、為什么要使用代理服務器:
(1)提高訪問速度:
由于目標主機返回的數據會存放在代理服務器的硬盤中,因此下一次客戶再訪問相同的站點數據時,會直接從代理服務器的硬盤中讀取,起到了緩存的作用,尤其對于熱門站點能明顯提高請求速度。
(2)防火墻作用:
由于所有的客戶機請求都必須通過代理服務器訪問遠程站點,因此可在代理服務器上設限,過濾某些不安全信息。
(3)通過代理服務器訪問不能訪問的的目標站點:
互聯網上有許多開發的代理服務器,客戶機在訪問受限時,可通過不受限的代理服務器訪問目標站點,通俗說,我們使用的翻墻瀏覽器就是利用了代理服務器,雖然不能出國,但也可直接訪問外網。
3、什么是正向代理:
一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端。客戶端才能使用正向代理。
正向代理總結就一句話:代理端代理的是客戶端。
正向代理最大的特點就是客戶端非常明確要訪問的服務器地址;服務器只清楚請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端。
4、什么是反向代理:
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求,發給內部網絡上的服務器
?? ?并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
反向代理總結就一句話:代理端代理的是服務端。
5、反向代理服務器的作用:
反向代理服務器通常有兩種模型,它可以作為內容服務器的替身,也可以作為內容服務器集群的負載均衡器。
(1)內容服務器的替身:
如果您的內容服務器具有必須保持安全的敏感信息,如信用卡號數據庫,可在防火墻外部設置一個代理服務器作為內容服務器的替身。當外部客戶機嘗試訪問內容服務器時,會將其送到代理服務器。實際內容位于內容服務器上,在防火墻內部受到安全保護。代理服務器位于防火墻外部,在客戶機看來就像是內容服務器。
當客戶機向站點提出請求時,請求將轉到代理服務器。然后,代理服務器通過防火墻中的特定通路,將客戶機的請求發送到內容服務器。內容服務器再通過該通道將結果回傳給代理服務器。代理服務器將檢索到的信息發送給客戶機,好像代理服務器就是實際的內容服務器。如果內容服務器返回錯誤消息,代理服務器會先行截取該消息并更改標頭中列出的任何 URL,然后再將消息發送給客戶機。如此可防止外部客戶機獲取內部內容服務器的重定向 URL。
這樣,代理服務器就在安全數據庫和可能的惡意攻擊之間提供了又一道屏障。與有權訪問整個數據庫的情況相對比,就算是僥幸攻擊成功,作惡者充其量也僅限于訪問單個事務中所涉及的信息。未經授權的用戶無法訪問到真正的內容服務器,因為防火墻通路只允許代理服務器有權進行訪問。
(可以配置防火墻路由器,使其只允許特定端口上的特定服務器(在本例中為其所分配端口上的代理服務器)有權通過防火墻進行訪問,而不允許其他任何機器進出)
(2)作為內容服務器的負載均衡器:
可以在一個系統內使用多個代理服務器來平衡各 Web 服務器間的網絡負載。在此模型中,可以利用代理服務器的高速緩存特性,創建一個用于負載均衡的服務器池。此時,代理服務器可以位于防火墻的任意一側。如果 Web 服務器每天都會接收大量的請求,則可以使用代理服務器分擔 Web 服務器的負載并提高網絡訪問效率。
對于客戶機發往真正服務器的請求,代理服務器起著中間調停者的作用。代理服務器會將所請求的文檔存入高速緩存。如果有不止一個代理服務器,DNS 可以采用“循環復用法”選擇其 IP 地址,隨機地為請求選擇路由。客戶機每次都使用同一個URL,但請求所采取的路由每次都可能經過不同的代理服務器。
可以使用多個代理服務器來處理對一個高用量內容服務器的請求,這樣做的好處是內容服務器可以處理更高的負載,并且比其獨自工作時更有效率。在初始啟動期間,代理服務器首次從內容服務器檢索文檔,此后,對內容服務器的請求數會大大下降。比如Nginx就是典型的負載均衡服務器。
?
二、Nginx配置文件詳解:
前面說過,Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;在實際中,Nginx使用最多的三個核心功能是反向代理、負載均衡和靜態服務器。
這三個不同的功能的使用,都跟nginx的配置密切相關,nginx服務器的配置信息主要集中在nginx.conf這個配置文件中,并且所有的可配置選項大致分為以下幾個部分:
main # 全局配置events { # nginx工作模式配置 }http { # http設置....server { # 服務器主機配置....location { # 路由配置....}location path {....}location otherpath {....}}server {....location {....}}upstream name { # 負載均衡配置....} }如上述配置文件所示,主要由6個部分組成:
- main:用于進行nginx全局信息的配置
- events:用于nginx工作模式的配置
- http:用于進行http協議信息的一些配置
- server:用于進行服務器訪問信息的配置
- location:用于進行訪問路由的配置
- upstream:用于進行負載均衡的配置
1、main模塊:
觀察下面的配置代碼:
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;
述配置都是存放在main全局配置模塊中的配置項:
- user用來指定nginx worker進程運行用戶以及用戶組,默認nobody賬號運行
- worker_processes指定nginx要開啟的子進程數量,運行過程中監控每個進程消耗內存(一般幾M~幾十M不等)根據實際情況進行調整,通常數量是CPU內核數量的整數倍
- error_log定義錯誤日志文件的位置及輸出級別【debug / info / notice / warn / error / crit】
- pid用來指定進程id的存儲文件的位置
- worker_rlimit_nofile用于指定一個進程可以打開最多文件數量的描述
2、event模塊:
event {
worker_connections 1024;
multi_accept on;
use epoll;
}
上述配置是針對nginx服務器的工作模式的一些操作配置:
- worker_connections 指定最大可以同時接收的連接數量,這里一定要注意,最大連接數量是和worker processes共同決定的。
- multi_accept 配置指定nginx在收到一個新連接通知后盡可能多的接受更多的連接
- use epoll 配置指定了線程輪詢的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac請使用Kqueue
3、http模塊:
作為web服務器,http模塊是nginx最核心的一個模塊,配置項也是比較多的,項目中會設置到很多的實際業務場景,需要根據硬件信息進行適當的配置,常規情況下,使用默認配置即可!
http {
????## 基礎配置
????sendfile on;
????tcp_nopush on;
????tcp_nodelay on;
????keepalive_timeout 65;
????types_hash_max_size 2048;
????# server_tokens off;
?
????# server_names_hash_bucket_size 64;
????# server_name_in_redirect off;
????include /etc/nginx/mime.types;
????default_type application/octet-stream;
?
????## SSL證書配置
????ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE????ssl_prefer_server_ciphers on;
?
????##日志配置
????access_log /var/log/nginx/access.log;
????error_log /var/log/nginx/error.log;
?
????##Gzip 壓縮配置
????gzip on;
????gzip_disable "msie6";
?
????# gzip_vary on;
????# gzip_proxied any;
????# gzip_comp_level 6;
????# gzip_buffers 16 8k;
????# gzip_http_version 1.1;
????# gzip_types text/plain text/css application/json application/javascript
?text/xml application/xml application/xml+rss text/javascript;
?
????##虛擬主機配置
????include /etc/nginx/conf.d/*.conf;
????include /etc/nginx/sites-enabled/*;
(1)基礎配置:
- sendfile on:配置on讓sendfile發揮作用,將文件的回寫過程交給數據緩沖去去完成,而不是放在應用中完成,這樣的話在性能提升上有好處;
- tc_nopush on:讓nginx在一個數據包中發送所有的頭文件,而不是一個一個單獨發。
- tcp_nodelay on:讓nginx不要緩存數據,而是一段一段發送,如果數據的傳輸有實時性的要求的話可以配置它,發送完一小段數據就立刻能得到返回值,但是不要濫用。
- keepalive_timeout 10:給客戶端分配連接超時時間,服務器會在這個時間過后關閉連接。一般設置時間較短,可以讓nginx工作持續性更好;
- client_header_timeout 10:設置請求頭的超時時間;
- client_body_timeout 10:設置請求體的超時時間;
- send_timeout 10:指定客戶端響應超時時間,如果客戶端兩次操作間隔超過這個時間,服務器就會關閉這個鏈接;
- limit_conn_zone $binary_remote_addr zone=addr:5m :設置用于保存各種key的共享內存的參數;
- limit_conn addr 100: 給定的key設置最大連接數;
- server_tokens:雖然不會讓nginx執行速度更快,但是可以在錯誤頁面關閉nginx版本提示,對于網站安全性的提升有好處;
- include /etc/nginx/mime.types:指定在當前文件中包含另一個文件的指令;
- default_type application/octet-stream:指定默認處理的文件類型可以是二進制
- type_hash_max_size 2048:混淆數據,影響三列沖突率,值越大消耗內存越多,散列key沖突率會降低,檢索速度更快;值越小key,占用內存較少,沖突率越高,檢索速度變慢。
(2)日志配置:
access_log logs/access.log:設置存儲訪問記錄的日志
error_log logs/error.log:設置存儲記錄錯誤發生的日志
(3)SSL證書加密:
ssl_protocols:指令用于啟動特定的加密協議,nginx在1.1.13和1.0.12版本后默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。
ssl prefer server ciphers:設置協商加密算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件。
(4)壓縮配置:
gzip 是告訴nginx采用gzip壓縮的形式發送數據。這將會減少我們發送的數據量。
gzip_disable 為指定的客戶端禁用gzip功能。我們設置成IE6或者更低版本以使我們的方案能夠廣泛兼容。
gzip_static 告訴nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被注釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這里)。
gzip_proxied 允許或者禁止壓縮基于請求和響應的響應流。我們設置為any,意味著將會壓縮所有的請求。
gzip_min_length 設置對數據啟用壓縮的最少字節數。如果一個請求小于1000字節,我們最好不要壓縮它,因為壓縮這些小的數據會降低處理此請求的所有進程的速度。
gzip_comp_level 設置數據的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。我們設置為4,這是一個比較折中的設置。
gzip_type 設置需要壓縮的數據格式。上面例子中已經有一些了,你也可以再添加更多的格式。
(5)文件緩存配置:
open_file_cache 打開緩存的同時也指定了緩存最大數目,以及緩存的時間。我們可以設置一個相對高的最大時間,這樣我們可以在它們不活動超過20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定檢測正確信息的間隔時間。
open_file_cache_min_uses 定義了open_file_cache中指令參數不活動時間期間里最小的文件數。
open_file_cache_errors 指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。我們也包括了服務器模塊,這些是在不同文件中定義的。如果你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。
4、server模塊:
srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務器的配置信息。
server {
????listen ???????80;
????server_name localhost ???192.168.1.100;
????root ???????/nginx/www;
????index ???????index.php index.html index.html;
????charset ???????utf-8;
????access_log ???logs/access.log;
????error_log ???logs/error.log;
????......
}
核心配置信息如下:
- server:一個虛擬主機的配置,一個http中可以配置多個server;
- server_name:用于指定ip地址或者域名,多個配置之間用空格分隔;
- root:表示整個server虛擬主機內的根目錄,所有當前主機中web項目的根目錄;
- index:用戶訪問web網站時的全局首頁;
- charset:用于設置www/路徑中配置的網頁的默認編碼格式;
- access_log:用于指定該虛擬主機服務器中的訪問記錄日志存放路徑;
- error_log:用于指定該虛擬主機服務器中訪問錯誤日志的存放路徑;
5、location模塊:
location模塊是nginx配置中出現最多的一個配置,主要用于配置路由訪問信息。
在路由訪問信息配置中關聯到反向代理、負載均衡等等各項功能,所以location模塊也是一個非常重要的配置模塊。
基本配置:
location / {
????root ???/nginx/www;
????index ???index.php index.html index.htm;
}
location /:表示匹配訪問根目錄
root:用于指定訪問根目錄時,訪問虛擬主機的web目錄
index:在不指定訪問具體資源時,默認展示的資源文件列表
反向代理配置方式:
通過反向代理代理服務器訪問模式,通過proxy_set配置讓客戶端訪問透明化。
location / {
????proxy_pass http://localhost:8888;
????proxy_set_header X-real-ip $remote_addr;
????proxy_set_header Host $http_host;
}
有關反向代理的配置,文章最下面會給出一個詳細配置步驟。
6、upstream模塊:
upstream模塊主要負責負載均衡的配置,通過默認的輪詢調度方式來分發請求到后端服務器。
簡單的配置方式如下:
upstream name {
????ip_hash;
????server 192.168.1.100:8000;
????server 192.168.1.100:8001 down;
????server 192.168.1.100:8002 max_fails=3;
????server 192.168.1.100:8003 fail_timeout=20s;
????server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
核心配置信息如下:
- ip_hash:指定請求調度算法,默認是weight權重輪詢調度,可以指定
- server host:port:分發服務器的列表配置
- ?down:表示該主機暫停服務
- ?max_fails:表示失敗最大次數,超過失敗最大次數暫停服務
- ?fail_timeout:表示如果請求受理失敗,暫停指定的時間之后重新發起請求
更多有關負載均衡的詳細知識,可以參考下一篇博客。
?
三、使用Nginx配置反向代理服務器:
Nginx作為近年來較火的反向代理服務器,安裝在目的主機端,主要用于轉發客戶機請求,后臺有多個http服務器提供服務,nginx的功能就是把請求轉發給后面的服務器,決定哪臺目標主機來處理當前請求。下面演示如何進行配置使Nginx發揮作用。
1、模擬n個http服務器作為目標主機:
用作測試,簡單的使用2個tomcat實例模擬兩臺http服務器,分別將tomcat的端口改為8081和8082
2、配置IP域名:
192.168.72.49 8081.max.com
192.168.72.49 8082.max.com
3、配置nginx.conf
upstream tomcatserver1 { server 192.168.72.49:8081; } upstream tomcatserver2 { server 192.168.72.49:8082; } server { listen 80; server_name 8081.max.com; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tomcatserver1; index index.html index.htm; } } server { listen 80; server_name 8082.max.com; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tomcatserver2; index index.html index.htm; } }流程:
1)瀏覽器訪問8081.max.com,通過本地host文件域名解析,找到192.168.72.49服務器(安裝nginx)
2)nginx反向代理接受客戶機請求,找到server_name為8081.max.com的server節點,根據proxy_pass對應的http路徑,將請求轉發到upstream tomcatserver1上,即端口號為8081的tomcat服務器。
4、效果展示:
?請求8081.max.com,tomcat1接收返回首頁
請求8082.max.com,tomcat2接收返回首頁
?
參考博客:
https://blog.csdn.net/Daybreak1209/article/details/51549031
https://blog.csdn.net/keyeagle/article/details/6723408
https://blog.csdn.net/tsummerb/article/details/79248015
總結
以上是生活随笔為你收集整理的Nginx(二):反向代理原理 与 配置文件详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL数据库的性能优化总结
- 下一篇: Nginx(三):负载均衡策略 与 Ng