# 1.說說正向代理和反向代理的區別
···
正向代理和反向代理的位置是一樣的B,都處于客戶端A和服務端(C或其他)中間;
區別在于
正向代理客戶端,服務端不清楚誰是真正的請求人,服務端被忽悠了;正向代理可用于翻墻
反向代理服務端,客戶端不清楚誰是真正的響應人,客戶端被忽悠了;反向代理可用于保護真實服務器
···
#### 一、介紹
> 實踐中客戶端無法直接跟服務端發起請求的時候,我們就需要代理服務。代理可以實現客戶端與服務端之間的通信,我們的Nginx也可以實現相應的代理服務。代理分為正向代理和反向代理,此文就來演示一下Nginx配置正向代理和反向代理的場景。
* * *
#### 二、正向代理和反向代理的區別
正向代理和反向代理的區別我在知乎上找到兩張圖可以幫助我們很好的理解:


###### 正向代理:客戶端 代理 一>服務端
正向代理簡單地打個租房的比方:
A(客戶端)想租C(服務端)的房子,但是A(客戶端)并不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到了這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)并不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
###### 反向代理:客戶端 一>代理 服務端
反向代理也用一個租房的例子:
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)并不知道這個房子到底誰才是房東
他都有可能認為這個房子就是B(代理)的
由上的例子和圖我們可以知道正向代理和反向代理的區別在于代理的對象不一樣,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。
#### 三、Nginx代理的配置演示
##### 1、正向代理配置場景演示
正向代理很常見,我們的科學上網就是一種正向代理。
我們接下來演示正向代理的這么一個場景。
首先我在我的A服務器的nginx設置訪問控制
訪問控制之前我訪問A下的test.html是這樣的:

我們打開/etc/nginx/conf.d/default.conf
我們加入這么一個判斷語句
如果訪問A的IP不是118.126.106.11(我的B服務器)則返回403.
~~~
location / {
if ( $remote_addr !~* "^118\.126\.106\.11") {
return 403;
}
root /opt/app/demo/html;
index index.html index.htm;
}
~~~
添加后reload一下nginx再訪問test.html:

