Jetty 가 요청 URI 에 불법 문 자 를 입력 하면 Jetty 가 연결 을 끊 어 nginx 가 이 노드 가 건강 하지 않다 고 생각 합 니 다.

3038 단어 nginxjetty
 
 

jetty 在请求URI里传入非法字符(如直接一个16进制字节A1,非%A1,用抓包TCP工具发送),jetty抛出如下错误

8.1.0.RC1、

8.1.18.v20150929、

9.3好的

如果前面代理用nginx的proxy_next_upstream,会认为该节点失效,如果请求刷的厉害,有可能所有节点都被刷成不健康状态;导致nginx返回给用户502;

org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte Fd in state 0
	at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:178)
	at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:117)
	at org.eclipse.jetty.http.HttpURI.toUtf8String(HttpURI.java:503)
	at org.eclipse.jetty.http.HttpURI.getPathAndParam(HttpURI.java:687)
	at org.eclipse.jetty.server.Request.getRequestURI(Request.java:1024)
	at org.eclipse.jetty.server.Response.sendError(Response.java:364)
	at org.eclipse.jetty.server.Response.sendError(Response.java:419)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:603)
	at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Thread.java:695)

8.1.18 요청 을 처리 할 때 utf - 8 코드 가 실 패 했 을 때 ios - 8859 - 1 을 사용 하여 404 를 찾 을 수 없습니다.
2015 - 11 - 16 15: 37: 43.763: WARN: oejs. AbstractHttpConnection: Failed UTF - 8 decode for request path, trying ISO - 8859 - 1 그런데 이상 한 것 은 되 돌아 오 는 것 을 처리 하고 있 습 니 다.
Response. sendError, 코드 에서 호출
Request. getRequestURI 는 utf - 8 코드 를 사용 하여 이상 을 일 으 켜 연결 을 직접 닫 습 니 다.
초보적인 해결 방향:
1. 9 버 전 으로 올 라 갑 니 다. 하지만 jetty 9.3 은 기본적으로 jdk 8 을 컴 파일 하고 jdk 는 6 에서 달리 고 있 습 니 다. 위험 이 적지 않 습 니 다.
2. nginx 개 nginxupstream_check_module
http://nolinux.blog.51cto.com/4824967/1594029
3. 8.1.18 코드 (손 이 설 다 니) 를 고치 고 초보 적 인 생각
response. sendError () --- > request. getRequestURI () -- > HttpURI. getPathAndParam 발생 NotUtf8Exception 을 8599 - 1 로 바 꾸 어 가 져 옵 니 다.
 public String getPathAndParamISO8859()
    {
        if (_path==_query)
            return null;
        return StringUtil.toString(_raw,_path,_param-_path,StringUtil.__ISO_8859_1);
    }

4.proxy_next_upstream 마지막 에 max 추가fails = 0 의 노드, 어차피 앞 이 틀 렸 으 니 이 노드 는 버 티 고 있다.
 
jetty, nginx 는 익숙 하지 않 습 니 다. 큰 소 가 있 으 면 지도 하고 기록 하 세 요. 사람 을 실수 하 는 것 은 탓 하지 마 세 요!!!!

좋은 웹페이지 즐겨찾기