소개


grep은 "global regular expression print"의 약어로, "파일 전체에서 정규 표현식과 일치하는 것을 출력하라"는 의미를 가지고 있다.


문자열 검색


-r 옵션는 recursive로서 서브 디렉토리까지 검색을 하게 된다.


파일에서 검색

grep "검색하고 싶은 문자열" [파일명]

디렉토리에서 검색

grep "검색하고 싶은 문자열" [디렉터리명]

grep -r "검색하고 싶은 문자열" [디렉터리명]


대소문자 구분 없이 검색


grep -r -i "검색하고 싶은 문자열" [디렉터리명]


정규 표현식 검색


정규 표현식은 특수한 기호를 사용해 검색하고 싶은 내용을 유연하게 표현하는 방법이다.


 기호

 설명

 ()

 그룹화

 |

 좌우 중 하나

 ?

 직전 표현이 0회 또는 1회 등장

 *

 직전 표현이 0회 이상 연속해서 등장

 +

 직전 표현이 1회 이상 연속해서 등장

 .

 임의의 한 문자

 ^

 줄 머리

 $

 줄 끝

 \ 다음에 오는 문자를 이스케이프



이름 찾기


grep -r -i -E "(sunghoon|성훈)" [디렉터리명]


핸드폰 번호 찾기


grep -r -i -E "0[0-9]{1,2}-[0-9]{3,4}-[0-9]{4}" [디렉터리명]


'서버 > 리눅스 명령어' 카테고리의 다른 글

[리눅스] sudo  (0) 2017.02.03
[리눅스] strings 명령어  (0) 2016.08.30
[리눅스] vi 에디터에서 텍스트 바꾸기  (0) 2016.06.08
[리눅스] vi 에디터 기본  (0) 2015.12.28
[리눅스] find  (0) 2015.12.16
Posted by SungHoon, Park
,

소개


sudo는 "substitute user do"라는 뜻으로서, 일부 또는 전체 명령어를 ROOT 계정 또는 다른 계정의 권한으로 실행할 수 있도록 한다.


su vs sudo


su 명령어는 다른 계정으로 전환을 한다. 사용이 필요한 명령어가 있어 ROOT 계정으로 전환을 하고 명령어 수행 했더라도 계속 접속이 유지되므로 보안에 문제가 발생하게 된다. sudo 명령어는 특정 작업에만 수행할 수 있는 권한을 부여해 주는 것이므로 이러한 보안 문제점을 방지할 수 있다.


사용법


sudo [실행할 명령어] 형태로 사용이 가능하다. 명령어를 입력 후 엔터키를 입력하게 되면 본인의 비밀번호를 묻는다. 비밀번호를 정상적으로 입력하게 되면 /etc/sudoers에 등록된 사용자인지 검증을 한 후 명령어를 실행하게 된다.


ROOT 계정으로 수행


sudo useradd user1


다른 계정으로 수행


sudo -u sunghoon useradd user1


sudoers를 이용한 권한 부여


sudo vi /etc/sudoers 편집으로 권한을 추가할 수 있다. 추가할 계정의 권한을 파일 하단에 추가하면 된다.


user1 계정에 useradd, usermod 권한을 추가


user1 ALL=/usr/sbin/useradd,/usr/sbin/usermod


참고자료


'서버 > 리눅스 명령어' 카테고리의 다른 글

[리눅스] grep  (0) 2017.02.10
[리눅스] strings 명령어  (0) 2016.08.30
[리눅스] vi 에디터에서 텍스트 바꾸기  (0) 2016.06.08
[리눅스] vi 에디터 기본  (0) 2015.12.28
[리눅스] find  (0) 2015.12.16
Posted by SungHoon, Park
,

문제점

아파치에서 에러 페이지 설정을 위해 다음과 같이 설정하였다.


ErrorDocument 404 /standby/notfound.html


