第九章 Nginx的虚拟主机实战

9.1 什么是虚拟主机

说起虚拟主机,想必对于程序猿来说,这个东西并不陌生。阿里云,腾讯云,百度云等云服务器厂商都提供虚拟主机服务,使得普通人可以以很低的价格拥有自己的主机,我们可以搭建自己的网站,博客等。
那么究竟是什么是虚拟主机呢?不知道大家是不是真正的理解这个概念。
我们看一下维基百科对虚拟主机的解释:

虚拟主机(英语:virtual hosting)或称 共享主机shared web hosting),又称虚拟服务器,是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。虚拟主机之间完全独立,并可由用户自行管理,虚拟并非指不存在,而是指空间是由实体的服务器延伸而来,其硬件系统可以是基于服务器群,或者单个服务器。

其实简单的来说,虚拟主机就是多个网站使用同一个物理服务器,每一个服务器都可以单独的向外界提供服务,互不影响。虚拟主机之间完全独立,在外界看来,每一台虚拟主机都和一台独立的主机表现的完全一致。
虚拟主机的出现,对互联网来说是一个非常重要的贡献,由于可以让多个虚拟主机共享一台物理主机的所有资源,所以让每个用户承担的成本也大大的降低了。

Nginx作为一个广泛应用的Web服务器,支持三种形式的虚拟主机配置:

  • 基于端口号的主机配置
  • 基于ip的主机配置
  • 基于域名的主机配置

我们逐个介绍这几种配置方式。

9.2 基于端口号的主机配置

所谓基于端口的主机配置就是多个虚拟主机的ip地址相同,但是他们的端口不同,我们可以通过端口号来访问不同的虚拟主机。
我们以8081, 8082,8083三个端口为例来了解这种配置。

1、为每一个端口号创建目录

1./usr/local/nginx/html/目录下面创建port子目录
2.port下面创建8081,8082,8083三个子目录、
3. 每个子目录分别创建各个端口的index文件

  1. [root@nginx-07 html]# cd /usr/local/nginx/html/
  2. [root@nginx-07 html]# mkdir -p port
  3. [root@nginx-07 html]# cd port/
  4. [root@nginx-07 port]# mkdir -p 8081 8082 8083
  5. [root@nginx-07 port]# tree /usr/local/nginx/html/port/
  6. /usr/local/nginx/html/port/
  7. ├── 8081
  8. ├── 8082
  9. └── 8083
  10. 3 directories, 0 files
  11. [root@nginx-07 port]# echo "8081 port" > 8081/index.html
  12. [root@nginx-07 port]# echo "8082 port" > 8082/index.html
  13. [root@nginx-07 port]# echo "8083 port" > 8083/index.html
  14. [root@nginx-07 port]# tree /usr/local/nginx/html/port/
  15. /usr/local/nginx/html/port/
  16. ├── 8081
  17. └── index.html
  18. ├── 8082
  19. └── index.html
  20. └── 8083
  21. └── index.html
  22. 3 directories, 3 files

2、修改配置文件

修改/usr/local/nginx/conf目录下面的nginx.conf文件,如下:

  1. server {
  2. listen 8081;
  3. server_name localhost;
  4. location / {
  5. root html/port/8081/;
  6. index index.html index.htm;
  7. }
  8. error_page 500 502 503 504 /50x.html;
  9. location = /50x.html {
  10. root html;
  11. }
  12. }
  13. server {
  14. listen 8082;
  15. server_name localhost;
  16. location / {
  17. root html/port/8082/;
  18. index index.htm index.html;
  19. }
  20. error_page 500 502 503 504 /50x.html;
  21. location = /50x.html {
  22. root html;
  23. }
  24. }
  25. server {
  26. listen 8083;
  27. server_name localhost;
  28. location / {
  29. root html/port/8083/;
  30. index inde.htm index.html;
  31. }
  32. error_page 500 502 503 504 /50x.html;
  33. location = /50x.html {
  34. root html;
  35. }
  36. }

3、启动nginx并进行请求

我们启动nginx之后,查看系统的端口情况如下: 可以看到,三个端口都已经被监听了。

  1. [root@nginx-07 sbin]# ss -lntp|grep nginx
  2. LISTEN 0 128 *:8081 *:* users:(("nginx",pid=29853,fd=10),("nginx",pid=20542,fd=10))
  3. LISTEN 0 128 *:8082 *:* users:(("nginx",pid=29853,fd=11),("nginx",pid=20542,fd=11))
  4. LISTEN 0 128 *:8083 *:* users:(("nginx",pid=29853,fd=12),("nginx",pid=20542,fd=12))

4、测试端口

