Nginx基础配置详解(main、events、http、server、location)
1.概览
nginx为我们提供了一个配置文件nginx.conf
,其存放于/usr/local/nginx
,我们来看看。这里是已经去除#注释部分的内容,同时加上了每个指令代表的含义。
# worker进程的数量,设置为auto,将获取CPU的核心数
worker_processes 1;
events {
# 设置每个工作进程同时连接的最大数量
worker_connections 1024;
}
# 提供配置文件上下文,设置http服务器
http {
# 设置包含的mime类型
include mime.types;
# 定义响应的默认mime类型
default_type application/octet-stream;
# 高效文件传输模式
sendfile on;
# 长连接超时时间,在此期间客户端连接将保持打开状态,如果连接一直活跃,超时时间将自动刷新。如果设置为0,即禁用长连接
keepalive_timeout 65;
# 虚拟服务器配置
server {
# 配置监听端口,多个server可以监听同一个端口,只要server_name + listen的组合值唯一即可。
listen 80;
# 配置服务器名称,如果请求时没有匹配的服务器名称,将使用默认的服务器名称
server_name localhost;
location / {
# html为相对路径,相对于当前配置文件所在的目录
root html;
index index.html index.htm;
}
# 配置错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
可以看到,nginx.conf
配置文件由3部分组成:
- main块
- events块
- http块。http块中可以配置多个server块,每个server块中可以配置多个location块。
接下来我们来分别看看这三大块可以进行哪些配置。由于可配置项的数量很多,我们仅列举出常用的配置选项,具体可见官方文档:
**main块+events块:**https://nginx.org/en/docs/ngx_core_module.html
**http块:**https://nginx.org/en/docs/http/ngx_http_core_module.html
2.main块
main块也就是全局块,主要设置一些影响nginx服务器整体运行的配置指令。例如:worker进程数量,master进程pid存放位置等。
以下是main块的常用配置:
1)配置是否以守护进程方式运行nginx
作用域:main
语法:daemon on | off
默认值:
daemon on;
2)配置工作进程的数量
作用域:main
语法:worker_processes number | auto
默认值:
worker_processes 1;
3)配置主进程pid存放位置
作用域:main
语法:pid file
默认值:
pid logs/nginx.pid;
配置示例:
# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;
3.events块
events块主要配置Nginx服务器与客户端的网络连接相关指令。例如每个worker进程可以同时支持的最大连接数。
以下是events块的常用配置:
1)配置有新连接时工作进程的唤醒方式
这里有一个“惊群”的问题,大致意思是:在某一时刻只接收到一个新的网络连接,多个睡眠的进程会被同时唤醒,但只有一个进程可以获得连接,这就回造成一部分系统资源的浪费。在Nginx服务中,如果存在多个工作进程,就有可能出现“惊群”问题。
作用域:events
语法:accept_mutex on | off
默认值:
accept_mutex off;
作用:如果启用accept_mutex,有新连接时,工作进程将依次接受。否则,所有工作进程将被通知,如果新连接的数量低,就会造成工作进程资源浪费。
2)配置是否允许同时接收多个连接
作用域:events
语法:multi_accept on | off
默认值:
multi_accept off;
作用:如果禁用multi_accept,工作进程将一次接受一个新连接。否则,工作进程将一次接受所有新连接。
3)配置每个工作进程最大连接数
作用域:events
语法:worker_connections number
默认值:
worker_connections 512;
作用:设置工作进程可以同时打开的最大连接数。
配置示例:
# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;
events {
# 配置有新连接时,唤醒工作进程的方式
accept_mutex on;
# 配置每个工作进程是否可以同时接收连接
multi_accept on;
# 配置每个工作进程的最大连接数
worker_connections 1024;
}
4.http块
http块是Nginx服务器配置中的重要部分,代理、缓存、第三方模块的配置都放在这个模块。http块中可以包含多个server块,server块也可以包含多个location块。
🔔Tips:很多的配置指令可以同时存在于http,server,location块中,如果同时配置,生效的原则为就近原则
以下是http块的常用配置:
1)配置mime-type
作用域:http,server,location
语法:default_type mime-type
默认值:
default_type text/plain;
作用:定义响应的mime类型
在浏览器中,可以显示文本,图片等资源,浏览器为了区分这些资源,需要使用
mime-type
(网络资源的媒体类型)。Nginx作为web服务器,也需要识别客户端请求的资源类型。因此,Nginx定义了mime.types
文件,其中定义了很多的资源类型。我们在定义default_type
时,参照这个文件配置即可。
cd /usr/local/nginx
cat mime.types
# 输出内容,省略绝大部分
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/json json;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
......
}
2)配置错误页面
作用域:http,server,location,if in location
语法:error_page code … [=[response]] uri;
作用:定义错误对应的响应
示例:
1)指定404错误码对应的响应
error_page 404 /404.html;
2)更改404错误码为200,并指定响应
error_page 404 =200 /empty.gif;
3)指定响应代码
error_page 404 = /404.php;
3)配置每个连接的最大请求数
作用域:http,server,location
语法:keepalive_requests number
默认值:
keepalive_requests 1000;
作用:设置一个连接能提供服务的最大请求数。在发出最大数量的请求后,连接将关闭。定期关闭连接有利于内存的释放。
4)配置每个连接处理请求的最长时间
作用域:http,server,location
语法:keepalive_time time
默认值:
keepalive_time 1h;
作用:设置一个连接处理请求的最长时间。到达该时间后,连接将在随后的请求处理之后关闭。
5)配置连接超时时间
作用域:http,server,location
语法:keepalive_timeout timeout [header_timeout]
默认值:
keepalive_timeout 75s;
作用:设置长连接的超时时间,在此期间,连接将保持打开状态。零值将禁用长连接
6)配置文件高效传输模式
作用域:http,server,location,if in location
语法:sendfile on | off
默认值:
sendfile off;
作用:如果开启此选项,可以提升文件传输的速度。
7)包含其他文件
作用域:any
语法:include file
示例:
include mime.types;
作用:将另一个文件包含到配置中
配置示例:
# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;
events {
# 配置有新连接时,唤醒工作进程的方式
accept_mutex on;
# 配置每个工作进程是否可以同时接收连接
multi_accept on;
# 配置每个工作进程的最大连接数
worker_connections 1024;
}
http {
# 配置引入资源的媒体类型文件
include mime.types;
# 配置默认的响应类型
default_type text/plain;
# 配置每个连接能处理的最大请求数
keepalive_requests 1000;
# 配置每个连接处理请求的最长时间
keepalive_time 1h;
# 配置每个连接的超时时间
keepalive_timeout 75s;
# 配置开启文件高效传输模式
sendfile on;
}
5.server块
server块包含在http块中,在server块里,我们可以配置虚拟主机,虚拟主机技术将一台服务器划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。这和可以http块中定义多个server块契合。
以下是server块的常用配置:
1)配置网络监听端口
listen指令的配置相对复杂,我们这里只看最简单且常用的一种方式:listen port
。
🔔在nginx中有个概念:default_serer
,如果没有显式指定,则配置文件中定义的第一个server为默认server
作用域:server
语法:
listen 8080
作用:监听指定端口上的所有的连接
2)配置虚拟主机的名称
作用域:server
语法:server_name name …
默认值:server_name “”
作用:设置虚拟主机的名称
server_name
的语法看上去比较简单,支持同时配置多个名称,第一个为主名称。
Nginx为我们提供了多种配置形式:使用具体名称
、使用通配符
以及使用正则表达式
。
1)使用具体名称
server_name myserver.com www.server.com;
2)使用通配符
可以使用*
替换名称的开头部分和结尾部分。
server_name *.myserver.com www.myserver.*;
3)使用正则表达式
使用正则表达式,在Nginx中使用正则表达式需要以~
开头。
server_name ~^www\.\d+\.com$;
该正则表达式的含义是:以www
开头,紧跟.
(.
在正则表达式中有特殊含义,因此需要使用\
转义)再紧跟一个或多个0-9的数字(\d
代表0-9的任意一个数字,+
代表其前面的字符出现一次或多次),再紧跟.com
示例:www.4399.com
既然可以通过多种形式来配置server_name
,因此在包含多个虚拟主机的配置中,可能会出现一个请求被多个虚拟主机的server_name
匹配成功,Nginx做了规定,按照以下优先级匹配虚拟主机:
1)完全匹配server_name成功
2)通配符在开头部分时匹配server_name成功
3)通配符在结尾部分时匹配server_name成功
4)第一个正则表达式匹配server_name成功
🔔Tips:如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。
6.location块
location块包含在server块中,每个server块可以设置多个location块。location块的作用在于,对请求中的URI进行匹配并进行处理。
1)配置location块
作用域:server,location
语法:location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
作用:对请求的URI进行匹配
同样的location
的配置也存在多种方式:
Nginx定义了匹配规则:
1)先使用不含正则表达式的location进行匹配,找到匹配度最高的一个
2)再通过包含正则表达式的配置进行匹配,如果能匹配到则停止向下匹配并立即处理请求,否则使用第一步的匹配度最高的location来处理请求。
1)精准匹配,如果匹配成功,则停止向下匹配并立即处理请求
# 精准匹配
location = /test {
...
}
2)匹配以/test
开头
# 匹配以/test开头的URI
location /test {
...
}
3)匹配以/test
开头,如果匹配成功,则停止向下匹配并立即处理请求
# 匹配以/test开头的URI,如果匹配成功,则停止向下匹配并立即处理请求
location ^~ /test {
...
}
4)正则匹配,区分大小写
# 匹配以/test开头的URI,区分大小写
location ~ /test {
...
}
5)正则匹配,不区分大小写
# 匹配以/test开头的URI,不区分大小写
location ~* /test {
...
}
2)配置请求的根目录
作用域:http, server, location, if in location
语法:root path
默认值:
root html
作用:配置请求的根目录
可以看到默认配置为root html
,这里的html
是一个相对路径,相对于当前配置文件所在的目录
配置示例:
# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;
events {
# 配置有新连接时,唤醒工作进程的方式
accept_mutex on;
# 配置每个工作进程是否可以同时接收连接
multi_accept on;
# 配置每个工作进程的最大连接数
worker_connections 1024;
}
http {
# 配置引入资源的媒体类型文件
include mime.types;
# 配置默认的响应类型
default_type text/plain;
# 配置每个连接能处理的最大请求数
keepalive_requests 1000;
# 配置每个连接处理请求的最长时间
keepalive_time 1h;
# 配置每个连接的超时时间
keepalive_timeout 75s;
# 配置开启文件高效传输模式
sendfile on;
server {
# 配置监听端口
listen 8080;
# 配置location
location / {
root html;
index index.html;
}
location /test {
return 200 'test success';
}
}
}
以上就是Nginx配置文件的基本配置,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。