그러나 이상하게도 크롬, 파이어폭스 브라우저에서는 404 에러 페이지가 잘 노출되나, IE 브라우저에서는 에러 페이지가 노출되지 않았다.

원인

이유를 알지 못해 계속 헤맸는데, 확인해보니 IE 브라우저 버그였다.

IE 브라우저는 512 바이트 이상이여야 404 에러 페이지를 노출하고, 512 바이트 이하일 경우 IE 브라우저에서 '웹 페이지를 찾을 수 없습니다' 메세지를 노출해준다.

해결

  • 에러 페이지의 크기를 512 바이트 이상으로 설정하여 정상적으로 노출될 수 있도록 변경하였다.
  • 또 다른 방법으로는 인터넷 옵션에서 'HTTP 오류 메세지 표시'를 체크 해제하는 방법이 있는데, 근본적인 해결책은 아닌듯 하다.

참고

각 에러코드마다 파일 사이즈가 다르니 다음 URL을 확인해보는 것도 좋을 것 같다.

http://www.404-error-page.com/404-error-page-too-short-problem-microsoft-ie.shtml




Posted by SungHoon, Park
,

strings 명령어는 바이너리 파일에서 문자열을 추출하는 역할을 한다.

아파치의 mod_jk.so 버전을 확인하고 싶을 경우 다음과 같이 실행하면 된다.


예제) strings mod_jk.so | grep mod_jk/


mod_jk/1.2.31 (1026297)

mod_jk/1.2.31


'서버 > 리눅스 명령어' 카테고리의 다른 글

[리눅스] grep  (0) 2017.02.10
[리눅스] sudo  (0) 2017.02.03
[리눅스] vi 에디터에서 텍스트 바꾸기  (0) 2016.06.08
[리눅스] vi 에디터 기본  (0) 2015.12.28
[리눅스] find  (0) 2015.12.16
Posted by SungHoon, Park
,

윈도우즈에서 작업한 파일을 리눅스에서 열 경우 라인 끝마다 ^M 문자가 들어간 것을 볼 수 있다.

특히, 쉘스크립트 등에 포함이 될 경우 쉘이 동작하지 않게 된다.

아파치쪽 SSL 패스워드(SSLPassPhraseDialog) 설정과 톰캣쪽 환경설정 파일(setenv.sh)이 쉘로 되어 있었는데 ^M 떄문에 정상적으로 뜨지 않아 헤맴 -ㅅ-;


어쨌든 ^M을 없애는 방법은 간단하다.

vi 에디터를 열고,


:%s/^M//g

(^M은 단순 텍스트 입력이 아닌 Ctrl + v + m으로 입력하여야 한다.)


이렇게 명령어를 날려주면 된다.


Posted by SungHoon, Park
,

[톰캣] JSESSIONID

서버/톰캣 2016. 7. 28. 14:19

JSESSIONID란?

- 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키

- HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고 응답후 연결은 끊기게 되므로 상태를 유지할 수 없다.

- 따라서, 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 한다.


동작방식에 대해서

1. 브라우저에 최초 접근시 톰캣은 Response 헤더에 다음과 같이 JSESSIONID값이 발급된다.


Set-Cookie: JSESSIONID=3CB361E0BE1A9A7DE7DB926DF0772BAE


2. 브라우저 재요청시 Response를 통해 받은 JSESSIONID를 Request 헤더의 쿠키에 값을 넣어 서버에 요청한다. 쿠키를 통해 JSESSIONID값을 전달받게 되면 서버는 새로운 JSESSIONID 값을 Response 헤더에 발급하지 않는다.


3. 클라이언트로부터 전달받은 JSESSIONID값을 기준으로 서버에서는 세션 메모리 영역에 상태를 유지할 값들을 저장할 수 있게 된다. (HttpSession 등)


유지범위

- 동일한 Full 도메인 (서브도메인이 다를 경우 쿠키가 유지되지 않으므로..)

- 포트번호는 달라도 무관하다.


