假设我们有 2 个域名
http://www.foo.co.uk
http://www.bar.co.uk
1 个用于 Ubuntu 16.04 LTS 服务器的公共静态 IP 80.12.34.56
(192.168.0.11
本地)
192.168.0.17
以及在同一台机器上运行的 2 个 KVM Ubuntu 16.04 LTS 服务器实例192.168.0.18
如何才能将流量从 重定向foo.co.uk
到,同时保持从到 的192.168.0.17
流量不变?bar.co.uk
192.167.0.18
编辑:这是我现在的 /sites-available/proxy_server.conf 文件
<VirtualHost *:80>
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://192.168.0.18:8080/
ProxyPassReverse / http://192.168.0.18:8080/
ServerName syphonx.localhost
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
</VirtualHost>
这会在我的 error.log 文件中产生如下错误
[proxy:error] [pid 7701:tid 139952398472960] (113)No route to host: AH00957: HTTP: attempt to connect to 192.168.0.18:8080 (192.168.0.18) failed
[proxy:error] [pid 7701:tid 139952398472960] AH00959: ap_proxy_connect_backend disabling worker for (192.168.0.18) for 60
[proxy_http:error] [pid 7701:tid 139952398472960] [client ##.#.##.##:55331] AH01114: HTTP: failed to make connection to backend: 192.168.0.18
我试图在它们之间进行 ping 操作,但似乎 *.17 和 *.18 上的 2 个 KVM 实例的网络配置使得我无法访问它们。
答案1
这听起来有点像我在网络上的设置。我的家庭服务器上有多个面向 Web 的服务,但位于不同的系统 IP 上。
我在一个系统上有一个专用nginx
服务器,它处理通过端口 80 和 443 的公共 IP 上的所有入站流量,并反向代理到我网络上的后端服务器(它们是 Apache、nginx 和 lighttpd,因此它不一定特定于后端)。我目前为不同 IP 地址上的 GitLab 实例和 OwnCloud 实例以及当前处于关闭状态的服务器执行此操作(之前运行了 MediaWiki 的测试实例)。
注意:此答案的编写理念是,执行下面定义的反向代理的系统是一个单独的系统,而不是您现有的服务器配置之一。如果它是您现有的服务器之一,则不要更改现有配置,除非添加新的一个用于单个站点不是在该服务器上,而不是为每个服务器设置新的配置。我还建议使用
nginx
;您可以在任何您想要的 Web 服务器上执行此操作,我只是知道如何在中快速执行此操作nginx
。
(1)nginx
在其中一台服务器上安装,或设置另一台服务器
我使用nginx
和nginx-core
变体,但您可以使用 Apache 或任何您熟悉并知道如何配置的 Web 服务器(但由于我使用nginx
,因此我nginx
在此处使用说明)。我还使用ssl-cert
创建垃圾自签名证书以供默认捕获全部使用。
sudo apt-get install nginx nginx-core ssl-cert
(2)将该 nginx 服务器配置为“默认”捕获无效域名。
首先,让我们对默认的 catch-all 站点做一些更改。
sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/catch-all
将其放入/etc/nginx/sites-available/catch-all
文件中:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
include snippets/snakeoil.conf;
return 404;
}
对于我们未在实例上配置nginx
监听连接的域的 IP 地址,这是默认的“全部捕获”功能。这样,我们可以为指向此处的任何无效域提供“未找到”信息。我们将在单独的配置文件中明确定义我们认为可以接受的所有域。不过,现在让我们启用这个全部捕获功能,然后开始设置单独的域。
sudo ln -s /etc/nginx/sites-available/catch-all /etc/nginx/sites-enabled/
(3)为各个允许的站点及其反向代理配置 nginx
对于这个例子,我将按照你的帖子
www.foo.co.uk
使用。www.bar.co.uk
基本上,我将为您提供一个示例文件,您可以将其用于反向代理配置。这应该适用于大多数反向代理设置,尽管您正在运行的个别网站可能会有细微差别,我无法在这里提供帮助。
对于每个要反向代理的站点,首先创建包含域名的文件。我将使用您所述的两个域名作为示例。
sudo touch /etc/nginx/sites-available/{www.foo.co.uk,www.bar.co.uk}
在创建的两个文件中,您都可以将其放置到位。只需在我的评论所在的位置(以 开头#
)相应地更新信息即可:
server {
listen 80;
server_name DOMAINNAME; # Replace DOMAINNAME with the actual domain
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
# Replace this INTERNALIPADDRESS:PORT with the IP and port
# combination for the server on your network handling the
# above-specified domain name.
proxy_pass http://INTERNALIPADDRESS:PORT/;
}
}
一旦创建,我们需要再次激活它们。
sudo ln -s /etc/nginx/sites-available/www.foo.co.uk /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/www.bar.co.uk /etc/nginx/sites-enabled/
现在我们已经激活了网站,让我们确保这里没有配置错误。如果此命令输出除“配置文件语法正常”和“配置文件测试成功”之外的任何内容,则需要解决这些错误:
sudo nginx -t
如果没有错误通知,并且您收到“OK”和“成功”消息,则重新启动该nginx
过程以使所有配置真正生效。
Ubuntu 14.04 及更早版本:
sudo service nginx restart
Ubuntu 16.04:
sudo systemctl restart nginx
(4)在您的网络上配置端口转发,将端口 80 和 443 转发到您刚刚设置此反向代理服务器的服务器。
在我刚刚写的例子中,假设我放置的服务器nginx
是 192.168.100.200。在您的路由器上,设置端口 80 和端口 443 以路由到该 IP 地址。 如果您不打算使用 HTTPS,则仅转发端口 80。
(5)将您域名的 DNS 指向您家里的公共 IP 地址。
这是很容易理解的,但请确保 DNS记录指向路由器在公共互联网上为您提供的 IP 地址。(如果您不知道 IP 地址,A
请转到或类似网站获取)ipchicken.com
(6)DNS 传播后,您就大功告成了。从任何系统进行测试不是在您的家庭网络上(例如咖啡店或其他地方的公共 Wi-Fi 上的计算机)。
答案2
我认为您的虚拟主机正在使用桥接网络,这意味着它们无法连接到主机,或者主机无法连接到它们。
例如:尝试浏览或 ping http://192.168.0.18通过 192.168.0.11,由于桥接网络,您将无法访问。
如果是这种情况,则使用 NAT 连接到您的 VM 而不是网桥,然后 ping 新获得的 IP,我觉得它应该可以工作。