Skip to main content
Nordlys logo, a drawing of two gray mountains with green northern lights in the background 陈迪の自留地

Back to all posts

Nginx 相关

Published on by Chen Di · 5 min read

Nginx 代理 apk 文件下载

server {
        listen       80;
        server_name  app.com.cn;

        location /app {
            alias /var/www/app;
            autoindex on;
            default_type application/octet-stream;
        }
    }

Nginx 过滤某个字段

如果你希望在统计 Nginx 日志中 Osonkredit.apk 出现的次数时,考虑去重 IP 地址,只计算每个 IP 地址出现的次数一次,可以使用以下方法。

1. 使用 grepawk 去重 IP

假设你希望计算每个唯一 IP 地址访问 Osonkredit.apk 的次数,可以结合 grepawksort 进行操作。

grep 'Osonkredit.apk' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq | wc -l

解释:

  • grep 'Osonkredit.apk' /var/log/nginx/access.log: 找到包含 Osonkredit.apk 的所有行。
  • awk '{print $1}': 从每行中提取出第一个字段,即客户端 IP 地址。
  • sort: 对 IP 地址进行排序(uniq 需要排序的输入)。
  • uniq: 去重,只保留每个 IP 地址的唯一出现。
  • wc -l: 统计不同 IP 地址的数量。

2. 使用 awk 完全处理

如果你希望使用 awk 来完成所有的工作,并避免管道中多个命令的嵌套,可以使用如下的单一 awk 命令:

awk '$0 ~ /Osonkredit.apk/ {ips[$1]} END {print length(ips)}' /var/log/nginx/access.log

解释:

  • awk '$0 ~ /Osonkredit.apk/ {ips[$1]} END {print length(ips)}': 这个命令做了以下几件事:
    • $0 ~ /Osonkredit.apk/: 只处理包含 Osonkredit.apk 的行。
    • {ips[$1]}: 使用 IP 地址(即第一列 $1)作为键,存储到 ips 数组中。每个唯一的 IP 会存储一次,重复的 IP 会覆盖前一个值。
    • END {print length(ips)}: 在处理完所有行后,打印 ips 数组的长度,即唯一 IP 的数量。

3. 使用 zgrep (针对压缩日志文件)

如果 Nginx 日志被压缩,你可以使用 zgrep 来对 .gz 格式的日志进行类似的统计。以下命令会统计压缩日志文件中每个唯一 IP 地址访问 Osonkredit.apk 的次数:

zgrep 'Osonkredit.apk' /var/log/nginx/access.log*.gz | awk '{print $1}' | sort | uniq | wc -l

总结:

这些方法可以帮助你统计在 Nginx 日志中每个唯一 IP 地址访问 Osonkredit.apk 的次数。如果你有多个日志文件(如压缩日志),可以使用 zgrep 来处理。

Nginx 反向代理

  1. 路径问题

    • NGINX 默认尝试从文件系统中提供请求的资源。日志显示 NGINX 在 /usr/share/nginx/html/ 目录中查找请求路径 /EZLoan/someTypeNillActionBoo/superTimUserniLear,但找不到文件。
    • 这是因为没有为 /EZLoan 指定一个明确的反向代理规则,或者请求路径被误解为静态文件路径。
  2. 代理配置问题

    • 你配置的 location /EZloan 中的路径为 proxy_pass http://backend;,但你的 URL 请求是 /EZLoan(大小写敏感)。
    • 由于没有匹配到配置规则,NGINX 可能默认将此请求当作静态文件请求处理。
  3. 拼写错误或恶意请求

    • 请求路径 /EZLoan/someTypeNillActionBoo/superTimUserniLear 看起来不像预期的路径,可能是用户拼写错误或恶意请求。

解决方案

  • 确保路径匹配大小写

NGINX 的 location 是大小写敏感的。你的配置中是 /EZloan,但日志显示请求路径是 /EZLoan。修改配置如下:

location ~* ^/EZLoan {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

这里使用了正则表达式 ~*,使路径匹配大小写不敏感。

  • 捕获未知路径并重定向

如果有类似不正确或恶意请求,可以捕获它们并返回合适的响应,比如 404 页面或重定向:

location /EZLoan {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

- 捕获不存在的静态文件请求

location / {
    return 404;
}
  • 检查 proxy_pass 的后端配置

确保后端 http://backend 配置正确,且能够处理 /EZLoan/someTypeNillActionBoo/superTimUserniLear 这样的请求路径。

在后端处理未知路径时返回合适的状态码,比如 404,而不是直接丢给前端。