한계

- 톰캣 컨테이너를 2대 이상 사용하게 될 경우 세션을 유지할 수 없다. 유지가 되기 위해서는 세션 클러스터링 환경을 구축하여야 한다.

'서버 > 톰캣' 카테고리의 다른 글

[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,

사실 이 기능을 막기위해 찾게된 건 아니고,

반대로 담당 시스템에서 iframe으로 타서비스를 사용중이였는데 갑자기 아래와 같은 메세지가 떠서..

ㅠㅠ;


"이 콘텐츠를 프레임에 표시할 수 없습니다."

이 웹 사이트에 입력한 정보의 보안을 위해서 이 콘텐츠의

게시자가 프레임 내 표시를 혀용하지 않습니다.


이런걸 ClickJacking이라고 하는 듯. 여튼!


아파치의 확장헤더 X-Frame-Options를 추가하여 우리 서비스를 외부서비스 iframe에서 호출하지 못하도록 막을 수 있다.


예제) Header always append X-Frame-Options SAMEORIGIN


X-Frame-Options 값

 설명

 DENY

 해당 페이지는 frame 내에서 표시 불가

 SAMEORIGIN

 동일 origin에 대해서만 frame 내에서 표시

 ALLOW-FROM uri

 특정 origin에 대해서만 frame 내에서 표시


※ 확장헤더이므로 브라우저마다 지원현황이 다르므로 주의하도록 한다.

- IE8+

- Opera 10.50+

- Safari 4+

- Chrome 4.1.249.1042+ (Allow-From not yet supported)

- Firefox 3.6.9 (or earlier with NoScript)


※ 참고자료

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

https://blogs.msdn.microsoft.com/ieinternals/2010/03/30/combating-clickjacking-with-x-frame-options/



Posted by SungHoon, Park
,

server.xml은 아래의 톰캣 아키텍처 구조를 그대로 반영한 설정파일이므로, 다음과 같은 구조를 파악하는 것이 설정파일 이해에 많은 도움이 된다.



1. <Server>

- 최상위 컴포넌트로서, 톰캣의 인스턴스와 동일하다.

- 1개 이상의 <Service>를 포함한다.

- 기본으로 8005 포트가 설정되어 있다. 여러개의 톰캣 인스턴스를 사용할 경우, 포트번호 설정을 다르게 하여야 한다.


속성

 설명

 shutdown

 톰캣을 셧다운할 때, 사용할 텍스트를 설정한다. 

 기본으로 "SHUTDOWN"이 설정되어 있는데 TCP 소켓으로 SHUTDOWN 텍스트를 날리면 톰캣 서버가 종료된다. (링크참조)

 따라서, 보안강화를 위해 shutdown의 텍스트를 임의로 변경하거나, 포트 설정을 port="-1"로 셋팅하고 자체적으로 kill 명령을 통해 종료처리를 할 수 있다.


2. <Listener>

- <Server>의 하위 컴포넌트

- 특정 이벤트들을 리스닝하고 이벤트 발생시 응답한다.


3. <GlobalNamingResources>

- <Server>의 하위 컴포넌트

- <Resource> 등을 통해서 전역 리소스를 설정한다. (JNDI 등...)


4. <Service>

- <Server>의 하위 컴포넌트

- 1개 이상의 <Connector>와 <Engine>을 포함한다.

- 기본으로 설정된 이름은 Catalina이다. 여담으로 Catalina 이름의 유래는 톰캣 서블릿 컨테이너를 고안한 Craig McClanahan이 좋아한 섬(Catalina Island) 이름이였다고 한다. (링크참조)


5. <Connector>

- 톰캣은 기본적으로 HTTP(8080), HTTPS(8443), AJP(8009) 커텍터를 제공한다.

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

- AJP Connector : https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html


 속성

 설명

port

 포트번호

protocol

 프로토콜명 (HTTP/1.1, AJP/1.3 등..)

