在使用ajax向tomcat部署的rest服务(使用nginx作为反向代理服务器)请求数据时返回了Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource这个异常,错误码是504(网关超时)
一直在想是什么原因导致了这个异常,也试图搜索了是不是tomcat或者nginx返回的“Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource”文字,仔细看了网络报文后发现这些异常信息是chrome浏览器自己解析出来的:
问题产生的根源在于tomcat上rest服务异常导致没有返回任何数据给nginx代理服务器,而nginx超时后就会返回504这个错误给chrome浏览器。
可以很容易重现这个问题:直接把tomcat服务器关闭,nginx代理服务器向连接服务器超时后就会返回504错误,nginx默认的连接超时时间为60s,这里可以通过设置proxy_connect_timeout参数来设置nginx连接tomcat服务器超时时间。
更多关于nginx作为反向代理时的超时设置参数还有下面几个:
proxy_read_timeout(连接成功后_等候后端服务器响应时间)、proxy_send_timeout(后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据)
收获:web请求失败不能只看描述性文字,要特别关注返回的http错误码