Nginx配置动态代理后通过curl访问报403问题
作者:ProgrammingAh
今天生产环境遇到了一个问题,在测试环境其他系统调用我们系统的一个接口没问题,在生产环境死活调不通
问题描述
有业务人员反馈最近刚发版的一个服务提供的接口,其他系统一直调用不通。
尝试解决
分析
单体项目,系统部署架构很简单,抽象一下如下图所示:
经过几次尝试有如下发现:
- 浏览器上访问正常,不管是外网还是局域网
- 通过curl请求接口,请求tomcat地址正常,请求nginx地址返回403
- 其他系统通过通过nginx地址调用返回403,通过tomcat地址就正常
在网上找的解决方案
在网上搜索nginx配置动态代理报403,一般搜到4种情况
1、由于启动用户和 nginx 工作用户不一致所致
对比nginx配置文件中的用户与实际启动nginx用户是否一致
# 查看实际启动用户 ps -ef | grep nginx # 查看配置文件中配置的用户 cat /usr/local/nginx/conf/nginx.conf
2、缺少 index.html 或者 index.php 文件,就是配置文件中 index index.html index.htm 这行中的指定的文件
查看root的配置目录下是否有index.html等文件,没有的话会报403
server { listen 80; server_name localhost; index index.html; root /data/www; }
3、权限问题,如果 nginx 没有 web 目录的操作权限,也会出现 403 错误
运行nginx的用户对root的配置目录没有读写权限
# 修改web目录的读写权限,或者把nginx的启动用户改成目录的所属用户,或者将web目录的所属用户改为nginx的启动用户,重启nginx即可 chmod -R 777 /data/www chown -R nginx:nginx /data/www
4、SELinux 设置为开启状态(enabled)的原因
# 查看当前selinux的状态 /usr/sbin/sestatus -v # 将SELINUX=enforcing修改为selinux=disabled vi /etc/selinux/config SELINUX=disabled # 重启系统生效 reboot
是终解决
最终发现都不是上述四种情况,经过多方分析,发现配置目录下多了一个配置/usr/local/nginx/conf/conf.d/agent_deny.config,内容大概如下所示:
# 禁止Scrapy等工具的抓取 if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; } # 禁止UA及UA为空的访问 # 。。。 # 禁止非GET/POST方式的抓取 # 。。。
第一条就将curl和httpclient给禁用了,这也就解决了问题描述里对方系统调用接口和使用curl调用nginx地址时调不通的原因了。
解决方法,最终提供两个思路:
1、httpclient调用时修改User_Agent
2、直接调用tomcat接口
总结
遇到问题多总结,网上的答案不一定能解决你的问题,还要具体问题具体分析,多分析现象,根据现象找到蛛丝马迹。
到此这篇关于Nginx配置动态代理后通过curl访问报403问题的文章就介绍到这了,更多相关Nginx动态代理报403内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!