Nginx 代理服務

Nginx 代理服務

環境: CentOS7、Nginx 1.16.0

在之前我們說到了Nginx的負載均衡,Nginx可以作爲負載均衡器,分發客戶端請求,其實,這就是Nginx的代理服務之一:反向代理

Nginx的代理服務分爲兩種:

  • 正向代理
  • 反向代理

正向代理

正向代理是存在於客戶端和服務器之間的代理人,需要客戶端主動指定proxy,之後proxy會接受客戶端的請求併發送給server,將得到的結果又回發給客戶端,這一切對於server是透明的,它完全不知道這些請求時不同的人發起的。此時proxy代理的就是客戶端,也就是正向代理。

正向代理

反向代理

反向代理與正向相反,這裏proxy代理的是服務器,用戶統一向proxy發送請求,而proxy將請求轉發給其代理的server,將得到的結果再返回給客戶端。這一切對於客戶端來說是透明的,用戶完全不知道自己的請求將會發送到哪個服務器,因此也不需要客戶端做任何的設置,只需要把proxy當作server就行。

正向代理和反向代理的區別

配置:

在配置上:

  • 正向代理需要你主動設置代理服務器ip或者域名進行訪問,由設置的服務器ip或者域名去獲取訪問內容並返回。
  • 反向代理不需要你做任何設置,直接訪問服務器真實ip或者域名,但是服務器內部會自動根據訪問內容進行跳轉及內容返回,你不知道它最終訪問的是哪些機器。

用途:

從用途上來區分:

  • 正向代理:正向代理用途是爲了在防火牆內的局域網提供訪問internet的途徑。另外還可以使用緩衝特性減少網絡使用率
  • 反向代理:反向代理的用途是將防火牆後面的服務器提供給internet用戶訪問。同時還可以完成諸如負載均衡等功能

安全性:

從安全性來講:

  • 正向代理:正向代理允許客戶端通過它訪問任意網站並且隱蔽客戶端自身,因此你必須採取安全措施來確保僅爲經過授權的客戶端提供服務
  • 反向代理:對外是透明的,訪問者並不知道自己訪問的是代理。對訪問者而言,他以爲訪問的就是原始服務器

正向代理的功能

從上面的介紹也就可以猜出來正向代理的至少一個功能(科學上網),也即:

用戶A無法訪問facebook,但是能訪問服務器B,而服務器B可以訪問facebook。於是用戶A訪問服務器B,通過服務器B去訪問facebook,,服務器B收到請求後,去訪問facebook,facebook把響應信息返回給服務器B,服務器B再把響應信息返回給A。這樣,通過代理服務器B,就實現了翻牆。

反向代理的功能

從上面的介紹也可以猜出來反向代理的至少一個功能——負載均衡。還有其他許多功能:

  • 保護和隱藏原始資源服務器
  • 加密和SSL加速
  • 負載均衡
  • 緩存靜態內容
  • 壓縮
  • 減速上傳
  • 安全
  • 外網發佈

Nginx上的實現

Nginx上的正向代理

配置語法:

Syntax: proxy_pass URL;
Default: ——
Context: location, if in location, limit_except

URL可支持http、https、socket的寫法

此時,在我的阿里服務器上,我在8080端口運行了一個server服務,但我的安全組並沒有對外開放8080端口,也就是說,外界無法通過ip:8080訪問到我的應用。但是這裏可以通過Nginx做一次正向代理進行訪問:

這裏我通過443端口配置的https服務,把訪問443的請求全部轉發到了8080端口。可以看作,我的8080端口是google搜索,設置不對外開發,即好像我們在國內正常無法使用google一樣,但是和他同處的443端口,相當於一臺海外的服務器,它可以訪問google,我們就通過它,實現了對google的訪問。

再看一個例子:

這是一臺服務器上Nginx的配置,這裏通過匹配代理Ip進行訪問控制

這裏,這裏設置了只允許http_x_forwarded_for帶有116.62.103.228

的請求進行訪問,其餘的訪問一律返回403。

那麼接下來看一看116.62.103.228上Nginx的配置

這裏配置起到的作用,就是將收到的所有請求都轉發給自己,由這臺代理服務器發出請求,返回響應。(resolver配置DNS解析,這裏是google的8.8.8.8)

那麼只需要在代理工具中選擇該代理服務器,將自己的請求都發送到代理服務器上,就可以訪問之前被限制的服務器了。

一些擴展配置:

除了proxy_pass一行,其餘的都可以寫在配置文件中,在.conf文件裏include引入即可。

Nginx上的反向代理

實現負載均衡:

四層負載均衡:

通過報文中的IP地址和端口,再加上負載均衡設備所採用的負載均衡算法,最終確定選擇後端哪臺下游服務器。以TCP爲例,客戶端向負載均衡發送SYN請求建立第一次連接,通過配置的負載均衡算法選擇一臺後端服務器,並且將報文中的IP地址信息修改爲後臺服務器的IP地址信息,因此TCP三次握手連接是與後端服務器直接建立起來的。

也就是說,這是直接在傳輸層進行控制

七層負載均衡:

七層負載均衡在應用層選擇服務器,只能先與負載均衡設備進行TCP連接,然後負載均衡設備再與後端服務器建立另外一條TCP連接通道。就可以做到更多對於應用層信息的控制。Nginx實現的就是七層的負載均衡。

四層負載均衡與服務器直接建立起TCP連接,很容易遭受SYN Flood攻擊。SYN Flood是一種廣爲人知的DDoS(分佈式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,發送大量僞造的TCP連接請求,從而使得被攻擊方資源耗盡的攻擊方式。從技術實現原理上可以看出,四層負載均衡很容易將垃圾流量轉發至後臺服務器,而七層設備則可以過濾這些惡意並清洗這些流量,但要求設備本身具備很強的抗DDOS流量的能力。

實現:

配置語法:

Syntax: upstream name {...}
Default: ——
Context: http

我在==/etc/nginx/conf.d/==下新建了三個配置, server1.conf、server2.conf、server3.conf。它們分別監聽8080、8081、8082端口,並且展示不同的首頁。

如果nginx啓動失敗,並且error.log有如下錯誤,

可能是你並沒有開放該端口。

首先通過如下命令查看開放的端口:

semanage port -l | grep http_port_t

再執行如下命令添加端口:

semanage port -a -t http_port_t -p tcp 8080

如果報錯

改用:

semanage port -m -t http_port_t -p tcp 8080

可以啓動nginx並訪問了:


接下來創建80端口的配置文件upstream.conf,如下:

重啓nginx,這次,不停刷新127.0.0.1,就可以看到原本在不同端口設置的頁面了。

如果我們禁用掉其中一個端口,iptables -I INPUT -p tcp --dport 8081 -j DROP即相當於其中一個server宕機,那麼nginx會自動的排除,不再將請求轉發給它。

最後,再補充一點upstream配置的細節

upstream xxx {
	server xxx.com weight=5;//分配權重,即分配給該server的機率更大
	server xxx.com:8080;//可指定服務器端口
	server unix:/tmp/xxx;//支持socket
	server xxx.com backup;//備份節點
}
down 當前server暫時不參與負載均衡
backup 預留的備份服務器
max_fails 允許請求失敗的次數
fail_timeout 經過max_fails後,服務暫停的時間
max_conns 限制最大的接受連接數

| :----------- | ------------------------------- |
| backup | 預留的備份服務器 |
| max_fails | 允許請求失敗的次數 |
| fail_timeout | 經過max_fails後,服務暫停的時間 |
| max_conns | 限制最大的接受連接數 |

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章