Nginx深入:nginx功能模块、目录结构及配置文件详解
阅读原文时间:2023年08月09日阅读:4

Nginx功能模块说明

1、Nginx 核心功能模块(Core functionality)

Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Events)层,这里有很多 Nginx 必需的全局参数配置。

有关核心功能模块的官方文档为:http://nginx.org/en/docs/ngx_core_module.html

2、标准的 HTTP 功能模块集合

这些标准的 HTTP 功能模块,虽然不是 Nginx 软件所必需的,但都是很常用的,因此绝大部分默认情况都会自动安装到 Nginx 软件中,见下表。保留软件的默认配置就好,不建议改动,除非你明确知道你在做什么,有什么额外影响。

企业场景常用的 Nginx HTTP 功能模块汇总

Nginx HTTP 功能模块

模块说明

ngx_http_core_module

包括一些核心的 HTTP 参数配置,对应 Nginx 的配置为 HTTP 区块部分

ngx_http_access_module

访问控制模块,用来控制网站用户对 Nginx 的访问

ngx_http_gzip_module

压缩模块,对 Nginx 返回的数据压缩,属于性能优化模块

ngx_http_fastcgi_module

FastCGI 模块,和动态应用相关,如 PHP

ngx_http_proxy_module

proxy 代理模块

ngx_http_upstream_module

负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

ngx_http_rewrite_module

URL 地址重写模块(伪静态)

ngx_http_limit_conn_module

限制用户并发连接数及请求数模块

ngx_http_limit_req_module

根据定义的 key 限制 Nginx 请求过程的速率

ngx_http_log_module

访问日志模块,以指定的格式记录 Nginx 客户访问日志等信息

ngx_http_auth_basic_module

web 认证模块,设置 Web 用户通过账号索码访问 Nginx

ngx_http_ssl_module

ssl模块,用于加密的 HTTP 连接,如 https

ngx_http_stub_status_module

记录 Nginx 基本访问状态信息等的模块

在生产环境中,配置、调整及优化 Nginx 软件,主要就是根据这此模块的功能修改相应的参数来实现的。

官方文档:https://nginx.org/en/docs/

Nginx目录结构及配置文件介绍

注:以下介绍基于源码编译安装的nginx

[root@web01 ~]# tree /app/nginx
/app/nginx
├── client_body_temp
├── conf                           #//nginx所有的配置文件的目录,重要
│   ├── fastcgi.conf               #fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default
│   ├── fastcgi_params             #fastcgi的参数文件
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                 #媒体类型文件
│   ├── mime.types.default
│   ├── nginx.conf                 #nginx默认的主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                #scgi相关参数文件
│   ├── scgi_params.default
│   ├── uwsgi_params               #uwsgi相关参数文件,配置Python环境可能会用到
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                   #//fastcgi临时数据目录
├── html                           #//这是编译安装时nginx的默认站点目录
│   ├── 50x.html                   #错误页面优雅替代显示文件,例如:出现 502 错误时会调用此页面
│   └── index.html                 #默认的首页文件,在实际环境中,大家习惯用(注意字眼不是必须)                                               index.html、index.php、index.jsp来做网站的首页文件。
├── logs                           #//nginx默认的日志存放目录,包括错误日志及访问日志
│   ├── access.log                 #访问日志
│   ├── error.log                  #错误日志
│   └── nginx.pid                  #nginx的pid文件,nginx进程启动后,会把所有进程的pid号写到此文件
├── proxy_temp                     #//临时目录
├── sbin                           #//命令目录
│   └── nginx                      #启动命令
├── scgi_temp
└── uwsgi_temp

# 注:
所有default结尾的都是备份文件,未注释的生产很少用,可以不必理会。
koi-utf、koi-win、win-utf:这3个文件是 KOI8-R 编码转换的映射文件,因为 Nginx 的作者是俄罗斯人,在 Unicode 流行之前,KOI8-R 是使用最为广泛的俄语编码。

PS:以yum官方源安装的nginx配置文件是在/etc/nginx下

[root@web02 ~]# tree /etc/nginx/
/etc/nginx/
├── conf.d
│   └── default.conf
├── default.d
├── fastcgi_params
├── mime.types
├── modules -> ../../usr/lib64/nginx/modules
├── nginx.conf
├── nginx.conf.rpmsave
├── scgi_params
└── uwsgi_params

Nginx的主配置文件

Nginx主配置文件nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。配置文件中main区块(层)位于最上面,main层后面有Events层、http层等,在http层中又包含一个或多个server层,每个server层中又可有一个或多个location层。

nginx.conf是Nginx最重要的配置文件之一。必须搞定它。下面以yum官方源安装的nginx主配置文件为例详解。

[root@web02 ~]# grep -v '^$|#' /etc/nginx/nginx.conf
## 核心层(main层)
user  nginx;                    # nginx的启动用户
worker_processes  auto;         # nginx运行的work进程数量(建议与CPU数量一致或auto)
                                    auto:自动根据cpu的核心数来启动对应的工作进程数
