實踐中客戶端沒法直接跟服務端發起請求的時候,咱們就須要代理服務。代理能夠實現客戶端與服務端之間的通訊,咱們的Nginx也能夠實現相應的代理服務。代理分爲正向代理和反向代理,此文就來演示一下Nginx配置正向代理和反向代理的場景。html
正向代理和反向代理的區別我在知乎上找到兩張圖能夠幫助咱們很好的理解:python
正向代理簡單地打個租房的比方:nginx
A(客戶端)想租C(服務端)的房子,可是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子因此你找了B(代理)幫忙租到了這個房子。瀏覽器
這個過程當中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。服務器
反向代理也用一個租房的例子:網絡
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)纔是房東。
B(代理)是中介把這個房子租給了A(客戶端)。app
這個過程當中A(客戶端)並不知道這個房子到底誰纔是房東
他都有可能認爲這個房子就是B(代理)的spa
由上的例子和圖咱們能夠知道正向代理和反向代理的區別在於代理的對象不同,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。3d
正向代理很常見,咱們的***就是一種正向代理。
咱們接下來演示正向代理的這麼一個場景。
首先我在個人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:
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系統,能夠從網絡設置中選擇高級,而後選擇代理
反向代理的演示更爲簡單一些。
首先在/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結果是訪問不到的:
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
由上的打比方和演示例子能夠體會到正向代理與反向代理的區別和Nginx正向代理和反向代理的簡單配置。正向代理和反向代理的區別上邊也說過在於代理的對象不同,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。
最後一句話總結此文就是
代理服務器站在客戶端那邊就是正向代理,
代理服務器站在原始服務器那邊就是反向代理,
Nginx經過proxy_pass
能夠設置代理服務。