acceptCount

 Request 큐의 길이를 설정한다. HTTP 요청시, IDLE 쓰레드가 없을 경우 해당값만큼 요청을 대기한다. 대기 큐에 들어간다는 것은 처리가능한 쓰레드가 없다는 의미이며, 기능장애 가능성이 높다. 따라서, 계속 대기 큐에 쌓이도록 하는 것보다 0~10 내외로 값을 낮게 주어 처리하도록 한다.

redirectPort

 SSL 요청이 들어올 경우 리다이렉트될 포트번호

URIEncoding

 GET 요청을 처리할 때 사용할 인코딩 방식을 설정한다. 톰캣은 기본적으로 ISO-8859-1인데, 한글 사용을 위해 UTF-8로 변경을 해주도록 한다

useBodyEncodingForURI

 true/false로 설정한다. 

 이 값은 request.setCharacterEncoding()으로 설정한 값으로 인코딩을 처리한다. 스프링 프레임워크를 사용할 경우 web.xml에서 CharacterEncodingFilter로  선언해주는 값으로 인코딩을 하게 된다

maxParameterCount

 GET 또는 POST로 전달할 수 있는 파라미터 갯수

 기본값은 10000개

 0으로 설정하게 되면 갯수에 제한을 두지 않는다.

maxPostSize

 POST로 전달할 수 있는 bytes 사이즈
 기본값은 2Mbytes(2097152)
 0이하의 숫자로 설정하게 되면 bytes 사이즈에 제한을 두지 않는다

connectionTimeout

 타임아웃 밀리세컨드

 기본값은 60000(60초)이며 -1일 경우 타임아웃의 제한이 없다

connectionUploadTimeout

 데이터 업로드에 대한 타입아웃 밀리세컨드
 이 설정은 disableUploadTimeout이 false일 경우에 효과가 있다

maxThreads

 Connector에서 처리할 수 있는 동시 요청 쓰레드 갯수

 기본값은 200개

 아파치와 연동할 경우 MaxClients 값과 관계가 있다. 아파치 MaxClients가 톰캣의 maxThreads보다 많을 경우 hang이 걸릴수가 있다.


 ※ maxThreads X 로드밸런싱 갯수 = MaxClients * 1.1 (또는 1.2)

    아파치 prefork 방식 기준이다.


 ※ http://knight76.tistory.com/entry/Apache-http-서버와-tomcat-서버간의-연결-유의사항 참고

minSpareThreads

 최소로 유지할 쓰레드 갯수
 기본값은 10

maxSpareThreads

 idle 상태로 유지할 최대 쓰레드 갯수

 톰캣6 이후로 없어진 속성값. 톰캣 5.5까지 지원한다.


6. <Engine>

- 커넥터로 수신한 클라이언트의 요청을 처리하고 응답한다.

- 기본으로 설정된 이름은 Catalina이다.


7. <Host>

- VirtualHost를 의미하며, name 속성으로 설정된 호스트명으로 웹 애플리케이션을 제공한다.

- 기본으로 설정된 이름은 localhost이다.

- 하나의 톰캣 인스턴스에 여러개의 <Host>도 사용가능하나, 보통 톰캣 인스턴스당 1개의 <Host> 설정을 추천한다.


속성

 설명

 appBase

 웹 애플리케이션이 존재하는 경로. CATALINA_BASE의 webapps를 기본으로 한다.

unpackWARs

 기동시 war 파일을 압축해제한다.

autoDeploy

 class 파일, JSP, XML 등이 갱신되었을 때 자동으로 배포한다.


8. <Context>

- 웹 애플리케이션의 의미한다.

- <Context> 설정이 <Host>안에 없을 경우 기본적으로 webapps 하위의 ROOT 디렉토리(or ROOT.war)을 기본경로(http://localhost:8080/)로 설정한다.


- 컨텍스트 설정은 CATALINA_BASE 하위의 conf 디렉토리에서도 설정할 수 있다.

예제) %CATALINA_BASE%\conf\[엔진명]\[호스트명] 하위에 설정파일 추가.

