浏览器上访问正常,不管是外网还是局域网
通过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接口
遇到问题多总结,网上的答案不一定能解决你的问题,还要具体问题具体分析,多分析现象,根据现象找到蛛丝马迹。
- 221
-
让风替我亲亲你
Elasticsearch