Tagged: Linux

Apache mod_deflate 설정

Apache LogoApache 2.4 에서 mod_deflate 설정 에 대한 문서 입니다.

Apache 2.2 에비해서 Apache 2.4 에서의 설정이 새롭게 바뀌었습니다.

 

 

1. Requirement

Apache 2.4 에서 mod_deflate 를 사용하기 위해서는 다음과 같은 모듈들도 활성화되어야 합니다.

  • mod_setenvif : 환경변수를 정의한다.
  • mod_headers : HTTP 요청 헤더와 응답 헤더를 조절하고 수정하는 지시어를 제공한다.
  • mod_deflate : 서버의 출력을 네트웍으로 클라이언트에 보내기 전에 압축하는 기능 제공

위 모듈들이 Apache 2.4.10 에 활성화 되어 있어야 합니다.

2. 설정

mod_deflate 의 설정은 Apache 2.2 와 2.4 가 차이가 있습니다. 두 버전에 상관없이 설정할 수 있는 방법도 있는데, 이것은 아파치 문서에 나와 있는 방법이기도 합니다.

그런데, Apache 2.4 의 Fileter 모듈을 적용해서 특정한 컨텐츠타입에만 Deflate 를 적용하면 다음과 같습니다.

deflate 를 사용하는데 따라 클라이언트에게 압축된 컨텐츠라는 걸 알려주기 위해서 헤더값을 다음과 같이 조작해 줍니다.

이것을 종합하면 다음과 같습니다.

iptable 의 hashlimit 를 이용한 접속 제한

보통 DDOS 공격과 같은 경우에 초당 몇 십개에서 몇백번건의 접속을 시도 합니다. 이러한 초당 수백건의 접속을 이용해서 iptables 의 hashlimit 를 이용한 접속 제한을 할 수 있습니다.

예를들어 초당 20번 이상 접속을 시도하는 것을 차단하고 싶다면 다음과 같이 지정하면 됩니다.

이 차단은 약 1시간 동안 유지됩니다.

 

[번역] 리눅스 커널 튜닝 – swappiness and overcommit_memory

이 문서는 다음 주소의 내용을 발 번역한 것입니다.

리눅스 커널 튜닝 – swappiness and overcommit_memory

리눅스 커널  튜닝가능한 파라메터 vm.swappiness (/proc/sys/vm/swappiness) 는 어떻게 메모리 페이지들이(memory pages) 적극적으로 디스크에 스왑(swap)되어질 수 있는지를 정의하는데 사용되어질 수 있습니다. 리눅스는 활용할 수 있는 free 메모리양이 충분하더라도 오랫동안 메모리 페이지에 접근하지 않는 것들을 스왑 공간으로 이동시킵니다. 이러한  동작은 “swappiness” 커널 파라메터 값을 /proc/sys/vm/swappiness 에서 변경할 수 있습니다.

높은 swappiness 값은 커널은 매핑된 페이지를 좀 더 해제하라는 의미 입니다. 낮은 swappiness 값은 반대의 의미로 커널은 매핑된 페이지를 덜 해제하도록 하라는 의미 입니다. 바꿔말해서, vm.swappiness 값이 높을 수록 시스템은 좀 더 많이 스왑을 할 것입니다.

vm.swappiness 는 스와핑 활동과 freeing 캐쉬사이의 균형을 바꾸기 위해서 0 에서 100 사이의 값을 가집니다. 100 은 커널이 항상 비활성 페이지를 찾게되고 그것들을 스왑 합니다. 다른 말로, 스왑의 발생은 애플리케이션이 메모리를 얼마나 많이 사용하는지, 어떻게 부족한 캐쉬가 찾기 활동을하고  비활성 아이템을 릴리즈하는가에 의존합니다.

