另一个用户已经发布了这个问题,但没有给出详细的答案。这是原始问题的链接 -一个 IP 地址,两个网站,两台机器
我有两台机器,每台都安装了 apache2 并具有静态 IP 地址。
服务器 1
example.com
static ip = 192.168.0.6
apache2 running on ports 80 and 443 fine
ufw and router firewall are open on ports 80 and 443 as well
服务器 2
domain name = myhost01.example.com
static ip = 192.168.0.7
apache2 running on 8080(HTTP) and 8443(HTTPS)
ufw and router firewall are open on ports 8080 and 8443
当我访问 {http)www.example.com 或 (https)www.example.com 时 - 我正确接收了服务器 1 的 Web 内容
当我访问 myhost01.example.com:8080 或 myhost01.example.com:8443 时 - 我正确接收了服务器 2 的 Web 内容
我想反向代理服务器 2,这样当用户访问 http:// myhost01 .example.com/ 时,他们会收到 http:// myhost01. example.com:8080/ 的内容,基本上隐藏了端口号。目前,当我尝试访问 myhost01(dot)example(dot)com 时,我收到“无法连接/找不到网页”错误
在 example.com 的虚拟主机文件中,我使用了以下内容:
ProxyRequests Off
ProxyPass / http://myhost01. example.com:8080/
ProxyPassReverse / http://myhost01 .example.com:8080/
apache2 中启用了 proxy 和 proxy_http 模块
关于如何实现这个功能你有什么想法吗?
PS-由于我的信誉点数不足以发布两个以上的网址,因此在网址中添加了空格。
**更新- 请参阅下面的注释
服务器 1 - example.com - VHOST 文件
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com
DocumentRoot /myweb/cmweb/apache/http
#ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://myhost01.example.com:8080/
ProxyPassReverse / http://myhost01.example.com:8080/
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
<Directory /myweb/cmweb/apache/http/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
LogLevel warn
</VirtualHost>
尝试使用 192.168.0.7 代理替换 myhost01(dot)example(dot)com,但无济于事
Server2 - myhost01(dot)example(dot)com VHOST 文件
<VirtualHost *:8080>
ServerAdmin [email protected]
ServerName myhost01.example.com
ServerAlias myhost01 myhost01.example.com
DocumentRoot /mwdhost/cmweb/apache/http
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /mwdhost/cmweb/apache/http/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
LogLevel warn
</VirtualHost>
myhost01 已添加到域名注册人的 A 记录中,可以执行 NSLOOKUP 并获取 myhost01.example.com 的正确外部 IP 地址
下面是 server1 的 Apache Error.log - 可能是我遇到的问题的线索???
Sun Feb 02 18:24:52 2014] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 54.43.138.12:8080 (myhost01.example.com) failed
[Sun Feb 02 18:24:52 2014] [error] ap_proxy_connect_backend disabling worker for (myhost01.example.com)
[Sun Feb 02 18:24:53 2014] [error] proxy: HTTP: disabled connection for (myhost01.example.com)
[Mon Feb 03 07:33:54 2014] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
答案1
建议:
检查 server1(example.com) 是否可以查找并获取正确的 DNS 记录myhost01.example.com
?
您的服务器是否各有一个公共 IP 和一个内部 IP?还是像链接的问题一样,您只有一个 IP?
我是否闻到了具有一个 IP、在上述端口上运行 nat 和端口转发的廉价路由器的味道?
- 廉价路由器经常会出现这样的问题:它们无法结合使用外部地址的 nat 和端口转发来访问其他内部机器。有些路由器还会故意不这样做,因为将所有内部负载发送到网关/nat 路由器是一种不好的做法。
两个 DNS 记录(myhost1.example.com 和 example.com)都指向同一个公共 IP?
是的,这是有意且正确的,但是会发生什么呢?
- 当 Apache 实例想要查找代理连接的位置时,它会被告知外部 IP
myhost01.example.com
指向可能导致连接失败的路由器。我们假设确实如此。
- 当 Apache 实例想要查找代理连接的位置时,它会被告知外部 IP
我们发现一个可能的错误,该如何解决呢?
由于来自 DNS 的外部 IP 无法帮助 server1 找到本地 IP 以通过本地网络,所以我们需要一种方法来做到这一点,幸运的是,有很多条路可以通往罗马。
- 一种方法是在 ProxyPass 中使用 server2 的本地 IP。
- 另一种方法是简单地覆盖您的 DNS 答案。这可以在充当代理的 server1 上完成。编辑文件
/etc/hosts
。有关您可以在这里阅读 hosts 文件。 - 第三种方法是为本地服务器创建额外的 DNS 记录。例如,指向 的名为 local2.example.com 的条目
192.168.0.7
。
笔记。如果您想知道,完全可以拥有更多公共 IP 并在小子网(例如,也将用作互连)上运行它们。但不太建议这样做。
免责声明
此答案基于经验猜测,因为答案中缺少完整的配置、Apache 日志和错误。欢迎随时改进。
答案2
你的方法似乎有点过了。
所有现代 Web 服务器都允许您将多个网站绑定到单个 IP 地址和端口。这可以通过为各个站点配置主机头名称来实现。
此外,您可以使用 SNI 将多个 SSL 站点指向相同的 IP 地址和端口(443 或其他)。较旧的浏览器不支持 SNI,但这可能不是您的问题。
将其中一个站点连接到端口 8080,然后在其上连接代理是一条很长的路,除非明确需要以某种方式向客户端公开端口 8080。
作为一个大忙人,除非绝对需要,否则我不会花很多时间在 Apache 配置上。否则,我会使用 Virtualmin (http://www.webmin.com/virtualmin.html),它可以处理此类配置下 85% 的脏活。