不同的nginx安装方式对应不同的配置文件目录,可以采用apt-get安装,也可以使用nginx的压缩包安装,我采用的前者,因为简单。具体方法,可以参考:https://blog.csdn.net/qq_41985134/article/details/117991218
虚拟主机原理:外界只有通过域名才能访问主机,一个主机只负责一个域名的请求会造成资源浪费,一个域名对应一个ip地址,那么能不能一个ip地址对应多个域名,nginx服务器端判断你访问哪个域名,指向不同的站点目录,把相应的资源拿出来给你就好了。
虚拟主机,就是把一台物理服务器划分成多个 “虚拟” 的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。Nginx 提供虚拟主机的功能,就是为了让我们不需要安装多个 Nginx,就可以运行多个域名不同的网站。
Nginx 下,一个 server 标签就是一个虚拟主机。nginx 的虚拟主机就是通过 nginx.conf 中 server 节点指定的,想要设置多个虚拟主机,配置多个server节点即可。
例如:www.meituan.com 切换城市,可以看到不同的城市地址不一样(二级域名)
比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台 Nginx 服务器,就可以使用虚拟主机技术,在一台 Nginx 服务器上,模拟多个虚拟服务器。
- 目录介绍:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
- 虚拟主机配置文件
从nginx.conf中可以看到:
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
刚安装的nginx在这两个目录中只有一个文件,default,位于/etc/nginx/sites-enabled/,看来,虚拟主机的配置文件在sites-enabled里面。
基于端口的虚拟主机配置
- 操作default
注释里很贴心的给我们样例了,仿照着修改一下:
server {
listen 82; # 监听82端口
listen [::]:82;
root /var/www/web/index; #意思是访问82端口的请求定位到该目录下
index index.html; # 这个页面文件提前放在/var/www/web/index中
server_name indexdemo;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 83;
listen [::]:83;
root /var/www/web/login;
index login.html;
server_name logindemo;
location / {
try_files $uri $uri/ =404;
}
}
修改完配置文件一定记得重新读取并解析才能生效:
nginx -s reload
访问:http://192.168.xxx.xxx:83/试一下
- 当然,用域名也可以访问:www.xxx.com:82
基于域名的虚拟主机配置
- 直接上代码了
# 为了验证基于域名的虚拟主机,那么肯定是访问多个域名,访问同一端口得到不同的反馈,
# 好像是有多台主机,但其实只有一台。
server {
listen 81;
listen [::]:81;
root /var/www/web/index;
index index.html;
server_name www.xxx.com;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 81;
listen [::]:81;
root /var/www/web/login;
index login.html;
server_name www.yyy.com;
location / {
try_files $uri $uri/ =404;
}
}
不同的域名访问同样的端口,得到不同的内容,目的达成。
servername匹配规则
- 上面讲的基于域名的虚拟主机是想不同的域名访问不同的资源,可以通过设置多个server来显示。那如果是不同的域名访问同样的资源呢?那就不用设置多个server了,太傻了,直接一个server写多个域名就好了。
- 那给一个域名,怎么匹配对应的server资源呢?遵循以下规则:
先精准,后头通配符,再尾通配符,最后正则
server {
listen 81;
listen [::]:81;
root /var/www/web/index;
index index.html;
server_name www.xxx.xyz www.xxx.store;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 81;
listen [::]:81;
root /var/www/web/login;
index login.html;
server_name *.xxx.store www.xxx.* vod.xxx.*;
location / {
try_files $uri $uri/ =404;
}
}
尝试www.xxx.xyz,因为是先精准匹配,所以去index.html
尝试vod.xxx.store,因为没有精准匹配的,所以匹配到前通配符*.xxx.store,去到login.html
尝试www.xxx.net,因为前两种情况不存在,所以尾通配符匹配,去到login.html。
vod.xxx.org同理。
可能会有疑问,vod.xxx.store怎么设置解析?答案是需要去买域名的网站的域名管理中去增加这条域名解析。那xxx.net?xxx.org呢?这些当然是域名了,需要单独买,但是咱们不买也可以实现,那就是在hosts文件里进行域名解析,模拟一下外网的操作。如下
192.168.xxx.xxx www.xxx.neg
192.168.xxx.xxx vod.xxx.org
简单来说,这两行的意思就是,将www.xxx.neg、vod.xxx.org的外网域名映射到192.168.xxx.xxx的内网,然后交给第二个server去解析。
操作系统规定,在进行DNS请求以前,先检查自己的Hosts文件中是否有这个域名和IP的映射关系。如果有,则直接访问这个IP地址指定的网络位置,如果没有,再向已知的DNS服务器提出域名解析请求。也就是说Hosts的IP解析优先级比DNS要高。(这里的例子就是咱们没钱买不到这两个域名,那么就不让dns解析了,直接hosts解析模拟,如果咱们有这个域名,经过dns解析之后得到的ip就是192.168.xxx.xxx但是咱没有域名,那就直接用hosts告诉主机,见到www.xxx.neg、vod.xxx.org,就直接访问192.168.xxx.xxx,这个ip就是它们的真实ip地址。虚拟机拿到请求就执行nginx的功能,分别给资源就好了)