admin管理员组文章数量:1631688
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。
客户端与服务器的数据交互的流程:
- 首先客户端与服务器需要建立TCP连接。只要单击某个超级链接。HTTP的工作开始
- 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
- 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容,例如返回一个HTML的文本。
- 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由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的基本配置文件和虚拟主机与域名解析和ServerName匹配规则 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729099481a1186493.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论