Nginx

通過 CNAME 和 Nginx Docker 容器將安全域重定向到另一個域

  • August 9, 2021

**更新:**我在這篇文章的底部附加了第二次嘗試。它正在“工作”,但我想讓我最初的想法發揮作用。

我正在嘗試通過重定向伺服器將域的 https 請求重定向到另一個域。

我將使用https://website.com,https://website2.comhttps://myredirectserver.com作為範例。

我購買了一個 SSL 證書website.com,它的 DNS 是 CNAMEDwww到的myredirectserver.com。也有一個 SSL 證書mywebsite2.com,它目前位於伺服器上。一切都很好作為一個獨立的域。

myredirectserver.com有兩個指向兩個 IP 地址的流量管理 A 記錄(高可用性)。

這兩個 IP 地址在防火牆中通過 NAT 轉換為代理伺服器。

在該代理伺服器上,有一個執行 Alpine/Nginx 的 Docker 容器。

容器的 Dockerfile:

FROM nginx:1.17.7-alpine    
RUN apk add --no-cache tzdata    
ENV TZ America/Chicago    
RUN rm /etc/nginx/conf.d/default.conf    
COPY myredirectserver.com.conf /etc/nginx/conf.d/myredirectserver.com.conf
RUN rm /etc/nginx/nginx.conf    
COPY nginx.conf /etc/nginx/nginx.conf    
COPY myredirectserver.com.crt /etc/nginx/ssl/myredirectserver.com.crt    
COPY myredirectserver.com.key /etc/nginx/ssl/myredirectserver.com.key    
COPY proxy_params /etc/nginx/proxy_params

啟動它的docker run部分(通過後端程式碼安裝了用於動態配置文件創建的捲):

docker run --name=myredirectserver --restart always --log-opt max-size=50m --log-opt max-file=5 -d -v /etc/nginx/myredirectserverBuild:/etc/nginx/myredirectserverBuild -v /etc/nginx/myredirectserverSSL:/etc/nginx/myredirectserverSSL -p 8224:443 -p 8223:80 myredirectserver

在該 Docker 容器中,Nginx 配置文件位於/etc/nginx/conf.d/myredirectserver.com.conf

#I DO NOT KNOW IF THIS IS CORRECT FOR WHAT I NEED
   server {
               listen 443 ssl;
   
               server_name myredirectserver.com www.myredirectserver.com;
               ssl_certificate /etc/nginx/ssl/myredirectserver.com.crt;
               ssl_certificate_key /etc/nginx/ssl/myredirectserver.com.key;
           }
           server {
               listen 80;
               server_name myredirectserver.com www.myredirectserver.com;
               return 301 https://www.myredirectserver.com$request_uri;
           }
   
   include /etc/nginx/myredirectserverBuild/*.conf;

最後的包含文件包含原始請求的域,mywebsite.com.conf

## www.mywebsite.com virtual host
       server {
           listen 443 ssl;

           server_name mywebsite.com www.mywebsite.com;
           ssl_certificate /etc/nginx/myredirectwebsiteSSL/mywebsite.com.crt;
           ssl_certificate_key /etc/nginx/myredirectwebsiteSSL/mywebsite.com.key;               
       }
       server {
           listen 80;
           server_name mywebsite.com www.mywebsite.com;
           return 301 https://www.mywebsite2.com$request_uri; <--- The redirect
       }
       

website2.com域位於主機伺服器上,我可以正常請求該域。我只是無法弄清楚我哪裡出錯了。我覺得它在我的 Nginx 配置中,但我的 Nginx 語法並不是最好的。為什麼我return 301不工作並將我重定向到域?

故障排除期間的幾點注意事項:

wget 0.0.0.0:8223返回:

 --2021-07-26 23:44:19--  http://0.0.0.0:8223/
Connecting to 0.0.0.0:8223... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.mywebsite2.com/ [following]
--2021-07-25 23:44:19--  https://www.mywebsite2.com/
Resolving www.mywebsite2.com (www.mywebsite2.com)... XX.XXX.XXX.XXX
Connecting to www.mywebsite2.com (www.mywebsite2.com)|XX.XXX.XXX.XXX|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

index.html                                               [ <=>                                                                                                                  ]  37.56K   231KB/s    in 0.2s    

2021-07-25 23:44:20 (231 KB/s) - ‘index.html’ saved [38461]

curl --resolve www.myredirectserver.com:8223:0.0.0.0 http://www.myredirectserver.com/返回超時,瀏覽器也是如此。

在本地網路上,在地址欄 ( 192.168.69.140:8223) 中輸入 Docker 容器的 IP 會將我帶到https://www.website2.com.

輸入https://192.168.69.140:8224會將我帶到安全飛濺警告頁面。點擊proceed,它給了我一個404.

我不知所措,因為當請求到達 CNAME 的 IP 時,我不知道如何處理它myredirectserver.com。如何告訴 Nginx 查看原始請求的域website.com

更新(第二次嘗試):

我停止了 Docker 容器,並將DNSCNAME中的www級別更改為指向一個已經存在的高可用 IP。我會打電話destinationserver.net的。所以基本上:

`mywebsite.com`
|
|---> CNAME 'destinationserver.net'

`destinationserver.net`
|
|----> A XX.XXX.XXX.XXX --> Firewall --> Proxy

|----> A XX.XXX.XXX.XXX --> Firewall --> Proxy

destinationserver.net伺服器上,我在 Nginx 配置中有以下內容website.com

# ## www.mywebsite.com virtual host
       server {
           listen 8222 ssl;

           server_name mywebsite.com www.mywebsite.com;
           ssl_certificate /etc/nginx/ssl/mywebsite.com.crt;
           ssl_certificate_key /etc/nginx/ssl/mywebsite.com.key;
           return 301 http://www.mywebsite2.com$request_uri;
       }
       server {
           listen 8221;
           server_name mywebsite.com www.mywebsite.com;
           return 301 https://www.mywebsite2$request_uri;
       } 

正如我在問題第一行的“更新”中所說,這是“有效的”,但是在單獨的空間中處理這些重定向會很好,因此是 Docker 容器的想法。

我已經放棄了重定向伺服器的想法,而是做了兩件事:

我向根域添加了一個 ANAME(別名),因此www請求將轉到與非請求相同的高可用流量管理器位置www。然後,在Nginx配置中,我添加了以下內容來重定向請求:

# ## www.mywebsite.com virtual host
       server {
           listen 8222 ssl;

           server_name mywebsite.com www.mywebsite.com;
           ssl_certificate /etc/nginx/ssl/mywebsite.com.crt;
           ssl_certificate_key /etc/nginx/ssl/mywebsite.com.key;
           return 301 https://www.mywebsite2.com$request_uri;
       }
       server {
           listen 8221;
           server_name mywebsite.com www.mywebsite.com;
           return 301 https://www.mywebsite2$request_uri;
       } 

這適用於我需要它做的事情,所以除非有人提出更好的方法,否則我會保持原樣。

引用自:https://serverfault.com/questions/1070739