Nginx

一個區域網路上的兩個網路伺服器,分別執行 apache2 和 nginx,在一個 WAN IP 地址下 - 通過(子)域名連接到正確的伺服器

  • March 20, 2022

我有兩台物理伺服器在同一個區域網路上執行。兩者都在執行網路伺服器;一個執行apache2,另一個執行nginx。它們各自具有不同的域名,但具有相同的外部 WAN IP 地址。假設網路佈局如下所示:

               WAN
           10.20.30.40
     |----------|----------|
     |                     |
  Domain 1              Domain 2
exampleABC.com     (sub.)exampleXYZ.com
     |                     |
     |----------|----------|
                |
           Single LAN
                |
     |----------|----------|
     |                     |
 IP addr 1             IP addr 2
192.168.0.10           192.168.0.20
     |                     |
     |                     |
 Server 1              Server 2
  apache2                nginx

apache2 伺服器屬於我,而 nginx 伺服器不屬於我。兩台伺服器都為其提供的每項服務都有專用的子域 - 例如,(www.)exampleABC.com 用於主網頁,cloud.exampleXYZ.com 用於反向代理雲服務,media.exampleXYZ.com 用於媒體等。

由於未知的原因,當連接到 WAN IP 地址時,nginx 伺服器優先 - 最初,兩個域都會指向 nginx 託管的主網頁,但是使用以下(目前)nginx 配置,exampleABC.com 將正確導致apache2 伺服器,而 exampleXYZ.com 繼續通向 nginx 伺服器。

server {
   listen 80;

   # listen on all subdomains
   server_name exampleABC.com *.exampleABC.com;
   
   location / {
       # transparently proxy to other server (port 443)
       proxy_pass http://192.168.0.10:80;

       # set "Host" header passed to other server to client-requested FQDN so other server knows which subdomain is being requested
       proxy_set_header Host $http_host;
   }
}

server {
   listen 443 ssl;

   server_name exampleABC.com *.exampleABC.com;
   
   location / {
       proxy_pass https://192.168.0.10:443;
       proxy_set_header Host $http_host;
   }
}

但是,apache2 伺服器託管的子域(docs.exampleABC.com 等)繼續連接到 nginx。(nginx 子域工作正常。)

這是我通過 apache2 設置的子域配置之一:

<VirtualHost *:80>
   ServerName ft.exampleABC.com
   Redirect permanent / https://ft.exampleABC.com/
   RewriteEngine on
   RewriteCond %{SERVER_NAME} =ft.exampleABC.com
   RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
   <VirtualHost _default_:443>
       # The ServerName directive sets the request scheme, hostname and port that
       # the server uses to identify itself. This is used when creating
       # redirection URLs. In the context of virtual hosts, the ServerName
       # specifies what hostname must appear in the request's Host: header to
       # match this virtual host. For the default virtual host (this file) this
       # value is not decisive as it is used as a last resort host regardless.
       # However, you must set it for any further virtual host explicitly.

       ServerName ft.exampleABC.com
       #ServerAlias *.exampleABC.com

       ServerAdmin webmaster@localhost
       DocumentRoot /mnt/external/webserver/ft

       # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
       # error, crit, alert, emerg.
       # It is also possible to configure the loglevel for particular
       # modules, e.g.
       #LogLevel info ssl:warn

       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined

       # For most configuration files from conf-available/, which are
       # enabled or disabled at a global level, it is possible to
       # include a line for only one particular virtual host. For example the
       # following line enables the CGI configuration for this host only
       # after it has been globally disabled with "a2disconf".
       #Include conf-available/serve-cgi-bin.conf
       
       <Directory /mnt/external/webserver/ft>
           Options Indexes FollowSymLinks
           AllowOverride None
           Require all granted
       </Directory>

       #   SSL Engine Switch:
       #   Enable/Disable SSL for this virtual host.
       SSLEngine on

       < snipped: lines added by certbot >

   </VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我想讓它在連接到 exampleABC.com、ft.exampleABC.com 等時,客戶端正確連接到 apache2 伺服器。當然,exampleXYZ.com 及其子域仍應連接到 nginx 伺服器。

