admin管理员组

文章数量:1631674

Nginx的基本配置文件和虚拟主机与域名解析和ServerName匹配规则

  • Nginx的基本配置文件
  • Nginx 虚拟主机与域名解析
    • 域名、DNS、IP地址的关系
        • Ip地址和DNS地址的区别
        • IP地址
        • DNS是什么?
        • http协议
    • 虚拟主机原理
    • 域名解析
      • 1. 域名实战配置不同的域名映射不同的页面
      • 2. 修改本地windows下面的host文件
      • 3. 测试
    • 监听多端口
    • 泛域名
  • ServerName匹配规则
      • 完整匹配
      • 通配符匹配
      • 通配符结束匹配
      • 正则匹配
      • 特殊匹配格式
      • 匹配顺序
      • 优化

Nginx的基本配置文件

Nginx的默认配置文件是nginx.conf

查看对应的nginx.conf 文件

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

去掉注释的简单版如下:

# 默认为1,表示开启一个业务进程
worker_processes  1;

# 单个业务进程可接受连接数
events {
    worker_connections  1024;
}

http {
	#文件扩展名与文件类型映射表(是conf目录下的一个文件)
    include       mime.types;
    
    #默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
    default_type  application/octet-stream;
    
    #sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
    sendfile        on;
    
	#长连接超时时间,单位是秒
    keepalive_timeout  65;
    
	#虚拟主机的配置
    server {
    #监听端口
        listen       80;
        
        #域名,可以有多个,用空格隔开
        server_name  localhost;
        
	  #配置根目录以及默认页面
        location / {
            root   html;
            index  index.html index.htm;
        }
        
		#出错页面配置
        error_page   500 502 503 504  /50x.html;
        
         #/50x.html文件所在位置
        location = /50x.html {
            root   html;
        }
    }
}

Nginx 虚拟主机与域名解析

虚拟主机使用特殊的软硬件技术,把一台运行在因特网上的服务器主机分成一台台虚拟的主机,每一台虚拟主机都具有独立的域名,具有完整的Internet服务器(WWW、FTP、Email等)功能,虚拟主机之间完全独立,并可由用户自行管理,在外界看来,每一台虚拟主机和一台独立的主机完全一样。

域名、DNS、IP地址的关系

输入域名 —> 域名解析服务器(DNS) ----> 解析成IP地址 ----> 通过IP地址完成访问内容 ----> 返回信息

Internetl上的计算器IP是唯一的,一个IP地址对应一个计算机。一台计算机上面可以有很多服务,也就是一个ip地址对应了很多个域名,即一个计算机上有很多网站。

Ip地址和DNS地址的区别
  • IP地址是指单个主机的唯一IP地址,而DNS服务器地址是用于域名解析的地址。
  • 一个是私网地址 , 一个是公网地址;
  • 一个作为主机的逻辑标志,一个作为域名解析服务器的访问地址。
IP地址

IP,就是Internet Protocol的缩写,是一种通信协议,我们用的因特网基本是IP网组成的。

DNS是什么?

我们访问因特网必须知道对端的IP地址,可是我们访问网站一般只知道域名啊,怎么办?
这时候DNS就有用处了,电脑先访问DNS服务器,查找域名对应的IP,于是,你的电脑就知道要发包到IP地址了。

http协议

HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。

客户端与服务器的数据交互的流程:

  1. 首先客户端与服务器需要建立TCP连接。只要单击某个超级链接。HTTP的工作开始
  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
  3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容,例如返回一个HTML的文本。
  4. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

虚拟主机原理

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务

域名解析

通过配置Nginx.conf文件来配置我们域名解析。默认的配置文件默认执行的地址是html目录下的index.html页面

1. 域名实战配置不同的域名映射不同的页面

