如何在 OS X Server 下將子域反向代理到我 LAN 上的另一台電腦?
視覺化這個結果:
site1.example.com
-> 我的單個公共 IP -> 埠轉發 80 和 443 到在 OS X 10.10 Yosemite 上執行OS X Server192.168.1.10
4.1 的 LAN Macsite2.example.com
-> 我的單個公共 IP -> LAN192.168.1.10
-> 反向代理?-> :80 和 :443 在 LAN 上192.168.1.15
這是在我無法選擇添加另一個公共 IP 的網路上。
#1已經啟動並執行良好。
#2是困難的部分,主要是因為我在 #1 上執行OS X Server,並且代理設置似乎不是相對簡單的 Apache設置,例如:
<VirtualHost *:80 *:443> ServerName site2.example.com ProxyRequests off ProxyPass / http://192.168.1.15/ ProxyPassReverse / http://192.168.1.15/ </VirtualHost>
也就是說,OS X Server 在奇怪的地方有 Apache 配置文件,我的理解是牠喜歡用 GUI 中的新更改覆蓋它們,所以我試圖找出“正確”的方法來做到這一點OS X 伺服器。
我的一個朋友建議可能有一種方法可以使用 OS X Server 的命令
webappctl
並編寫適當webapp.plist
的. 查看Apple 建議的頁面和他們的範例 .plist 文件,在我看來,他們對“網路應用程序”的想法確實希望附加到目錄(即 site1.example.com/webapp),而不是作為子域(如上面的**#2**中)。也許我還沒有完全弄清楚 .plist 格式?man
在 OS X Server 上執行此操作的“正確”方法是什麼?
這個問題最初是關於 Mac OS X Server 4.1 的,但隨著軟體版本號的變化,我剛剛開始工作,這個答案是從 macOS Server 5.2 開始編寫的。Server 5 顯然改變了一些事情,因為 Server 中的每個服務現在都位於一個主反向代理之後,因此這些說明不適用於 Server 4.1。
配置文件
在 macOS 伺服器機器上製作 web 應用配置文件,在 中
/Library/Server/Web/Config/apache2/httpd_site2webapp.conf
,指向site2
伺服器的 IP 地址。ProxyPreserveHost On ProxyPassReverse / http://192.168.1.15:80/ ProxyPass / http://192.168.1.15:80/ ServerName site2.example.com
然後在 中
/Library/Server/Web/Config/apache2/webapps/com.example.site2webapp.plist
,添加以下內容,引用.conf
上面文件的位置:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!-- See man pages for webapp.plist(5) and webappctl(8) for information about this example webapp.plist --> <plist version="1.0"> <dict> <key>includeFiles</key> <array> <!-- Include files are activated in virtual host when webapp is started --> <string>/Library/Server/Web/Config/apache2/httpd_site2webapp.conf</string> </array> <key>name</key> <string>com.example.site2webapp</string> <key>displayName</key> <!-- Name shown in Server app --> <string>site2WebApp</string> <key>installationIndicatorFilePath</key> <!-- The presence of this file indicates web app is installed --> <string>/Library/Server/Web/Config/apache2/httpd_site2webapp.conf</string> <key>sslPolicy</key><!-- Determines webapp SSL behavior --> <integer>0</integer> <!-- 0: default, UseSSLWhenEnabled --> <!-- 1: UseSSLAlways --> <!-- 2: UseSSLOnlyWhenCertificateIsTrustable --> <!-- 3: UseSSLNever --> <!-- 4: UseSSLAndNonSSL --> </dict> </plist>
如果您還需要 SSL,請將以下內容放入
/Library/Server/Web/Config/apache2/httpd_site2SSLwebapp.conf
. 該配置的不同之處在於伺服器之間的 LAN 流量預設情況下將不加密(此配置實際上告訴伺服器不要檢查是否有有效證書),但 WAN 流量將被加密。我相信您可以在伺服器上為加密的本地流量安裝自簽名證書site2
,但此配置仍將啟用反向代理,而無需匹配證書。(我承認可能有一種更正確的方法來保護本地流量,但這對我有用。)SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off ProxyPreserveHost On ProxyPassReverse / http://192.168.1.15:80/ ProxyPass / http://192.168.1.15:80/ ServerName site2.example.com
以及對應的 SSL web app plist,
/Library/Server/Web/Config/apache2/webapps/com.example.site2SSLwebapp.plist
,和上面的差不多:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!-- See man pages for webapp.plist(5) and webappctl(8) for information about this example webapp.plist --> <plist version="1.0"> <dict> <key>includeFiles</key> <array> <!-- Include files are activated in virtual host when webapp is started --> <string>/Library/Server/Web/Config/apache2/httpd_site2SSLwebapp.conf</string> </array> <key>name</key> <string>com.example.site2SSLwebapp</string> <key>displayName</key> <!-- Name shown in Server app --> <string>site2SSLWebApp</string> <key>installationIndicatorFilePath</key> <!-- The presence of this file indicates web app is installed --> <string>/Library/Server/Web/Config/apache2/httpd_site2SSLwebapp.conf</string> <key>sslPolicy</key><!-- Determines webapp SSL behavior --> <integer>0</integer> <!-- 0: default, UseSSLWhenEnabled --> <!-- 1: UseSSLAlways --> <!-- 2: UseSSLOnlyWhenCertificateIsTrustable --> <!-- 3: UseSSLNever --> <!-- 4: UseSSLAndNonSSL --> </dict> </plist>
對於這四個文件中的每一個,權限都需要是所有者:root 和組:wheel,644:
$ sudo chown -R root:wheel /path/to/file $ sudo chmod -R 644 /path/to/file
設置 Server.app
將 Web 應用程序添加到網站
- 在Server.app 界面的網站選項卡中,點擊網站列表下方的**+以添加新站點**
- 輸入
site2.example.com
域名- 將其他所有內容保留為預設設置
- 點擊編輯高級設置…
- 在“使這些 Web 應用程序在此網站上可用:”部分下,選中啟用site2WebApp
- 點擊確定
- 點擊創建
SSL
如果您需要在 WAN 上使用 SSL,請在伺服器中安裝涵蓋新域的證書。我使用Let’s Encrypt
site1
創建了一個對我和site2
域都有好處的證書。
- 在Server.app的Certificates選項卡中,點擊視窗底部的**+ ,然後****Import a Certificate Identity…**
- 拖放
.pem
從 Let’s Encrypt 返回的文件(或您擁有的任何證書文件),然後點擊導入- 在網站選項卡中,創建與以前幾乎相同的新站點,除了將埠更改為
443
SSL 證書並在 SSL 證書下,選擇剛剛導入的證書- 在Edit Advanced Settings…下,改為為site2SSLWebApp選中 Enable
我上面的回答改編自https://www.precursor.ca/precursor/resources/rais/landing/ReverseProxyTutorial.html中的說明。*警告:此連結下載包含 PDF 和範例伺服器 Web 應用程序配置文件的 zip 文件。*他們的 zip 還包括使用 Server 4.1 執行此操作的歷史說明。
我認為你的朋友可能正在走這
webappctl
條路。但是讓我們從 Apache 開始:當使用 OS X Server 時,Apache 從/Library/Server/Web/Config/apache2
. 該目錄包含一個文件ReadMe.txt
,其中部分內容是:網站/
此目錄包含由伺服器應用程序為網站服務配置的每個啟用的虛擬主機的文件。由於 httpd_server_app.conf 中有幾個“包含”指令,Apache 會讀取其內容。
…
這些文件由伺服器應用程序的伺服器駐留部分和 webappctl(8) 修改。管理員可以直接更改此文件和自定義虛擬主機文件,但強烈建議管理員將更改放在單獨的“包含”文件中,並將 webapp.plist(8) 機制與 webappctl(8) 命令結合使用 -線工具來管理它們。請參閱這些文件頂部的編輯指南。
好吧,似乎有道理。進一步查看該 Apache 配置目錄,有引用的
sites
子目錄,以及webapps
. 後者包含一堆描述 OS X Server 的 Web 服務的 plist,加上一個名為com.example.mywebapp.plist
. 在該文件的頂部,有一些有趣的地方:
includeFiles
鍵,它看起來有一組指向 webapp 想要的自定義包含文件.conf
的路徑proxies
鍵,映射到另一個應用程序的ApacheProxyPass
/ProxyPassReverse
指令雖然我自己沒有對此進行測試,但我的建議可能是嘗試使用相同的反向 DNS 命名方案自己將 plist 添加到此目錄:複製
com.example.mywebapp.plist
到com.example.site2.plist
. 擁有自己的副本後,您可以刪除大部分不必要的位,然後調整proxies
值以引用您自己的 URL,而不是它們擁有的範例路徑。如果這不起作用,您可以使用稍大的錘子並創建一個可包含的
.conf
文件,其中包含來自問題的直接 Apache 指令,將其放在伺服器的 Apache 配置目錄中。完成後,從您的 webapp plist 中完全刪除proxies
密鑰,然後使用該includeFiles
密鑰拉入該.conf
文件。無論哪種方式,一旦 webapp plist 就位,使用
webappctl
(作為 root)啟動新創建的應用程序:
$ sudo webappctl start com.example.site2
這應該要麼成功(返回退出程式碼 0),要麼 - 希望 - 失敗並提供一些您可以改進 webapp plist 的資訊。(同樣,這一切都未經測試,只是一個起點。)
如果您最終使用了
.conf
從 webapp plist 引用的自定義包含文件,那麼將該文件的備份保存在某處也不是一個壞主意,這樣以後的 OS X 或 Server.app 更新就不會刪除它。雖然 Server 的 ApacheReadMe.txt
沒有明確表示他們將刪除使用者生成的配置,但也沒有說他們不會。安全總比後悔好。祝你好運!