일반적으로 프로세스들은 함수 malloc() 를 호출함으로서 메모리를 할당 합니다. 커널은 충분한 메모리가 활용가능한지 판단하고 할당요청을 허용하거나 거부할지를 결정합니다. 리눅스는 메모리 오버커밋(overcommit memory) 할 수 있는 기능을 지원 합니다. 그것은 물리적 램과 스왑을 합쳐 더 많은 메모리를 할당되어질 수 있도록 허용하는 것 입니다. 이것은 무섭지만, 때때로 애플리케이션이 최악의 케이스 시나리오로 메모리를 할당하는 경우에 필요하지만 절대로 이러한 케이스를 사용해서는 안됩니다. (애플리케이션이 메모리를 많이 잡아먹도록 만들지 말라는 이야기 입니다.)

vm.overcommit_memory 는 3가지 가능한 세팅 값이 있습니다.

  • 0 (heuristic overcommit) : 충분한 메모리가 활용가능하지 체크하고, 만약 그렇다면, 할당을 허용한다. 만약 메모리가 충분하지 않다면, 요청을 거부하거나 애플리케이션에 에러를 리턴한다.
  • 1 (always overcommit) :  커널은 “모든 돈을 걸어라”는 것과 같다. 1로 세팅하는 것은 커널에게 애플리케이션의 메모리에 대한 요청을 항상 성공으로 리턴하라고 명령하는 것이다. 이것은 듣기에따라서 섬뜩하고 무서운 것이다.
  • 2 (strict covercommit) : 메모리에 물리적 메모리와 스왑을 합쳐 초과 할당을 vm.overcommit_ratio 에 정의되어진 것만큼 할당하도록 허용하라. vm.overcommit_ratio 파라메터는 비율로서 얼마나 커널이 오버커밋을 할 수 있는지를 결정할때에 추가할 메모리의 양이다. 예를들어, vm.overcommit_ratio 가 50 이고 1GB 의 램을 가지고 있따면 커널은 요청이 실페하기전에 0.5GB 의 물리메모리와 스왑을 더해서 할당되어질 수 있도록 허용하게 된다. 결국 물리메모리를 낭비하게 된다.

프로세스가 포크(fork)될때나 fork()함수를 호출할때, 이것은 전체 페이지 테이블(page table)이 복제된다. 다른 말로하면, 작식 프로세스는 완벽하게 부모의 메모리공간의 복사본을 가진다는 것이며 이는 당신이 예상한대로 두배의 메모리양을 필요로한다. (부모 메모리, 자식 메모리) 만약 그 자식들의 의도가 즉각적으로 exec()를 호출하는 것이라면( 하나의 프로세스가 다른것으로 교체되는) 부모의 메모리를 복제하는 활동은 시간을 낭비한다. 왜냐하면 이러한 패턴은 아주 일반적인것으로, fork()와 달리 vfork()로 생성은 부모 메모리를 복제하지 않으며 대신에 자식 프로세스가 exec() 를 호출하거나 사라질때까지 그것을 블럭킹한다.  The problem is that the HotSpot JVM developers implemented Java’s fork operation using fork() rather than vfork()

영구적으로 바꾸기.

 

CentOS IPv6 비활성화

IPv4 의 부족분을 대체하기 위해서 IPv6 가 개발되었지만 아직까지 사용빈도가 높지않아 리눅스 IPv6 비활성화 시켜서 자원을 아낄 수 있습니다. 기본적으로 CentOS 6, 7 에서는 IPv6 가 활성화 되어 있습니다.

위와같이 IPv6 가 사용 됩니다.

CentOS 6 

1. IPv6 커널 모듈 비활성화

다음과 같이 IPv6 커널 모듈이 로딩되지 않도록 해줍니다.

2. 커널 파라메터 추가

다음과 같이 IPv6 커널 파라메터를 추가해 줍니다.

이제 재부팅을 해주면 IPv6 가 비활성화 됩니다.

CentOS 7

1. Grub2 IPv6 비활성화 옵션 추가

이와같이 GRUB_CMDLINUX_LINUX=”ipv6.disable=1 …” 를 추가 합니다.

그리고 다음과 같이 Grub 을 재성해 줍니다.

 

위 절정을 다하고 시스템을 reboot 해주면 IPv6 가 비활성화 됩니다.

RabbitMQ 설정