此時本地我的瀏覽器就是被限制了,訪問不了該資源。
現在我登錄上我的B服務器,打開/etc/nginx/conf.d/default.conf
添加`resolver`和`proxy_pass`,設置如下:
~~~
server {
listen 80;
server_name localhost nginx.tangll.cn;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host$request_uri;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
~~~
`resolver`為DNS解析,這里填寫的IP為Google提供的免費DNS服務器的IP地址
`proxy_pass`配置代理轉發
至此便是配置了B服務器所有訪問根一級的請求全部都代理轉發對應到$http\_host$request\_uri去了,`$http_host`就是我們要訪問的主機名,`$request_uri`就是我們后面所加的參數。
簡單的說至此就是相當于配置好了我們請求了B服務器,B服務器再去請求我們所請求的地址。
那么接下來我們來看一下結果,我們在本地配置好代理,我這里是mac系統,可以從網絡設置中選擇高級,然后選擇代理

填入我們B服務器的IP,然后我們來看一下代理是否成功。
我們登錄[http://www.ip138.com/](https://link.jianshu.com?t=http%3A%2F%2Fwww.ip138.com%2F) 可以看到此時我們的IP地址已經為B服務器的IP,說明代理成功。

然后我們再來訪問一下test.html:

結果證明,此時的客戶端已經可以成功訪問A服務器的資源。
以上就是正向代理的一個場景演示,這個過程中可以知道,我們客戶端是想要A的資源,但是A的資源只有B能拿到,便讓B代理去幫助我們訪問A的資源。整個過程A只知道B拿了他的資源,并不知道客戶端拿到。
##### 2、反向代理配置場景演示
反向代理的演示更為簡單一些。
首先在/etc/nginx/conf.d/下新建一個test.conf:
~~~
server {
listen 8080;
server_name localhost nginx.tangll.cn;
location / {
root /opt/app/demo/html;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
~~~
可以看到我server里listen的是8080端口,但是我的服務器本身不對外開放8080端口,只開放了80端口。
所以我們此時訪問test.html結果是訪問不到的:

然后我們打開我們的/etc/nginx/conf.d/default.conf
添加`proxy_pass`設置如下:
~~~
server {
listen 80;
server_name localhost nginx.tangll.cn;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#設置代理
#location ~ /test.html$ {
# proxy_pass http://127.0.0.1:8080;
#}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
~~~
我們設置當匹配test.html結尾的URL時就去代理訪問本機的8080端口
為了對比我們先注釋掉,然后直接80端口訪問一下test.html:

可以看到此時返回的404。
這時候取消注釋我們reload一下nginx然后用80端口訪問test.html

此時便可訪問8080端口配置的資源。
以上便是完成了一個反向代理的演示,這個過程中我們可以知道,客戶端想要訪問的是test.html,但是test.html實際上是8080端口下配置的,中間經過了代理才能拿到。也就是說客戶端并不知道中間經歷了什么代理過程,只有服務端知道。客戶端只知道他拿到了test.html也就是8080端口下配置的資源內容。
#### 四、總結
> 由上的打比方和演示例子可以體會到正向代理與反向代理的區別和Nginx正向代理和反向代理的簡單配置。正向代理和反向代理的區別上邊也說過在于代理的對象不一樣,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。
> 最后一句話總結此文就是
> 代理服務器站在客戶端那邊就是正向代理,
> 代理服務器站在原始服務器那邊就是反向代理,
> Nginx通過`proxy_pass`可以設置代理服務。
作者:唐龍隆
鏈接:https://www.jianshu.com/p/ae76c223c6ef
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
- 常見功能
- 第三方授權登錄
- 郵件發送
- 簡易聊天室
- 獲取各國匯率
- PHP獲取服務器硬件指標
- 數據上報之
- web開發
- 開發規范
- 前端
- 踩坑
- 將footer固定在底部
- bootstrap
- Metronic
- 用到的jquery插件
- bootstrap-hover-dropdown
- jquery.slimscroll
- jquery.blockui
- bootstrap-switch
- js.cookie
- moment
- bootstrap-daterangepicker
- morris
- raphael
- jquery.waypoints
- jquery.counterup
- select2
- 取值和設置默認值
- vue
- axios
- 瀏覽器
- 谷歌瀏覽器
- 谷歌插件
- layui
- layui-表格
- layui-表單
- layui-彈窗
- layui-分頁
- 后端
- 操作系統
- linux
- 用戶管理
- 文件管理
- 目錄管理
- 壓縮和解壓縮
- 進程查看
- 端口查看
- 開機自啟動服務
- 定時任務
- shell腳本
- 殺掉運行超過指定時長指定服務的進程
- 獲取服務器使用狀態
- bash-shell連接socket
- 自定義快捷命令
- centos-踩坑
- 防火墻
- 軟件
- yum
- vim
- screen
- window
- 語言
- PHP
- 配置優化
- 框架
- thinkphp5.1+
- think命令行
- laravel6.+
- 維護模式
- 根據環境讀取不同配置
- laravel6.+采坑
- laravel坑位
- 數據庫事務
- 任務調度
- 文件權限問題
- 增強框架
- larvel:elastic-search
- 圖形驗證碼
- laravel獲取ip
- 函數
- strtotime
- 正則匹配
- 類
- 接口類與抽象類
- 類相關的關鍵字 - abstract
- 類相關的關鍵字 - interface
- PHP有關類的調用方式"->"與"::"的區別
- 擴展
- 問題歸納
- json_encode和json_decode
- 字符串的運算
- curl
- 優化php效率
- 數組相加合并與array_merge
- 時區轉換
- 不常用特性
- php反射
- 包管理器-composer
- GuzzleHttp
- Python
- Go
- 數據庫
- Redis
- 安裝
- 本地化-數據備份
- php-redis操作
- Mysql
- mysql-命令集合
- 設置終端可訪問
- 數據庫設計
- 用戶基礎信息表
- 踩坑集合
- mysql-2002
- mysql-2054
- 優化策略
- mysql-密碼驗證插件
- 一些牛逼的sql查詢
- topN
- 無限級分類
- Memcache
- MongoDb
- 安裝mongo-server
- 安裝php-mongodb擴展
- 在laravel中使用mongoDB
- 客戶端軟件
- Hbase
- Elasticsearch
- elastic-search
- restfulApi操作es
- web服務器
- 1.nginx
- 配置語法規則
- 配置詳解
- rewrite規則
- request_filename
- 2.apache
- 功能設計
- 加密解密
- Base64
- 對亞馬遜SKU加密
- 兼職項目中的加解密
- 騰訊外包時的加密
- 接口設計
- 接口限流設計
- 分庫分表
- 遍歷展示文件目錄結構
- 時區換算
- 文件切割
- 解析xml字符串
- 項目
- 博客后臺管理
- 亞馬遜廣告API
- 官方指引文檔
- 開發人員中心
- 應用商店
- 第三方庫
- 申請API郵件記錄
- 亞馬遜MWS
- 付款報告
- 亂碼
- 亞馬遜管理庫存報告
- 報告
- 商品
- 入庫
- 履行
- 出庫
- 財務
- 訂單
- 異步任務處理
- 集群如何同步代碼
- 基本開發流程
- 文檔管理
- showdoc
- 運行環境
- 開發環境
- vagrant
- windows上配置安裝
- vagrant安裝插件緩慢
- 更換ssh默認端口映射
- 設置x-shell密碼登錄
- 使用市場的box-homestead
- homestead-7: Box 'lc/homestead'
- 常見問題
- 虛擬環境reboot
- 突然無法使用
- phpStudy
- wamp
- 壓測性能
- VPN
- vultr
- 凌空圖床
- 寶塔
- 自動化部署
- 版本管理軟件鉤子
- 線上環境-LNMP
- centos7
- nginx
- mysql
- mysql開機自啟
- mysql-更換默認端口
- datetime字段類型默認值
- php
- php擴展安裝
- redis
- swoole
- gd
- BCMath
- igbinary
- zstd
- 包管理器:composer
- 優化性能
- nodejs
- 更新gcc版本
- 版本控制
- git
- 常用命令
- gitlab
- 版本管理規范
- 使用阿里云創建遠程倉庫
- git自動化部署
- svn
- 忽略指定文件
- 拉取代碼
- 自動化運維
- jekins
- 容器
- 集群
- 架構設計
- 設計原則
- 閱讀參考
- 代碼規劃
- 架構實戰
- 服務治理
- 權限控制設計
- 具體設計
- 計劃
- 疑問知識點
- 讀書筆記
- 高性能Mysql
- TCP-IP詳解-卷一:協議
- 思考
- php如何實現并發執行
- 對接調用設計
- 如何在瀏覽器上實現插件
- 如何設計一個app結合業務告警
- mysql的where查詢沒有用到索引
- 為啥in查詢比循環嵌套sql的查詢還要慢
- 使用git來創建屬于自己的composer包
- 翻頁獲取數據的時候又新增了數據
- 安全思路
- 月報
- PHP ?? 和 ?: 的區別
- PHP異步執行
- redis集群的目標是什么
- 大文件數據處理
- 性能瓶頸分析
- 命令行里輸出帶顏色的字體
- 面試問題合集
- 基礎
- 安全
- 算法
- 冒泡排序
- 快速排序
- 二分法查詢數組指定成員
- 字符查找匹配
- 令牌桶
- 漏桶
- 計數器
- 代理
- 協議
- http
- 狀態碼
- tcp
- udp
- Oauth2.0
- 設計模式
- 單例模式
- 適配器模式
- 工廠模式
- 觀察者模式
- 流程化
- 地址欄輸入網址到返回網頁的流程
- 題目收集
- 工具
- rabbitMq
- rabbitMQ用戶管理
- 生產者
- 消費者
- 支持TP5.*的think-queue
- 消息丟失
- 消費者報錯
- rabbitMQ配置優化
- 磁盤滿載導致服務掛掉
- PHP類庫
- rabbitMQ踩坑
- navicat
- vscode
- phpstorm
- 激活碼
- markdown
- PHP自定義類庫
- 工具類
- 領導力
- 任務分配
- 代碼組織
- 不要重復
- 避免污染
- 接口定義規范
- 小業務需求
- 獲取充值面額組成
- 監控服務器CPU和內存
- shell腳本版本