Bootstrap

Nginx —— 基本配置及其详解

持续更新中…

一、日志相关

1.1、配置项详解

  • 可以通过以下参数来自定义日志文件的位置、输出格式等:
    log_format: 定义日志文件的输出格式,支持多个自定义字段。
    access_log:配置访问日志的输出路径。这里可以使用 Nginx 内置变量来组合自定义日志格式。
    error_log:指定针对特定位置或方法的错误级别以及需要记录的错误消息的类型。

  • 一些常用的 Nginx 日志格式变量:
    $remote_addr: 客户端 IP 地址。
    $remote_user: 客户端用户名称(仅限于 HTTP 基本身份验证)。
    $time_local: 记录时间,通常以标准时间格式为 “%d/%b/%Y:%H:%M:%S %z”。
    $request: 客户端发送的原始请求行 (比如 “GET /index.html HTTP/1.1”) 。
    $status: HTTP 响应代码 (200, 404 等)。
    $body_bytes_sent: 发送到客户端的字节数。
    $http_referer: 来源 URL。
    $http_user_agent: 使用浏览器标识符来标识请求的客户端。

  • 配置字段中出现的含义:
    proxy_pass <url>:将请求转发给一个后端服务器地址(包括协议、IP 和端口号)。
    access_log [path] [format]}:允许配置服务器访问日志。可以指定一个路径,或将其设置为 off 以禁用记录该请求的日志。
    error_log [path] [level]:开启的错误级别和设置错误消息的输出位置。

  • 在配置中,你还可以结合使用以下子标识符:
    json_escape($some_json_property): 使用 escape() 的形式转义 JSON 字符串。这对于记录 JSON 数据非常有用。
    $upstream_addr$upstream_response_time:对于支持代理连接的 Nginx 前端,显示代理服务器的IP和代理总时间 (upstream_response_time)。

1.2、配置示例

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;
    
    # 记录后端重定向和代理相关的错误 (4xx/5xx)
    error_log   /var/log/nginx/error.log  warn;

    server {
        ...
        location / {
            proxy_pass http://xxxxxx;

            # 启用日志
            access_log /var/log/nginx/x-access.log;
            error_log /var/log/nginx/x-error.log;

            # 配置日志格式
            log_format proxylog '{"@timestamp":"$time_iso8601","client_ip":'
                                     '"$realip_remote_addr",'
                                     '"upstream_addr":"$upstream_addr",'
                                     '"host":"$http_host",'
                                     '"req_uri":"$request_uri",'
                                     '"status":$status,'
                                     '"bytes_sent":$bytes_sent,'
                                     '"referer":"$http_referer",'
                                     '"user_agent":"$http_user_agent",'
                                     '"request_time":$request_time,'
                                     '"upstream_connect_time":"$upstream_connect_time",'
                                     '"upstream_header_time":"$upstream_header_time",'
                                     '"upstream_response_time":"$upstream_response_time"}';

            # 定义日志输出
            access_log /var/log/nginx/x-access.log proxylog;
        }
    }
}

单个请求配置日志,其他默认

所有经过此 location 转发到 http://xxx.xxx.xxx 的请求和响应,将会被记录到 /var/log/nginx/upstream.log 日志文件中,并按照自定义格式“upstreamlog”记录。

http {
    ...
    # 定义一个名为“upstreamlog”的自定义日志格式
    log_format upstreamlog '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $body_bytes_sent '
        '"$http_referer" "$http_user_agent" '
        'upstream:"$upstream_addr" response_time:$upstream_response_time '
        'request_time:$request_time';
    

	location / {
    	proxy_pass http://xxx.xxx.xxx;
    	access_log /var/log/nginx/upstream.log upstreamlog;
	}
}
;