一個區域網路上的兩個網路伺服器,分別執行 apache2 和 nginx,在一個 WAN IP 地址下 - 通過(子)域名連接到正確的伺服器
我有兩台物理伺服器在同一個區域網路上執行。兩者都在執行網路伺服器;一個執行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 -T
nginx 系統的系統管理員的輸出:
- 剪斷 -
此外,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.conf
,exampleABC.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 伺服器起始頁。