nginx 簡單實踐:正向代理、反向代理【nginx 實踐系列之二】
〇、前言
本文為 nginx 簡單實踐系列文章之一,主要簡單實踐了兩個內容:正向代理、反向代理,僅供參考。
關于 Nginx 基礎,以及安裝和配置詳解,可以參考博主過往文章:
http://www.rzrgm.cn/hnzhengfy/p/Nginx.html
注意:可以使用測試域名,但前提是要修改 hosts 文件。
路徑和重啟:Linux(/etc/hosts)(重啟命令:/etc/init.d/network restart);Windows(C:\Windows\System32\drivers\etc\hosts)。
例如:192.168.1.1 www.testczzj.com
一、正向代理
1.1 正向代理簡介
正向代理主要是為了客戶端服務,位于客戶端和目標服務器之間。
當客戶端(如 Web 瀏覽器或移動應用程序)需要訪問互聯網上的資源時,它會向正向代理發送一個請求,并指定目標服務器。然后,正向代理會代替客戶端向目標服務器轉發這個請求。一旦目標服務器處理了請求并生成了響應,正向代理會將這個響應返回給客戶端。
??
主要用途:
- 正向代理常用于在防火墻內的局域網客戶端提供訪問 Internet 的途徑。例如,公司內部網絡,通過一個或多個代理服務器訪問互聯網資源,以節省帶寬、提高訪問速度或進行內容過濾。
- 正向代理可以用于提高網絡性能,例如通過緩存經常訪問的內容來減少帶寬使用量。
- 正向代理還可以隱藏客戶端的真實身份,客戶端主動使用代理服務器,服務端不知道實際發起請求的客戶端,使客戶端能夠訪問一些原本無法直接訪問的資源,如Google、YouTube等。
1.2 正向代理的示例
Nginx 默認情況下是作為反向代理服務器使用的。為了讓其充當正向代理,需要通過配置文件進行修改。
配置文件的路徑:/usr/local/nginx/conf/nginx.conf。配置內容如下:
server {
listen 8888;
resolver 8.8.8.8 ipv6=off;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass $scheme://$host;
proxy_set_header Host $host;
allow all;
#if ($request_method = "CONNECT") {
# proxy_pass https://$host;
#}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
如下示例,通過正向代理方式,訪問百度首頁:
[root@www ~]# curl -x http://www.testczzj.com:8888 http://www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新聞</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地圖</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>視頻</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>貼吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登錄</a> </noscript> <script>document.write('<a + encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登錄</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多產品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>關于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必讀</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意見反饋</a> 京ICP證030173號 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
[root@www ~]# curl -x https://www.testczzj.com:8888 https://www.baidu.com
curl: (56) Received HTTP code 400 from proxy after CONNECT
[root@www ~]#
注意,百度首頁的協議為 https 時,會返回 400 錯誤,此問題尚未解決,有哪位大佬知道煩請指教,再做補充。
參考:https://blog.csdn.net/qq_42978535/article/details/142653929
https://blog.csdn.net/weixin_43334761/article/details/135863106
二、反向代理
2.1 反向代理簡介
- 位于服務器端和客戶端之間,主要用于服務器端的負載均衡、緩存靜態內容、加密和SSL加速、安全防護等。
- 服務器主動使用代理服務器,客戶端不知道實際提供服務的服務端。
- 常用于網站后端,將客戶端的請求轉發到內部服務器,然后將響應返回給客戶端,對外表現為統一的服務地址。
??
當我們在外網訪問百度的時候,其實會進行一個轉發,代理到內網去,這就是所謂的反向代理,即反向代理“代理”的是服務器端,而且這一個過程對于客戶端而言是無感的。
反向代理廣泛應用于網站托管、大型分布式系統以及需要高效管理網絡流量的各種場景中。
2.2 反向代理示例一:加載新地址的頁面,但 url 不進行跳轉
例如,將 http://www.testczzj.com:8888 的請求轉發至示例地址 http://www.testczzj.com:5000。
先準備一個示例項目:

注:通過dotnet new mvc和dotnet run,運行一個示例網站,配置為:"applicationUrl": "https://www.testczzj.com:5001;http://www.testczzj.com:5000"。(另外,代碼行app.UseHttpsRedirection();需注釋掉,否則 url 會自動重寫到 https)
下面是 nginx 的配置詳情:
server {
listen 8888;
server_name www.testczzj.com;
#charset utf-8;
#charset koi8-r;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
root /usr/tmp/dotnet_project_test;
index index.html index.htm test_page.html;
proxy_pass http://www.testczzj.com:5000;
}
}
如下圖,自動加載頁面 http://www.testczzj.com:5000 的內容,同時 url 未跳轉:

2.3 反向代理示例二:根據路徑訪問不同的地址
例如,根據路徑中的 user1、user2,將請求轉發到不同的端口:
- 訪問地址:http://www.testczzj.com:8888/user1/,轉發至:http://www.testczzj.com:5000。
- 訪問地址:http://www.testczzj.com:8888/user2/,轉發至:http://www.testczzj.com:5003。
先準備兩個示例項目:

nginx 配置示例:
server {
listen 8888;
server_name www.testczzj.com;
#charset utf-8;
#charset koi8-r;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /user1/ {
rewrite ^/user1/(.*)$ /$1 break; # 通過重寫,將路徑中的 /user1/ 去掉
proxy_pass http://www.testczzj.com:5000;
}
location /user2/ {
rewrite ^/user2/(.*)$ /$1 break; # 將路徑中的 /user2/ 去掉
proxy_pass http://www.testczzj.com:5003;
}
}
效果如下:

本文來自博客園,作者:橙子家,歡迎微信掃碼關注博主【橙子家czzj】,有任何疑問歡迎溝通,共同成長!

浙公網安備 33010602011771號