docker部署nginx反向代理多個web應用


正向代理和反向代理

正向代理 是client的代理,它隱藏了client。
反向代理 是server的代理,它隱藏了server。

正向代理

正向代理 與我們通常理解的代理(proxy)含義一致,例如某幕后老板為了隱藏自己的身份找了一個工具人替他辦事,大家都以為這個工具人才是老板,卻全然不知幕后大佬的存在。另一個經典的例子是2018年張藝謀的電影《影》,影片中替身境州就是沛國大都督子虞的工具人,或者叫傀儡,文雅一點叫 代理

在互聯網中,代理最早是用來幫助內網客戶端訪問外網服務器的,例如FQ。所謂的“代理”就是一個中間服務器,由於客戶端不能直接訪問目標服務器,於是客戶端將請求發送給中間服務器,由中間服務器向目標服務器發起請求,並將請求到的數據返回給客戶端。在這個過程中,目標服務器並不知道客戶端姓甚名誰,因為它收到的只是中間服務器的請求。此時,客戶端和代理服務器是一個整體,客戶端對目標服務器是隱藏的。

正向代理 代理的是客戶端,客戶端相對於服務器來說是不可見的,客戶端通過代理完成一系列請求。

反向代理

反向代理 與正想代理剛好相反:

上面這張圖很好的解釋了什么是反向代理:我們想吃外賣卻又不知道哪一家店有賣的,我們可以在外賣平台上請求我們想吃的種類例如熱干面,外賣平台按照它聚合的商家內容為我們自動篩選並展示可以下單的商家,我們不必知道商家的具體位置(這不代表我們不能獲取),我們也不用親自跑到店里去買飯。相反的,商家或者外賣小哥必須知道我們地址,不然外賣往哪里送呢?

在上面這個情景中,我們相當於client,平台相當於proxy,商家相當於server。我們不必知道商家的位置也不用和商家直接聯系,只需要向平台發出請求,平台按照我們的需要自動匹配符合條件的商家並幫助我們下單。

在互聯網中,反向代理服務器也起到了類似的作用:它對用戶隱藏了服務真正所在的服務器地址,而是通過反向代理服務器來處理用戶的請求。代理服務器接收到用戶的請求后,按照預先定義的規則訪問不同的服務,並將請求的結果轉發給用戶。通過定義不同的規則,代理也可以區分不同的請求並且訪問不同的web服務。

反向代理能夠將真正的web服務放置於內網服務器中,保證內網服務器的安全,有效組織web攻擊。同時,反向代理服務器能夠優化網站的負載。

總之,反向代理 代理的是服務端,服務端相對於客戶端來說是不可見的,服務端任何時候都不能直接請求。客戶端只能請求代理服務器。

以上圖片來自於 https://www.cnblogs.com/taostaryu/p/10547132.html

Nginx

關於 Nginx:8分鍾帶你深入淺出搞懂Nginx

Nginx 是一款用於反向代理的 web 應用,由於其內存占用少、啟動速度快、高並發能力強,在互聯網項目中被廣泛應用。

反向代理多個web應用

Nginx 功能強大,這里用於代理部署在服務器上的多個web應用,通過不同的域名訪問不同的web應用。

這里需要兩個前提:

  1. 已經實現內網穿透的公網服務器
  2. 大陸的公網服務器的話域名需要備案

大陸公網服務器需要對備案域名,這是個很惱火的事情,如果不備案的話,估計能用幾天,然后就被封掉,sad~

因為我已經用 frp 將內網服務器的 web 應用轉發到了公網服務器的不同端口。如果能夠配置 nginx 反向代理,可以選擇 http 協議,否則嘗試使用 tcp 協議也是可以訪問的。

因為設置了端口轉發,nginx 反向代理應該部署在公網服務器上。

初始化nginx容器

拉取鏡像資源:

$ docker pull nginx

設置掛載目錄:

$ export NGINX=~/dockerv/nginx
$ mkdir -p $NGINX

啟動一個容器獲取配置文件:

$ docker run -d --name nginx -p 80:80 nginx
$ docker cp nginx:/etc/nginx/nginx.conf $NGINX/

移除容器:

$ docker rm -f nginx

掛載並初始化容器:

$ docker run -d --name nginx -p 80:80 \
-v $NGINX/html:/usr/share/nginx/html \
-v $NGINX/log:/var/log/nginx \
-v $NGINX/nginx.conf:/etc/nginx/nginx.conf \
nginx

這里需要讓nginx容器的80端口代理宿主機的80端口(http服務),這樣我們對宿主機80端口的請求會被自動轉發給nginx服務。

配置nginx

配置nginx使它能通過不同的域名識別不同的web服務,nginx將不同請求轉發到宿主機的不同端口,然后frp將請求再次轉發到內網服務器上的不同web應用。

注意:在此之前,應該在域名控制台將待使用的域名或者二級域名解析到公網服務器的IP。

在nginx.conf文件中添加以下內容:

server {
    listen 80;
    server_name xxx.top *.xxx.top;
    location / {
        proxy_pass http://49.232.231.46:10080;
        proxy_redirect http://$host/ http://$http_host/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

需要注意的幾個地方:

listen 80;

容器內nginx服務監聽的端口,默認即可。在啟動容器是它被綁定到了宿主機的80端口。

server_name xxx.top *.xxx.top;

需要轉發給nginx處理的域名。當用戶請求指定域名時,公網服務器會將請求交給nginx處理。

proxy_pass http://49.234.232.46:10080;

frps設置了宿主機的10080端口為內網服務器的代理http端口,這里nginx將指定域名的請求轉發給宿主機的10080端口,再由frp轉發給內網服務器的frpc進行處理。

因為這里nginx容器是用的是bridge網絡模式,IP地址需要寫宿主機的公網IP地址,否則nginx找不到宿主機的地址。如果是直接在宿主機上部署或者使用host網絡模式部署的nginx容器,可以直接寫127.0.0.1或者localhost。

重啟nginx服務

$ docker restart nginx

其它

因為反向代理時將指定域名集合一股腦的轉發給了內網服務器,frpc並不知道將哪個域名交給哪個web服務處理。所以frpc還需要配置web應用的轉發信息。下面是frpc.ini的部分轉發配置:

[omv]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = omv.xxx.top

[halo]
type = http
local_ip = 127.0.0.1
local_port = 8090
custom_domains = blog.xxx.top

[emby]
[jellyfin]
type = http
local_ip = 127.0.0.1
local_port = 8096
custom_domains = emby.xxx.top

[qbittorrent]
type = http
local_ip = 127.0.0.1
local_port = 6996
custom_domains = qb.xxx.top

[tinyMediaManager]
type = http
local_ip = 127.0.0.1
local_port = 9800
custom_domains = tmm.xxx.top

[filebrowser]
type = http
local_ip = 127.0.0.1
local_port = 8888
custom_domains = file.xxx.top


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM