如何使用 NGINX 设置基于名称和基于 IP 的虚拟主机(服务器块)
自开发和推出以来,在相对较短的时间内(大约 10 年多一点),Nginx 由于其高性能和低内存使用率,在 Web 服务器中经历了持续稳定的增长。
由于 Nginx 是免费和开源软件,因此它已被全球数千名 Web 服务器管理员采用,不仅在 Linux 和 *nix 服务器中,而且在 Microsoft Windows 中。
不要错过:Apache 基于名称和基于 IP 的虚拟主机
对于我们这些最习惯 Apache 的人来说,Nginx 可能有一个有点陡峭的学习曲线(至少这是我的情况),但一旦你设置了几个,它肯定会得到回报网站并开始查看流量和资源使用统计数据。
在本文中,我们将解释如何使用 Nginx 在 CentOS/RHEL 中设置基于名称和基于 IP 虚拟主机7 服务器和 Debian 8 及其衍生产品,从 Ubuntu 15.04 及其衍生产品开始。
我们对本文的测试场景如下:
- 操作系统:Debian 8 Jessie 服务器 [IP 192.168.0.25]
- 网关:路由器 [IP 192.168.0.1]
- 网络服务器:Nginx 1.6.2-5
- 虚拟域名:www.howtoinglovesnginx.com 和 www.nginxmeanspower.com。
安装 Nginx Web 服务器
如果您尚未安装 Nginx,请先安装 Nginx,然后再继续。如果您需要入门帮助,在此站点中快速搜索 nginx 将返回有关此主题的几篇文章。单击此页面顶部的放大镜图标并搜索关键字 nginx。如果您不知道如何在此站点中搜索文章,请不要担心,我们在这里添加了 nginx 文章的链接,只需根据您各自的 Linux 发行版浏览并安装它即可。
- 在 RHEL/CentOS 7 中从源安装并编译 Nginx
- 在 Debian 8 上安装 Nginx Web 服务器
- 在 Fedora 23 上安装带有 MariaDB 和 PHP/PHP-FPM 的 Nginx
- 在 Ubuntu 15.10 服务器/桌面上安装 Nginx Web 服务器
- 密码保护 Nginx 网站目录
然后准备好继续本教程的其余部分。
在 Nginx 中创建基于名称的虚拟主机
我相信您已经知道,虚拟主机是由 Nginx 在单个云 VPS 或物理服务器中提供服务的网站。然而,在 Nginx 文档中,您会找到术语“服务器块”,但它们基本上是相同的东西,但名称不同。
设置虚拟主机的第一步是在主配置文件 (/etc/nginx/nginx.conf) 中创建一个或多个服务器块(在我们的例子中,我们将创建两个,每个虚拟域一个))或在 /etc/nginx/sites-available 内。
虽然此目录中的配置文件的名称(sites-available)可以设置为您想要的任何名称,但最好使用域的名称,此外我们选择添加.conf
扩展名表明这些是配置文件。
这些服务器块可能相对复杂,但其基本形式包含以下内容:
在 /etc/nginx/sites-available/howtoinglovesnginx.com.conf 中:
server {
listen 80;
server_name tecmintlovesnginx.com www.tecmintlovesnginx.com;
access_log /var/www/logs/tecmintlovesnginx.access.log;
error_log /var/www/logs/tecmintlovesnginx.error.log error;
root /var/www/tecmintlovesnginx.com/public_html;
index index.html index.htm;
}
在 /etc/nginx/sites-available/nginxmeanspower.com.conf 中:
server {
listen 80;
server_name nginxmeanspower.com www.nginxmeanspower.com;
access_log /var/www/logs/nginxmeanspower.access.log;
error_log /var/www/logs/nginxmeanspower.error.log error;
root /var/www/nginxmeanspower.com/public_html;
index index.html index.htm;
}
您可以使用上述块开始设置虚拟主机,也可以使用 /etc/nginx/sites-available/default (Debian) 中的基本框架创建文件>) 或 /etc/nginx/nginx.conf.default (CentOS)。
复制后,更改其权限和所有权:
chmod 660 /etc/nginx/sites-available/tecmintlovesnginx.com.conf
chmod 660 /etc/nginx/sites-available/nginxmeanspower.com.conf
Debian 及其衍生品
chgrp www-data /etc/nginx/sites-available/tecmintlovesnginx.com.conf
chgrp www-data /etc/nginx/sites-available/nginxmeanspower.com.conf
CentOS 和 RHEL
chgrp nginx /etc/nginx/sites-available/tecmintlovesnginx.com.conf
chgrp nginx /etc/nginx/sites-available/nginxmeanspower.com.conf
完成后,您应该删除示例文件或将其重命名为其他名称,以避免混淆或冲突。
请注意,您还需要创建日志目录(/var/www/logs
)并为 Nginx 用户(nginx 或 www-data ,取决于您运行的是 CentOS 还是 Debian)对其的读写权限:
mkdir /var/www/logs
chmod -R 660 /var/www/logs
chgrp <nginx user> /var/www/logs
现在必须通过在启用站点的目录中创建此文件的符号链接来启用虚拟主机:
ln -s /etc/nginx/sites-available/tecmintlovesnginx.com.conf /etc/nginx/sites-enabled/tecmintlovesnginx.com.conf
ln -s /etc/nginx/sites-available/nginxmeanspower.com.conf /etc/nginx/sites-enabled/nginxmeanspower.com.conf
接下来,在 /var/www/
中为每个虚拟主机创建一个名为 index.html
的示例 html 文件(替换
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Tecmint loves Nginx</title>
</head>
<body>
<h1>Tecmint loves Nginx!</h1>
</body>
</html>
最后,测试 Nginx 配置并启动 Web 服务器。如果配置有任何错误,系统会提示您更正:
nginx -t && systemctl start nginx
并将以下条目添加到本地计算机中的 /etc/hosts
文件中作为基本名称解析策略:
192.168.0.25 tecmintlovesnginx.com
192.168.0.25 nginxmeanspower.com
然后启动 Web 浏览器并转到上面列出的 URL:
要在 Nginx 中添加更多虚拟主机,只需根据需要多次重复上述步骤即可。
Nginx 中基于 IP 的虚拟主机
与所有主机均可通过同一 IP 地址访问的基于名称的虚拟主机不同,基于 IP 的虚拟主机需要不同的 IP:端口> 各组合。
这允许 Web 服务器根据接收请求的 IP 地址和端口返回不同的站点。由于基于命名的虚拟主机为我们提供了共享 IP 地址和端口的优势,因此它们是通用 Web 服务器的标准,并且应该是首选设置,除非您安装的 Nginx 版本不支持服务器名称指示 (SNI),要么是因为它是一个非常过时的版本,要么是因为它是在没有 –with-http_ssl_module 编译选项的情况下编译的。
如果,
nginx -V
不返回下面突出显示的选项:
您将需要更新您的 Nginx 版本或重新编译它,具体取决于您原来的安装方法。编译Nginx可以参考下面的文章:
- 在 RHEL/CentOS 7 中从源安装并编译 Nginx
假设我们一切顺利,我们需要注意基于 IP 的虚拟主机的另一个先决条件是独立 IP 的可用性 - 通过将它们分配给不同的网络接口,或者通过使用虚拟主机IP(也称为 IP 别名)。
要在 Debian 中执行 IP 别名(假设您使用的是 eth0),请编辑 /etc/network/interfaces
,如下所示:
Debian 及其衍生品
auto eth0:1
iface eth0:1 inet static
address 192.168.0.25
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
auto eth0:2
iface eth0:2 inet static
address 192.168.0.26
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
在上面的示例中,我们使用 eth0: eth0:1
(192.168.0.25) 和 eth0:2
(192.168.0.26) 创建两个虚拟网卡。
CentOS 和 RHEL
在 CentOS 中,将 /etc/sysconfig/network-scripts/ifcfg-enp0s3 重命名为 ifcfg-enp0s3:1
并复制为 ifcfg-enp0s3:2
,然后分别更改以下行:
DEVICE="enp0s3:1"
IPADDR=192.168.0.25
和
DEVICE="enp0s3:2"
IPADDR=192.168.0.26
完成后,重新启动网络服务:
systemctl restart networking
接下来,对本文前面定义的服务器块进行以下更改:
在 /etc/nginx/sites-available/howtoinglovesnginx.com.conf 中:
listen 192.168.0.25:80
在 /etc/nginx/sites-available/nginxmeanspower.com.conf 中:
listen 192.168.0.26:80
最后,重新启动 Nginx 以使更改生效。
systemctl restart nginx
并且不要忘记相应地更新您的本地 /etc/hosts
:
192.168.0.25 tecmintlovesnginx.com
192.168.0.26 nginxmeanspower.com
因此,在端口 80 上向 192.168.0.25 和 192.168.0.26 发出的每个请求都将返回 howtoinglovesnginx.com 和nginxmeanspower.com 分别:
如上图所示,您现在拥有两个基于 IP 的虚拟主机,使用服务器中唯一的 NIC 并具有两个不同的 IP 别名。
总结
在本教程中,我们解释了如何在 Nginx 中设置基于名称和基于 IP 虚拟主机。尽管您可能想使用第一个选项,但重要的是要知道,如果您需要的话,另一个选项仍然存在 - 只需确保在考虑本指南中概述的事实后做出此决定即可。
此外,您可能需要为 Nginx 文档添加书签,因为在创建服务器块(您已经找到了 – 我们现在正在用 Nginx 语言讨论)和配置它们时经常参考它们是值得且有益的。您不会相信可用于配置和调整这个出色的 Web 服务器的所有选项。
与往常一样,如果您对本文有任何疑问或意见,请随时使用下面的表格给我们留言。我们期待您的来信,并且非常欢迎您对本指南提供反馈。