其他資訊:

最初,客戶端(例如網路瀏覽器)無法驗證 exampleABC.com 的 TLS 證書的真實性。(請注意,我在 apache2 下正確設置了 TLS 證書。)這是通過將我的 apache2 域添加到 nginx 伺服器的證書來解決的。不過,我不認為這應該是必要的——我的證書(在 apache2 下)應該通過反向代理傳遞,不是嗎?

如果我在手動指定 Host 標頭(通過)時嘗試通過 curl 連接到 apache2 伺服器curl -vL -H "Host: ft.exampleABC.com" https://192.168.0.10,我將被重定向到 nginx 伺服器的主網頁。我不確定這意味著什麼。

編輯:

這是nginx -Tnginx 系統的系統管理員的輸出:

  • 剪斷 -

此外,nginx 伺服器通過LinuxServer.io 的 “SWAG”在容器中執行。

編輯:

LinuxServer.io 的 SWAG 載入與預設配置不同的 nginx 配置。以下命令獲取正確的配置文件:

docker exec -it swag /usr/sbin/nginx -c /config/nginx/nginx.conf -T

該命令的結果可以在此粘貼中找到。(StackExchange 的字元太多)

有效的是創建一個具有以下內容的新文件/config/nginx/proxy-confs/exampleABC.subdomain.conf(相當於/etc/nginx/conf.d/exampleABC.subdomain.confexampleABC.subdomain可以用任何東西替換):

server {
   listen 80;
   listen [::]:80;

   server_name .exampleABC.com;
   
   location / {
       proxy_pass http://192.168.0.10:80;
       proxy_set_header Host $http_host;
   }
}

server {
   listen 443 ssl;
   listen [::]:443 ssl;

   server_name .exampleABC.com;
   
   location / {
       proxy_pass https://192.168.0.10:443;
       proxy_set_header Host $http_host;
   }
}

我在原始文章中鍵入的 nginx 配置應該與此功能幾乎相同,所以我懷疑問題要麼是缺乏listen [::]:<port>;IPv6 兼容性,要麼是其他一些配置文件與我創建的配置文件衝突。

我是他們的伺服器所在房屋的所有者。無論如何,我都不是專家;我只是很好地遵循指南。我有一個 DuckDNS 域名,我為 Plex、Sonarr、SABnzbd 等執行 Docker 容器。我還為我的反向代理執行一個 SWAG 容器。

Unilock 引入了他們自己的伺服器。它有自己的域名並使用 apache2 進行所有伺服器配置。該伺服器在進入我的網路之前,正在偵聽與我相同的所有埠(80、443 等)。

有人告訴我,如果 Unilock 可以在非標準埠上執行他們的服務,我們也許可以更改我的 pfSense 路由器的設置來執行兩個伺服器。我還被告知我可以將他們伺服器的域名添加到我的 SWAG 容器的 EXTRA_DOMAINS 變數中。我這樣做了,但沒有幫助。

我還在我的 SITE_CONF 預設文件中添加了一個額外的伺服器塊。額外的塊如下所示:

#second server block
server {
   listen 443 ssl;
   listen [::]:443 ssl;
   server_name <his domain name>; #change this to your subdomain
   #include /config/nginx/ssl.conf;
   client_max_body_size 0;
   location / {
   #include /config/nginx/proxy.conf;
   resolver 127.0.0.11 valid=30s;
   #set $upstream_app 192.168.0.10;
   #set $upstream_port 443;
   #set $upstream_proto https;
   #proxy_pass $upstream_proto://$upstream_app:$upstream_port;
   proxy_pass https://192.168.0.10:443; 
   proxy_max_temp_file_size 2048m;
  }

我的主伺服器塊是預設文件。如果我需要發布整個配置,我會;儘管似乎 unlock 已經在 Pastebin 上這樣做了。輸入上述內容後,我可以訪問 unilock 的首頁,但他們的子域仍然重定向到我的預設 nginx 伺服器起始頁。

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