轉自: https://blog.csdn.net/zhoulu001/article/details/53074845
nginx是一個高性能的Http服務器,有兩個默認的模塊proxy_pass和upstream。proxy_pass可以很方便的進行反向代理,然后配合upstream可以很方便的實現負載均衡。
在nginx的根路徑下的conf文件夾下的nginx.conf就是我們需要關注的配置文件。
1. proxy_pass
在server下listen指定了服務器的斷開,server_name指定了域名,location過濾訪問的請求,proxy_pass設置了一個url,意思就是當前反向代理的目標服務器地址。
所以當我們在本地訪問http://localhost:4444的時候,nginx會將我們的請求反向代理到proxy_pass指定的目標服務器。
2.upstream
上面的請求都會反向代理到proxy_pass設置的目標服務器上,但如果目標服務器宕機了怎么辦?這個時候我們可以設置負責均衡,upstream就可以派上用場了。
upstream可以設置多台服務器,然后通過proxy_pass指向upstream,從而當我們訪問http://localhost:4444的時候,就反向代理到了upstream中的某一台服務器中了。
而具體是反向代理到upstream中的哪一台服務器,我么可以設置對應的算法。
i).默認是采用輪詢機制,就是采用輪詢的方式反向代理;
ii).設置權重weight,我們可以通過設置weight來指定服務器被訪問的權重,權重越大,反向代理過去的機會就越大;
iii). ip_hash的方式:因為每一個ip對應一個唯一的hash值,這樣來自同一個ip的請求會反向代理到特定的某一台機器上。
3.跨域
前端跨域有很多方式,比如JSONP,服務端代理和html5的access-control-allow-orgin等。但這一一些方式都需要根據需要修改相關的前端或者后端代碼。但nginx跨域不需要修改任何代碼。
從上面我們知道,nginx的proxy_pass可以將我們的請求通過proxy_pass反向代理到目標服務器上,nginx跨域就是利用反向代理來實現。比如我們需要訪問某個后端api,假設它的地址是http:://xxxxx/api/myrequest,並且后端api的地址都是以http;//xxxxx/api開頭。因為使用ajax直接訪問該地址肯定存在跨域問題,那么如何配置nginx的配置文件呢?
只增加一個對應的location去過濾請求,然后進行反向代理,我們捕捉所有以/api開頭的請求。
有兩種方式:
i. 方式一:
-
location /api/ {
-
-
proxy_pass http: //xxxxx/api;
-
}
ii. 方式二:
-
location /api/ {
-
-
proxy_pass http: //xxxxx/api/;
-
}
方式二比方式一多了一個/。
區別就是:
方式一: 如果用戶訪問的是http://?????/api/getInfo,反向代理到的是http://xxxxx/api/getInfo
方式二: 如果用戶訪問的是http://?????/api/getInfo,反向代理到的是http://xxxxx/getInfo
這樣就達到了跨域了。