Nginx虚拟主机
写在前面
在了解了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 | # /usr/local/nginx/conf/vhost/envythink.com.conf |
可以看到两者除了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 | mkdir -p /usr/share/nginx/html/envythink |
然后在/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 | [root@envythink think]# nginx -t |
(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 | # /usr/local/nginx/conf/vhost/envythink.com.conf |
可以看到这里使用了两个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 | [root@envythink think]# nginx -t |
注意由于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 | server { |
第二步,新建/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 | [root@envythink think]# nginx -t |
第四步,打开本地宿主机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 | [root@envythink vhost]# lsof -i:80 |
这就表明我们给虚拟机设置的别名就生效了。