Nginx 问题速查手册

Nginx 的使用过程中的问题集,方便后面查查查

IP_hash 使用 XFF

remotip 是代理服务器的IP,导致IPhash无法保持同一客户端到同一台机器,
所以需要使用客户端的IP,xff来进行IPhash

map $http_x_forwarded_for $clientRealIp {
    "" $remote_addr;
    ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}

upstream tets {
        hash $clientRealIp;
        server 127.0.0.1:81;
        server 127.0.0.1:82;
}

Nginx配置优化之道

禁止特定的rferer的访问

有些自动化请求导致除了一些问题,所以这里就把它给静止掉

if ($http_referer ~* "www.xxx.com") {
    return 403;
}

直接使用正则来对 referer的头来进行匹配,匹配项返回403

允许跨域请求

api 的请求不被允许跨域的时候,下面给出一个可以进行域名通配的方法,比*的策略好上不少

if ($http_origin ~ [a-z]+\.12ms\.xyz$){ # xxx.12ms.xyz域名才可以访问
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Request-Method GET;
}

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

wss 连接返回 400

在对应的 proxy_pass 下添加,配置:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

由于websocket不同于http的单次请求,所以在nginx内有以上特殊配置。

http://nginx.org/en/docs/http/websocket.html

Proxy 请求头丢失

重新设置Authorization请求头:

proxy_set_header Authorization $http_authorization;

在nginx 配置中proxy导致请求头的丢失,

默认情况,NGINX在代理请求时会重新定义两个HTTP头字段,“Host”和“Connection”,并删除值为空的头部字段。“Host”会被设置为 $proxy_host变量的值,“Connection”被设置为close。

net::ERR_SPDY_PROTOCOL_ERROR

如果配置了Http2 和 proxy_pass 的情况就需要关注一下这个问题:
在proxy前面指定 http 的版本:

proxy_http_version 1.1;

在 nginx 可以使用http2 ,但是proxy到后端的机器不一定支持 http2 的协议,所以两端的协议不对等导致http的连接的建立失败。
使用如上配置强制指定即可

net::ERR_CONTENT_LENGTH_MISMATCH

nginx的缓存目录的权限的问题,修正目录权限

chown -R user:user nginx/proxy_temp

整体的访问没有问题的,但是在单个大的页面(如sitemap)进行加载的时候,加载时间会非常的久,
load的时间甚至长达6sec。且有机率出现 net::ERR_CONTENT_LENGTH_MISMATCH 的错误,整个页面无法访问

这个问题直接去check了日志,其中有一条error:

2019/08/25 09:59:52 [crit] 24677#0: *1 open() "/usr/local/nginx/tmp/proxy/1/00/0000000001" failed (13: Permission denied) while reading upstream, client: 182.148.107.206, server: 127.0.0.1, request: "GET /notebook/new HTTP/1.1", upstream: "http://127.0.0.1:10081/new",

所以是权限问题,检查目录权限,tmp的owner是 root:root 而nginx 的进程的权限是其他用户所以在请求的时候去抓取缓存文件没有权限。

指定

对指定的 UA 来进行屏蔽

if ($http_tencent_leakscan ~* "Tencent_Security_Team" ) {
    return   403;
}
if ($http_user_agent ~* "Tencent_Security_Team" ) {
    return   403;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注