- %CATALINA_BASE%\conf\Catalina\localhost\host-manager.xml

  <Context antiResourceLocking="false" privileged="true" useHttpOnly="true" />


- %CATALINA_BASE%\conf\Catalina\localhost\manager.xml

  <Context antiResourceLocking="false" privileged="true" useHttpOnly="true" />


9. <Valve>

- 요청을 처리하는 파이프라인 사이에 추가되어 특별한 처리를 수행하는 컴포넌트다.

- Valve는 Catalina 컨테이너(Context, Host 또는 Engine)에 추가되어, 요청과 응답 사이에 pre-processing을 가능하게 한다. <Context>에 추가되면 해당 웹 애플리케이션에 Valve가 적용, <Host>에 추가되면 모든 웹 애플리케이션에 Valve가 적용된다.

- Servlet Filter와 비슷한 기능이나, Servlet은 EE 스펙, Valve는 톰캣 스펙이다.


※참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

http://i5on9i.blogspot.kr/2014/07/tomcat-valve-servlet-filter.html

https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html

http://bcho.tistory.com/788





'서버 > 톰캣' 카테고리의 다른 글

[톰캣] JSESSIONID  (0) 2016.07.28
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,

conf 디렉토리 하위에는 7개의 설정파일이 존재한다.


1. server.xml

- 톰캣 설정에서 가장 중요한 파일이다. 톰캣의 Service, Connector(포트 설정 등), Host 정보와 같은 중요한 정보들을 설정한다.


2. catalina.policy

- 보안 정책 권한 설정 파일이다. JVM에 의해서 웹 애플리케이션에 강제적으로 보안 정책 권한을 설정한다.


3. catalina.properties

- 서버를 시작할 때 검색하는 서버, 공유로더, jar 등의 공유정보를 포함한다.


4. tomcat-users.xml

- 사용자 권한과 인증 정보를 설정한다.

- 톰캣 관리자를 사용할 때 활용되는 정보이며, 기본적으로 주석처리가 되어 있다. 주석해제 및 설정을 하여야 톰캣 관리자가 활성화 된다.


5. logging.properties

- 톰캣 인스턴스의 로깅 설정 파일이다.

- 톰캣에서는 java.util.logging을 구현한 줄리(tomcat-juli.jar) 라이브러리를 로깅 서비스로 활용한다.

- 기본적으로 4가지 로그 파일을 설정한다.


1. catalina.{yyyy-mm-dd}.log

- 톰캣 로그 : 서버로그 or 카탈리나 로그로도 불린다.

- stdout(System.out), stderr(System.err)에 관한 에러로그들을 출력한다. 


2. localhost.{yyyy-mm-dd}.log

- server.xml에 설정된 호스트들의 로그


3. manager.{yyyy-mm-dd}.log

- 톰캣 관리자 애플리케이션 로그


4. host-manager.{yyyy-mm-dd}.log

- 호스트 관리자 애플리케이션 로그


6. web.xml

- 톰캣 인스턴스에서 사용하는 기본 설정파일이다. 웹 애플리케이션에서 web.xml이 설정되어 있다면 웹 애플리케이션 설정이 우선한다.


7. context.xml

- 세션, 쿠키 저장경로 등을 지정하는 설정 파일이다.


'서버 > 톰캣' 카테고리의 다른 글

