'HTTP'에 해당되는 글 7건

  1. 2022.03.15 [Gradle] build.gradle 에서 maven insecure protocol 설정
  2. 2021.12.07 [Elasticsearch] LLRC + Springboot 성능 튜닝 팁
  3. 2021.01.27 [Chrome] https 강제 리다이렉팅
  4. 2017.03.27 [Elasticsearch] Head plugin에서 Multi Cluster 연결하기 2
  5. 2017.02.06 [HttpClient] javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name
  6. 2017.02.02 [AWS] ELB + http to https + Nginx 설정
  7. 2007.04.18 [HTTP Method] post vs get

[Gradle] build.gradle 에서 maven insecure protocol 설정

ITWeb/개발일반 2022. 3. 15. 12:39

maven. uri 설정 시 https 가 아닌 http 를 사용 할 경우 gradle 7.x 에서는 아래 설정을 추가해 주면 됩니다.

 

repositories {
	mavenCentral()
    
    maven {
    	url = uri("http://nexus.xxxxx.com/repository/snapshots")
        allowInsecureProtocol = true
    }
    
    maven {
    	url = uri("http://nexus.xxxxx.com/repository/public")
        allowInsecureProtocol = true
    }
}

 

:

[Elasticsearch] LLRC + Springboot 성능 튜닝 팁

Elastic/Elasticsearch 2021. 12. 7. 09:14

대부분의 성능 이슈는 서버 엔진 보다는 클라이언트 단에서 사용을 잘 못 하는 경우가 많이 있습니다.

 

Low Level Rest Client 와 Springboot 조합으로 API 개발 시 튜닝 요소를 조금 정리 합니다.

나중에 또 기억 못할 것 같으니...

 

RestClientBuilder 에 보면 아래와 같이 기본 설정이 되어 있습니다.

public static final int DEFAULT_MAX_CONN_PER_ROUTE = 10;
public static final int DEFAULT_MAX_CONN_TOTAL = 30;

이 기본 값으로 그냥 사용하게 되면 너무 리소스를 제한적으로 사용하기 때문에 성능이 제대로 나오지 않게 됩니다.

해당 값을 적절하게 튜닝을 하셔야 하는데 모든 케이스에 다 적용 가능한 부분은 아니지만 그래도 가늠 할 수 있는 기준 정도로는 사용이 가능 할 것 같아 공유 합니다.

분석 결과는 Core 1 개당 setMaxConnPerRoute 설정 시 25 개씩이 최적 값으로 보입니다.
4 core 짜리면 4 x 25 = setMaxConnPerRoute(100)

 

아래는 실제 코드 내부에 작성 되어 있는 코멘트를 보여 드리기 위해 캡쳐 했습니다.

HttpAsyncClientBuilder httpClientBuilder = HttpAsyncClientBuilder.create().setDefaultRequestConfig(requestConfigBuilder.build())
  //default settings for connection pooling may be too constraining
  .setMaxConnPerRoute(DEFAULT_MAX_CONN_PER_ROUTE).setMaxConnTotal(DEFAULT_MAX_CONN_TOTAL)

 

코드에서도 동일하게 기본 설정은 너무 제한적일 수 있다고 되어 있습니다.

 

Embedded Tomcat 에서의 기본 Max Connection 은 8192 개 입니다.

Tomcat 과 HttpClient 그리고 Elasitcsearch 에 대한 각각의 Connection, Thread Count 를 잘 조정 하셔야 성능을 최적화 할 수 있습니다.

 

추가적으로 Connection 과 Route 의 비율은 10:1 정도가 적절해 보입니다.

 

아래는 Tomcat 기본 설정 내용입니다.

- Embedded Tocmat 의 설정 중
    acceptCount 는 기본 100 개 이며 이 설정은 maxConnection 에 다다랐을 때 OS 레벨에서 큐잉 하게 되는 값 입니다.
    maxConnections 는 기본 8192 개 이며 NIO/NIO2 를 사용 하며, -1 로 설정 시 카운팅 하지 않습니다. (unlimited)
    maxThreads 는 기본 200 개 이며 connection 당 생성 가능한 최대 thread 수 입니다.
    BIO 일 경우 maxConnections 와 maxThreads 값은 같아야 합니다.


정답은 없으나 시스템 리소스 상황에 맞춰서 최적 값을 찾아 내는게 제일 중요 합니다.
위에 설정 방식이나 값이 최적 값이 아니며 상황에 맞춘 최적 값이고 다른 환경에서는 튜닝 포인트가 된다고 보는게 좋을 것 같습니다.

시스템의 ulimit 설정을 꼭 확인 하고 사용하는 stack 의 default 값도 꼭 확인 하고 사용 합시다.

성능 최적화를 위해 함께 살펴 봐야 하는 소스 코드는 

Java NIO, Executor
Tomcat Connector
Http Client (Components)
Elasticsearch RestClient

 

:

[Chrome] https 강제 리다이렉팅

ITWeb/개발일반 2021. 1. 27. 12:38

