1. 什么是Nginx
Nginx是一款广受欢迎且功能强大的开源网络服务器,在我们的日常应用中,主要用于高效地处理HTTP、HTTPS请求。其核心配置项为如下:
2. events块
Nginx 的 events 块是其配置文件(通常为 nginx.conf)中一个非常重要的部分,用于定义和配置与事件处理模型相关的设置。这些设置直接影响到 Nginx 如何高效地监听并响应客户端连接请求,以及如何处理网络事件(如读写操作)。
位置与作用域:
- 全局级别:在 nginx.conf 文件的最外层,直接位于 main 部分内。全局 events 块设定的是整个 Nginx 服务器实例的默认事件处理策略。
- http块内部:可以嵌套在 http 块中,为特定的 HTTP 服务或虚拟主机提供独立的事件处理配置。这种情况下,其配置将覆盖全局 events 块的设置。
events中最重要的两个配置信息是use和worker_connections:
- use:用于指定事件处理模型(epoll,poll,select)
- worker_connections: 设置每个工作进程(worker process)能够同时处理的最大连接数。
3. http块
nginx 的 http 块是其配置文件中非常重要的一部分,用于定义与HTTP协议相关的全局设置、服务器块(server)以及更具体的location块(location)。这部分配置直接影响着Nginx如何处理接收到的HTTP请求。
在http块内部,可以设置一系列影响所有服务器块的全局配置选项,包括但不限于:
- 缓冲区相关配置(http请求header与body的大小设置,这部分是出问题的高频所在)。
- HTTP模块包含:通过include指令引入其他包含具体HTTP模块配置的文件,便于组织和管理复杂配置。
- 日志设置:如定义全局的access_log和error_log路径及格式。
- MIME类型定义:通过types指令设置文件扩展名与MIME类型的映射。
- 默认字符集:使用charset指令指定默认的HTTP响应字符集。
- gzip压缩:启用并配置gzip模块,设置压缩级别、压缩类型等。
- 缓存设置:如果使用了proxy_cache或fastcgi_cache等缓存模块,可以在此配置全局缓存策略。
- SSL/TLS配置:虽然实际的SSL证书和密钥配置通常在服务器块内,但全局SSL参数(如密码文件、SSL协议版本、Ciphersuite等)可在此定义。
- 限速与连接管理:设置全局的连接数限制、请求速率限制等。
4. server块
Nginx 的每个 server 块代表一个独立的、逻辑上的 web 服务器,可以为特定的域名或一组域名提供服务。在实际部署中,通过配置多个 server 块,可以在同一台物理或虚拟服务器上托管多个网站,每个网站具有自己的配置规则,如监听端口、根目录、访问控制、SSL 设置等。
server块中的两个核心属性:
- listen:指定服务器的监听端口
- server_name:制定服务器的监听域名
ini
server {
listen 80 sndbuf=640k default_server;
server_name a.example.com;
}
对应到一条消息具体的HTTP请求:www.a.example.com/request ,上述server将监听所有a.example.com域名的请求。
5. location块
在Nginx的配置文件中,location 块是非常关键的部分,用于定义对不同URL请求的处理规则,包括但不限于路由、访问控制、内容缓存、重写规则等。对应到一条消息具体的HTTP请求:www.a.example.com/request ,location对应一个/request请求。
ini
location [modifier] pattern {
# location块内的配置指令
}
- modifier(可选):修饰符,影响Nginx如何匹配和处理请求。常见的修饰符包括:
-
- =:精确匹配。如果请求的URI与指定的pattern完全相同,则优先匹配并立即停止搜索其他location。
- ^~:前缀匹配。如果请求的URI以指定的pattern开头,且该location没有使用正则表达式,将优先匹配并停止搜索其他正则location。
- ~:区分大小写的正则表达式匹配。
- ~*:不区分大小写的正则表达式匹配。
- !~ 和 !~* 分别表示区分大小写和不区分大小写的正则表达式否定匹配。
- pattern:匹配规则,可以是普通字符串或正则表达式,用于匹配客户端请求的URI。当Nginx接收到一个请求时,它会根据请求URI依次检查各个location块的pattern,按照上述修饰符的优先级进行匹配。
匹配规则和优先级
- 精确匹配 ( = ) :具有最高优先级。一旦找到一个精确匹配的location,Nginx将不再检查其他location。
- 前缀匹配 ( ^~ ) :次高优先级。若请求URI以某个location的前缀字符串开始,并且该location没有使用正则表达式,Nginx将立即选择此location,不再检查其他正则表达式location。
- 正则表达式匹配 ( ~ 或 ~ * ) :按照配置文件中出现的顺序依次检查。一旦找到第一个匹配的正则表达式location,除非有更高优先级的匹配(如精确匹配),否则将使用该location。
- 通用匹配 (/ 或未指定修饰符) :最低优先级。如果没有其他匹配规则适用,或者所有正则表达式location均未匹配,那么通用匹配location将被选中。
location块内的配置指令
在location块内部,可以放置各种Nginx指令来定义对匹配请求的处理方式,location中可以定制化重写http中的配置:
- proxy_pass:指定反向代理的上游服务器地址。
- root 或 alias:设置请求资源的本地文件系统路径。
- try_files:尝试按顺序访问多个文件或URI,返回第一个存在的文件或成功处理的URI。
- index:指定默认首页文件列表。
- access_log 和 error_log:配置访问日志和错误日志。
- allow 和 deny:基于IP地址控制访问权限。
- rewrite:定义URL重写规则。
- expires 或 proxy_cache:设置响应内容的缓存策略。
- auth_basic 和 auth_basic_user_file:启用基本身份验证。
- 以及其他与HTTP处理相关的指令,如返回状态码、设置响应头、限制速率等。