解决:The proxy server received an invalid response from an upstream server

转载 2016年06月01日 15:08:09

最近在App上的调用接口时出现下面的错误信息,导致正常页面无法访问。

The proxy server received an invalid response from an upstream server. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!

分析报错原因

根据信息提示(代理服务器无法得到正确响应)往下分析报错原因。
首先检查提示错误信息出处,打开站点nginx虚拟目录的配置文件看到如下配置项:

1
2
3
4
5
6
7
8
9
location~. * . * $ {
	client_max_body_size 15m;
	client_body_buffer_size 256k;
	proxy_next_upstream http_502 http_504 error timeout invalid_header;
	proxy_set_header Host $host;
	proxy_set_header X - Forwarded - For $remote_addr;
	proxy_pass http: //localhost:8980; }
	proxy_next_upstream
...

这个配置指定了nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。

error就是当机、断线之类的,timeout就是读取堵塞超时。找到提示以后我们往下看,看到最后一行的proxy_pass代理位置(需要转发的路径配置),目前写的是localhost:8980,查询端口号得知此端口连接tomcat服务。所以在此判断应该是tomcat连接出错。

然后找到tomcat配置路径(/opt/apache-tomcat-xxxx/conf)中的server.xml文件查询tomcat端口信息,搜索到如下代码:

1
2
3
4
5
6
7
8
9
<Connector port="8980" 
protocol="HTTP/1.1" 
connectionTimeout="20000" 
redirectPort="8443"
compression="on" 
compressionMinSize="2048" 
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
/>

在这可以看到http协议中的8980端口,结合上面的nginx反向代理配置信息确定是在连接tomcat时候报错。

使用top命令查看进程,也并未看到相关进程。下面我们在/opt/apache-tomcat-xxxx/bin中通过命令暂停和重启tomcat服务。

1
2
# sh shutdown.sh
# sh startup.sh

在暂停服务器的时候出现错误信息:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006f3000000, 1414856704, 0) failed;
error=’Cannot allocate memory’ (errno=12)。

这是JVM抛出的错误,提示内存分配问题。检查到这里突然想到由于业务调整刚对服务器做过调整,内存从4G降到1G,应该是这个原因导致JVM崩溃。

查找解决方法

分析后,考虑再不升级内存的情况下,通过swap添加虚拟内存,尝试重启comcat服务,添加swap步骤如下:

1、通过df -h查看磁盘使用,发现数据盘/dev/xvdb1 使用90%(共100G),清除附件到53%。

2、在/opt/下创建一个swap文件。

1
mkdir swap cd swap sudo dd if=/dev/xvdb1 of=swapfile bs=1024 count=4194304

根据上面命令分配从数据盘分配4G空间给swap。

3、把生成的文件转换成 Swap 文件

1
sudo mkswap swapfile

4、激活 Swap 文件。

1
sudo swapon swapfile

查看 free -m 的结果,说明已经生效。

Swap: 4095,9 ,4086

重启comcat服务器,启动正常。查看接口,正常。

原本以为到这就结束了,40分钟后又出现异常,查看进程JVM崩溃。停止重启服务器没有问题,好吧,继续查看原因。

使用top命令进行资源查看,发现COMMAND(Java)的%MEM在30分钟内从50%到85%,然后崩溃。
分析基本确定还是内存问题,查看JVM和服务器配置得知通常使用的JVM都是32位的,目前的64位的JVM会损失10-20%的性能,从这个点继续出发做两个修改:

1、Tomcat关闭日志catalina.out,

catalina.out文件会越来越大,对系统的稳定造成了一定的影响。

一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统的稳定造成了一定的影响。可通过修改conf/logging.properties日志配置文件来屏蔽掉这部分的日志信息。

1
catalina.org.apache.juli.FileHandler.level = WARNING

将level级别设置成WARNING就可以大量减少日志的输出,当然也可以设置成OFF,直接禁用掉。

一般日志的级别有:

SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)

也可以在bin/catalina.sh代码中的修改:

“$CATALINA_BASE”/logs/catalina.out 2>&1 &
改为:
/dev/null 2>&1 &

我使用的是第二种方法,直接代码简单粗暴。

