1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > 服务器 > 正文

服务器

在一个服务器上面怎么放两个网站呀?

1987web2022-08-19服务器576

文章使用 Zhihu On VSCode 编辑发布

理解了 HTTP 协议你就知道,一个服务器完全可以 host 很多网站,原因就在于 HTTP request 里面包含了 HOST 这个信息头。 虽然两个域名都解析到同一个 IP,但是当用户用不同的两个域名向你的服务器发出请求的时候,HTTP Request 里面的 Host 头是不一样的。 当你在浏览器里输http://developer.mozilla.org的时候,server 收到的 HTTP 报文头长这样:

GET / HTTP/1.1
Host: developer.mozilla.org
...

当你换一个域名的时候,比如http://developer.google.org,报文就是这样:

GET / HTTP/1.1
Host: developer.google.org
...

很显然,服务器可以根据不同的 host 来把请求转发到相应的服务。 一般的实践做法的话,推荐使用 nginx 作为 Gate,在配置文件里这样配置即可:

http{...server{listen80;server_namedeveloper.mozilla.org;root/var/www/html/mozilla;...}server{listen80;server_namedeveloper.google.com;root/var/www/html/google;...}}

这样配置的话,用户用域名http://developer.mozilla.org请求的,就会从 /mozilla 这个文件夹 serve 静态资源,从http://google.org请求的,就会从 /google 文件夹 serve 静态资源。 一般情况本地的两个网站还要有 serve 动态请求的应用,假如一个启动后监听 3000 端口,一个监听 8000 端口,那再加上如下配置:

http{......server{listen80;server_namedeveloper.mozilla.org;root/var/www/html/mozilla;location/api{proxy_passlocalhost:3000}}server{listen80;server_namedeveloper.google.com;root/var/www/html/google;location/api{proxy_passlocalhost:8000}...}}

这样的话,形如http://developer.mozilla.org/api/...的请求就会转发到localhost:3000,然后 nginx 再把localhost:3000返回的再返回给浏览器,当然如果应用不是在和 nginx 一个主机上的话,可能这个localhost:3000就是私网的其它主机ip,或者也可以是公网 ip,或者域名,8000 的也同理。

这样配置的话,你的服务器就可以 host 两个网站了,同理还可能是很多个。

nginx 的话,用作这种 Gate 转发请求并静态文件 host 是蛮方便的一种选择,只需要几行简单的 json 配置,就能稳定正常运行,而且基于异步 I/O,并发性能很好。

当然,说了这么多我的意思就是,那个 Host 头可以让你过滤转发请求,具体实践方法推荐 nginx,简单快速稳定易扩展。