Nginx正向代理實現(xiàn)局域網電腦訪問外網的過程詳解
引言
在網絡環(huán)境中,有時候我們需要讓局域網內的電腦訪問外網,但是由于網絡策略或其他原因,直接訪問外網是不可行的。這時候,可以借助 Nginx 來搭建一個正向代理服務器,實現(xiàn)局域網內電腦通過 Nginx 轉發(fā)訪問外網的需求。
在工作中我遇到了一個類似的情況:在公司網絡中,由于管理要求,局域網內的電腦不能直接訪問外網。但是,工作上領導吩咐需要讓局域網內的電腦能夠訪問外網上的某個網站,這時候就需要用到正向代理。本文將介紹如何配置 Nginx 實現(xiàn)這一功能。
準備工作
首先,我們需要一臺可以訪問外網的服務器,例如一臺服務器、電腦或者虛擬機。確保該服務器已經安裝了 Nginx,并且網絡配置正確。
我這里是有一臺服務器是可以正常訪問外網的(IP:192.168.0.10),同時局域網內的其他電腦也可以訪問這臺服務器。
修改nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 正向代理配置內容 server { listen 9000; # 監(jiān)聽端口 server_name localhost; set $url "proxy_server_doman_or_ip"; # 設置代理的域名或IP變量,這里替換成自己需要代理的網站 location / { proxy_pass http://$url:8082; # 將請求轉發(fā)到由 $url 變量表示的地址。 } } }
重啟nginx,打開局域網電腦測試訪問:192.168.0.10:9000,網頁跳轉成功。不就是請求轉發(fā)嘛,so easy!
問題解決?如果這么簡單我就不寫這篇文章了??
果然第二天就出問題了,有同事反饋網站進不去了。我想不可能吧,一測試果然不行。果斷查閱了一下資料,找到問題原因:nginx在進行域名轉發(fā)時會先把域名解析成IP保存在內存中,后面的訪問都是通過IP直接訪問,如果目標網站的 IP 地址發(fā)生變化,我們的代理就會失效。
找到原因就好辦了,添加域名解析功能嘛
域名解析
為了解決 IP 地址變化的問題,我們可以使用域名解析來動態(tài)獲取目標網站的 IP 地址。直接奉上完整配置,修改 Nginx 配置如下:
# 設置Nginx啟動一個工作進程,這是Nginx的一個核心設置,它決定了Nginx會使用多少個工作進程來處理客戶端請求。 worker_processes 1; # 配置定義了Nginx如何處理事件,例如連接請求,數據傳輸等 events { worker_connections 1024; # 定義了每個工作進程允許的最大并發(fā)連接數。 } # HTTP模塊的配置塊,包含了HTTP服務器的一般配置 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 正向代理配置內容 server { listen 9000; # 監(jiān)聽端口 server_name localhost; # 設置DNS解析器的地址為8.8.8.8,并且設置了解析器的緩存時間為300秒(這樣每隔300s就會重新解析一次)。ipv6=off 是關閉IPv6的解析支持。 resolver 8.8.8.8 valid=300 ipv6=off; resolver_timeout 3s; # 設置解析DNS的超時時間為3秒 proxy_read_timeout 60s; proxy_send_timeout 60s; proxy_connect_timeout 60s; set $url "proxy_server_doman_or_ip"; # 設置代理的域名或IP變量,這里替換成自己需要代理的網站 location / { proxy_pass http://$url:9000; # 將請求轉發(fā)到由 $url 變量表示的地址。9000是目標網站的端口。 proxy_buffers 256 4K; # 設置用于緩存后端響應的緩沖區(qū)大小為256個,每個大小為4K。 proxy_max_temp_file_size 0; # 設置Nginx暫存響應數據的最大臨時文件大小為0,即不使用臨時文件。 proxy_cache_valid 200 302 1m; # 針對狀態(tài)碼為200和302的響應,設置緩存有效期為1分鐘。 proxy_cache_valid 301 1h; # 針對狀態(tài)碼為301的響應,設置緩存有效期為1小時。 proxy_cache_valid any 1m; # 對于其他任何響應狀態(tài)碼,設置緩存有效期為1分鐘。 } } }
重啟nginx,問題解決。到這里,正向代理功能就實現(xiàn)了。如果只想實現(xiàn)正向代理功能看到這里就可以了。后面是我在遇到問題時的一些調試經驗技巧!
轉發(fā)代理調試
我在實現(xiàn)代理后,發(fā)現(xiàn)正向代理響應的速度非常慢有時候需要一分鐘才能響應結果。但有時候又很快。就好奇為啥會這樣,為了方便調試和監(jiān)控,我設置添加了Nginx 的訪問日志。
修改 Nginx 配置如下:
# 設置日志記錄格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' 'upstreamIP: $upstream_addr' 'upgrade: $http_upgrade'; # 正向代理配置內容 server { listen 9000; # 監(jiān)聽端口 server_name localhost; # 設置DNS解析器的地址為8.8.8.8,并且設置了解析器的緩存時間為300秒(這樣每隔300s就會重新解析一次)。ipv6=off 是關閉IPv6的解析支持。 resolver 8.8.8.8 valid=300 ipv6=off; resolver_timeout 3s; # 設置解析DNS的超時時間為3秒 proxy_read_timeout 60s; proxy_send_timeout 60s; proxy_connect_timeout 60s; set $url "proxy_server_doman_or_ip"; # 設置代理的域名或IP變量,這里替換成自己需要代理的網站 location / { proxy_pass http://$url:9000; # 將請求轉發(fā)到由 $url 變量表示的地址。9000是目標網站的端口。 proxy_buffers 256 4K; proxy_max_temp_file_size 0; proxy_cache_valid 200 302 1m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; access_log logs/proxy/access.log main; # 定義了訪問日志的路徑和格式。 error_log logs/proxy/error.log; # 定義了錯誤日志的路徑 } }
這樣,Nginx 將會在nginx項目下的 logs/proxy/access.log 文件中記錄所有代理轉發(fā)日志。
日志信息:
192.168.0.28 - - [27/Feb/2024:17:02:03 +0800] "GET /prod-api/system/todo/listAll?pageNum=1&pageSize=10&active=true HTTP/1.1" 200 64 "http://192.168.20.2:8082/user-task/todo" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"upstreamIP: 182.148.159.30:8082
192.168.0.28 - - [27/Feb/2024:17:02:03 +0800] "GET /prod-api/process/business/listAll?pageNum=1&pageSize=10&active=true HTTP/1.1" 200 979 "http://192.168.20.2:8082/user-task/todo" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"upstreamIP: 182.148.159.30:8082
192.168.0.28 - - [27/Feb/2024:17:02:06 +0800] "GET /prod-api/system/user/select HTTP/1.1" 499 0 "http://192.168.20.2:8082/login?redirect=%2Findex" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"upstreamIP: 172.16.30.6:8082
通過日志信息可以看到,請求轉發(fā)后的upstreamIP有兩個不同的IP:182.148.159.30和172.16.30.6,說明請求被轉發(fā)到了兩個不同的IP,當請求IP為182.148.159.30時,響應正常;當請求IP為172.16.30.6時,響應失敗導致等待。
發(fā)現(xiàn)這個情況后,我也是很疑惑為啥會將域名解析出兩個IP,第一反應是域名解析錯誤,為了驗證我將DNS解析的服務器換成了離我最近的四川電信服務器:61.139.2.69,測試發(fā)現(xiàn)結果也是一樣的。雖然感覺解析是沒有問題的,保險起見我還是自己在網上通過解析網站測試了一下域名解析的結果:結果顯示域名確實綁定了兩個IP,一個是正常的一個是不行的。
然后我就聯(lián)系我們這個域名對應網站的負責人,得出的結果就是他們確實綁定了兩個IP,有一個IP是綁定的內網IP,所以才導致外網請求時失效。
失敗的原因:nginx獲取解析后的IP是通過輪詢往IP轉發(fā)請求,如果輪詢到內網IP就會導致請求失敗。
解決辦法:
手動選擇IP地址:在Nginx配置中,你可以手動指定代理的目標IP地址,而不是使用解析出的IP地址。這樣可以避免將請求發(fā)送到內網IP。
使用域名解析出的IP地址進行請求:你可以通過解析域名獲取到的IP地址列表,然后使用一些方法(比如按照某種規(guī)則選擇IP地址)來保證請求不會發(fā)送到內網IP地址。
使用nginx的upstream模塊進行負載均衡:通過upstream模塊,你可以指定多個代理服務器,然后使用一定的負載均衡策略,比如輪詢、權重等,來分配請求到不同的服務器。在這里,你可以手動配置upstream模塊,指定外網IP,而不包括內網IP。
修改DNS設置:聯(lián)系網站負責人,修改域名解析,只將外網IP綁定到域名上,而不包括內網IP。
你們猜我最后咋解決的???
必須是第四條?。。?!
到此這篇關于利用Nginx正向代理實現(xiàn)局域網電腦訪問外網的文章就介紹到這了,更多相關Nginx局域網電腦訪問外網內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx使用的php-fpm的兩種進程管理方式及優(yōu)化
這篇文章主要介紹了Nginx使用的php-fpm的兩種進程管理方式及優(yōu)化,需要的朋友可以參考下2016-09-09Nginx access.log日志詳解及統(tǒng)計分析小結
nginx有一個非常靈活的日志記錄模式,本文主要介紹了Nginx access.log日志詳解及統(tǒng)計分析小結,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03Nginx服務器中l(wèi)ocation配置的一些基本要點解析
這篇文章主要介紹了Nginx服務器中l(wèi)ocation配置的一些基本要點解析,特別對管理以及查找匹配作出了詳細的講解,需要的朋友可以參考下2015-12-12