我们可以通过curl命令测试各个端口,如下:

  1. [root@nginx-07 sbin]# curl http://localhost:8081/index.html
  2. 8081 port
  3. [root@nginx-07 sbin]# curl http://localhost:8082/index.html
  4. 8082 port
  5. [root@nginx-07 sbin]# curl http://localhost:8083/index.html
  6. 8083 port

9.3 基于IP的虚拟主机

所谓基于IP的虚拟主机就是将虚拟主机绑定到不同的IP地址。我们可以通过不同的IP地址访问不同的虚拟主机。但是这种模式企业里面用的比较少,所以我们只需要了解一下即可。

1、配置IP

一般情况下,我们自己的电脑都只会有最多两个网卡,这个时候我们可以使用ifconfig命令来增加几个虚拟网卡来完成本次实验。如下:
第九章 Nginx的虚拟主机实战 - 图1

2、为每个IP设置目录

第九章 Nginx的虚拟主机实战 - 图2

3、修改配置文件

针对每一个IP,设置配置文件:
第九章 Nginx的虚拟主机实战 - 图3

4、测试各个IP

启动Nginx,并使用不同的IP进行访问,得到的结果如下:
第九章 Nginx的虚拟主机实战 - 图4

9.4 基于域名的虚拟主机

所谓基于域名的虚拟主机是非常广泛的一种使用方式,绝大多数公司都是使用该种方式配置的虚拟主机。

1、配置域名

/etc/hosts文件中配置三个域名,分别如下:

  1. [root@nginx-07 sbin]# cat /etc/hosts
  2. 127.0.0.1 www.hr.com
  3. 127.0.0.1 www.platmis.com
  4. 127.0.0.1 www.napi.com

2、为域名创建目录

我们为每个域名创建一个单独的目录,创建index文件,如下:

  1. [root@nginx-07 html]# mkdir -p domain
  2. [root@nginx-07 html]# cd domain
  3. [root@nginx-07 domain]# mkdir -p hr platmis napi
  4. [root@nginx-07 domain]# echo "hello www.hr.com" > hr/index.html
  5. [root@nginx-07 domain]# echo "hello www.platmis.com" > platmis/index.html
  6. [root@nginx-07 domain]# echo "hello www.napi.com" > napi/index.html
  7. [root@nginx-07 domain]# tree
  8. .
  9. ├── hr
  10. └── index.html
  11. ├── napi
  12. └── index.html
  13. └── platmis
  14. └── index.html
  15. 3 directories, 3 files

3、修改配置文件

对上面三个虚拟主机进行配置,如下:

  1. user nobody;
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile on;
  10. keepalive_timeout 65;
  11. server {
  12. listen 80;
  13. server_name www.hr.com;
  14. location / {
  15. root html/domain/hr/;
  16. index index.html index.htm;
  17. }
  18. error_page 500 502 503 504 /50x.html;
  19. location = /50x.html {
  20. root html;
  21. }
  22. }
  23. server {
  24. listen 80;
  25. server_name www.platmis.com;
  26. location / {
  27. root html/domain/platmis/;
  28. index index.htm index.html;
  29. }
  30. error_page 500 502 503 504 /50x.html;
  31. location = /50x.html {
  32. root html;
  33. }
  34. }
  35. server {
  36. listen 80;
  37. server_name www.napi.com;
  38. location / {
  39. root html/domain/napi/;
  40. index inde.htm index.html;
  41. }
  42. error_page 500 502 503 504 /50x.html;
  43. location = /50x.html {
  44. root html;
  45. }
  46. }
  47. }

我们对三个域名都监听了相同的IP地址和端口号。

4、测试域名

重启nginx之后,查看80端口,如下:

  1. [root@nginx-07 conf]# ss -lntp|grep nginx
  2. LISTEN 0 128 *:80 *:* users:(("nginx",pid=31139,fd=7),("nginx",pid=20542,fd=7))

可以看到,nginx监听了80端口,我们分别测试三个域名:

  1. [root@nginx-07 conf]# curl http://www.hr.com/index.html
  2. hello www.hr.com
  3. [root@nginx-07 conf]# curl http://www.platmis.com/index.html
  4. hello www.platmis.com
  5. [root@nginx-07 conf]# curl http://www.napi.com/index.html
  6. hello www.napi.com

从结果中可以看到,虽然三个域名监听了相同的IP地址和端口号,但是通过域名进行访问的时候,nginx可以完美的区分不同的域名。

在本文中,我们介绍了Nginx支持的三种虚拟主机形式,根据我个人的经验来看,几乎所有的公司使用的都是最后一种,也就是基于域名的主机配置方式,这些东西并不难,大家注重理解就可以了。