我们经常需要在同一台服务器上,部署多个网站。我们之前讲过手动在Ubuntu 18.04上配置Apache虚拟主机,那么如何在 Ubuntu 16.04 上配置 Nginx Web 服务器块(类似于 Apache 中的虚拟主机),以在一台服务器上托管多个域名网站呢?
示例配置
为了演示方便,本教程中我们将使用 Nginx 服务器配置两个域名分别为 example.com 和 test.com。
步骤 1 — 设置网站根目录
默认情况下,Ubuntu 16.04 上的 Nginx 启用了一个服务器块(虚拟主机)。它被配置在 /var/www/html
目录下。
如果只在一台服务器上部署单个站点,我们可以使用默认的 Nginx 配置,但如果我们要配置多个站点,我们就需要设置额外的网站目录。本文的示例中,我们的所有域名都不使用默认的网站目录 /var/www/html
,而是为每个域名配置独立的网站目录。
我们将在 /var/www
目录下,为每个站点创建一个网站目录。
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html
现在我们为每个测试域名创建了单独的网站目录,我们需要把每个 Web 目录的所有权分配给 Nginx 用户。
注意:我们可以根据需要再次调整文件夹的权限或所有权,以允许 www-data
用户获得访问授权。
我们可以使用 $USER
环境变量将所有权分配给我们当前登录的帐户。这样,我们就能够创建或编辑此目录中的内容了:
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html
到目前为止,每个网站目录的权限应该已经设置完成,但我们可以通过输入以下命令来进一步设置权限:
sudo chmod -R 755 /var/www
现在,目录结构现在已经配置好了,我们可以继续后续操作。
第 2 步 – 为每个站点创建示例页面
现在,我们为每个站点创建一个测试页面。
在第一个域名根目录下,创建一个名为 index.html
的文件:
nano /var/www/example.com/html/index.html
在该文件中,我们填充一些基本的 Html 代码:
/var/www/example.com/html/index.html
<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com server block is working!</h1>
</body>
</html>
完成后保存并关闭文件。注意 nano
编辑器的用法,按 CTRL+o
编辑写入,然后按 CTRL+x
退出。
为了方便,我们直接将刚创建的 Html 文件复制到另一个网站目录下:
cp /var/www/example.com/html/index.html /var/www/test.com/html/
现在,我们可以在编辑器中打开新文件:
nano /var/www/test.com/html/index.html
然后稍作修改:
/var/www/test.com/html/index.html
<html>
<head>
<title>Welcome to Test.com!</title>
</head>
<body>
<h1>Success! The test.com server block is working!</h1>
</body>
</html>
完成后保存并关闭此文件。
第 3 步 – 为每个域创建服务器块文件
现在,每个网站目录下,都已经有了一个可以访问的内容,我们需要对 Nginx 进行一些配置。
默认情况下,Nginx 包含一个名为 default
的配置文件,我们将该文件的配置内容用作新建配置文件的模板。
创建第一个服务器配置文件
如上所述,我们通过复制 default 配置文件来创建第一个网站服务器块配置文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
现在,使用sudo
权限打开刚刚创建的新配置文件:
sudo nano /etc/nginx/sites-available/example.com
忽略注释行,该文件将类似于以下内容:
/etc/nginx/sites-available/example.com
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
首先,我们先查看 listen 指令。在服务器上只有一个服务器配置文件可以启用 default_server
选项。如果server_name
没有匹配到任何可用的配置文件时,指定使用默认的配置文件。
我们可以从新建的两个配置文件选择一个,在 listen
指令中添加 default_server
,或者可以使用 default 配置文件,如果找不到请求的主机,它将吧 /var/www/html
目录作为默认访问路径。
在本文中,我们将保留 default 配置文件以处理不匹配的请求,因此我们从新建的两个网站配置文件中删除 default_server
选项。
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
. . .
}
接下来,我们要调整网站的根目录,文件中 root
指令指定指向创建的站点的网站目录:
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
}
接下来,我们需要修改 server_name
以匹配对应的域名和别名。
完成后,文件将如下所示:
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
这就是我们的基本配置。保存并关闭文件以退出。
创建第二个服务器块文件
我们以刚刚配置好的配置文件为模板,复制它以为下一个域名创建配置文件:
sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com
在编辑器中打开新文件:
sudo nano /etc/nginx/sites-available/test.com
同样,设置好网站对应的根目录和别名。
完成后,文件可能如下所示:
/etc/nginx/sites-available/test.com
server {
listen 80;
listen [::]:80;
root /var/www/test.com/html;
index index.html index.htm index.nginx-debian.html;
server_name test.com www.test.com;
location / {
try_files $uri $uri/ =404;
}
}
完成后,保存并关闭文件。
第 4 步 — 启用服务器块并重新启动 Nginx
现在我们已经创建了两个域名的配置文件,我们可以通过创建从这些文件到 sites-enabled
目录的符号链接来启用配置文件,这样 Nginx 就可以在启动期间读取该目录。
通过以下命令来创建符号链接:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/
配置文件现在已被链接到启用的目录中。我们现在启用了三个服务器块(配置文件),服务器将根据它们的 listen
指令和 server_name
请求进行响应:
example.com
: 将响应请求example.com
和www.example.com
test.com
: 将响应请求test.com
和www.test.com
default
: 将响应 80 端口上与其他两个块不匹配的任何请求。
接下来,我们还需要调整一下 /etc/nginx/nginx.conf
文件中的配置:
sudo nano /etc/nginx/nginx.conf
在文件中,找到 server_names_hash_bucket_size
指令。删除#
符号以取消注释该行:
/etc/nginx/nginx.conf
http {
. . .
server_names_hash_bucket_size 64;
. . .
}
完成后保存并关闭文件。
接下来,测试以确保任何 Nginx 文件中都没有语法错误:
sudo nginx -t
如果没有发现问题,重新启动 Nginx 以启用更改:
sudo systemctl restart nginx
第 5 步 – 修改本地主机文件以进行测试(可选)
如果我们没有可使用的域名,只是在本地计算机进行配置测试,我们可以设置本地计算机在请求域名时访问的 IP 地址。这样本地可以访问这两个域名,但是其他用户则无法访问。
编辑 /etc/hosts 文件:
sudo nano /etc/hosts
假设服务器的公共 IP 地址是 203.0.113.5
,我们进行如下配置:
/etc/hosts
127.0.0.1 localhost
. . .
203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com
这样,我们在本地访问 example.com 和 test.com 域名时,就是访问本地计算机上的文件,而不是真的访问了这两个域名对应的网站。
第 6 步 — 测试您的结果
现在已全部设置完毕,我们通过浏览器访问对应的域名:
http://example.com
应该会看到如下所示的页面:
访问第二个域名,如下所示:
http://test.com
如果访问正常,说明我们的配置是没有问题的。不要忘记删除在第五步中对 hosts
进行的测试配置。
作者:牛奇网,本站文章均为辛苦原创,在此严正声明,本站内容严禁采集转载,面斥不雅请好自为之,本文网址:https://www.niuqi360.com/linux/how-to-set-up-nginx-virtual-hosts-on-ubuntu/