Nginx 日志分析技巧

Nginx 日志分析技巧

Nginx 日志是排查问题、分析流量的重要工具。学会看日志,网站问题排查效率翻倍。

1. 日志位置

# 默认访问日志
/var/log/nginx/access.log

# 默认错误日志
/var/log/nginx/error.log

可以在 nginx.conf 里自定义:

access_log /var/log/nginx/www.access.log;
error_log /var/log/nginx/www.error.log;

2. 日志格式

默认日志格式:

127.0.0.1 - - [04/Oct/2026:10:00:00 +0800] "GET / HTTP/1.1" 200 612 "https://www.baidu.com/" "Mozilla/5.0..."

各字段含义:

  • IP 地址
  • 请求时间
  • 请求方法和路径
  • 状态码
  • 响应大小
  • 来源页面
  • User-Agent

3. 常用分析命令

# 查看访问量前10的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head 10

# 查看访问量前10的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head 10

# 查看状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr

# 查看 404 请求
grep ' 404 ' access.log

# 查看 502 错误
grep ' 502 ' access.log

4. 排查问题

排查 502 错误:

grep ' 502 ' access.log | tail 20

排查慢请求:
开启慢日志:

slow_request_log /var/log/nginx/slow.log;
slow_request_time 5s;

排查爬虫:

grep 'Baiduspider' access.log
grep 'Googlebot' access.log

5. 流量统计

# 今天总访问量
grep '04/Oct/2026' access.log | wc -l

# 今天总流量
grep '04/Oct/2026' access.log | awk '{sum+=$10} END {print sum/1024/1024 " MB"}'

# 每小时访问量
awk '{print $4}' access.log | cut -d: -f2 | uniq -c

6. 日志切割

日志太大要切割,用 logrotate:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    notifempty
    create 0640 nginx adm
    postrotate
        systemctl reload nginx
    endscript
}

7. 常用工具

  • GoAccess:实时日志分析工具
  • ELK:Elasticsearch + Logstash + Kibana
  • Zabbix:监控告警

总结

Nginx 日志分析核心:

  • 位置:/var/log/nginx/
  • 命令:awk + sort + uniq
  • 排查:看状态码、看慢请求
  • 切割:用 logrotate

学会这些,日常日志分析基本够用了。


emer 发布于  2026-10-4 11:08 

PHP 错误与异常处理:从 die 到优雅的错误处理

前言

很多 PHP 新手处理错误就是 die() 或者 exit(),页面直接白屏,用户体验极差。本文讲清楚 PHP 的错误和异常处理机制,帮你写出更健壮的代码。

一、错误 vs 异常

很多人搞不清错误和异常的区别:

  • 错误:PHP 本身的问题,比如语法错误、调用不存在的函数
  • 异常:程序逻辑上的问题,比如数据库连不上、文件不存在

PHP 7 以后,很多错误也变成了异常,可以用 try-catch 捕获。

二、错误级别

PHP 有很多错误级别:

E_ERROR      致命错误,脚本停止运行
E_WARNING    警告,脚本继续运行
E_NOTICE     注意,一般不影响运行
E_PARSE      语法解析错误
E_DEPRECATED 过时提醒

开发环境和生产环境的配置不一样:

# 开发环境:显示所有错误
display_errors = On
error_reporting = E_ALL

# 生产环境:不显示错误,只记录日志
display_errors = Off
log_errors = On
error_reporting = E_ALL

三、异常处理基础

try-catch-finally

<?php
try {
    // 可能出错的代码
    $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
} catch (PDOException $e) {
    // 捕获异常
    echo "数据库连接失败:" . $e->getMessage();
} finally {
    // 不管有没有异常都会执行
    echo "执行完毕";
}

抛出异常

<?php
function divide($a, $b)
{
    if ($b == 0) {
        throw new Exception("除数不能为 0");
    }
    return $a / $b;
}

try {
    echo divide(10, 0);
} catch (Exception $e) {
    echo "错误:" . $e->getMessage();
}

四、自定义异常类

<?php
class DbException extends Exception
{
    public function errorMessage()
    {
        return "数据库错误:" . $this->getMessage();
    }
}

class UserException extends Exception
{
    public function errorMessage()
    {
        return "用户错误:" . $this->getMessage();
    }
}

// 使用
try {
    if (!$user) {
        throw new UserException("用户不存在");
    }
} catch (UserException $e) {
    echo $e->errorMessage();
} catch (DbException $e) {
    echo $e->errorMessage();
} catch (Exception $e) {
    echo "其他错误:" . $e->getMessage();
}

五、错误处理器

把 PHP 错误转换成异常,统一处理:

<?php
// 自定义错误处理器
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    // 把错误转换成异常抛出
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try {
    // 这个本来是 warning,现在会被捕获
    $result = 10 / 0;
} catch (ErrorException $e) {
    echo "错误:" . $e->getMessage();
}

六、异常处理器

兜底处理,最后一道防线:

<?php
// 自定义异常处理器
set_exception_handler(function ($e) {
    echo "未捕获的异常:" . $e->getMessage();
    // 记录日志
    error_log($e->getMessage());
});

// 没有 try-catch 的异常会走这里
throw new Exception("爆炸了");

七、常见错误处理方式对比

方式 问题
die() / exit() 页面白屏,用户体验差
echo 错误信息 代码混在一起,不好维护
错误码返回 调用方需要判断错误码
异常处理 代码清晰,错误统一管理

八、最佳实践

  1. 生产环境不要显示错误:会暴露服务器信息
  2. 一定要记录日志:方便排查问题
  3. 用异常处理替代 die():代码更优雅
  4. 自定义异常类:区分不同类型的错误
  5. 兜底异常处理器:防止未捕获的异常白屏

九、日志记录

<?php
try {
    // 可能出错的代码
} catch (Exception $e) {
    // 记录日志
    error_log(
        date('Y-m-d H:i:s') . " 错误:" . $e->getMessage() . "\n",
        3,
        '/var/log/php/error.log'
    );

    // 给用户友好提示
    echo "系统繁忙,请稍后再试";
}

总结

PHP 错误处理的核心思路:

  1. 开发环境显示错误,生产环境隐藏错误
  2. 用 try-catch 捕获异常,不要用 die()
  3. 自定义异常类,区分不同错误类型
  4. 设置错误处理器,把错误转成异常
  5. 一定要记录日志,方便排查问题

掌握这些,你的 PHP 代码会健壮很多。


emer 发布于  2026-10-4 10:09