1.正向代理與反向代理的區別?
正向代理:是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。正向代理的典型用途爲在防火牆內的局域網客戶端提供訪問Internet的途徑.
反向代理:反向代理是代理服務器的一種,服務器根據客戶端的請求,從其關聯的一組或多組後端服務器(如Web服務器)上獲取資源,然後再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址或者域名,而不知道在代理服務器後面的服務器簇的存在.
2.nginx概述
Nginx是一款優秀的反向代理服務器程序,能夠爲若干臺服務器提供反向代理服務,一方面爲客戶端提供的統一的訪問地址,另一方面爲後臺多個服務器提供了負載均衡的能力。Nginx是目前最主流的反向代理服務器,能夠提供可靠的負載均衡、動靜分離的能力。
a. 下載地址
http://nginx.org/en/download.html
b. 安裝
將下載好的安裝包解壓到一個沒有中文沒有空格的目錄下即可。
c. windows下常用命令
驗證配置是否正確: nginx -t
查看Nginx的版本號:nginx -V
啓動Nginx:start nginx
快速停止或關閉Nginx:nginx -s stop
正常停止或關閉Nginx:nginx -s quit
配置文件修改重裝載命令:nginx -s reload
d. 配置
nginx的工作是基於[conf/nginx.conf]配置文件來進行的。
nginx.conf的配置結構:
http{ #代表處理http請求
#配置一個虛擬服務器
server{
#此虛擬服務器接收對80端口的訪問
listen 80;
#此虛擬服務器接收對localhost主機名的訪問
server_name localhost;
#當訪問/user資源時由此配置處理
location /user{
規則
}
#當訪問/order資源時由此配置處理
location /order{
規則
}
...
}
#其他Server配置
server ...
...
}
3.nginx案例實現請求轉發
通過Nginx實現請求轉發,通過配置nginx.conf轉發策略,使得本來訪問tomcate:8080端口轉交由訪問nginx:8088端口
當客戶端訪問http://www.aaa.com時,由nginx轉發給http://127.0.0.1:8080端口進行處理
配置hosts文件
127.0.0.1 www.aaa.com
在nginx.conf中配置
http{
#爲nginx配置一個虛擬服務器,
server {
#監聽本機8088端口
listen 8088;
#接收對www.aaa.com主機名的訪問
server_name www.aaa.com;
#對/即任意路徑的訪問進行處理
location / {
#轉發到指定地址,tomcate訪問地址
proxy_pass http://127.0.0.1:8080;
}
#可以配置多個location
...
}
#可以配置多個server
...
}
啓動 tomcat
startup.bat
啓動nginx
start nginx
4. location路徑配置和匹配規則
a. location路徑的寫法
在配置虛擬服務器時,可以配置多個location,指定不同路徑採用不同的處理方案,location支持多種寫法,規則如下:
1. = =/aaa/1.jpg 路徑嚴格匹配,路徑必須一模一樣纔會匹配到
2. ^~ ^~/aaa 只要是指定路徑開頭的路徑都可以匹配
3. ~ ~.png$ 區分大小寫按正則匹配路徑
4. ~* ~*.png$ 不區分大小寫按正則匹配路徑
5. / / 通用匹配,所有路徑都可以匹配到
b. location路徑配置的優先級
由於location的路徑配置非常靈活,所有有可能一個路徑被多個location所匹配,此時按照如下規則判斷匹配優先級:
• 首先匹配 =
• 其次匹配 ^~
• 其次是按文件中順序的正則匹配
• 最後是交給 / 通用匹配
• 當有匹配成功時候,停止匹配,按當前匹配規則處理請求
----總的規律是,精度越高優先級越高
案例:
location = / {
#規則A
}
location = /login {
#規則B
}
location ^~ /static/ {
#規則C
}
location ~ \.(gif|jpg|png|js|css)$ {
#規則D
}
location ~* \.png$ {
#規則E
}
location / {
#規則F
}
訪問根目錄 /, 比如 http://localhost/ 將匹配規則 A
訪問 http://localhost/login 將匹配規則 B
http://localhost/register 則匹配規則 F
訪問 http://localhost/static/a.html 將匹配規則 C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則 D和規則 E,但是規則 D 順序優先,規則 E不起作用
http://localhost/static/c.png則優先匹配到規則 C
訪問 http://localhost/a.PNG 則匹配規則 E,而不會匹配規則 D,因爲規則 E 不區分大小寫
訪問 http://localhost/category/id/1111 則最終匹配到規則 F
5. Ngnix的負載均衡策略
nginx在分發資源到後端服務器時,如何分配請求是可以配置的,稱之爲nginx的負載均衡策略。
輪詢 默認不配置就是輪詢 連接請求輪流分配給後端服務器
http{
upstream sampleapp {
server <<dns entry or IP Address(optional with port)>>;
server <<another dns entry or IP Address(optional with port)>>;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
ip哈希 ip_hash; abs(客戶端ip.hash())%服務器數量,根據餘數決定連接請求去往哪個服務器
http{
upstream sampleapp {
ip_hash;
server <<dns entry or IP Address(optional with port)>>;
server <<another dns entry or IP Address(optional with port)>>;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
最少連接 least_conn; 將連接請求分配給目前連接數最少的服務器
http{
upstream sampleapp {
least_conn;
server <<dns entry or IP Address(optional with port)>>;
server <<another dns entry or IP Address(optional with port)>>;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
基於權重 直接在地址後配置weight=x 根據權重進行分配,權重值越大,被分配的連接越多。可以直接配置爲down,則不再分配連接。
http{
upstream sampleapp {
server <<dns entry or IP Address(optional with port)>> weight=2;
server <<another dns entry or IP Address(optional with port)>> weight=5;
server <<another dns entry or IP Address(optional with port)>> down;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
7. Nginx的動靜分離實現
a. 動靜分離原理
動 --> 動態資源 --> servlet jsp --> 程序
靜 --> 靜態資源 --> jpg mp3 mp4 html css js --> 文件
tomcat能夠處理動態和靜態資源,但本質上是爲處理動態資源而設計的服務器,過多靜態資源交由tomcat管理會降低tomcat處理動態資源的能力,得不償失。
nginx本身無法處理動態資源,但可以處理靜態資源,而且性能優良。
因此可以將靜態資源和動態資源拆分,將靜態資源交由ngin處理,動態資源仍由tomcat處理,從而解放了tomcat對動態資源的處理能力,整體上實現動靜分離,提升了效率。
b. 動靜分離實現
配置方式:
server {
listen 8088;
server_name www.aaa.com;
location / {
#root可以指向nginx服務器中的本地磁盤地址
#靜態文件就放置在這個磁盤地址中
#之後對server中資源的訪問會被轉換到對本地磁盤資源的訪問
#www.aaa.com/aaa/bbb/1.html-->d://html/aaa/bbb/1.html
root D://html;
#默認訪問的首頁配置
index index.html;
}
}