Nginx 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