html에서는 form안에 form을 넣을 수 없다. 

(정확히 말하면 chrom 기준)



html 코드에 div를 사용하는 것이 좋다.


<div class="form-group">

<label for="objectUrl" class="col-xs-2 control-label"><span class="fa fa-fw fa-bars"></span>이미지/동영상 업로드</label>

<div class="col-xs-10">

<input type="text" class="form-control" id="objectUrl" name="objectUrl" value="${actionTagGuide.objectUrl!}" ><br/>

   <label><input type="file" name="file" id="file" accept="image/*,video/*"/></label>

   <button type="button" class="btn btn-danger btn-upload">file upload</button> 

</div>

</div>



스크립트 코드는 다음과 같다.


<script>

$(document).ready(function() {

$('.btn-upload').on('click', function (){

if (confirm('Want to upload a image or a video file?')) {

var data = new FormData();

data.append("file", $('#file').prop('files')[0]);

console.log(data);

$.ajax({

            type: "POST",

            enctype: 'multipart/form-data',

            url: "/actiontag_guide/upload/",

            data: data,

            processData: false,

            contentType: false,

            cache: false,

            timeout: 600000,

            success: function (result) {

                console.log("SUCCESS : ", result.data.url);

                $('#objectUrl').attr("disabled", true) 

                $('#objectUrl').val(result.data.url)

            },

            error: function (e) {

                console.log("ERROR : ", e);

            }

        });

}

     });




Posted by 김용환 '김용환'




google place api response는 200이고, 

status 결과에 REQUEST_DENIED 라는 내용이 보인다. 



다양한 원인이 있을 수 있다. 동작되다가 갑자기 안된다면, ip whitelist 이슈 일 수 있다. 

whitelist를 관리 중에 새롭게 변경된 ip가 빠져 있거나,

아예 처음부터 whitelist ip를 넣지 않았다가 ip를 추가하면, 기존의 요청하던 IP가 disallow되면서 에러가 날 수도 있다.






https://developers.google.com/places/web-service/faq#_6


문제 해결

계속 "status": "REQUEST_DENIED"를 받는 이유는 무엇인가요?

다음과 같은 경우 Google Places API 웹 서비스에서 "status": "REQUEST_DENIED"를 반환합니다.

  • Google Developers Console에서 Google Places API 웹 서비스를 활성화하지 않았습니다.
  • 요청에서 key 매개변수가 누락되었습니다.
  • key 매개변수가 Google Developers Console의 API 키와 일치하지 않습니다.
  • Google Developers Console에서 API 키가 올바르게 설정되지 않았습니다.
    • 브라우저 키를 사용 중인 경우 허용된 리퍼러가 올바른지 확인합니다.
    • 서버 키를 사용중인 경우 허용된 IP가 올바른지 확인합니다.
    • Android 및 iOS 키는 지원되지 않으므로 브라우저 또는 서버 키를 사용하세요.
  • 요청이 HTTPS 요청으로 전송되지 않았습니다. 모든 Google Places API 웹 서비스 요청에는 HTTPS가 필요합니다.
  • 요청 전송에 잘못된 HTTP method가 사용되었습니다.
    • 장소 추가를 제외한 모든 요청은 GET 요청으로 전송해야 합니다.
    • 모든 장소 추가 요청은 POST 요청으로 전송해야 합니다.





Why do I keep receiving "status": "REQUEST_DENIED"?

The "status": "REQUEST_DENIED" is returned by the Google Places API Web Service when:

  • You have not activated the Google Places API Web Service in the Google Developers Console.
  • The key parameter is missing from your request.
  • The key parameter does not match the your API key in the Google Developers Console.
  • Your API key has not been correctly set up in the Google Developers Console:
    • If you are using a browser key, check that your allowed referer(s) are correct.
    • If you are using a server key, check that your allowed IP(s) are correct.
    • Android and iOS keys are not supported, please use a Browser or Server key.
  • The request was not sent as an HTTPS request, HTTPS is required for all Google Places API Web Service requests.
  • The incorrect HTTP method was used to send the request:
    • All requests must be sent as a GET request except for Place Add.
    • All Place Add requests must be sent as a POST request.



Posted by 김용환 '김용환'



인터넷을 찾아보니..


RFC 2616 (HTTP 1.1) 스펙 규격에 따르면, HTTPS 페이지에서 HTTP 페이지로 링크로 넘어갈 때, 브라우져에서 HTTP 페이지에 Referer를 넘기지 않는다. 다음 같은 조항 때문이다.



https://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3


Clients SHOULD NOT include a Referer header field in a (non-secure) HTTP request if the referring page was transferred with a secure protocol.



Posted by 김용환 '김용환'


2015년 10월 5일 작성


Google place의 map api를 사용할 때, address만 가지고 필터를 할 수 없다. 


예를 들어 특정 지역 (예를 들어 북한 관련 지역)을 자동 완성, 결과 검색시 보고 싶지 않다면 

일반적으로 address로 필터를 할 수 있다고 생각하지만, 검색해보면 많이 나오는 것을 확인할 수 있다.
(다른 회사의 서비스를 확인하다보니, 모회사의 P 서비스에서 북한 정보를 검색하면 대부분 보이지 않지만, 일부 데이터를 그대로 북한 정보가 보인다. 아마도 단어 단위의 필터를 쓴 것 같다. 독도도 리암쿠리암으로 검색하면 나온다 ㅠ)


이를 방지하려면 오직 위/경도로만 체크해야 한다. 

폴리곤 위/경도 데이터를 사용하면 완벽하게 특정 지역에 있는지를 확인할 수 있다. 북한 위치에 대한 위경도는 거의 완벽하게 나온다.






** 제일 중요. **

또한 Google place map api 사용시, 독도를 리암쿠리암으로 보이는 심각한 문제가 있기 때문에, 독도 위경도를 폴리곤으로 잡아 리암쿠리암으로 검색되지 않도록 개발할 필요가 있다.  또는 언어 locale에 어떻게 나타나는지 잘 볼 필요가 있다. 



--- 2017년 1월 내용 추가.


http://'독도'를 '리앙쿠르 암초'로 썼다가 혼난 기업들

http://v.media.daum.net/v/20170118175504257


내가 한 작업에 대해서 아무도 알아 주지도 않았지만, 내가 만든 서비스에서는 이런 이슈가 나타나지 않았다..  (뿌듯..)



Posted by 김용환 '김용환'

Java App--Web 환경 테스트할 때, 

jquery.ajax에서 java url에서 리턴하는 json string을 읽기 위해서는 

dataType을 json으로 한다. 

jQuery.ajax({
method: "GET",
data : params,
dataType: "json",
url : "/search/" + query,
success: function(searchResult){

... }

});


Posted by 김용환 '김용환'


nginx 모듈 대부분은 모듈 설치 없이 nginx 에서 지원하고 있다.


http://nginx.org/en/docs/



그러나 특정 모듈은 컴파일시 특별히 옵션을 주어야 같이 설치가 되는 모듈이 있다.

예를 들어 ngx_http_ssl_module은 --with_http_ssl_module을 설정 매개변수를 주어야 사용할 수 있다. 

http://nginx.org/en/docs/http/ngx_http_ssl_module.html


The ngx_http_ssl_module module provides the necessary support for HTTPS.

This module is not built by default, it should be enabled with the --with-http_ssl_module configuration parameter.

This module requires the OpenSSL library.



또는 이미 포함된 모듈은 --without 접두사가 붙는 형태로 컴파일시 옵션으로 설치가 안되게 할 수 있다.

--without-http_access_module과 같이 사용한다.


기본적으로 nginx에 포함된 모듈과 포함되지 않는 모듈을 확인하기 위해서는 

다음 페이지를 방문한다. 자세히 설명된다.
http://wiki.nginx.org/Modules

http://nginx.org/en/docs/



Posted by 김용환 '김용환'


nginx를 설치하면, ngx_http_upstream_module 을 따로 로딩할 필요 없이 사용할 수 있다.

nginx -V 로 보이는 모듈 리스트에서는 보이지 않는다. 


$ /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.6.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)

TLS SNI support enabled

...



nginx.conf 파일을 upstream 및 proxy_pass로 설정한다. 192.168.0.1~2로 reverse proxy 연결을 지원한다(예를 들어 nginx-tomcat 간의 connection을 연결하는 형태). keepalive를 사용하면 keep alive 기능과 동일하다. (time_wait 이 거의 발생하지 않는다.)


http {


  upstream pp-server {

    server 192.168.0.1;

    server 192.168.0.2;

    server 192.168.0.3;

    keepalive 30;

  }


  server {

    listen 80;

    server_name localhost;



    location / {

      proxy_pass http://pp-server;

    }

  }

}



nginx+ (상용 버전)에서는 고급 기능을 쓸 수 있다.



*튜닝 요소

keepalive 사용시 숫자를 잘 정의해야 한다. keepalive를 사용하는 것이 socket close를 최대한 적게 할 수 있다는 장점이 있지만, 너무 작게 설정하면, 작은 수의 socket close를 계속 발생할 수 있다. 

개인적으로 ulimit으로 해서 file socket 개수가 무한대라면, 높은 값(15000)을 주어도 무방한 듯 하다. 

테스트를 통해 확인해보니 너무 작게 주면 그 개수안에서 LRU 정책을 사용하여 socket close가 여전히 발생한다. 많이 줄 수록 socket close는 거의 발생하지 않았다.




* 참조

http://nginx.org/en/docs/http/ngx_http_upstream_module.html






Posted by 김용환 '김용환'


예전에 점검이라는 단어를 외국에서는 maintainance 라고 적었었다.



동사와 함께 쓰일 때는 undergo를 함께 쓴다. 

'점검중이다' 라는 영어문구이다.


Web service is undergoing maintainance.

Web application is undergoing maintainance.


또는 동사 없이 쓸 때는 in progress를 쓰는 것이 좋다. 


maintainance in progress. 

Posted by 김용환 '김용환'



- 종료 (stop)


$ ps -ef | grep logstash 

$ kill <processid>



- 시작 (start)


$ nohup bin/logstash -f conf/logstash.conf 2>&1 &

Posted by 김용환 '김용환'


 Backend 서비스중 하나로서, Apache Http 서버를 실행해서 Tomcat과 붙여서 테스트하면 느리다고 한다. Tomcat만 실행하면 1초 내외라 한다. UI 정적 리소스는 전혀 없고, 하나의 ip에서 ui요청하면 여러 리소스를 서비스하는 것이 아니라 1건씩 처리해주는 서버이다. 완벽하지는 않지만, 도움이 될 듯 해서 공유한다. 



<성능>

1. KeepAlive

Apache 설정 보니. KeepAlive 설정은 전혀 보이지 않는다. 


KeepAlive on/off 여부

KeepAliveTimeout 숫자


디폴트는 On 이라, 따라서 서버 소켓 개수 여부는 리눅스의 ulimit 개수까지 file open이 된다. 그리고 KeepAliveTimeout은 5초입니다.  Session이 다르면 해당 소켓을 쓸 수 없다. 

http://httpd.apache.org/docs/current/ko/mod/core.html#keepalive


UI가 많은 포털에서는 KeepAlive가 유용하지만, 해당 서버의 경우 요청이  그렇지 않기 때문에 검토해야 한다. 

그러나 Client쪽에서 KeepAlive로 통신하는 경우를 선호한다면, KeepAlive를 On으로 하는 것이 좋다. 소켓은 열고 닫는 비용이 항상 비싸다..





2. Timeout 

Timeout 설정은 없다. Timeout은 디폴트값은 60초이다. 

즉 특정 클라이언트의 ack / syn 가 오지 많으면 60초를 기다리라는 뜻으로, 5초나 10초로 짧게 해주면 좋을 듯 하다. IDC내부라면 최대 5이다.

http://httpd.apache.org/docs/current/ko/mod/core.html#timeout


Timeout 5


3. ulimit -f 확인

ulimit -f 하셔서 프로세스에서 최대 몇개의 파일을 open할 수 있는지 체크해야 한다. 

보통은 ulimited 또는 최소 34000개 이상의 값을 지정한다.  keepalive로 사용할 경우 이 값이 굉장히 중요해며, 성능의  중요 factor중 하나가 된다. 



4. mpm_worker_module

mpm_worker_module 부분의 MaxClients 설정값과 StartServer를 늘려주는 것이 좋을 듯 싶습니다.  메모리는 조금 늘어나도 성능이 늘어나기 때문이다. 어느정도 성능이 필요한 서버이기 때문에 초기값을 조금 많게 잡고 MaxClients 개수를 높여 성능 이슈가 없게 할 수 있다. 


<IfModule mpm_worker_module>

    StartServers          128

    MaxClients           1024

    MinSpareThreads      25

    MaxSpareThreads      75

    ThreadsPerChild      25

    MaxRequestsPerChild   0

</IfModule>



5. mod_jk timeout

mod_jk에 timeout을 사용하는 것이 좋다.

http://knight76.tistory.com/entry/modjk%EC%9D%98-workersproperties-%EC%84%A4%EB%AA%85




<보안 관점>


1. SSL쪽은 이거 보셔서 알고리즘을 변화시키면 된다. 

 http://unhandledexpression.com/2013/01/25/5-easy-tips-to-accelerate-ssl/


SSLHonorCipherOrder On
SSLCipherSuite ALL:!ADH:!EXP:!LOW:!RC2:!3DES:!SEED:!RC4:+HIGH:+MEDIUM

2. Directory

보안을 높이기 위해서는 cgi-bin같은 디렉토리, ui 디렉토리를 보여주지 않도록 설정한다. 




<기타>

Tomcat쪽도 server.xml의 Timeout을 확인한다. 

 

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html


connectionTimeout 같은 류를 꼭 체크한다. 


Posted by 김용환 '김용환'