apache多个站点
最佳回答
很多人常常看到一台服务器上跑多个站点,不同的域名访问不同的站点,就会有个疑惑:访问的时候并没有在地址栏中加入端口号,多个域名都是解析到这个服务器的IP地址,服务器怎么能够正确的分辨和解析呢?
其实还是对http协议不够了解,看下图一切一目了然
对应的在apache中有rewite和proxy模块,它们就是为了完成这些任务, 一台服务上我们配置多个 vhost,必然需要端口号,
比如:
a.com :80
b.com :8080
实际访问的时候 www.a.com 自动转发到80端口, www.b.com 则自动转发到8080端口。
网站 1:
网站 2:
这样一个服务器的 80 端口上就跑起两个站点.
没事找了个虚拟主机来试用,尝试用给的IP地址访问怎么都访问不了,一直都显示
后来仔细一想,虚拟主机是需要依赖域名的,不然没办法区分vhost,后来找到测试的域名果然可以正常访问了。
最新回答共有5条回答
-
游客
回复首先帮题主梳理一下几个名词之间的关系,再回答题主的问题。
服务器现在我们说起服务器,可能是指一台物理机,也可能是一台虚拟机,也可能是云服务商的一个容器(docker)。如果是物理机,由于物理机性能都非常好,一般都会在服务器上部署多个网站。而虚拟机和容器本身就是一种资源划分的手段,一般只会在一个虚拟机或容器里部署一个网站。所以服务器和网站的关系是1比1-N。
IP、网卡、服务器服务器上部署了网站,想要网站能被外界访问需要一个公网IP。而网卡就是绑定IP,提供数据传输能力的硬件。网卡与IP的关系是1比1,一个服务器可以插多个网卡。
域名、IP有了IP,实际上用户就可以访问到网站了,但IP地址不容易记,所以就有了域名。通过DNS可以实现域名到IP的解析。一个域名可以绑定多个IP,假设的域名绑定了100个IP,通过DNS的负载均衡策略,每次解析返回的IP地址都可能不一致。
题主的问题:Q1第一问题其实是,假设我只有一个公网IP,但我有100台服务器部署了网站,要如何部署才能让用户的请求平均分配到这100台机器上。给一种比较简单的方式:
公网IP绑定的机器是一台反向代理(Nginx),反向代理跟后端的100台机器保持长连接检查机器状态,有请求进来时,根据负载均衡策略从100台机器中选择一台处理请求。用户能感知到的机器就是反向代理一台(一个IP),但实际提供服务的是后端的100台机器。
题主的问题:Q2虚拟机商在分配机器时,如果你选择了独立IP,每台机器都有独立的虚拟网卡,每个网卡都有自己的IP。
题主的问题:Q3正常情况下一个公网IP只会绑定一台机器。
-
無畏
回复域名简单的说就一个网站地址,这个地址是唯一的。
主机服务器就是用来运行网站程序和储存数据的。
IP是服务器地址。
网卡是服务器与外界链接一个出口。
网站是运行在服务器上的程序。
它们之间的关系是:IP和域名是绑定在服务器上,域名通过DNS服务器指向IP地址上,这样输入域名就可以访问到服务器。
Q1:这些大型网站有一个主服务器和很多加速服务器。我们一般访问到是加速服务器上的缓存数据。
Q2:通过网站运行环境,如IIS。每个域名在绑定在IIS,然后通过IIS指向对应的虚拟目录。
Q3:1个IP只能对应一台主机。
-
清风若雨
回复关于域名、服务器、IP、网卡与网站之间的关系,如果要梳理清楚,那就要先向你介绍一下WEB工作流程。
WEB工作流程,用户访问网站过程中经历了哪些流程?
用户打开浏览器 -> 输入域名 -> 回车 -> 网页内容在用户浏览器上显示出来。上面的流程是用户在表象层上的感知,但在技术层上,远远不止这些流程,具体流程如下(以下流程也仅仅是精简流程,技术要做的工作远不止这些):
关系梳理
用户打开浏览器 -> 输入域名 -> 回车后,用户系统本地会对此域名进行解析 -> 找到此域名对应的IP -> 然后定位到要访问网站的远程服务器 -> 浏览器发送请求(要获取哪个页面) -> 远程服务器接收到请求后,将页面发送给用户浏览器 -> 用户浏览器解析页面HTML进行渲染 -> 页面最终展现在用户眼前。服务器(硬件)
服务器做为硬件设备,网站是要部署在服务器之上的,所以少了硬件的支持,就谈不上网站。网卡(硬件)
网卡做为电脑上的硬件设备,要上网就离不开网卡,不管是客户端(用户的电脑)还是网站服务器,如果少了网卡,联网这辈子都是不可能的了。IP
有了电脑/服务器、网卡,接入运营商网络后,网络运营商就会给你分配一个全世界独一无二的公网IP,以此来定位客户端电脑和服务器端。
IP可以理解为人的身份证,在互联网上代表某台机器的唯一编码。域名
-
無畏
回复配置多个站点就是启用虚拟主机,把httpd.conf这个配置文件里面有
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
这个前面的#号取消掉,然后每一个站点放在httpd-vhosts.conf这里面就可以了。