想象一下这个结果:
site1.example.com
-> 我的单个公共 IP -> 将 80 和 443 端口转发到192.168.1.10
正在运行的 LAN MacOS X 服务器OS X 10.10 Yosemite 上的 4.1site2.example.com
-> 我的单个公共 IP -> LAN192.168.1.10
-> 反向代理?-> LAN 上的 :80 和 :443192.168.1.15
在网络上,我无法添加另一个公共 IP。
#1已经启动并运行良好。
#2是最难的部分,主要是因为我在跑步OS X 服务器在 #1 上,代理设置似乎不是相对简单的 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 Server 上执行此操作的“正确”方法。
我的一个朋友建议,也许有一种方法可以使用 OS X Server 的webappctl
命令并编写适当的webapp.plist
使用 Web 应用OS X Server 文档的“Web 应用”部分几乎没有包含任何细节。查看man
Apple 建议的页面及其示例 .plist 文件,我认为他们对“Web 应用”的理解真的希望附加到目录(即 site1.example.com/webapp),而不是作为子域名(如#2,以上)。也许我还没有完全弄清楚 .plist 的格式?
在 OS X Server 上执行此操作的“正确”方法是什么?
答案1
我认为您的朋友可能对路径有所了解webappctl
。但让我们从 Apache 开始:使用 OS X Server 时,Apache 从 中提取其配置/Library/Server/Web/Config/apache2
。该目录包含一个文件ReadMe.txt
,其中部分内容如下:
网站/
此目录包含由服务器应用程序为网站服务配置的每个已启用虚拟主机的文件。由于 httpd_server_app.conf 中的多个“Include”指令,Apache 会读取其内容。
...
这些文件由服务器应用程序的服务器驻留部分和 webappctl(8) 修改。管理员可以直接更改此文件和自定义虚拟主机文件,但强烈建议管理员将更改放在单独的“包含”文件中,并使用 webapp.plist(8) 机制与 webappctl(8) 命令行工具结合使用来管理它们。请参阅这些文件顶部的编辑指南。
好的,这似乎合理。进一步查看 Apache 配置目录,有引用的sites
子目录以及webapps
。后者包含一堆描述 OS X Server Web 服务的 plist,以及一个名为的 plist com.example.mywebapp.plist
。在该文件的顶部,有几点值得关注:
- 该键看起来包含Web 应用程序需要的
includeFiles
自定义包含文件的路径数组.conf
- 键
proxies
,映射到另一个应用程序的ApacheProxyPass
/指令ProxyPassReverse
虽然我自己还没有测试过,但我的建议可能是尝试使用相同的反向 DNS 命名方案自己将 plist 添加到此目录:复制com.example.mywebapp.plist
到com.example.site2.plist
。一旦您有了自己的副本,您就可以删掉大部分不必要的部分,然后调整值proxies
以引用您自己的 URL,而不是他们拥有的示例路径。
如果这不起作用,您可以稍微大点声望,创建一个.conf
包含问题的 Apache 指令的可包含文件,并将其放置在服务器的 Apache 配置目录中。完成后,将密钥proxies
从您的 webapp plist 中删除,而是使用该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
没有明确说明它们将要删除用户生成的配置,它并没有说他们惯于也一样。小心为上。
祝你好运!
答案2
这个问题最初是在 Mac OS X Server 4.1 上提出的,但随着软件版本号的变动,我刚刚才开始工作,这个答案是针对 macOS Server 5.2 写的。Server 5 显然有所改变,因为每一个服务器中的服务现在位于一个主反向代理之后,因此这些说明不适用于服务器 4.1。
配置文件
在 macOS Server 机器上创建 Web 应用程序配置文件,/Library/Server/Web/Config/apache2/httpd_site2webapp.conf
指向服务器的 IP 地址site2
。
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 应用程序 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,请在服务器中安装涵盖新域的证书。我使用了让我们加密创建一个对我site1
和site2
域都适用的证书。
- 在里面证书选项卡中,单击+然后导入证书身份...
- 拖放
.pem
从 Let's Encrypt 获取的文件(或任何您拥有的证书文件),然后单击进口 - 在里面网站选项卡,创建新站点的方式与之前几乎相同,只是将端口更改为
443
,并在 SSL 证书下选择刚刚导入的证书 - 在下面编辑高级设置...,而是选中启用site2SSLWeb应用
上面的回答改编自https://www.precursor.ca/precursor/resources/rais/landing/ReverseProxyTutorial.html。警告:此链接下载一个包含 PDF 和示例服务器 Web 应用程序配置文件的 zip 文件。他们的 zip 还包含使用 Server 4.1 执行此操作的历史说明。