
# 中间件-Nginx日志
Nginx是一个开源的、高性能的HTTP和反向代理服务器，以及IMAP/POP3/SMTP代理服务器。它具有其稳定性、丰富的功能集、简单的配置和低系统资源消耗等特点。Nginx常被用于处理静态文件、负载均衡、反向代理以及缓存等功能，适用于各种规模的网站和应用程序。
Nginx日志主要分为两种：访问日志（access_log）和错误日志（error_log）。这些日志对于系统监控、性能分析、故障排查等都非常有用。
- 访问日志（access_log）：访问日志记录了客户端访问Nginx服务器的详细信息。通过访问日志，您可以了解到用户的IP地址、访问的URL、访问时间、请求的处理时间、HTTP响应状态码、请求的头部信息等。
- 错误日志（error_log）：错误日志记录了Nginx服务器在处理请求过程中遇到的错误和警告信息。通过查看错误日志，您可以定位到问题的源头，从而进行故障排除。
#### 采集方法
使用ICAgent采集日志，接入前请参考[安装ICAgent（区域内主机）](https://support.huaweicloud.com/usermanual-lts/lts_02_0013.html)完成ICAgent安装。然后再通过采集ECS-文本日志方式将日志上报至LTS服务，详细操作请参考[云主机ECS文本日志接入LTS](https://support.huaweicloud.com/usermanual-lts/lts_04_1031.html)。
#### Nginx日志示例以及字段含义
介绍访问日志和错误日志的示例和字段说明。
表1访问日志字段说明 
| 参数                      | 说明                          | 示例                                                                                      |
|:---|:---|:---|
| $remote_addr            | 客户端地址。                      | 211.28.65.253                                                                           |
| $remote_user            | 客户端用户名称。                    | --                                                                                      |
| $time_local             | 访问时间和时区。                    | 18/Jul/2012:17:00:01 +0800                                                              |
| $request                | 请求的URI和HTTP协议。              | "GET /article-10000.html HTTP/1.1"                                                      |
| $http_host              | 请求地址，即浏览器中您输入的地址（IP或域名）。    | www.wang.com 192.168.100.100                                                            |
| $status                 | HTTP请求状态。                   | 200                                                                                     |
| $upstream_status        | upstream状态。                 | 200                                                                                     |
| $body_bytes_sent        | 发送给客户端文件内容大小。               | 1547                                                                                    |
| $http_referer           | url跳转来源。                    | https://www.example.com/                                                                |
| $http_user_agent        | 用户终端浏览器等信息。                 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C; |
| $ssl_protocol           | SSL协议版本。                    | TLSv1                                                                                   |
| $ssl_cipher             | 交换数据中的算法。                   | RC4-SHA                                                                                 |
| $upstream_addr          | 后台upstream的地址，即真正提供服务的主机地址。 | 10.10.10.100:80                                                                         |
| $request_time           | 整个请求的总时间。                   | 0.205                                                                                   |
| $upstream_response_time | 请求过程中，upstream响应时间。         | 0.002                                                                                   |
   
错误日志示例：
```
2023/07/10 17:00:00 [error] 12345#12345: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.100, server: example.com, request: "GET /api/data HTTP/1.1", upstream: "http://10.0.0.1:8080", host: "example.com
```
表2错误日志字段说明 
| 示例                                                                                        | 说明                                    |
|:---|:---|
| 2023/07/10 17:00:00                                                                       | 错误发生的时间。                              |
| \[error\]                                                                                 | 表示这是一个错误日志。                           |
| 12345#12345                                                                               | 进程ID。                                 |
| \*1                                                                                       | 连接的编号。                                |
| recv() failed (104: Connection reset by peer) while reading response header from upstream | 错误信息，表明在从上游读取响应头时接收失败，错误原因是"连接被对方重置"。 |
| client: 192.168.1.100                                                                     | 客户端的IP地址。                             |
| server: example.com                                                                       | 服务器的名称。                               |
| request: "GET /api/data HTTP/1.1"                                                         | 请求的方法和路径。                             |
| upstream: "http://x.x.x.x:8080"                                                           | 上游服务器的地址。                             |
| host: "example.com"                                                                       | 请求的主机名。                               |
   
#### 日志位置
在Nginx配置文件中，您可以通过指令来设置访问日志和错误日志的存放位置和格式。例如：
```
http {  
    ...  
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
                      '$status $body_bytes_sent "$http_referer" '  
                      '"$http_user_agent" "$http_x_forwarded_for"';  
    server {  
        ...  
        access_log  /var/log/nginx/access.log  main;  
        error_log  /var/log/nginx/error.log warn;
        ...  
    }  
}
```
在这个例子中，log_format指令定义了一个名为main的日志格式，然后在server块中使用access_log指令指定了访问日志的存放位置 /var/log/nginx/access.log，错误日志被存放在/var/log/nginx/error.log路径下，并且日志级别被设置为warn。Nginx支持多种日志级别，包括debug、info、notice、warn、error、crit和alert。
