無代碼開發(fā)平臺(國內(nèi)無代碼開發(fā)平臺推薦)">國內(nèi)無代碼開發(fā)平臺(國內(nèi)無代碼開發(fā)平臺推薦)
1134
2022-05-30
@TOC
學習背景
什么是nginx?
【百度百科】
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務(wù)器…
除了反向代理,nginx還支持正向代理、負載均衡以及基于SSL安全證書的HTTPS訪問等功能特性~
本文主要是介紹是如何配置nginx正向代理、反向代理及負載均衡,進入正文~
一、代理服務(wù)
什么是代理?來一張圖了解下
代理又分為正向代理和反向代理。
二、正向代理
1.1 什么是正向代理?
先來看張圖~
【再舉個栗子】
某同學喜歡面向搜索引擎編程,想通過 百度 搜索引擎查找一些學習資料,但是有些網(wǎng)站直接訪問可能不太安全,會暴露自己的IP,同學比較苦惱,想著怎樣才能使用百度 搜索自己想要的學習資料,又不會暴露自己的IP在網(wǎng)站上呢?
這時我告訴該同學,我呢手上剛好有一臺代理服務(wù)器,這臺代理服務(wù)器通過nginx配置了正向代理轉(zhuǎn)發(fā)http和https請求,你呢,只需要在自己的Windows本地電腦的網(wǎng)關(guān)配置一下這臺代理服務(wù)器的IP和端口號,就能正常通過代理服務(wù)器訪問到百度 并搜索相關(guān)的學習資料了,還不會暴露自己真實的IP~
同學非常興奮,說自己了解過nginx,但是啥是正向代理啊?
正向代理,指的是通過代理服務(wù)器 代理瀏覽器/客戶端去重定向請求訪問到目標服務(wù)器 的一種代理服務(wù)。
正向代理服務(wù)的特點是代理服務(wù)器 代理的對象是瀏覽器/客戶端,也就是對于目標服務(wù)器 來說瀏覽器/客戶端是隱藏的。
同學覺得有點意思,于是又問,那nginx如何實現(xiàn)正向代理啊?
1.2 如何實現(xiàn)nginx正向代理?
(1)正向代理轉(zhuǎn)發(fā)https說明
在實現(xiàn)nginx正向代理之前,先說明一下,現(xiàn)在的網(wǎng)站基本上都是https,因此要實現(xiàn)nginx正向代理轉(zhuǎn)發(fā)請求,除了要配置轉(zhuǎn)發(fā)http80端口的請求,還有配置https443端口的請求~
正向代理轉(zhuǎn)發(fā)http請求很簡單,不過正向代理轉(zhuǎn)發(fā)https請求稍微有一點麻煩,目前網(wǎng)上的教程大多都是如下這樣配置的(也不知道他們驗證過沒。。。):
一開始我也像上面那樣配置,雖然http請求正常轉(zhuǎn)發(fā)了,但是發(fā)現(xiàn)https并沒有轉(zhuǎn)成功,而是報錯HTTP/1.1 400 Bad Request~
后來才了解到,nginx官方并不支持直接轉(zhuǎn)發(fā)https請求,但是阿里的一個大佬對nginx拓展了一個ngx_http_proxy_connect_module模塊,并且在github上開源了 https://github.com/chobits/ngx_http_proxy_connect_module
不過維護的ngx_http_proxy_connect_module模塊的補丁也是有nginx版本限制的(目前維護了1.4.x~1.19.x版本),如README.md說明:
如果你安裝的nginx版本不在1.4.x~1.19.x這個范圍內(nèi),那無法支持正向代理轉(zhuǎn)發(fā)https請求。
(2)安裝nginx
如果已安裝nginx(可跳過),這里以1.9.2版本為例,使用root用戶進行安裝:
$ cd /usr/nginx $ wget http://nginx.org/download/nginx-1.9.2.tar.gz $ tar -xzvf nginx-1.9.2.tar.gz $ cd /usr/nginx/nginx-1.9.2 $ make && make install
這里安裝nginx通過install進行編譯安裝,編譯后默認安裝目錄為/usr/local/nginx,后續(xù)配置新模塊ngx_http_proxy_connect_module還需要重新install編譯一次~
(3)下載新模塊
GitHub上下載ngx_http_proxy_connect_module的zip壓縮包源碼:
https://github.com/chobits/ngx_http_proxy_connect_module
(4)解壓新模塊源碼
將新模塊ngx_http_proxy_connect_module源碼壓縮包上傳到服務(wù)器/usr/nginx目錄,并解壓并重命名
$ mkdir -p /usr/nginx $ cd /usr/nginx $ /usr/nginx $ unzip ngx_http_proxy_connect_module-master.zip $ mv ngx_http_proxy_connect_module-master ngx_http_proxy_connect_module
(5)添加新模塊到nginx
使用root用戶進入nginx的資源目錄/usr/nginx/nginx-1.9.2,給nginx添加新模塊ngx_http_proxy_connect_module和并重新編譯nginx
$ /usr/nginx/nginx-1.9.2 $ patch -p1 < /usr/nginx/ngx_http_proxy_connect_module/patch/proxy_connect.patch $ ./configure --add-module=/usr/nginx/ngx_http_proxy_connect_module $ make && make install
–說明:
這里nginx-1.9.2版本對應(yīng)proxy_connect.patch補丁,其他版本相關(guān)補丁支持版本,詳情見GitHub~ https://github.com/chobits/ngx_http_proxy_connect_module
使用root用戶安裝和編譯新模塊完成后,如果你希望后續(xù)不使用root用戶運維,可以授權(quán)安裝目錄/usr/local/nginx給nginx用戶或者其他普通用戶~
chown -R nginx:nginx /usr/local/nginx chown root:root /usr/local/nginx/sbin/nginx chmod +s /usr/local/nginx/sbin/nginx
–說明:
二進制/usr/local/nginx/sbin/nginx文件需要重新歸屬為root用戶,并且權(quán)限位添加s權(quán)限(權(quán)限位+s的二進制文件屬于是管道文件,也就是普通用戶也可執(zhí)行該二進制文件,執(zhí)行后產(chǎn)生的進程屬于該文件的權(quán)限所有者,這里文件所有者是root)
(6)修改nginx的配置
修改nginx的配置分別添加http和https的server,其他配置保持不變~
vi /usr/local/nginx/conf/nginx.conf
這兩個server主要配置是對DNS解析和proxy_pass代理進行:
#正向代理轉(zhuǎn)發(fā)http請求 server { #指定DNS服務(wù)器IP地址 resolver 114.114.114.114; #監(jiān)聽80端口,http默認端口80 listen 80; #服務(wù)器IP或域名 server_name localhost; #正向代理轉(zhuǎn)發(fā)http請求 location / { proxy_pass http://$host$request_uri; proxy_set_header HOST $host; proxy_buffers 256 4k; proxy_max_temp_file_size 0k; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream error timeout invalid_header http_502; } } #正向代理轉(zhuǎn)發(fā)https請求 server { #指定DNS服務(wù)器IP地址 resolver 114.114.114.114; #監(jiān)聽443端口,https默認端口443 listen 443; #正向代理轉(zhuǎn)發(fā)https請求 proxy_connect; proxy_connect_allow 443 563; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; location / { proxy_pass http://$host; proxy_set_header Host $host; } }
– DNS說明:
(國內(nèi)外)目前比較主流的DNS:
(國外)谷歌:8.8.8.8 developers.google.com
(國外)OpenDNS:208.67.222.222 signup.opendns.com
(國內(nèi))114:114.114.114.114 www.114dns.com
(國內(nèi))騰訊:119.29.29.29 www.dnspod.cn
(國內(nèi))阿里:223.5.5.5 alidns.com
(國內(nèi))百度:180.76.76.76 dudns.baidu.com
(7)檢查和刷新nginx配置
/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload
1.3 客戶端訪問(驗證正向代理)
客戶端要代理訪問目標網(wǎng)站示例對象:
http://www.baidu.com 和https://www.baidu.com
(1)客戶端–Windows瀏覽器訪問
首先在本地電腦的IE瀏覽器設(shè)置代理服務(wù)器和端口:
IE->右上角 ->工具 ->Internet選項->連接->局域網(wǎng)(LAN)設(shè)置 ->配置代理IP和端口
瀏覽器訪問
http://www.baidu.com/ 和https://www.baidu.com/
實時查看nginx日志
tail -f /usr/local/nginx/logs/access.log
通過實時查看nginx的訪問日志,可以看到Windows下設(shè)置代理IP和端口后,本地電腦訪問的所有網(wǎng)頁會通過代理服務(wù)器進行訪問網(wǎng)頁,實現(xiàn)了正向代理的功能,并且隱藏了用戶自己真實的IP~
(2)客戶端–Linux代理訪問
Linux下也可以驗證代理服務(wù)器是否能正常代理轉(zhuǎn)發(fā)http和https請求~
curl http://www.baidu.com/ -v -x 127.0.0.1:80 curl https://www.baidu.com/ -v -x 127.0.0.1:443
nginx正向代理轉(zhuǎn)發(fā)https成功:
二、反向代理
2.1 什么是反向代理?
先來一張圖了解下~
相比于正向代理,反向代理的定義如下:
反向代理,指的是瀏覽器/客戶端并不知道自己要訪問具體哪臺目標服務(wù)器,只知道去訪問代理服務(wù)器 ,代理服務(wù)器再通過反向代理 +負載均衡實現(xiàn)請求分發(fā)到應(yīng)用服務(wù)器的一種代理服務(wù)。
反向代理服務(wù)的特點是代理服務(wù)器 代理的對象是應(yīng)用服務(wù)器,也就是對于瀏覽器/客戶端 來說應(yīng)用服務(wù)器是隱藏的。
2.2 nginx實現(xiàn)反向代理
(1)修改nginx配置
修改nginx配置vi /usr/local/nginx/conf/nginx.conf 在http模塊中配置如下:
nginx反向代理都是結(jié)合負載均衡來實現(xiàn)的,這里先直接提供反向代理+負載均衡的配置,負載均衡后一章節(jié)介紹~
#反向代理+負載均衡 upstream reverseProxyServer{ #負載均衡應(yīng)用服務(wù)器A: 權(quán)重為10,10s內(nèi)連接請求失敗2次,nginx在10s內(nèi)認為server是不可用的,將不在發(fā)送請求給這臺服務(wù)器 server 應(yīng)用服務(wù)器A的IP:8080 weight=10 max_fails=2 fail_timeout=10s; #負載均衡應(yīng)用服務(wù)器B: 代理服務(wù)器權(quán)重為5,10s內(nèi)連接請求失敗2次,nginx在10s內(nèi)認為server是不可用的,將不在發(fā)送請求給這臺服務(wù)器 server 應(yīng)用服務(wù)器B的IP:8080 weight=5 fail_timeout=10s max_fails=2; #負載均衡應(yīng)用服務(wù)器C: 代理服務(wù)器權(quán)重為5,10s內(nèi)連接請求失敗2次,nginx在10s內(nèi)認為server是不可用的,將不在發(fā)送請求給這臺服務(wù)器 server 應(yīng)用服務(wù)器C的IP:8080 weight=5 fail_timeout=10s max_fails=2; } server { #監(jiān)聽80端口,http默認端口80 listen 80; #服務(wù)器IP或域名 server_name localhost; #反向代理請求路徑中含有/appname的所有請求到upstream定義的對應(yīng)反向代理模塊 location /appname { proxy_pass http://reverseProxyServer; } }
(2)檢查和刷新nginx配置
/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload
(3)瀏覽器訪問
代理服務(wù)器部署了tomcat應(yīng)用,訪問tomcat靜態(tài)頁面驗證一波~
http://代理服務(wù)器IP:8080/appname/ReverseProxy1.html
三、負載均衡
3.1 什么是負載均衡?
再來看下前面介紹反向代理的這張圖~
可以看到負載均衡(Load Balance)的主要作用是采用了負載均衡算法將請求分發(fā)到集群模式中的應(yīng)用服務(wù)器上,這樣即使某個后臺應(yīng)用服務(wù)器掛了,其他應(yīng)用服務(wù)器還可以正常接收請求,實現(xiàn)了高可用,并且集群模式模式下的應(yīng)用服務(wù)器支持縱向擴展,可以應(yīng)對業(yè)務(wù)快速增長帶來的高并發(fā)應(yīng)用場景~
3.2 負載均衡算法有哪些?
負載均衡算法常用的有輪詢、權(quán)重和ip_hash算法,默認是輪詢算法~
(1)基于輪詢的算法
原理是每一個請求按時間順序逐一被分發(fā)到不同的應(yīng)用服務(wù)器,如果接收請求的應(yīng)用服務(wù)器掛了,并且請求超過最大失敗次數(shù)max_fails(1次),則在失效時間fail_timeout(10秒)內(nèi)不會再轉(zhuǎn)發(fā)請求到該節(jié)點~
upstream defaultReverseProxyServer{ server 192.168.0.1:8080; server 192.168.0.2:8080; }
(2)基于權(quán)重的算法
原理是每一個請求按權(quán)重被分發(fā)到不同的應(yīng)用服務(wù)器,同樣,如果接收請求的應(yīng)用服務(wù)器掛了,并且請求超過最大失敗次數(shù)max_fails(默認1次或可設(shè)置N次),則在失效時間fail_timeout(默認10秒,可設(shè)置N秒)內(nèi),不會再轉(zhuǎn)發(fā)請求到該節(jié)點~
upstream weightReverseProxyServer{ server 192.168.0.1:8080 weight=10 max_fails=2 fail_timeout=5s; server 192.168.0.2:8080 weight=5 max_fails=2 fail_timeout=5s; }
(3)基于ip_hash的算法
原理是每一個請求按用戶訪問IP的哈希結(jié)果分配,如果請求來自同一個用戶IP則固定這臺IP訪問一臺應(yīng)用服務(wù)器,該算法可以有效解決動態(tài)網(wǎng)頁中存在的session共享問題。
upstream ipHashReverseProxyServer{ ip_hash; server 192.168.0.1:8080; server 192.168.0.2:8080; }
一般使用的是基于權(quán)重的算法,因為現(xiàn)在很多情況下都是集群部署,而且集群下的各個服務(wù)器資源大多都是不均勻的,資源高的則分配權(quán)重高一些,資源低的則分配權(quán)重低一些,這種情況使用基于權(quán)重的負載均衡算法,可以更高效的利用資源和提高并發(fā)處理能力~
原創(chuàng)不易,覺得有用的小伙伴來個一鍵三連(++評論 )走起~
Nginx 彈性負載均衡 ELB 負載均衡緩存
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。