Nginx配置
Nginx配置
后面学习Nginx配置,每次修改配置文件,一定要重载才能生效
systemctl reload nginx
简化版的nginx.conf
去掉注释掉的内容
worker_processes 1; # 启动的worker进程数 默认为1,表示开启一个业务进程
events {
worker_connections 1024; #每个worker进程的连接数
}
http {
include mime.types; #include是引入关键字,这里引入了mime.types这个配置文件(同在conf目录下,mime.types是用来定义,请求返回的content-type)
default_type application/octet-stream; #mime.types未定义的,使用默认格式application/octet-stream
sendfile on; # 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。 详情,见下文
keepalive_timeout 65; #长链接超时时间
#一个nginx可以启用多个server(虚拟服务器)
server {
listen 80;#监听端口80
server_name localhost; #接收的域名、主机名
location / {
root html; #根目录指向html目录
index index.html index.htm; #域名/index 指向 index.html index.htm文件
}
error_page 500 502 503 504 /50x.html; # 服务器错误码为500 502 503 504,转到"域名/50x.html"
location = /50x.html {# 指定到html文件夹下找/50x.htm
root html;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sendfile
打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送

Nginx 虚拟主机与域名解析
虚拟主机使用特殊的软硬件技术,把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每一台虚拟主机都具有独立的域名,具有完整的Internet服务器(WWW、FTP、Email等)功能,虚拟主机之间完全独立,并可由用户自行管理,在外界看来,每一台虚拟主机和一台独立的主机完全一样。
域名解析就是域名到IP地址的转换过程,IP地址是网路上标识站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址。域名的解析工作由DNS服务器完成。
域名、dns、ip地址的关系
域名是相对网站来说的,IP是相对网络来说的。当输入一个域名的时候,网页是如何做出反应的?
- 输入域名---->域名解析服务器(dns)解析成ip地址—>访问IP地址—>完成访问的内容—>返回信息。
Internet上的计算机IP是唯一的,一个IP地址对应一个计算机。
- 一台计算机上面可以有很多个服务,也就是一个ip地址对应了很多个域名,即一个计算机上有很多网站。
IP地址和DNS地址的区别
- IP地址是指单个主机的唯一IP地址,而DNS服务器地址是用于域名解析的地址。
- 一个是私网地址,一个是公网地址;
- 一个作为主机的逻辑标志,一个作为域名解析服务器的访问地址。
IP地址
IP,就是Internet Protocol的缩写,是一种通信协议,我们用的因特网基本是IP网组成的。
IP地址就是因特网上的某个设备的一个编号。
IP地址一般由网络号,主机号,掩码来组成。
DNS是什么?
- 我们访问因特网必须知道对端的IP地址,可是我们访问网站一般只知道域名啊,怎么办?这时候DNS就有用处了,电脑先查询自己的域名解析文件,没有则访问DNS服务器,查找域名对应的IP,于是,你的电脑就知道要发包到IP地址了。
http协议 HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
虚拟主机原理
虚拟主机是为了在同一台物理机器上运行多个不同的网站,提高资源利用率引入的技术。
一般的web服务器一个ip地址的80端口只能正确对应一个网站。web服务器在不使用多个ip地址和端口的情况下,如果需要支持多个相对独立的网站就需要一种机制来分辨同一个ip地址上的不同网站的请求,这就出现了主机头绑定的方法。简单的说就是,将不同的网站空间对应不同的域名,以连接请求中的域名字段来分发和应答正确的对应空间的文件执行结果。
举个例子来说,一台服务器ip地址为192.168.8.101,有两个域名和对应的空间在这台服务器上,使用的都是192.168.8.101的80端口来提供服务。如果只是简单的将两个域名A和B的域名记录解析到这个ip地址,那么web服务器在收到任何请求时反馈的都会是同一个网站的信息,这显然达不到要求。接下来我们使用主机头绑定域名A和B到他们对应的空间文件夹C和D。当含有域名A的web请求信息到达192.168.8.101时,web服务器将执行它对应的空间C中的首页文件,并返回给客户端,含有域名B的web请求信息同理,web服务器将执行它对应的空间D中的首页文件,并返回给客户端,所以在使用主机头绑定功能后就不能使用ip地址访问其上的任何网站了,因为请求信息中不存在域名信息,所以会出错。
ServerName匹配规则
我们可以在同一个servername中配置多个域名
完整匹配
server中可以配置多个域名,例如:
server_name test81.xzj520520.cn test82.xzj520520.cn;
通配符匹配
使用通配符的方式如下:
server_name *.xzj520520.cn;
需要注意的是精确匹配的优先级大于通配符匹配和正则匹配。
通配符结束匹配
使用通配符结束匹配的方式如下:
server_name www.xzj520520.*;
正则匹配
正则匹配格式,必须以~
开头,比如:server_name ~^www\d+\.example\.net$;
。如果开头没有~
,则nginx认为是精确匹配。在逻辑上,需要添加^
和$
锚定符号。注意,正则匹配格式中.
为正则元字符,如果需要匹配.
,则需要反斜线转义。如果正则匹配中含有{
和}
则需要双引号引用起来,避免nginx报错,如果没有加双引号,则nginx会报如下错误:directive "server_name" is not terminated by ";" in ...
。
特殊匹配格式
server_name ""; 匹配Host请求头不存在的情况。
匹配顺序
1. 精确的名字
2. 以*号开头的最长通配符名称,例如 *.example.org
3. 以*号结尾的最长通配符名称,例如 mail.*
4. 第一个匹配的正则表达式(在配置文件中出现的顺序)
2
3
4
优化
1. 尽量使用精确匹配;
2. 当定义大量server_name时或特别长的server_name时,需要在http级别调整server_names_hash_max_size和server_names_hash_bucket_size,否则nginx将无法启动。
2
Nginx配置使用场景
修改nginx配置文件后,记得重新加载nginx
systemctl reload nginx
不同二级域名,映射到不同静态网页
可以写多个server字段,从前向后匹配,先匹配到哪个就用哪个
用户访问pro.hedaodao.ltd
,就会走到第一个server配置;test.hedaodao.ltd
走到第二个配置
http {
#....其他属性
server {
listen 80;
server_name pro.hedaodao.ltd;
location / {
root html/pro;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name test.hedaodao.ltd;
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
不同域名,映射到同一静态页面
server_name
- 可以写多个,用空格分开
- 使用通配符(*)
- 使用正则表达式(https://blog.csdn.net/yangyelin/article/details/112976539)
http{
server {
listen 80;
server_name *.hedaodao.ltd ~^[0-9]+\.hedaodao\.ltd$; # "\."是转译"."
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
泛域名
所谓“泛域名解析”是指:利用通配符* (星号)来做次级域名以实现所有的次级域名均指向同一IP地址。
好处:
1.可以让域名支持无限的子域名(这也是泛域名解析最大的用途)。
2.防止用户错误输入导致的网站不能访问的问题
3.可以让直接输入网址登陆网站的用户输入简洁的网址即可访问网站
泛域名在实际使用中作用是非常广泛的,比如实现无限二级域名功能,提供免费的url转发,在IDC部门实现自动分配免费网址,在大型企业中实现网址分类管理等等,都发挥了巨大的作用。