我在路由器后面有两个 Web 服务器:1 个业务线 Web 应用程序/网站(Windows)和 1 个带有多个网站/项目的 LAMP/Web 开发服务器(带有虚拟主机、自己的域等的 apache)。到目前为止,为了公开访问 Web 开发项目,我一直在 Linux 服务器上的每个虚拟主机上使用不同的端口,因为端口 80 转发到 Windows 服务器(它优先)。现在我更喜欢使用我的域和子域来公开访问我的 Web 开发项目(而不是难以记住的端口号)...我该如何设置它,以便我可以通过端口 80(和端口 443...我正在添加 SSL)访问两台服务器上的所有网站?
答案1
在路由器和其他两台服务器之间设置反向代理服务器(监听端口 80 和 443),并通过主机名将流量从代理服务器引导到其他两台(或更多)服务器。注意:通过这样做,您还可以购买单个通配符或 SAN 证书来处理所有安全站点。
您没有提供足够的有关特定配置的信息来准确解释如何执行此操作,但此站点和其他站点都包含有关设置和配置反向代理的信息。 (但是,即使您提供了足够的信息,如此宽泛的“我该如何...”问题在 ServerFault 上也可能偏离主题。)
无论如何,您都可以直接任何传入站点任何后端服务器,无论使用何种技术来设置后端服务器(Apache、nginx、IIS 等),并且“重定向”(即反向代理)只能基于请求中的主机名(无论是域名、子域名,还是特定目录或文件)。事实上,您甚至可以将流量发送到外部的网站,但如果你这样做,当然,你需要确保你适当地处理防火墙外流量的安全性(即确保 https 等)。换句话说,技术做一切您希望它能做到,正如您希望它能做到的那样!
反向代理可以实现为专门配置的 Apache、IIS、nginx 或其他“Web 服务器”,并且还有许多专门为此而改编的“服务器”技术(例如,haproxy)。
考虑到您目前所处的阶段,您应该遵循本指南并了解更多有关这些技术的一般信息。换句话说,您不应期望这个特定的问题会导致某人 (1) 选择正确的实现并 (2) 告诉您如何针对您的特定问题进行设置和配置。
一旦你到达这一点,你将能够随时返回 ServerFault具体的关于的问题具体的您曾尝试申请但未成功的问题具体的解决方案。
“解决”问题的步骤:
- 确定合适的解决方案(完成:您所需要的是反向代理)
- 确定并评估可能的实现方式(进展顺利:这里已经为您确定了许多实现方式,在本网站和其他网站上搜索反向代理将为您提供大量信息)
- 选择一种技术来实现解决方案
- 设置和配置所选技术(ServerFault 随时为您服务,只需提出您尝试解决的问题的具体问题即可)
答案2
我认为最好的方法是nginx和ngx_http_proxy_module。它具有高度可扩展性、快速性和功能性。您可以为所有站点配置一个证书加密,它非常透明。举个非常简单的例子,在 nginx srv 配置中添加指令:
location /srv1 {
proxy_pass http://server1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /srv2 {
proxy_pass http://server2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
现在,如果您尝试传递,http://nginx/srv1
您将看到来自 server1 的响应。此外,您可以拆分两个域的配置,每个域都必须包含一个location /
带有 porxy_pass 的配置,如上例所示。
答案3
答案4
是的,大家说得对,反向代理就是我想在这里使用的方法。我通过设置新的虚拟机并安装 nginx 作为反向代理服务器,让它完美地工作。新的 nginx 服务器现在充当“前端服务器”,而我的 Ubuntu(14.04.4)/apache(2.4.7) 和 Windows/IIS 服务器(包含我的所有站点)现在充当“后端服务器”。我只需更改路由器中端口 80/http 的端口转发条目以反映新的反向代理服务器的 IP 地址,并配置我的 nginx 和 apache 配置文件,如下所示。
我的 nginx conf 文件(/etc/nginx/sites-enabled/default):
server {
# catch all for all other domains and sub-domains that are pointing here, but don't have a site hosted here (or that I'm too lazy to track down)
return 404;
}
server {
#
# stupidwindowsserveristillcantgetridof.com - line of business windows server
#
server_name stupidwindowsserveristillcantgetridof.com www.stupidwindowsserveristillcantgetridof.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.1.1.10:80;
}
}
server {
#
# dev.domain1.com - web dev app/project #1
#
server_name dev.domain1.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.1.1.20:80;
}
}
server {
#
# beta.domain2.com - web dev app/project #2
#
server_name beta.domain2.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.1.1.20:80;
}
}
server {
#
# domain3.com - web dev app/project #3
#
server_name domain3.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.1.1.20:80;
}
}
我的 apache conf 文件中与 Web Dev 项目域名对应的虚拟主机示例:
#
# Virtual host for dev.domain1.com - web dev app/project #1
#
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName dev.domain1.com
#ServerAlias dev.domain1.com
DocumentRoot /var/www/add_on_domain/dev.domain1.com
<Directory /var/www/add_on_domain/dev.domain1.com>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/dev.domain1.com-error.log
CustomLog ${APACHE_LOG_DIR}/dev.domain1.com-access.log combined
</VirtualHost>
希望这能更有效地帮助其他人。
PS-我计划稍后添加 SSL/https 内容