RabbitMQ LogoRabbitMQ 는 기본적으로 효율적으로 RabbitMQ 서버을 운영하기에 충분할만큼 내장된 설정으로 가지고 있습니다. 만약에 이 설정을 변경하고자 한다면 설정을 해야 합니다.

RabbitMQ 설정은 기본적으로 다음과 같이 3가지 방법을 제공 합니다.

  • 환경변수들(environment variables) : 포트(port), 파일 위치(file location), 파일 이름(file name)들을 정의. 이것은 쉘 환경변수로부터 가지고 올수 있으며 rabbitmq-env.conf 파일에 설정할 수 있다.
  • 설정파일 : 허가권(permission), 제한과 클러스터, 플러그인 세팅과 같은 서버 컨포넌트들을 정의.
  • 런타임 파라미터와 정책들 : 클러스터 전체 세팅을 런타임에서 변경할 수 있다.

설정파일의 위치는 배포판의 경우에 /etc/rabbitmq 를 루트하며, 컴파일 설치시에 지정해준 디렉토리를 기준으로 합니다.

rabbitmq-env.conf

이 설정 파일은 RabbitMQ 서버의 전체적인 설정들, 예를들어 서버 Port, 호스트이름, 노드이름등 입니다.

이는 쉘의 환경변수로 설정이 가능한데, 이 설정파일의 변수들에 ‘RABBITMQ_’ 를 붙이면 사용가능 합니다.

rabbitmq.conf

이 파일은 기본적으로 rabbitmq-env.conf 에서 지정 가능합니다. 주의해야 할 것은 파일명을 적을때에 conf 확장자를 생략하고 적으셔야 합니다. 왜냐하면 RabbitMQ 가 확장자 conf 를 추가하기 때문입니다.

이 설정 파일에서는 RabbitMQ 운영에 관련된 내용들을 주로 다룹니다. 사용할 메모리, 인증방법, SSL 인증서 설정등 입니다.

이러한 설정들은 다음의 명령어로 확인이 가능 합니다.

 

리눅스 아파치 설치

Apache LogoApache 는 전세계 웹 서버로 가장 많이 쓰이는 HTTP 서버 입니다.

Apache 는 최신 2.4 으로 넘어오면서 많은 변화를 겪었습니다.

이 문서는 리눅스 아파치 설치 하는 방법을 설명한 것입니다.

1. 개요

CentOS 7 배포판은 RHEL 7 을 재컴파일해서 만들어진 배포판 입니다. 이전 버전과 달리 서비스 데몬 관리로 Systemd 를 채용했고 기본 파일 시스템으로 XFS 를 채용하는등 많은 변화를 겪었습니다.

CentOS 7 에 서버 프로그램을 설치하게 될 경우에 이 Systemd 와 결합을 시키는 것도 중요한 일로 떠올랐습니다. Systemd 는 단순하게 서비스 데몬을 관리하는 것뿐만 아니라 시스템의 전반적인 인프라자체이므로 매우 중요한 요소가 되었습니다.

이 문서에 Apache 2.4.10 은 바로 Systemd 와 통합하는 방법을 포함 합니다. 이 문서의 내용은 Fedora 22 배포판을 많이 채용한 것입니다.

2. Apache 2.4.10

2.4.10 버전에서는 이전과 달리 기본 MPM으로 Event 입니다. 별도로 MPM을 지정해주지 않으면 Event 로 지정되었습니다. 하지만, 이 기본 Event 가 라이브러리 의존성을 가지고 있기 때문에 라이브러리가 갖추어지지 않았다면 Prefork 와 Worker 가 공유라이브러리로 컴파일되고 설치 이후에 무엇을 쓸것인지를 지정해줘야 합니다.

2.4.10 버전의 경우에 Event 를 활성화하기 위해서는 Apr, Apr-utils 의 버전이 1.5 이상이여 합니다. 하지만 CentOS 7 배포판에서는 현재 1.4 버전임으로 컴파일 설치할때에 1.5 이상을 같이 컴파일 해줘야 합니다. 

3. Download and Unpack