修改配置文件 (修改配置文件之前最好先备份

worker_processes  1; #允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个

events {
    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
    worker_connections  1024;
}


http {
    #文件扩展名与文件类型映射表(是conf目录下的一个文件)
    include       mime.types;
    #默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
    default_type  application/octet-stream;

    #sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
    sendfile        on;
    
     #长连接超时时间,单位是秒
    keepalive_timeout  65;

 #虚拟主机的配置
    server {
    #监听端口
        listen       80;
        #域名,可以有多个,用空格隔开
        server_name  master.lixiang;

	#配置根目录以及默认页面
        location / {
            root   /www/master;
            index  index.html index.htm;
        }

	#出错页面配置
        error_page   500 502 503 504  /50x.html;
        #/50x.html文件所在位置
        location = /50x.html {
            root   html;
        }
    }
    
    
    #虚拟主机的配置
    server {
    #监听端口
        listen       80;
        #域名,可以有多个,用空格隔开
        server_name   dev.lixiang;

	#配置根目录以及默认页面
        location / {
            root   /www/dev;
            index  index.html index.htm;
        }

	#出错页面配置
        error_page   500 502 503 504  /50x.html;
        #/50x.html文件所在位置
        location = /50x.html {
            root   html;
        }
      }
    }

映射根目录下面的www目录下面对应的文件

2. 修改本地windows下面的host文件

路径在: C:\Windows\System32\drivers\etc


在配置文件下面添加一行映射地址(配置单机域名)

使用systemctl reload nginx.service重新加载配置

3. 测试

访问:http://master.lixiang/

访问:http://master.lixiang/

访问:http://lixiang/

匹配不上默认为第一个

监听多端口

操作跟域名解析一样 只要修改server --> listen 端口即可 (注意:server_name和listen同时想等会报错

泛域名

所谓“泛域名解析”是指:利用通配符* (星号)来做次级域名以实现所有的次级域名均指向同一IP地址。

好处:

1.可以让域名支持无限的子域名(这也是泛域名解析最大的用途)。

2.防止用户错误输入导致的网站不能访问的问题

3.可以让直接输入网址登陆网站的用户输入简洁的网址即可访问网站

泛域名在实际使用中作用是非常广泛的,比如实现无限二级域名功能,提供免费的url转发,在IDC部门实现自动分配免费网址,在大型企业中实现网址分类管理等等,都发挥了巨大的作用。

我在阿里云购买的域名配置如下:

ServerName匹配规则

我们可以在同一个servername中配置多个域名 (注意:需要注意的是精确匹配的优先级大于通配符匹配和正则匹配。)

完整匹配

server_name master.ride4you.top  dev.ride4you.top;

通配符匹配

server_name *.ride4you.top ;

通配符结束匹配

使用通配符结束匹配的方式如下:

server_name *.ride4you.*;

正则匹配

正则匹配格式,必须以~开头,比如:server_name ~^www\d+.example ; 。如果开头没有 ,则 n g i n x 认为是精确匹配。在逻辑上,需要添 加 和 ;。如果开头没有~,则nginx认为是精确匹配。在逻辑上,需要添加^和 ;。如果开头没有 ,则nginx认为是精确匹配。在逻辑上,需要添锚定符号。注意,正则匹配格式中.为正则元字符,如果需要匹配.,则需要反斜线转义。如果正则匹配中含有{和}则需要双引号引用起来,避免nginx报错,如果没有加双引号,则nginx会报如下错误:directive “server_name” is not terminated by “;” in …。

特殊匹配格式

server_name ""; 匹配Host请求头不存在的情况。

匹配顺序

1. 精确的名字
2. 以*号开头的最长通配符名称,例如 *.example
3. 以*号结尾的最长通配符名称,例如 mail.*
4. 第一个匹配的正则表达式(在配置文件中出现的顺序)

优化

1. 尽量使用精确匹配;
2. 当定义大量server_name时或特别长的server_name时,需要在http级别调整server_names_hash_max_size和server_names_hash_bucket_size,否则nginx将无法启动。

附录:
为区分大小写的匹配
~* 不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)

!~ 区分大小写不匹配

!~* 不区分大小写不匹配

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

*重复零次或更多次前面一个字符

+重复一次或更多次前面一个字符

? 重复零次或一次前面一个字符

{n} 重复n次前面一个字符{n,} 重复n次或更多次

{n,m} 重复n到m次

*? 重复任意次,但尽可能少重复

+? 重复1次或更多次,但尽可能少重复

?? 重复0次或1次,但尽可能少重复{n,m}? 重复n到m次,但尽可能少重复{n,}? 重复n次以上,但尽可能少重复

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了x以外的任意字符

[^abc] 匹配除了abc这几个字母以外的任意字符

(exp) 匹配exp,并捕获文本到0…9

(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name’exp)(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

(?=exp) 零宽断言,匹配exp前面的位置

(?<=exp) 匹配exp后面的位置

(?!exp) 匹配后面跟的不是exp的位置

(?<!exp) 匹配前面不是exp的位置

(?#comment) 注释,这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

参考文章:https://hashnode.blog.csdn/article/details/124518509

本文标签: 配置文件虚拟主机域名解析规则Nginx