error_log  /var/log/nginx/error.log notice;  # nginx错误日志存放路径,notice为错误日志级别
pid        /var/run/nginx.pid;   # 启动后进程号存放路径

## 事件层(events层)
events {
    worker_connections  1024;   # 每个worker进程支持的最大连接数
}

## http层(网站配置)
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;   // 访问日志路径
    sendfile        on;                            // 开启高效文件传输
    keepalive_timeout  65;                         // 长连接超时时间
    include /etc/nginx/conf.d/*.conf;              #//包含nginx其他子配置文件(网站虚拟机配置文件)

## server层
#使用Server配置网站, 每个Server{}标签对应一个独立的网站站点(所谓虚拟主机)
server {
        listen       80;                 # 监听端口,默认80
        server_name  abc.com alias; # 提供服务的的域名及别名(比如abc.org,访问这个同abc.com)
        access_log  access.log;          # 该网站的访问日志

        location / {                        # 控制网站访问路径
            root   /usr/share/nginx/html;   # 存放网站源代码的位置
            index  index.html;              # 默认返回网站的文件
        }
    }
    ...
    # 第二个虚拟主机配置
server {
    ...
    }
} # http层结束

########## 注意 ##########
nginx配置文件,每一行都以';'结尾
http{} 标签主要用来解决用户的请求与响应。
server{} 标签主要用来响应具体的某一个网站。
location{} 标签主要用于匹配网站具体URL路径。

Nginx的其他配置文件

Nginx配合PHP动态服务相关配置文件为fastcgi.conf、fastcgi_params
Nginx配合Python动态服务相关配置文件为uwsgi_params

Nginx日志管理

错误日志配置

Nginx 会把自身运行的故障信息及用户访问的日志信息记录到指定的日志文件里。
# 错误日志在main层配置
格式:
error_log  file level;  # file为错误日志存放目录,level为错误日志级别

其中,关键字error_log不能改变,存放日志文件的目录可以指定任意,错误日志级别常见的有 [debug |info |notice |warn |error |crit |alert |emerg],级别越高记录的信息越少,生产场景一般是 warn |error |crit 这三个级别之一,比如可以用error。注意不要配置 info 等较低级别.会带来巨大磁盘 I/O 消耗。

其他可以设置error_log的层:http、server、location

访问日志配置

Nginx会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户浏览行为等,此功能由ngx_http_log_module模块负责。

Nginx访问日志主要由以下两个参数控制:
log_format:用来定义日志格式(可定义多种格式,取不同名字)
access_log:用来指定日志路径及使用的格式

# 以上面主配置文件中的配置为例:(默认参数)
位置:http层内

    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  /var/log/nginx/access.log  main;   // 访问日志路径

# 在没有特殊要求的情况下,采用默认配置即可。

# 日志变量说明
 '$remote_addr - $remote_user [$time_local] "$request" '
 $remote_addr  远端的IP(上一访问你的IP)
 $remote_user  登录的用户(网页没有登录用户则为空)
 [$time_local] 记录访问时间和时区
 "$request"    http请求方式                     

'$status $body_bytes_sent "$http_referer" '
$status  http状态码,记录请求返回的信息
$body_bytes_sent 流量
"$http_referer"  跳转地址(从哪个网站跳转过来的)

'"$http_user_agent" "$http_x_forwarded_for"'
"$http_user_agent"  客户端信息,如浏览器、手机客户端等
"$http_x_forwarded_for"  当前端有代理服务器时,设置Web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也要进行相关的x_forwarded_for设置

日志管理实操

# 查看日志
root@web01,172.16.1.7:~ # ll /var/log/nginx/
total 68
-rw-r----- 1 nginx adm 31262 Sep 28 11:39 access.log
-rw-r----- 1 nginx adm 33759 Sep 28 11:39 error.log

# 启动服务后,浏览器打开10.0.0.7显示nginx默认页面,刷新一下,日志便出来一条
[root@web01 ~]# curl 10.0.0.7
[root@web01 ~]# tail -f /var/log/nginx/access.log
10.0.0.7 - - [04/Aug/2023:06:20:32 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
10.0.0.7 - - [04/Aug/2023:06:20:58 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"

root@web01,172.16.1.7:~ # tail -f /var/log/nginx/access.log
10.0.0.1 - - [29/Sep/2022:09:37:48 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-"
10.0.0.1 - - [29/Sep/2022:09:37:48 +0800] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-"

10.0.0.1                       客户端IP,网卡
 -                             该网站不需要登录,没有用户(对应第二个-)
[29/Sep/2022:09:37:48 +0800]   时间、时区
"GET / HTTP/1.1"               请求方式 请求URI HTTP协议版本号
304   状态码(缓存,清缓存之后变200,代表正常访问)
0     流量,响应body的大小
"-"   无跳转

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"  客户端信息
"-"   没有使用代理