Apache-2.2

如何在 OS X Server 下將子域反向代理到我 LAN 上的另一台電腦?

  • May 2, 2017

視覺化這個結果:

  1. site1.example.com-> 我的單個公共 IP -> 埠轉發 80 和 443 到在 OS X 10.10 Yosemite 上執行OS X Server192.168.1.10 4.1 的 LAN Mac
  2. site2.example.com-> 我的單個公共 IP -> LAN 192.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 Encryptsite1創建了一個對我和site2域都有好處的證書。

  • 在Server.app的Certificates選項卡中,點擊視窗底部的**+ ,然後****Import a Certificate Identity…**
  • 拖放.pem從 Let’s Encrypt 返回的文件(或您擁有的任何證書文件),然後點擊導入
  • 網站選項卡中,創建與以前幾乎相同的新站點,除了將埠更改為443SSL 證書並在 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鍵,映射到另一個應用程序的Apache ProxyPass/ProxyPassReverse指令

雖然我自己沒有對此進行測試,但我的建議可能是嘗試使用相同的反向 DNS 命名方案自己將 plist 添加到此目錄:複製com.example.mywebapp.plistcom.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沒有明確表示他們刪除使用者生成的配置,但也沒有說他們不會。安全總比後悔好。

祝你好運!

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