2、修改tomcat为java分配的内存配置

linux下的tomcat:

修改TOMCAT_HOME/bin/catalina.sh

在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行:

1
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
其他说明

1、“m”说明单位是MB,否则默认是KB
2、一般使用物理内存的80%作为堆大小
3、一般把-Xms和-Xmx设为一样大
4、一般把-Xmn设置为-Xmx值的1/4
5、一般将堆的总大小的50%到60%分配给新生成的池

修改完重启comcat服务,top查看,目前运行时间16小时,%MEM维持在65%左右,正常。后续持续跟进。

Appium源码分析(7)-status模块

该模块中定义了36种不同的状态,以及状态的解释信息,还有一个模块方法,这个模块相对简单 36种状态1个json字符串定义了36个元素,每一元素代表了一个状态,每一个状态有一个名称,然后对应一个json...
  • qhshiniba
  • qhshiniba
  • 2015年05月04日 15:18
  • 4798

Docker for Windows安装与Linux+PHP开发环境搭建(二)

上一篇讲了docker安装与环境搭建的步骤,这一次主要是介绍过程中遇到的错误情形及其错误处理方法。典型的错误如 invalid registry endpoint或Connecting to tcp:...
  • freshlover
  • freshlover
  • 2015年12月29日 21:13
  • 4910

03搭建docker私有仓库

搭建docker私仓,可以使用docker官方提供的registry镜像。该镜像目前有2.0,2.3和2.3.1版本。它只与1.6.0以上版本的docker兼容。搭建私仓的步骤如下:   一:无代理、...
  • gqtcgq
  • gqtcgq
  • 2016年04月15日 17:55
  • 8784

解决方法HTTP Status 500 - description The server encountered an internal error () that prevented it from fulfilling this request

最近又在开始倒腾JSP,我都要疯了,问题一大堆!由于要在短时间内学习很多关于JSP的东东,所以借了一本明日科技的《JSP网络开发实例自学手册》,然后安装书中光盘的录像搭建配置好平台后,满心欢喜的按照光...
  • heyt860921
  • heyt860921
  • 2011年04月25日 10:53
  • 22325

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法

The server encountered an in.......的问题的一种类型:提交的数据或输入的数据超出了设定范围。 就是说定义 int,但提交的数据为 111111111111111111...
  • niaonao
  • niaonao
  • 2016年04月17日 18:57
  • 61413

"Primary script unknown" while reading response header from upstream, client: 192.168.1.102, server:

配置好了nginx和php,结果访问报这个错,经排查,是我的默认nginx配置文件解析php那里没有写root,我之前以为只要上面写有就可以,因此把php那里删掉了。 贴一下正确的配置文件:defa...
  • zhezhebie
  • zhezhebie
  • 2017年07月13日 13:22
  • 336

Drupal_CKFinder配置_The server returned an empty response

其实,CKEditor & CKFinder 的组合,配置起来确实很麻烦(本文后面附配置过程) 我差一点也放弃了要使用IMCE代替CKFinder 先说说这个问题,The server r...
  • PHP1923880282
  • PHP1923880282
  • 2013年03月12日 23:10
  • 2930

使用WinInet从HTTP服务器下载信息--Downloading from an HTTP Server using WinInet

Downloading from an HTTP Server using WinInet使用WinInet从HTTP服务器下载信息Thu, 2004-02-26 11:45 — rogerThe W...
  • iamoyjj
  • iamoyjj
  • 2011年04月16日 22:43
  • 10733

owncloud error : You are accessing the server from an untrusted domain

Few days back I setup Owncloud 6 on Ubuntu 14.04 . After a gap of a few days, I again started the ...
  • smhbqc
  • smhbqc
  • 2016年11月21日 12:54
  • 760

The server encountered an internal error () that prevented it from fulfilling this request.

在配置好从一个action跳转到另一个action后,查询出现了问题,保存action是可以运行的,而跳转到查询action就报错: --------------------------------...
  • shl7765856
  • shl7765856
  • 2012年05月29日 13:39
  • 2668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决:The proxy server received an invalid response from an upstream server
举报原因:
原因补充:

(最多只允许输入30个字)