一 401、403、404报错
① 401和403
说明: 由于 nginx 导致的'401、403'很不常见,这里不再细讲,后续会讲解两个'独特'的案例
1) 401 Unauthorized --> 权限认证机制、Cookie、Token --> 请求没有经过'授权'
2) 403 Forbidden --> '请求被拒绝访问' <-- '有认证,认证不对或者权限不足'
备注1: 关注'$upstream_addr'字段,该字段'决定'是谁返回的这些'报错码',要了解'事故源'
备注2: nginx 启动'用户'对静态资源的权限、nginx自身的权限管控是否'配置错误'
文件权限:root 切换到 'su - nginx启动用户 -s /bin/bash',然后看能不能'cd'到资源目录
相关指令: allow 、deny ['ip黑白名单']、auth_basic、auth_basic_user_file
补充: 'SELinux'暂时不考虑
autoindex on; 少了这条参数,所以一直报 " directory index of "/data/soft/" is forbidden"
nginx 403 报错原因 nginx index 缺少/ 导致403
② 404
error.log: 'No such file or directory'
强调: 404 '报错'的本质'语义'就是请求的'服务端资源'找不到导致,至少'服务端'是这样'理性'认为
备注: 找不到的'原因'很多,可能是'资源确实不存在'或者'配置参数不合理'导致
internal: 指定给定location只能用于'内部'请求、对于'外部'请求,返回 '404' 报错
区分:请求'有没有'发送到'上游服务器',通过'$upstream_addr'判断,是否'有值'
1)请求'发送到上游',后端业务的问题
场景1:可能经过nginx的'内部重定向'等,发送到'不符合预期'的proxy_pass
场景2:上游'缺失'对应的资源目录或者资源目录'被其它程序覆盖',拉通'上游服务'人员来定位
2)请求'没有'发送到上游
场景1:由于host跟server_name不匹配,导致匹配到'默认'的server_name上
说明:
1、该server块'没有'匹配的location
2、会把url作为root指令的'静态资源目录下的资源'进行查找,找不到则'报错'
场景2:server_name跟host匹配,但是实际'没有location'与'url'匹配
场景3:由于rewrite '错误配置'重定向导致'路由不匹配',也即nginx'没有'对应location能匹配
场景4:kong的route'路由规则和请求不匹配',导致404
场景5:location也匹配了,但是服务器上实际'没有'对应的资源
明确:实际查找的'静态资源路径'是什么? --> root、alias、try_files等'综合'作用
[1]、请求行中的 '域名和ip' 负责定位服务所在的主机,确保请求是'发送到这个节点'上
[2]、listen先筛选可以'选择的server_name',然后'host请求头'进行server_name匹配
[3]、但是server_name'不匹配',就会查找默认的server_name
重点:
[1]、nginx debug可以看到最终匹配的路由(using configuration)
[2]、$server_name可以看到'最终匹配'的server块
[3]、影响路由匹配的因素:静态资源是root和alias、动态资源是proxy_pass、重定向
++++++++++++++++ "一个案例" ++++++++++++++++
条件:
多个server块'不同conf文件中'配置'同一个域名'
但是location不同,reload|restart '不报错'
请求的时候404,应该是'某个server被覆盖',所以'查找' serevr_name 是否'冲突'
报错: 'No such file or directory'
客户端: '404 Not Found'
补充: 定义'某种行为'出现的时候,主动展示'404'的报错
error_page 404 /404.html;
try_files $uri $uri/ /index.html =404;