[톰캣] JSESSIONID  (0) 2016.07.28
[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,

톰캣을 구성하는 디렉토리 구조는 다음과 같다.


디렉토리명

설명

톰캣엔진

사용

인스턴스

사용

 bin

 톰캣 실행시 사용하는 스크립트 디렉토리

 

 conf

 웹 어플리케이션에 필요한 설정 파일 디렉토리

 

 lib

 톰캣에서 사용하는 라이브러리 디렉토리

 

 logs

 로그 디렉토리

 

 temp

 임시 파일 디렉토리

 

 webapps

 웹 어플리케이션 배포 디렉토리

 기본으로 docs, examples, host-manager, manager가 존재한다.

 

 work

 JSP가 Servlet 컴파일되는 디렉토리

 


[톰캣엔진에서 사용]으로 표시된 디렉토리는 톰캣엔진이 실제 구동될 때 사용하는 디렉토리를 의미하며,

[인스턴스에서 사용]으로 표시된 디렉토리는 웹 어플리케이션에서 웹서비스를 위해 사용하는 디렉토리들을 의미한다. 이 디렉토리들은 톰캣 환경변수 CATALINA_BASE와도 관련이 있다.


다음은 톰캣 환경변수 정보이다.


환경변수명

설명

 CATALINA_BASE

 톰캣 구동시 띄워지게 되는 웹서비스 인스턴스의 베이스 디렉토리

 conf, logs, temp, webapps, work 디렉토리를 포함하는 홈 디렉토리를 의미한다.

 CATALINA_HOME

 톰캣 설치 홈 디렉토리

 CATALINA_TMPDIR

 톰캣 인스턴스의 임시 디렉토리

 JRE_HOME

 자바 런타임 디렉토리

 CLASSPATH

 클래스패스 경로


환경변수에서는 CATALINA_BASE의 의미에 대해 살펴보자.


CATALINA_BASE는 인스턴스 단위에 대한 베이스 디렉토리이다.

톰캣 설치시 CATALINA_BASE에 관한 디렉토리들이 톰캣 홈 디렉토리 하위에 포함되기 때문에, CATALINA_BASE와 CATALINA_HOME의 경로가 같은 것이다.

톰캣이 시작되면 CATALINA_BASE의 conf, logs, temp, webapps, work 디렉토리 설정 등을 물고 구동되어 웹서비스를 제공하게 된다.


bin 디렉토리의 version.sh 스크립트를 실행하면 환경변수 정보를 확인할 수 있다.


[root@localhost bin]# ./version.sh 
Using CATALINA_BASE:   /root/apps/tomcat
Using CATALINA_HOME:   /root/apps/tomcat
Using CATALINA_TMPDIR: /root/apps/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_91
Using CLASSPATH:       /root/apps/tomcat/bin/bootstrap.jar:/root/apps/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.69
Server built:   Apr 11 2016 07:57:09 UTC
Server number:  7.0.69.0
OS Name:        Linux
OS Version:     3.10.0-123.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_91-b14
JVM Vendor:     Oracle Corporation


만약, 톰캣 인스턴스를 2개 운영해야 한다면...


~/deploy/inst1

ㄴ conf

ㄴ logs

ㄴ temp

ㄴ webapps

ㄴ work


~/deploy/inst2

ㄴ conf

ㄴ logs

ㄴ temp

ㄴ webapps

ㄴ work


위와 같이 나누고, conf 디렉토리의 server.xml 설정에서 Server 포트, HTTP 포트, AJP 포트, REDIRECT 포트를 다르게 설정해준다. 그리고 구동 스크립트를 2개로 나누어 CATALINA_BASE를 따로 설정하여 띄우면 된다.


[startup-1.sh]

#! /bin/sh


#! usr/bin/env bash

export CATALINA_BASE=~/deploy/inst1

export CATALINA_OPTS="-Denv.servername=inst1"


./startup.sh


[startup-2.sh]

#! /bin/sh


#! usr/bin/env bash

export CATALINA_BASE=~/deploy/inst2

export CATALINA_OPTS="-Denv.servername=inst2"


./startup.sh



'서버 > 톰캣' 카테고리의 다른 글

[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
[톰캣] 버전별 Servlet, JSP, JAVA 지원 스펙  (0) 2016.04.12
Posted by SungHoon, Park
,