http://DOMAIN:PORT 와 같이 접속 해야 할 일이 있는데 크롬에서는 강제로 https 로 redirect 시켜 버립니다.

아래 페이지에서 강제 redirect 를 해제할 도메인을 등록 하고 사용 하면 문제를 해결 할 수 있습니다.

 

chrome://net-internals/#hsts

 

왼쪽 메뉴에서 "Domain Security Policy" 를 클릭 합니다. (위 링크로 들어 가면 바로 나옵니다.)

본문 제일 아래 "Delete domain security policies" 에서 Domain 입력 후 Delete 버튼을 누르면 추가 됩니다.

 

버튼 이름이 Delete 라 이게 된게 맞아? 할 수 있는데 된게 맞습니다.

www.xxxxx.com  이면 xxxxx.com 을 입력

123.xxxxx.com 이면 123.xxxxx.com 을 입력

 

참 쉽죠.

:

[Elasticsearch] Head plugin에서 Multi Cluster 연결하기

Elastic/Elasticsearch 2017. 3. 27. 15:43

head plugin 을 사용하면서 restful api 를 이용해서 elasticsearch cluster 정보를 얻어 올 수 있습니다.

다만, restful api 를 사용하기 위해서는 아래 설정을 각 노드에 해줘야 합니다.


참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html

https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-http.html


http.cors.enabled: true

http.cors.allow-origin: "*"

http.cors.allow-credentials: true


단, 주의 하셔야 하는 점은 해당 노드들이 외부로 노출 되어 있지 않다는 전체 조건이 있을 경우 위와 같이 사용하시기 바랍니다.


:

[HttpClient] javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name

ITWeb/개발일반 2017. 2. 6. 11:33

http 통신 기능 구현 시 아래와 같은 에러를 접하는 경우가 있어서 해결 방법을 기록해 봅니다.


[에러내용]

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name

    at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1441)

    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2016)

    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)

    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)

    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)

    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)

    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)

    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)

    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)



[해결방법]

JVM 실행 시 옵션 추가)

-Djsse.enableSNIExtension=false


Application 내부에서 설정 추가)

System.setProperty(“jsse.enableSNIExtension”, “false”);

:

[AWS] ELB + http to https + Nginx 설정

ITWeb/개발일반 2017. 2. 2. 10:12

요즘 대부분의 서비스들이 http 를 제거 하고 https 로 서비스 하기 시작했습니다.

AWS 에서 제공하는 SSL 을 이용해서 ELB 에 구성하신 분들의 경우 대부분 아래와 같이 되어 있을 것 같은데요.


http://service    -> elb:80   -> ec2:80

https://service  -> elb:443  -> ec2:80


이와 같이 되어 있다 보니 개별 ec2 에서는 모두 listen 80 만 하게 됩니다.

그래서 client 에서 http 로 들어 왔는지 https 로 들어 왔는지 확인이 필요 한데요.

이 경우 아래와 같은 변수들을 활용해서 설정을 하시면 됩니다.


[참고문서]

http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html


[X-Forwarded Headers]

X-Forwarded-For

X-Forwarded-Proto

X-Forwarded-Port


[Nginx 설정]

server {

  listen       80;

  server_name  localhost;


  if ($http_x_forwarded_proto = 'http') {

    return 301 https://$server_name$request_uri;

  }

}


참고 용이니 실 서비스에 적용 시 충분한 테스트 후 적용하시기 바랍니다.

:

[HTTP Method] post vs get

ITWeb/스크랩 2007. 4. 18. 13:17

누가 http method 중 post 와 get 의 차이점이 무엇인지 물어 보더라구요.
인터넷개론에서 배웠던것 같은데 지금은 실무를 하면서 개념적으로 이해를 하면서 사용을 하다 보니 명확하게 이론적으로 설명을 잘 못해 주겠더라구요..

그래서 찾아 봤습니다.. ^^;

ref. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

get 과 post 만.. 간단히 설명 드리겠습니다.

- get method
    이 메서드는 form 에 포함되어 있는 entity 즉 request uri 에 의해서 전달이 되어 집니다.
    더 쉽게 얘기 하자면 query string 으로 해서 data 가 전달되는 형식 입니다.
    그냥 plain/text 로 전달되는게 아니고 application/x-www-form-urlencoded 되어 전달 됩니다.

- post method
    이 메서드는 get 방식과 틀리게 body 를 통해서 전달이 되게 됩니다.
    쉽게 얘기 해서 눈으로 봐서는 어떤 data 가 오고 가는지 확인이 힘들죠.
    body 패킷을 분석하게 되면 알수가 있게 됩니다.
   
추가적으로 보안과 관련된 내용인데요.
중요한 정보에 대해서는 get 을 사용하지 말고 post 를 사용하라고 되어 있습니다.
ref. http://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3
왜 그런지는 아시죠!!
get 보다는 안전 하지만 역시 body 의 패킷을 분석하면 다 알수 있기 때문에 하나의 guideline 이라고 보시면 좋을것 같습니다.
(보안에 민감한 내용들은.. SSL 을 사용하기를 권장하구요 ^^* https:// 말이죠.. )

: