검색

레이블이 Apache인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Apache인 게시물을 표시합니다. 모든 게시물 표시

2021년 9월 15일

CentOS 7 환경에서 Apache 웹서버 MPM 모듈 evnet로 변경하기

Apache 웹서버는 prefork 불리우는 방법으로 클라이어트의 요청을 처리하도록 되어 있다. 

prefork 는 Apache 2 부터 도입된 MPMs (다중처리 모듈들, Multi-Processing Modules) 중 하나이다. MPMs 에는 Prefork, Worker, Event 가 있으며 이외에도 Threadpool, Perchild, Leader 등 여러가지가 있다. yum 을 사용하여 설치되는 httpd 패키지는 prepork, worker, event 를 지원한다.

yum 을 설치를 하면 디폴트로 prepork 방식으로 동작하는데 아래 명령으로 현재 적용된 MPM 모듈을 확인할 수 있다.

httpd -V

아래와 같은 내용으로 출력될 것이다.



환경

  • CPU 2.0GHz (6Core),  16GB , 500GB * 2 (raid)
  • CentOS 7.8.2003  (64bit)
  • Apache 2.4.6 (64bit) 


변경

Prefork 방식의 성능 저하는 단일 스레드의 자식 스레드에서 한번에 하나의 요청을 순차적으로 처리하는 방식에 의한 한계를 예상하고 성능적으로 가장 우수하다고 알려진 event  방식으로 변경하였다. 

① /etc/httpd/conf.modules.d 경로의 00-mpm.conf 설정 파일에서 prefork MPM 부분은 주석처리하고 마지막의 event MPM 부분의 주석을 제거한다.

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

② 아파치 서버를 다시 시작하면 event MPM 방식으로 동작하게 된다.


systemctl restart httpd.service 
httpd -V


참고

How To Install the Apache Web Server on CentOS 7

Understanding Apache 2 MPM

Apache MPMs Explained

Change Apache MPM on CentOS7

2021년 4월 2일

MPMs worker 를 이용한 아파치 웹서버 성능 업 !!

 yum 패키지 매니저를 사용하여 설치한 Apache 웹서버는 prefork 불리우는 방법으로 클라이어트의 요청을 처리하도록 되어 있다. prefork 는 Apache 2 부터 도입된 MPMs (다중처리 모듈들, Multi-Processing Modules) 중 하나이다. MPMs 는 Prefork, Worker, Event 가 있으며 이외에도 Threadpool, Perchild, Leader 등 여러가지가 있다.



CASE

prefork 방식으로 설정된 Apache 웹서버를 잘 사용하고 있었으나 클라이언트 수가 늘어나면서 응답이 현저하게 지연되는 현상이 반복되었다. 응답이 지연되는 경우에도 CPU, Memory 은 충분한 여유가 있었다.

  • CPU 2.0GHz (6Core),  32GB 
  • Redhat Linux 6.5 (64bit)
  • Apache 2.2.14 (64bit) 

SOLUTION

Prefork 방식의 성능 저하는 단일 스레드의 자식 스레드에서 한번에 하나의 요청을 순차적으로 처리하는 방식에 의한 한계로 추정하고 Worker 방식으로 변경하였다. 

① /etc/sysconfig/httpd 설정 파일의  HTTPD 값을  /usr/sbin/httpd.worker 으로 변경한다.

② /etc/httpd/conf/httpd.conf 파일에서 worker MPM 설정을 변경한다.

③ 마지막으로 아파치 서버를 다시 시작하면 worker MPM 방식으로 동작하게 된다.


성능은 기대이상으로 놀라웠다. Prefork 방식의 경우와는 다르게 지연 없이 응답에 빠르게 동작하고 있다. 많은 요청이 발생하는 경우 멀티스레드 방식의 유용함을 체험할 수 있었다.


참고

How To Install the Apache Web Server on CentOS 7

Understanding Apache 2 MPM

Apache MPMs Explained

2020년 3월 26일

비주얼 스튜디오 코드로 Vue 웹 프로그램 개발하기

자바를 주 개발언어로 사용하고 있어 Eclipse,  Android Studio 정도를 개발 도구로 사용하고 있다.

소문으로만 들어온 Vue 를 CDN 방식의 코드를 참고하여 웹 프로그램에 적용해보았다. 기존  개발 방식과 비교하면 UI 컴포넌트들이 모듈와 되어 있어 쉽게 UI 구현 가능하지만 "Vue 를 꼭 사용해야 할까?" 라는 의문이 생겼다.

이러한 의문을 품고 요즘 유행하는 SPA (Single Page Application) 방법으로 개발 시도해보았다. 개발 도구에 조금  변화를 주었느데, 앞선 경험에서 Eclipse 도구가 그닥 유용하지 않아 Microsoft Visual Code Studio 를  사용해 보았다.

Visual Studio Code 

https://code.visualstudio.com/


① code.visualstudio.com 페이지를 방문하여 OS 에 맞는 프로그램을 다운로드하여 설치한다.
② Vue 개발를 위하여 다음의 Extentions 설치하였다.  설치는 Extentions 탭에서 검색하여 설치한다.
  • Prettier - Code formatter 
  • Vetur


기존 Eclipse 개발 도구와 비교하여 기대 이상의 성능과 개발의 편리함에 큰 충격을 경험하였다. 익숙한 것이 반듯이 좋은 것은 아닌것 같다.

웹 프로그램 

Vue 에 대한 충분한 지식과 경험이 없었기 때문에 무료이용이 가능한 Vue Material Kit 를 기반으로 간단한 프로그램을 개발하였다. 유료 버전도 있었지만 테스트를 위한 프로그램 템플릿으로 사용하는데에는 무료버전역시 충분했다.

Vue Material Kit (Free)

추가로 아래와 같은 기능들을 구현하였다. 학습의 목적도 있었기 떄문에 UI 기능 구현은 가능한 여러 컴포넌트들을 사용하려고 노력 하였다. 또한 클라이드 기반의 배포를 고려하여 시스템을 구성해보았다.

  1. 로그인 - JWT(JSON Web Token) / 로그아웃
  2. 인증 여부에 따른 메뉴 구성
  3. 블로그
  4. 이미지 갤러리
전체 구성도


프로그램 소스 : https://github.com/andang72/architecture-community-vue

편리하다고 느낌점들 

  1. 기본적인 HTML 과 JavaScript 기술을 가지고 있다면 어렵지 않게 개발이 가능하다.
  2. 다양한 UI 컴포넌들이 존재하고 매뉴얼도 잘 정리되어 있어 UI 개발이 편리했다.
  3. 서버 API 호출이 간단했다. API 가 이미 존재하는 경우 아주 빠르게 개발이 가능할 것 같다.
  4. 배포가 아주 단순했다. build 결과물을 웹 서버에 업로드만 하면 된다.

불편하다고 느낀점들

Search Results

Web results

처음 개발을 시작할 당시 Cross-Origin Resource Sharing (CORS) 관련 이슈가 상당히 신경쓰이는 부분이었다. ( ☛ Vue 개발 보다는 Spring 기반의 서버 부분에서 처리에 어려움이 있었다.  그러나 일단 해결되고 나면 크게 이슈가 되지 않았다.)
공통 함수 부분이 불편했다. vuex 에서 제공하는 ...mapActions 를 사용하는 방법이 일반적이 였지만  Template 에서 사용하기 위해서는 함수를 다시 만들어 주어야 하는 것이 사용을 어렵게 했다. ( ☛ 로그인 부분에서만 사용했다.)

긍정적으로 평가하는 점들

  • 클라이언트 프로그램들을 웹서버가 아닌 CDN 과 같은 다수의 장비에 큰 어려움 없이 배포가 가능하기 때문에 API 서버 성능만 보장이 된다면 굉장한 성능 개선이 가능할 것 같다. 