Apache 2.4.10 을 Event 로 동작하도록 컴파일 하기위해서 다운로드 합니다.

  • Httpd-2.4.10
  • Apr-1.5.1
  • Apr-utils-1.5.4

다운로드한 후에 압축을 해제하고 apr, apr-utils 는 srclib 디렉토리에 압축을 해제하고 버전을 제거한 패키지 이름으로 변경해 줍니다.

4. Patch Download and Patch

이 패치는 Fedora 22 에 httpd-.2.4.10 패키지에 있는 것을 가지고 온 것 입니다. 여기에는 보안 패치와 더불어 Systemd 와 통합되는 모듈이 들어있습니다.

패치는 다음과 같이 다운로드 받습니다.

download: httpd-2.4.10_patch.tar.bz2

httpd-2.4.10 디렉토리에서 다운로드 받은 파일을 압축해제하고 패치를 적용합니다.

5.Configure and Compile and install

프로그램에 설정을 할때는 어떤 기능을 쓸것인지를 결정해야 합니다. 어떤 역활로 서버를 사용할 것인지를 고민한 후에 프로그램을 설정하는 것이 좋습니다.

위 configure 는 다음과 같은 기능을 제공하지 않습니다.

  • dav 안됨

이제 컴파일과 설치를 해줍니다.

6. mod_systemd 설치.

httpd-2.4.10 에 Systemd 와 통합을 위한 패치를 했지만 컴파일할때에 모듈설치 옵션을 ‘all’이나 ‘most’ 로하지 않는 이상 컴파일 설치가 되지 않습니다. 이는 apxs 를 이용해서 모듈 설치를 해줍니다.

위에 잘 보면 link 시에 systemd_daemon 링킹이 되지 않습니다. 이것을 다음과 같이 수동으로 다시 만들어 줍니다.

그리고 다음과 같이 설치해 줍니다.

7. systemd 파일 등록.

이제 httpd 의 systemd 파일을 등록해 줍니다. 파일은 다음과 같습니다.

‘httpd.service’ 파일로 저장하고 다음과 같이 systemd 디렉터리로 옮겨 줍니다.

httpd.service 를 systemd 에 등록하고 시작해주면 됩니다.

실행상태는 다음과 같이 확인 가능 합니다.

추가 관련내용

Man 페이지 텍스트, PDF로 저장

Man 페이지 텍스트 파일로 저장.

 Man 페이지 PDF 파일로 저장.

Man 페이지 HTML 파일로 저장. 

먼저 패키지를 설치해야 합니다.

그리고 다음과 같이 해줍니다.

 

Man Page 컬러로 보기

리눅스의 Man Page 는 컬러가 아닙니다. 흑백으로만 나옵니다. 중요한 내용에 컬러를 입히면 눈에 잘 들어올텐데, 이걸 가능하게 하는 방법입니다.

‘source ~/.bashrc’ 를 해주면 바로 적용 됩니다.

그런데, xterm 을 사용하고 있다면 다음과 같이 .Xdefaults 에 다음과 같이 해줍니다.

그리고 다음과 같이 적용을 해줍니다.

출처: http://www.cyberciti.biz/faq/linux-unix-colored-man-pages-with-less-command/

Bash 패스워드 생성기.

쉘 스크립트에서 간단하게 패스워드를 생성할 수 있습니다.

사용법은 다음과 같습니다.

 

Python 3 설치

python-logoPython 3 설치. 현재 Python 2.x 버전이 2019년까지 수면을 연장했지만 이미 많은 모듈들이 2.x 버전에서 개발이 중단되거나 Python 3.x 를 지원하기 시작했다. 앞으로는 Python  2.x 를 개발하더라도 Python 3.x 와 호환을 고려해서 작성해야 한다.

1. Downloads and Unpack

다운로드는 Python 홈페이지에서 받는다.

2. Configure and Compile and Install

3. 후속작업

설치한 후에 python3 을 실행하면 다음과 같이 실행이되지 않는다.

공유라이브러리가 없기 때문에 나타나는 현상으로 다음과 같이 공유라이브러리를 인식시켜준다.