虚拟主机

web服务发布需要满足三个先觉条件即,IP、PORT、域名;

一个web服务器默认只能发布一个web;

为了节省资源成本,发布多个web就需要虚拟主机,所以,虚拟主机就是把一台服务器划分为多个"虚拟"的服务器,每一个虚拟主机都可以由独立的域名和独立的目录。

在nginx中一个server就是一个web。

基于IP的虚拟主机

基于IP在一台主机上发布多个web需要满足的条件就是该主机拥有两个及两个以上的IP

测试时不满足多网卡,所以创建一个虚拟网卡,配置如下

[root@localhost ~]# ifconfig eth0:1 10.16.0.100/24 up
    server {
        listen       10.16.0.9:81;
        #server_name  localhost;
        charset utf-8;
        #access_log  logs/host.access.log  main;
        location / {
            root   html/a;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       10.16.0.100:81;
        #server_name  localhost;
        charset utf-8;
        #access_log  logs/host.access.log  main;
        location / {
            root   html/b;
            index  index.html index.htm;
            }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
    }

基于端口

顾名思义基于端口表示端口不能重复

    server {
        listen       81;
        #server_name  localhost;
        charset utf-8;
        location / {
            root   html/a;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    } 
    server {
        listen       82;
        #server_name  localhost;
        charset utf-8;
        location / {
            root   html/b;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

基于域名

域名这里涉及到DNS解析,域名需要能够被解析到才可以访问,所以需要将域名添加到/etc/hosts

[root@localhost conf]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
10.16.0.9   www.a.com
10.16.0.9   www.b.com

nginx配置如下:

    server {
        listen       81;
        server_name  www.a.com;
        charset utf-8;
        location / {
            root   html/a;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       81;
        server_name  www.b.com;
        charset utf-8;
        location / {
            root   html/b;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

访问测试:

[root@localhost conf]# curl http://www.a.com:81
this is web a
[root@localhost conf]# curl http://www.b.com:81
this is web b

三种方式缺点:

基于IP:需要多个IP,如果是公网IP,每个IP都需要付费

基于端口:端口无法告诉公网用户,无法使用于公网用户,适用于内网

基于域名:这种方式解决了前两种方式的缺点