在一个服务器上面怎么放两个网站呀?
文章使用 Zhihu On VSCode 编辑发布 理解了 HTTP 协议你就知道,一个服务器完全可以 host 很多网站,原因就在于 HTTP request 里面包含了 HOST 这个信息头。
虽然两个域名都解析到同一个 IP,但是当用户用不同的两个域名向你的服务器发出请求的时候,HTTP Request 里面的 Host 头是不一样的。
当你在浏览器里输http://developer.mozilla.org的时候,server 收到的 HTTP 报文头长这样: 当你换一个域名的时候,比如http://developer.google.org,报文就是这样: 很显然,服务器可以根据不同的 host 来把请求转发到相应的服务。
一般的实践做法的话,推荐使用 nginx 作为 Gate,在配置文件里这样配置即可: 这样配置的话,用户用域名http://developer.mozilla.org请求的,就会从 /mozilla 这个文件夹 serve 静态资源,从http://google.org请求的,就会从 /google 文件夹 serve 静态资源。
一般情况本地的两个网站还要有 serve 动态请求的应用,假如一个启动后监听 3000 端口,一个监听 8000 端口,那再加上如下配置: 这样的话,形如 这样配置的话,你的服务器就可以 host 两个网站了,同理还可能是很多个。 nginx 的话,用作这种 Gate 转发请求并静态文件 host 是蛮方便的一种选择,只需要几行简单的 json 配置,就能稳定正常运行,而且基于异步 I/O,并发性能很好。 当然,说了这么多我的意思就是,那个 Host 头可以让你过滤转发请求,具体实践方法推荐 nginx,简单快速稳定易扩展。GET / HTTP/1.1
Host: developer.mozilla.org
...
GET / HTTP/1.1
Host: developer.google.org
...
http{...server{listen80;server_namedeveloper.mozilla.org;root/var/www/html/mozilla;...}server{listen80;server_namedeveloper.google.com;root/var/www/html/google;...}}
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 的也同理。