Nginx核心指令listen与server_name入门

域名


一般一个域名对应一个IP,而一个IP可以有多个域名。

域名是分级别的:一级域名(顶级域名)、二级域名、三级域名等,以英文的句点(.)进行分隔;一级域名可以包括多个二级域名,一个二级域名可以包括多个三级域名,以此类推。域名是需要在特定的组织进行注册或备案。

顶级域名就是一级域名,比如 .com、.net、.org、.com. cn、.cn,N级域名就是在N-1级域名前追加一级。

各种域名后缀都有不同含义。例如 .com 意为商业/公司(Commercial / companies / company ),.net 意为网络(network),.org 意为组织(organization)。

比如二级域名是在一级域名前加一级,二级域名示例:http://baidu.com     http://qq.com

注: 有些人会说 http://baidu.com 知乎 - 有问题,就会有答案 http://qq.com 是一级域名,虽然是错误的-但可以理解(说的人多了也就是对的了……),这是站在使用者/购买者角度看的,对于购买域名者来说 http://xxx.com http://xxx.com.cn就相当一级域名,但是从真正的域名分级看,它们俩分别是二级域名、三级域名。

多级域名


顶级域名、一级域名

  Top-level domains,first-level domains(TLDs),也翻译为国际顶级域名,也成一级域名。

  .com 供商业机构使用,但无限制最常用
  .net 原供网络服务供应商使用,现无限制
  .org 原供不属于其他通用顶级域类别的组织使用,现无限制
  .edu / .gov / .mil 供美国教育机构/美国政府机关/美国军事机构。因历史遗留问题一般只在美国专用
  .tel 供连接电话网络与因特网的服务使用
  .post 供邮政服务使用
  .mail 供邮件网站使用
  国家顶级域名:cn(中国大陆)、de(德国)、eu(欧盟)、jp(日本)、hk(中国香港)、tw(中国台湾)、uk(英国)、us(美国)

二级域名

  二级域(或称二级域名;英语:Second-level domain;英文缩写:SLD)是互联网DNS等级之中,处于顶级域名之下的域。二级域名是域名的倒数第二个部分,例如在域名example.baidu.com中,二级域名是baidu。

  .com 顶级域名/一级域名,更准确的说叫顶级域

  baidu.com 二级域名,更准确的说叫二级域

  tieba.baidu.com 三级域名,更准确的说叫三级域

  detail.tieba.baidu.com 四级域名,更准确的说叫四级域

  ......

子域名

子域名(或子域;英语:Subdomain)是在域名系统等级中,属于更高一层域的域。

比如,mail.example.com和calendar.example.com是example.com的两个子域,而example.com则是顶级域.com的子域。

凡顶级域名前加前缀的都是该顶级域名的子域名,而子域名根据技术的多少分为二级子域名,三级子域名以及多级子域名。

准确理解一级域名

通常我们把.com成为一级域名,但严格意义上这样讲不太准确,真正的一级域名是由一个合法的字符串+域名后缀组成,所以,guanghe.com这种形式的域名才是一级域名,guanghe是域名主体,.com是域名后缀,我们也可以把.com也称为顶级域。

一级域名又称为顶级域名,比如单独的gunaghe.com如果指向一个ip,这个域名就是一级域名。但需要注意的是,www.guanghe.com这种形式的域名并不是一级域名,它只是一个二级域名,也就是说www只是一个主机名。

巧妙使用二/多级域名

 一级域名需要备案,而二级域名不需要单独备案,只要它所处的一级域名已经备案,就能直接解析。比如guanghe.com已经备案,若还需使用www.guanghe.com、music.guanghe.com等二级域名,不需要单独备案但需要在域名申请的机构网站设置一下开启二级域名及绑定相应IP即可。

  域名有顶级域名和二级,三级之分,一般网站只用到顶级域名即可,有时候一个网站系统比较庞大,那么就可能使用多个域名,如果去申请多个域名肯定不划算,这个时候,使用已申请的一个域名的二级域名的处理方式就应运而生。比如百度买下了baidu.com这一顶级域名,将baidu.com绑定了一个地址,map.baicu.com、music.baicu.com也绑定到了各个地址,不用单独花钱,只是购买了baidu.com这一个顶级域名而已。

如上图所示,在百度云购买了一个云虚拟主机之后,会得到一个免费域名guanghebch.gz01.bdysite.com,这个域名就是一个多级域名,可无需备案直接使用,因为百度云已经买下了bdysite.com这个一级域名并进行了备案,旗下的子域名完全可以直接使用,这样就省去了开发者再去申请域名、备案的麻烦。当然,小编当时为了弄清域名申请备案整个流程,还是自己申请了一个一级域名guanghe.site,其实直接使用guanghebch.gz01.bdysite.com就完全可以满足开发要求了。

  那是不是说,申请一台云服务器就能得到一个免费域名(不管是几级的)?不是的,据了解,只有云虚拟主机赠免费域名,而云虚拟主机只支持php,如果项目做了前后端分离还好可以使用,否则,java项目不能使用云虚拟主机,即得不到免费域名,还得走域名申请、备案的流程。


 

Nginx虚拟主机


虚拟主机提供了在同一台服务器上运行多个网站的功能,启动的是一个nginx实例,部署多个虚拟主机来发布多个门户网站。虚拟主机标识是server,一个server对应一个虚拟主机。

HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。比如,提供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。 

即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以假想已具有多台服务器。

客户端使用 HTTP 协议访问服务器时,会经常采用类似 www.hackr.jp 这样的主机名和域名。

在互联网上,域名通过 DNS 服务映射到 IP 地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以 IP 地址形式访问了。

所以,如果一台服务器内托管了 www.tricorder.jp 和 www.hackr.jp 这两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名。

在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的URI。

 

 

虚拟主机的三种模式


(1)基于多域名方式配置虚拟主机

(2)基于多端口配置虚拟主机

(3)基于多ip配置虚拟主机

(1)基于多域名方式配置虚拟主机

基于多域名的虚拟主机是最常见的一种虚拟主机。只需配置你的DNS服务器,将每个主机名映射到正确的IP地址,然后配置Nginx服务器,令其识别不同的主机名就可以了。

网域名称系统(DNS,Domain Name System,将域名和IP地址相互映射的一个分布式数据库)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。

ps:如果没有特殊要求,最好还是使用基于多域名的虚拟主机。

hosts文件:在本机计算机上面,配置本地的ip地址和域名映射关系,通常用于测试。Windows 本地hosts文件,域名在本地的hosts里面做解析,不走公网。

C:\Windows\System32\drivers\etc\hosts

如果所有的虚拟主机都写在http下面会过于庞大很乱,每个server对应一个配置文件这样方便管理(有几个conf文件就有几个server,同理就有几个网站)。通过include函数进行serevr配置文件的引用(在http块内将所有的server删除,使用include进行引用,这样非常简洁明了),这条语句写在http指令块当中。

include /usr/local/nginx/conf/vhost/*.conf; 

[root@www ~]# mkdir -p /usr/local/nginx/conf/vhost  --vhost下面都是每台虚拟主机的配置

创建三台虚拟主机

[root@www ~]# vim /usr/local/nginx/conf/vhost/www.test.com.conf --配置第一台虚拟主机以.conf结尾
    server {
        listen       80;
        server_name  www.test.com;
        charset utf-8;
        root /data/www/test;    
        index  index.html index.htm;
     }

[root@www ~]# vim /usr/local/nginx/conf/vhost/www.test1.com.conf  --配置第二台虚拟主机
    server {
        listen       80;
        server_name  www.test1.com;
        charset utf-8;
        root /data/www/test1;    
        index  index.html index.htm;
     }

[root@www ~]# vim /usr/local/nginx/conf/vhost/www.tes2.com.conf  --配置第三台虚拟主机
    server {
        listen       80;
        server_name  www.test2.com;
        charset utf-8;
        root /data/www/test2;    
        index  index.html index.htm;
     }

创建每个server的发布目录,这些站点的路径是不存在的,需要手动创建(mkdir -p /data/www/test1 test2 test3)

[root@www ~]# echo "this is test" > /data/www/test/index.html
[root@www ~]# echo "this is test1" > /data/www/test1/index.html
[root@www ~]# echo "this is test2" > /data/www/test2/index.html

配置本地hosts文件用于域名解析(C:\Windows\System32\drivers\etc)

192.168.179.99  www.test.com    www.test1.com   www.test2.com

(2)基于多端口配置虚拟主机(可以使用同一个ip,通过访问不同的端口来访问)

[root@www ~]# vim /usr/local/nginx/conf/vhost/www.test1.com.conf  --修改之前的配置文件,绑定8080端口
   server {
        listen       8080;
        server_name  www.test1.com;
        charset utf-8;
        root /data/www/test1;
        index  index.html index.htm;

     }
[root@www ~]# netstat -tpln | grep 80  --可以看到虚拟主机test1用的是8080端口,虚拟主机test用的是80端口
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      55384/nginx: master 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      55384/nginx: master 

(3)基于多IP的虚拟主机(通过添加多个网卡或者在一块物理网卡上绑定多个IP地址来实现)

[root@www ~]# ip a
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link/ether 00:0c:29:b4:88:32 brd ff:ff:ff:ff:ff:ff
     inet 192.168.179.99/24 brd 192.168.179.255 scope global ens33
     valid_lft forever preferred_lft forever
     inet 192.168.179.150/24 brd 192.168.179.255 scope global secondary ens33:1
     valid_lft forever preferred_lft forever

[root@www ~]# vim /usr/local/nginx/conf/vhost/www.test.com.conf 
    server {
        listen    192.168.179.99:80;
        server_name  www.test.com;
        charset utf-8;
        root /data/www/test;
        index  index.html index.htm;
     }

[root@www ~]# vim /usr/local/nginx/conf/vhost/www.test1.com.conf 
    server {
        listen 192.168.179.150:80;    --绑定IP,因为含有多个IP,所以要监听不同IP的80端口
        server_name  www.test1.com;
        charset utf-8;
        root /data/www/test1;
        index  index.html index.htm;
     }

在/etc/hosts配置

192.168.179.99  www.test.com   
192.168.179.150  www.test1.com
[root@www ~]# netstat -tpln 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 192.168.179.150:80      0.0.0.0:*               LISTEN      2510/nginx: master  
tcp        0      0 192.168.179.99:80       0.0.0.0:*               LISTEN      2510/nginx: master

[root@www ~]# echo "this is 192.168.179.150:80" > /data/www/test1/index.html

[root@www ~]# curl www.test1.com
this is 192.168.179.150:80
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