1.何爲反向代理?
在介紹反向代理之前,先來了解一下正向代理。
正向代理:如果把局域網外的Internet
想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet
,則需要通過代理服務器來訪問,這種代理服務就稱爲正向代理,下面是正向代理的原理圖。
由於工作環境原因,日常工作只能侷限於單位的局域網,如果想要訪問互聯網,怎麼辦呢?這就需要用到正向代理,本人經常用正向代理來進行上網。
反向代理:看下面原理圖,就一目瞭然。其實客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP
地址。
正向代理和反向代理的區別,一句話就是:如果我們客戶端自己用,就是正向代理。如果是在服務器用,用戶無感知,就是反向代理。
這裏有個問題:反向代理服務器,怎麼選擇掛在它後面的哪一臺具體服務器呢?答案在後文揭曉,這就是負載均衡。
2. Nginx配置文件
在學習 Nginx
之前,要熟知它的配置文件,畢竟,下面需要做的所有配置(反向代理、負載均衡、動靜分離等),都是基於它的配置文件。
Nginx
默認的配置文件是在安裝目錄下的 conf
目錄下,後續對 Nginx
的使用基本上都是對此配置文件進行相應的修改。完整的配置文件,可以看一下文章最後。修改過nginx.conf
配置文件,記得要重啓Nginx
服務(☆☆☆☆☆)
配置文件中有很多#
號,該符號表示註釋內容,去掉所有以 #
開頭的段落,精簡之後的配置文件內容如下(PS:其實註釋掉的地方,都是一些功能的使用代碼,需要用到的時候,取消註釋即可):
# 主進程叫master,負責管理子進程,子進程叫worker # worker_processes配置項表示開啓幾個業務進程,一般和cpu核數有關 worker_processes 1; events { worker_connections 1024; } http { # include表示可以引入其他文件,此處表示引入http mime類型 include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 虛擬主機,可以配置多個 server { listen 80; server_name localhost; location / { # 路徑匹配之後,哪個目錄下去匹配相應的網頁,html是相對路徑 root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
去掉註釋信息後,可以將 nginx.conf
配置文件分爲三部分:
2.1 第一部分:全局塊
worker_processes 1;
從配置文件開始到events
塊之間的內容,主要會設置一些影響Nginx
服務器整體運行的配置指令,主要包括:配置運行Nginx
服務器的用戶(組)、允許生成的 worker process
數,進程PID
存放路徑、日誌存放路徑和類型以及配置文件的引入等。
上面這行 worker_processes
配置,是 Nginx
服務器併發處理服務的關鍵配置,該值越大,可以支持的併發處理量也越多,但是會受到硬件、軟件等設備的約束。
2.2 第二部分:events 塊
events { worker_connections 1024; }
events
塊涉及的指令主要影響Nginx
服務器與用戶的網絡連接,常用的設置包括:是否開啓對多 work process
下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 work process
可以同時支持的最大連接數等
上述例子就表示每個 work process
支持的最大連接數爲 1024
。這部分的配置對Nginx
的性能影響較大,在實際中應該靈活配置。
2.3 第三部分:http 塊
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
這部分是 Nginx
服務器配置中最頻繁的部分,代理、緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裏。需要注意的是:http
塊也可以包括 http
全局塊、server
塊。下面的反向代理、動靜分離、負載均衡都是在這部分中配置
http
全局塊:http
全局塊配置的指令包括:文件引入、MIME-TYPE
定義、日誌自定義、連接超時時間、單鏈接請求數上限等。server
塊:這塊和虛擬主機有密切關係,從用戶角度看,虛擬主機和一臺獨立的硬件主機是完全一樣的,該技術的產生是爲了節省互聯網服務器硬件成本。
每個http
塊可以包括多個server
塊,而每個server
塊就相當於一個虛擬主機。而每個server
塊也分爲全局server
塊,以及可以同時包含多個locaton
塊。(☆☆☆☆☆)
2.3.1 全局 server 塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或IP
配置。
2.3.2 location 塊
一個 server
塊可以配置多個 location
塊。
這塊的主要作用是:基於 Nginx
服務器接收到的請求字符串(例如 server_name/uri-string
),對虛擬主機名稱(也可以是 IP
別名)之外的字符串(例如 前面的 /uri-string
)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這裏進行。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; # 若請求路徑像這樣:www.xxxx/img/example.png # 則訪問/img/目錄下的文件時,nginx會去/var/www/image/img/目錄下找文件 location /img/ { root /var/www/image; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
3. 反向代理如何配置
3.1 反向代理實例一
實現效果:使用 Nginx
反向代理,訪問www.123.com
直接跳轉到127.0.0.1:8080
注意:此處如果要想從www.123.com
跳轉到本機指定的ip
,需要修改本機的hosts
文件。此處略過
配置代碼
server { listen 80; server_name 192.168.17.129; location / { root html; index index.html index.htm; proxy_pass http://127.0.0.1:8080 } }
如上配置,Nginx
監聽 80
端口,訪問域名爲www.123.com
(不加端口號時默認爲 80
端口),故訪問該域名時會跳轉到 127.0.0.1:8080
路徑上。
此處的意思爲:
nginx
反向代理服務監聽192.168.17.129
的80
端口,如果有請求過來,則轉到proxy_pass
配置的對應服務器上,僅此而已。 在location
下,同時配置root
和proxy_pass
選項時,兩個選項只會二選一執行 此處不能配置https反向代理
實驗結果:
3.2 反向代理實例二
實現效果:使用 Nginx
反向代理,根據訪問的路徑跳轉到不同端口的服務中,Nginx
監聽端口爲 9001
訪問http://192.168.17.129/edu/
直接跳轉到 127.0.0.1:8080
訪問http://192.168.17.129/vod/
直接跳轉到 127.0.0.1:8081
第一步,需要準備兩個 tomcat
,一個 8080
端口,一個 8081
端口,並準備好測試的頁面 第二步,修改 nginx
的配置文件,在 http
塊中配置 server
server { listen 9001; server_name 192.168.17.129; location ~ /edu/ { proxy_pass http://127.0.0.1:8080 } location ~ /vod/ { proxy_pass http://127.0.0.1:8081 } }
根據上面的配置,當請求到達 Nginx 反向代理服務器時,會根據請求路徑不同進行分發到不同的服務上。
實驗結果:
補充:location 指令說明
該指令用於匹配 URL
, 語法如下:
location [ = | ~ | ~* | ^~] uri {
}
=
:用於不含正則表達式的uri
前,要求請求字符串與uri
嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求~
:用於表示uri
包含正則表達式,並且區分大小寫~*
:用於表示uri
包含正則表達式,並且不區分大小寫^~
:用於不含正則表達式的uri
前,要求Nginx
服務器找到標識uri
和請求。字符串匹配度最高的location
後,立即使用此location
處理請求,而不再使用location
塊中的正則uri
和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識
Nginx完整配置文件
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }