写在前面

在了解了Nginx相关的基础知识后,接下来将正式进入Nginx的实战内容。首先来学习Nginx的虚拟主机,这是后续学习其他知识的基础。

虚拟主机

概念

虚拟主机,在Web服务中可以理解为是一个独立的网站站点,这个站点具有“独立的域名”(所谓的独立域名可以是真的不同域名和IP地址,也可以是同一域名的不同端口),独立的程序和资源目录,可以独立的向外提供服务。

类型

既然前面说了“独立的域名”的不同含义,因此这里的类型就是对实际“独立的域名”的解释和分类:
(1)基于域名的虚拟主机:采用不同的域名来区分不同的虚拟主机或者对外提供服务;
(2)基于端口的虚拟主机:采用相同的域名,但是以不同的端口来区分不同的虚拟主机或者对外提供服务;
(3)基于IP的虚拟主机:采用不同的IP地址来区分不同的虚拟主机或者对外提供服务,这种方式在生产中使用的较少;

以上三种类型可以单独使用,也可以混合使用,具体如何使用需要结合具体场景来选择。

虚拟主机配置实例

为了更好的学习和使用Nginx虚拟主机,这里分别对前面介绍的基于域名的虚拟主机基于端口的虚拟主机基于IP的虚拟主机这三种方式进行实战练习。

基于域名的虚拟主机

默认情况下,开发者启动Nginx访问本机的IP地址(此处本机是安装Nginx的所在虚拟机,其IP地址为192.168.73.100)就可以看到默认的启动首页:

通过前面的学习,我们知道Nginx的主配置是nginx.conf,但是可能会出现本地一个nginx启动多个服务的情况,因此最好的办法是在nginx.conf中导入不同服务的配置,而不是全部在主配置文件中设置。具体的操作如下:

(1)在/usr/local/nginx/conf目录(即nginx.conf所在目录)下新建一个vhost目录,然后在vhost目录中新建一个名为envythink.com.conf的配置文件,注意该配置文件必须以.conf结尾。既然这里是基于域名的Nginx虚拟主机,那么就可以通过在nginx.conf主配置文件中添加多个server区块来实现,这个envythink.com.conf文件中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# /usr/local/nginx/conf/vhost/envythink.com.conf

server {
listen 8080;
server_name think.com;

location / {
root /usr/share/nginx/html/think;
index index.html index.htm index.php;
}
}

server {
listen 8080;
server_name envy.com;
client_max_body_size 1024M;

location / {
root /usr/share/nginx/html/envythink;
index index.html index.htm index.php;
}
}

可以看到两者除了server_name和站点根目录不同以外,其余内容都是相同的。
(2)回到/usr/local/nginx/conf目录下,打开nginx.conf文件,在里面导入前面新建的名为envythink.com.conf配置文件:

1
include vhost/envythink.com.conf;

注意该代码放置的位置如下所示:

include语法格式为include file|mask,这条语句可以放在nginx配置文件中的任何位置。

(3)由于我们在envythink.com.conf配置文件中分别设置了根目录为 /usr/share/nginx/html/envythink/usr/share/nginx/html/think,因此接下来需要使用mkdir -p 目录命令来递归创建该目录:

1
2
mkdir -p /usr/share/nginx/html/envythink
mkdir -p /usr/share/nginx/html/think

然后在/usr/share/nginx/html/envythink目录中新建一个index.html文件,其中的代码为:

1
<p style="color:blank">welcome to envythink.com</p>

/usr/share/nginx/html/think目录中新建一个index.html文件,其中的代码为:

1
<p style="color:red">welcome to think.com</p>

(4)使用nginx -t命令来对Nginx配置文件语法进行检测,如果出现ok的字样则说明没有语法错误:

1
2
3
[root@envythink think]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

(5)打开本地宿主机Windows系统内C:\Windows\System32\drivers\etc的文件,并在里面新增如下DNS映射:

1
192.168.73.100  envythink.com  think.com

它的目的是当开发者访问envythink.com/think.com的时候其实访问的是IP为192.168.73.100(也就是虚拟机IP)提供的服务。

(6)使用nginx -s reload命令来重启Nginx服务,然后在浏览器中访问http://think.com:8080/可以看到结果如下所示:

访问http://envythink.com:8080/可以看到结果如下所示:

基于端口的虚拟主机

其实细心的你,可能已经发现我们没有使用nginx.conf主配置文件中的80端口,而是使用了8080端口,这就已经使用了基于端口的虚拟主机,但是由于域名不是原来的,可能看起来不是那么明显。

(1)修改/usr/local/nginx/conf/vhost/envythink.com.conf配置文件中代码为如下所示内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# /usr/local/nginx/conf/vhost/envythink.com.conf

server {
listen 8080;
server_name think.com;

location / {
root /usr/share/nginx/html/think;
index index.html index.htm index.php;
}
}

server {
listen 8081;
server_name think.com;

location / {
root /usr/share/nginx/html/think;
index index_81.html;
}
}

server {
listen 8080;
server_name envy.com;
client_max_body_size 1024M;

location / {
root /usr/share/nginx/html/envythink;
index index.html index.htm index.php;
}
}

可以看到这里使用了两个server_name为think.com的server,同时两个网站的根目录也是一样的,不同在于首页使用的一个是index.html,另一个是index_81.html文件。

(2)修改/usr/share/nginx/html/think/index.html中为代码为:

1
<p style="color:red">welcome to think.com,the page is used 8080 port</p>

新建/usr/share/nginx/html/think/index_81.html文件,其中为代码为:

1
<p style="color:red">welcome to think.com,the page is used 8081 port</p>

(3)使用nginx -t命令来对Nginx配置文件语法进行检测,如果出现ok的字样则说明没有语法错误:

1
2
3
4
5
[root@envythink think]# nginx -t
nginx: [warn] conflicting server name "think.com" on 0.0.0.0:8080, ignored
nginx: [warn] conflicting server name "envy.com" on 0.0.0.0:8080, ignored
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

注意由于Nginx默认采用的是基于端口的虚拟主机方式,因此当出现同一端口多次使用的时候,就会出现上面的警告,但是这是正常现象。

(4)使用nginx -s reload命令来重启Nginx服务,然后在浏览器中访问http://think.com:8080/可以看到结果如下所示:

在浏览器中访问http://think.com:8081/可以看到结果如下所示:

虚拟主机配置总结

接下来将对配置Nginx虚拟主机的步骤进行总结,如下所示:
(1)增加一个完整的server标签段至结尾处;
(2)选择基于域名或者端口的虚拟配置方式;
(3)修改server_name及其网站对应的root目录;
(4)创建server_name域名对应的网页根目录,并创建index.html文件;
(5)检查Nginx配置文件是否存在语法错误,然后平滑重启Nginx,接着检查启动结果;
(6)通过修改本地hosts文件来修改DNS域名解析;
(7)访问网站,测试配置结果是否生效。

虚拟主机的别名配置

所谓的虚拟主机别名,其实就是给虚拟主机设置除了主域名之外的名字,这些之外的名字就是别名,这样做的好处就是用户访问不同的域名可以跳转到同一个域名上,进而访问同一个网站。

第一步,使用sed -n "41,57p" envy.com.conf > hello.com.conf命令来将之前envy.com.conf文件内的server拷贝到hello.com.conf文件中,然后修改其中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name hello.com www.hello.com; #多个域名之间需要使用空格隔开
client_max_body_size 1024M;
charset utf8;
# 开启目录索引,提供下载
autoindex on;
# 以人性化方式显示大小
autoindex_exact_size off;
# 与本地时间保持一致
autoindex_localtime on;

location / {
root /usr/share/nginx/html/hello;
index index.html index.htm index.php;
}
}

第二步,新建/usr/share/nginx/html/hello/index.html文件,其中的代码为:

1
<p style="color:blue">welcome,the page is used 80 port</p>

第三步,使用nginx -t命令来对Nginx配置文件语法进行检测,如果出现ok的字样则说明没有语法错误:

1
2
3
[root@envythink think]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

第四步,打开本地宿主机Windows系统内C:\Windows\System32\drivers\etc的文件,并在里面新增如下DNS映射:

1
192.168.73.100 hello.com www.hello.com

第五步,使用nginx -s reload命令来重启Nginx服务,然后在浏览器中访问http://hello.com/可以看到结果如下所示:

当在浏览器中访问http://www.hello.com/链接时,可以看到页面跳到了http://hello.com/页面。同时使用lsof -i:80命令查看一下当前系统80端口的占用情况:

1
2
3
4
[root@envythink vhost]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 10531 root 6u IPv4 240489 0t0 TCP *:http (LISTEN)
nginx 12173 nginx 6u IPv4 240489 0t0 TCP *:http (LISTEN)

这就表明我们给虚拟机设置的别名就生效了。