在CentOS/usr/share/nginx/html
到目前为止,我一直使用默认的 webRoot ( ) 来运行我的简单脚本和小型应用程序。前几天,我不得不配置nginx服务器块通过运行多个应用程序/var/www/html
。阅读一些教程后,我发现有两种方法可以做到这一点,使用virtual.conf或创建sites-available和sites-enabled文件夹并将新的conf放入其中。
部署应用程序并编辑主机文件后
192.168.0.38 dev.mysite.com www.dev.mysite.com (my local IP)
当我访问 localhost 时,应用程序可以正常工作,但当我访问 dev.mysite.com 时,我的 oldwebroot 会打开。我该如何修复此问题?
我仍然不明白在一台服务器上运行多个网站的想法,如果我将文件层次结构创建为和,
/var/www/mysite1/html
并/var/www/mysite2/html
在 sites-available 中为它们创建两个 conf,那么我们如何在机器上访问它们?由于它们都使用 localIP,那么在 hosts 中所做的编辑是什么?
请帮助我克服我的困惑并解决问题,我链接了我的 nginx.conf 和 mysite 服务器块配置。
服务器块 -http://codepad.org/nMEvcycy nginx.conf-http://codepad.org/WLl4bd1x
答案1
1)我认为问题出在监听指令上,因为它是在 localhost 上设置的,而您的域在 resolv.conf 文件中解析为 192.168.0.38。
改变
listen localhost:80;
到
listen 80;
或者,如果您有不想监听的其他网络接口,则只需使用您的 IP 添加另一个监听指令:
listen localhost:80;
listen 192.168.0.38:80;
2) 当您访问网站时,您的浏览器首先使用 DNS 解析来解析域名后面的 IP(在您的特定情况下,它会在 hosts 文件中本地覆盖,因此不使用外部 DNS)。 Web 服务器将侦听后面的 IP,并根据收到的 Host 标头在虚拟主机之间分发请求。这意味着您可以在同一个 IP 地址上托管多个域。
例如,您要访问 mysite1.com 和 mysite2.com。在 DNS 中,mysite1.com 和 mysite2.com 的 IP 为 XXXX。如果您访问 mysite1.com,将会发生什么情况:您的浏览器将打开多个 TCP 连接(通常是 4 个,以便并行发送请求并更快地获取链接内容)到 XXXX 端口 80。
然后它将发送
GET / HTTP/1.1
Host: mysite1.com
[ ... ]
现在您访问 mysite2.com,同样的事情,它打开到 XXXX 端口 80 的 TCP 连接,但这次发送:
GET / HTTP/1.1
Host: mysite2.com
[ ... ]
并且您将拥有适合每个站点的足够内容。
为了让 nginx 匹配 Host 标头,您必须server_name
在服务器块中设置指令。因此,您可以使用不同的server_name
值将配置拆分为不同的服务器块,并在一个 IP 后面为多个站点提供服务,或者通过在指令中使用多个值将相同的内容提供给多个域server_name
(但是,永远不要这样做:这称为重复内容,机器人会攻击您,请始终使用重定向)。这是针对 HTTP 的。
现在,对于 HTTPS 来说,情况更加复杂,因为 SSL 握手发生在 HTTP 流量交换之前。此握手是一种保护连接和交换加密信息的方法。但是,如果您在同一个 IP 上执行此操作,并且有多个具有不同server_name
值(因此证书也不同)的服务器块,那么 nginx 如何知道在 SSL 隧道建立的早期阶段他必须选择哪个证书(以及服务器块)?尚未看到 Host 标头!
为了解决这个问题,有一个名为“服务器名称指示”的 SSL 扩展,它允许客户端在握手阶段发送目标主机,以便 Web 服务器可以选择正确的虚拟主机。此外,还有其他解决方法,例如 x509 SubjectAltName 扩展(证书端)或简单的一个域 = 一个 IP。