참고자료

2019년 3월 6일

SELinux 환경에서 아파치 - 톰켓 연결시 보안 오류

SELinux (Security Enhanced Linux) 는 리눅스 보안 커널의 일부로 RedHat 과 미국 NAS(National Security Agent) 간의 협업으로 배포되었다. SELinux 의 경쟁자로는 SUSE Linux Enterprise Server 의 AppArmor 이 있다.

리눅스 커널에서 SELinux 는 관리자가 설정한 규칙 및 정책에 따라 사용자의 접근을 제한하는 강제접근제어 (Mandatory Access Controls, 이하 MAC ) 을 사용한다.  MAC 방식은  임의접근제어 ( Discretionary Access Control, 이하 DAC ) 방식 보다 높은 수준의 접근 제어 방식으로 관리자가 사전에 승인한 파일들만 처리하는 방식으로 보안 침해를 방지한다.

이슈 

Apache HTTPD 와 새로운 Tomcat  연결시 8009 포트가 아닌 새로운 포트(여기에서는 8010을 사용) 를 사용하게 된다.

❶ 설정을 추가하고 서버를 다시 시작하면 Apache HTTPD 에서 Tomcat 과 연결할 수 없다는 오류가 발생하게 된다. (로그를 통하여 확인)

❷ 그러나 Tomcat 로그를 확인해보면 8010 포트로 정상 시작되었음을 로그를 통하여 확인할 수 있었다.

❸ Apache HTTPD 와  Apache Tomcat 이슈가 아닐 거라는 가정하에 리눅스 서버의 로그를 확인을 시도하였으며 /var/log/messages 로그에서 보안이슈를 확인할 수 있다.


Mar 3 10:56:21 localhost setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_connect 
access on the tcp_socket port 8010. For complete SELinux messages. 
run sealert -l aa722160-f075-474c-bcd2-a2ce9535be26


문제해결

먼저 앞으로 문제해결을 위하여 사용할 기능들을 위하여 미리 (semanage , sepolicy) 다음 패키지를 설치한다.

#yum install policycoreutils-python
#yum install selinux-policy-devel

semanage 명령을 입력하여 httpd 서비스에 허용된 포트를 확인할 수 있다.

# semanage port -l | grep -w http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000


sepolicy 명령을 사용하는 방법도 있다.

# sepolicy network -t http_port_t
http_port_t: tcp: 80,81,443,488,8008,8009,8443,9000


이제 사용하려는 포트가 이미 등록되어 있는 포트는 아닌지 다음과 같이 확인한다. (이미 등록된 포트는 등록할 수 없다)

# sepolicy network -p 8010
8010: tcp unreserved_port_t 1024-32767
8010: udp unreserved_port_t 1024-32767
8010: sctp unreserved_port_t 1024-65535


이제 httpd 서비스에서 8010 포트를 사용할 수 있도록 아래과 같이 추가할 수 있다.

# semanage port -a -t http_port_t -p tcp 8010

  • 옵션 -d 를 사용하면 특정 서비스에 대하여 등록된 정책을 삭제 할 수 있다. 
  • 8010 포트가 이미 다른 서비스에 등록되어 있다면 -m 옵션을 사용한다. 


이제 아파치 서비스를 다시 시작하면 정상적으로 8010 포트를 통하여 톰켓과 접속함을 확인 할 수 있다.

결론 

SELinux 환경에서 Apache HTTPD 는 관리자에 의하여 미리 승인된 자원들에게만 접근이 가능하게 된다. 디폴트로 httpd 서비스의 경우 다음과 포트을 사용하는 것은 허용되어 있다. 그러나 이들 허용된 포트가 아닌 다른 포트를 사용하고자 하는 경우는 SELinux 정책을 수정해야 한다.

참고자료 

SELinux (Security-Enhanced Linux)
12 Critical Linux Log Files You Must be Monitoring
RHEL7: Use SELinux port labelling to allow services to use non-standard ports.