1. IP, 서브넷 관련

https://inpa.tistory.com/entry/WEB-IP-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%9C%EB%B8%8C%EB%84%B7-%EB%A7%88%EC%8A%A4%ED%81%AC-%EC%84%9C%EB%B8%8C%EB%84%B7%ED%8C%85-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

🌐 IP 클래스 · 서브넷 마스크 · 서브넷팅 계산법 💯 총정리

아이피(IP) 정리 IP(Internet Protocol) 란 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소이다. 아이피(ip)는 일반적으

inpa.tistory.com

2. CIDR

https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-CIDR-%EC%9D%B4-%EB%AC%B4%EC%96%BC-%EB%A7%90%ED%95%98%EB%8A%94%EA%B1%B0%EC%95%BC-%E2%87%9B-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC-%EA%B3%84%EC%82%B0%EB%B2%95#cidr_classless_inter-domain_routing

 

🌐 CIDR 개념 쉽게 이해해보자 & 계산법

CIDR (Classless Inter-Domain Routing) 네트워크 설계를 하면서 가장 많이 접하게 될 개념이 CIDR(사이더) 이다. CIDR의 full name은 (Classless Inter-Domain Routing) 으로 클래스 없는 도메인간 라우팅 기법이라는 뜻을

inpa.tistory.com

 

 

VPC 실습1 내용 요약

1) VPC 1개 생성

2) public / private 서브넷 1개씩 생성

3) 인터넷 게이트웨이 생성

4) public 서브넷 : 인터넷 게이트웨이와 연동, 라우팅 테이블 생성

5) NAT 게이트웨이 생성

6) private 서브넷 : NAT 게이트웨이와 연동, 라우팅 테이블 생성

 

VPC2 실습 예정 내용 요약

1) public 서브넷에 EC2를 생성하고, 인터넷gw를 통한 외부 통신 가능여부 확인

2) private 서브넷에 EC2를 생성하고, NATgw를 통한 외부 통신 가능여부 확인

 

 

1. VPC 생성

- VPC 생성 클릭

- VPC 생성시 필요한 정보 입력(이름, CIDR)

※ [VPC만] 선택하여 진행

 

2. VPC에 서브넷 생성

- public / private 하나씩 생성

 

3. 인터넷 게이트웨이 생성

- 인터넷 게이트웨이 설정 및 생성

- 인터넷을 연결할 public 서브넷과 연결하기

인터넷게이트웨이 - vpc 연결 진행
인터넷 게이트웨이 연결 완료

4. public 서브넷의 라우팅 테이블 설정

- public 서브넷의 라우팅 테이블 생성

- public 서브넷과 인터넷 게이트웨이 연결

외부 통신 할 경우, [인터넷 게이트웨이]를 목적지로 지정

- public 라우팅 테이블과 public 서브넷 연결하기

5. private 서브넷의 라우팅 테이블 설정

- private 서브넷 라우팅 테이블 생성

- private 라우팅 테이블과 private 서브넷 연결

- private 서브넷이 인터넷 연결 할 수 있도록 [NAT Gateway]를 생성한다.

- NAT Gateway는 public 서브넷에 위치시킨다. (private서브넷 → NAT GW → 인터넷 통신 순서임)

- 외부통신을 위한 공인IP가 필요함 → [탄력적 IP 할당] 클릭

- private 라우팅 테이블에서 [NAT Gateway]로 라우팅 추가(외부 통신을 위해서)

 

VPC 실습2에 이어서 진행

https://jparkk.tistory.com/28

 

AWS VPC 실습2

https://jparkk.tistory.com/26 AWS VPC 실습1 VPC 실습1 내용 요약 1) VPC 1개 생성 2) public / private 서브넷 1개씩 생성 3) 인터넷 게이트웨이 생성 4) public 서브넷 : 인터넷 게이트웨이와 연동, 라우팅 테이블 생

jparkk.tistory.com

 

'Infra > AWS' 카테고리의 다른 글

AWS AMI 이미지 생성해보기 실습  (0) 2023.08.23
AWS VPC 실습2  (0) 2023.08.14
AWS IAM(+그룹/사용자 생성 실습)  (0) 2023.08.13
AWS SAA-C03 취득 후기  (0) 2023.07.15
AWS CLF-C01 취득 후기  (0) 2023.07.15

AWS IAM(Identity and Access Management)이란?

- AWS 리소스에 대한 액세스를 제어할 수 있는 웹 서비스.

- IAM을 사용하면 사용자가 액세스 할 수 있는 AWS 리소스를 제어하는 권한을 중앙에서 관리 할 수 있다.

- 그룹관련 설정 : 그룹 생성/삭제, 그룹 권한 부여/삭제

- 사용자 관련 설정 : 사용자 생성/삭제, 사용자 권한 부여/삭제

※ 참고자료 - IAM에 대한 AWS 문서

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/introduction.html

 

IAM이란 무엇입니까? - AWS Identity and Access Management

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

<IAM 실습>

1. IAM에서 사용자 그룹 생성하기

1) IAM 대시보드에서 [사용자 그룹]을 클릭 → [그룹생성] 클릭

2) 그룹 이름 지정

3) 그룹 권한 지정 → 그룹 생성 클릭

- 필요한 권한을 검색창에서 검색하여 선택할 수 있다.

※ 최소 권한 부여 원칙 지키는 것이 좋다. 실습에서는 편의상 admin 권한 넣고 진행하였다.

4) 그룹 생성 확인

 

2. 생성한 그룹에 사용자 추가하기

1) 사용자 → [사용자 추가] 클릭

2) 사용자명 & 암호 지정

 

3) 새로 생성한 사용자를 그룹에 추가하기

4) 새로 생성한 계정으로 접속할 링크를 편집할 수 있다.

- 편집한 URL에 로그인 하면, 새로 생성한 사용자로 로그인 가능함

 

 

'Infra > AWS' 카테고리의 다른 글

AWS VPC 실습2  (0) 2023.08.14
AWS VPC 실습1  (0) 2023.08.13
AWS SAA-C03 취득 후기  (0) 2023.07.15
AWS CLF-C01 취득 후기  (0) 2023.07.15
AWS 자격증 공부 내용 요약 정리(CLF-C01 - AWS Certified Cloud Practitioner)  (0) 2023.05.31

브랜드 : 메리다
모델명 : 스컬트라 400
구매일 : 2021년 7월
구매가격 : 약 150만원
구매처 : 경기도 광주 오디벨로
주행거리 : 4207km

 



1. 특징
- 시마노 105 11단 구동계
- 알루미늄 프레임 & 카본 포크
- 디스크 브레이크 & 알루미늄 휠
 
2. 장점
- 입문용 자전거로 최고다. 구동계/프레임 등 입문자를 위해 매우 좋은 구성이다.

- 매우 무난한 디자인
- 알루미늄 프레임이라 낙차나 쓰러졌을때 파손 위험이 낮다.

- 디스크 브레이크
- 기본 타이어도 무난하지만, 타이어만 바꿔만 줘도 많이 이뻐진다.(슈발베 ONE 등)

 
3. 단점
- 딱히 없다. 타다보니 고급 자전거가 눈에 들어온다.
- 휠셋이나 안장은 기본 부품을 쓰다가 변경하는것 좋을거 같다.
 
4. 기타 

- 자전거 취미는 돈이 많이 든다. (정비비용, 속도계, 헬멧, 자전거 의류, 전조등, 후미등, 클릿슈즈 등등)

- 자전거는 소모품 및 필요한 기타용품이 꽤 있다. (타이어, 체인, 바테이프, 체인오일, 자전거 세차용품 등)

- 자전거 구매는 집과 가까운 샵에서 하는게 최고!



 
 

아래 링크 내용에 이어지는 내용이다.

https://jparkk.tistory.com/20

 

Haproxy, Keepalived 란?

※ 사전내용 ※ 1. 로드 밸런싱 - 서버가 처리해야 할 요청이 많을 경우, 요청을 여러 서버에 분배해주는 것 2. 로드 밸런서가 필요한 이유와 방법 - 요청이 많아짐에 따라, 서버에는 더 많은 부하

jparkk.tistory.com

 

만들어 볼 구성도

 

 

Haproxy+Keepalived 서버 (active/standby) 구성하기

실행환경 : CentOS Linux release 7.9.2009 (Web1~2, Haproxy active, Haproxy standby)

 

1. 패키지 설치

yum 명령어로 설치한다.

[01:03:16][root@haproxy_active_svr ~]
$ yum install haproxy keepalived

패키지 설치 확인 및 버전 확인

[01:08:27][root@haproxy_active_svr /]
$ haproxy -version
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>

[01:08:31][root@haproxy_active_svr /]
$ keepalived  -version
Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Copyright(C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>

 

 

2. Keepalived 설정하기

1) keepalived.conf 설정하기(master)

global_defs {
   router_id haproxy_active	# id 지정
}

vrrp_instance VI_1 {
    state MASTER		# master 역할이니, master로 지정
    interface eth0		# VIP를 추가할 인터페이스명을 지정
    virtual_router_id 10	# id 지정
    priority 200		# priority값을 지정, 값이 높으면 master
    advert_int 1
    authentication {
        auth_type PASS		# Master-Standby 서버 동일하게 적용
        auth_pass 1111		# Master-Standby 서버 동일하게 적용
    }
    virtual_ipaddress {
        192.168.0.104		#VIP를 지정
    }
}

 

2) Active 서버에서 VIP가 적용되었는지 확인

$ ip ad
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:39:48:f5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.102/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.104/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe39:48f5/64 scope link
       valid_lft forever preferred_lft forever

 

3) keepalived.conf 설정하기(standby)

global_defs {
   router_id haproxy_standby    # id 지정
}

vrrp_instance VI_1 {
    state BACKUP                # BACKUP 역할이니, BACKUP로 지정
    interface eth0              # VIP를 추가할 인터페이스명을 지정
    virtual_router_id 10        # id 지정
    priority 100                # priority값을 지정, 값이 높으면 master
    advert_int 1
    authentication {
        auth_type PASS          # Master-Standby 서버 동일하게 적용
        auth_pass 1111          # Master-Standby 서버 동일하게 적용
    }
    virtual_ipaddress {
        192.168.0.104           #VIP를 지정
    }
}

 

4) Standby 서버에서 VIP 적용 확인

→ Standby 서버이므로, VIP가 뜨지 않는게 정상.

→ 단, Master서버의 keepalived를 stop하고 VIP가 뜨면 정상

$ ip ad
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:2b:e8:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.103/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe2b:e884/64 scope link
       valid_lft forever preferred_lft forever

 

3. Haproxy 구성하기

→ Haproxy 설정은 /etc/haproxy/haproxy.cfg에서 한다.

→ Active - Standby 모두 동일하게 설정을 적용하면 된다. 단, Listen 부분의 IP는 각 서버의 IP로 넣는다.

→ 각 버전에 맞는 매뉴얼은 이 URL을 참고하면 설명이 되어 있다.

 

1) haproxy.cfg 파일 설정 적용하기

- global : 전체 영역에 걸쳐서 적용되는 설정

- defaults : 다음 파트들(frontend, backend, listen)에 대한 변수를 설정한다.

- frontend : 클라이언트의 요청이 연결될 ip 및 port를 설정

- backend : frontend에서 들어온 트래픽을 전달할 프록시 서버들에 대한 설정, healthcheck 설정

- listen : 모니터링 및 통계 페이지 설정

#===========================================
# global 영역
# 전체 영역에 걸쳐서 적용되는 설정
#===========================================
global
    log         127.0.0.1 local2	# 로깅 설정

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000		# 프로세스당 최대 동시 연결 수 지정
    user        haproxy
    group       haproxy
    daemon			# 데몬 모드

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#===========================================
# default 영역
# 다음 파트들(frontend, backend, listen)에 대한 변수를 설정한다.
#===========================================
defaults
	mode	http			# 인스턴스의 실행 모드 또는 프로토콜 설정
	log	global			# 로깅 활성화
	option	httplog			# HTTP 요청, 세션 상태 및 타이머 로깅 사용
	option	dontlognull		# null 연결 로깅 사용 또는 사용 안 함
	option	http-server-close		# 서버 측에서 http 커넥션 종료를 사용
	retries	3			# 연결 실패 후, 재시도 횟수
	timeout	http-request	10s	# 완전한 HTTP 요청을 대기할 수 있는 최대 허용 시간
	timeout	queue	1m		# 커넥션 슬롯이 비워질 때까지 대기열에서 대기할 최대 시간 설정
	timeout	connect	10s		# 서버에 대한 연결 시도가 성공할 때까지 대기할 최대 시간을 설정
	timeout	client	1m		# 클라이언트 측에서 최대 비활성 시간을 설정합니다.
	timeout	server	1m		# 특정 시간 이상 활동이 없으면 서버가 연결을 끊는다.
	timeout	http-keep-alive	10s	# 새로운 http 연결이 나타날 때까지 기다리는 최대 시간 설정
	timeout	check	10s		# 이미 연결된 이후에만, 추가적인 check timeout 시간을 설정한다.
	maxconn	3000			# 프로세스당 최대 동시 연결 수 지정

#===========================================
# frontend 영역
# 클라이언트의 요청이 연결될 ip 및 port를 설정
#===========================================
frontend		www
	bind	*:80			# 접속 port 지정
	default_backend	www.test.com	# backend 지정

#===========================================
# backend 영역
# frontend에서 들어온 트래픽을 전달할 프록시 서버들에 대한 설정
# healthcheck 설정
#===========================================
backend		www.test.com
	mode	http				# 인스턴스의 실행 모드 또는 프로토콜 설정
	balance	roundrobin			# 로드밸런싱 타입 지정
	option	httpchk /index.html		# index.html 파일의 유무로 healthcheck
	option	forwardfor			# 서버로 전송된 요청에 X-Forwarded-For 헤더 삽입 사용
	option	http-server-close			# 서버 측에서 http 커넥션 종료를 사용
	server	www1	192.168.0.100:80 check	# backend 서버를 선언 "server (name) (ip주소:포트)
	server	www2	192.168.0.101:80 check	# backend 서버를 선언


#===========================================
# Listen 영역
# 모니터링 및 통계 페이지 설정
#===========================================
listen	stats
	bind	192.168.0.102:8000 	# 접속 포트 지정
	stats	enable			# 상태 페이지 활성화
	stats	uri /status		# 접근할 uri 경로
	stats	refresh	3s		# 새로고침 주기 설정
	stats	auth admin:admin		# 상태페이지 접근 인증 추가

 

2) haproxy 설정파일 검사

$ haproxy -f /etc/haproxy/haproxy.cfg  -c
Configuration file is valid

 

3) haproxy 시작하기

$ systemctl start haproxy

 

4) haproxy 모니터링 페이지에서 웹서버들의 status 확인하기

- 브라우저를 띄워서 Listen 부분에서 설정한 모니터링 페이지에 접속한다.

- 화면 중간에 www1, www2의 status가 UP으로 보이는 것을 확인 할 수 있다.

haproxy 모니터링 페이지

 

4. 웹서버 로그를 통해서 haproxy를 통한 로드밸런싱이 잘 되는지 확인해보기

1) 브라우저에서 www.test.com으로 접속해보기

- www1과 www2가 번갈아 출력되면 정상적으로 로드밸런싱 되는것으로 보면 된다.

 

2) 웹서버의 access_log 확인해보기

- 로그를 보면 User-agent 값이 없는 로그가 계속 찍히는데, 이것은 Haproxy가 웹서버로 healthcheck를 하고 있는 것이다.

- User-agent 값이 있는 로그는 브라우저에서 test.com를 호출하여 찍힌 로그이며, 소스 IP가 haproxy IP이다.

- 이것은 웹서버의 로그설정에서 x-forward-for 부분을 추가해주면 정상적으로 소스 IP가 보이게 할 수 있다.

 

3) 웹서버의 로그설정에서 실제 client의 IP를 찍히도록 설정을 변경한다.

- httpd.conf에서 아래와 같이 변경하고 access_log를 확인하면 그림과 같이 소스 IP가 찍히는 것을 볼 수 있다.

- Haproxy 서버의 IP는 안 찍힌다..;;

참고 URL

https://zetawiki.com/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_X-Forwarded-For_%EB%A1%9C%EA%B7%B8_%EC%84%A4%EC%A0%95

(before)
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

(after)
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

 

5. Active 서버를 keepalived를 stop하여도 URL 호출이 잘 되는지 확인하기(failover 테스트)

→ Active 서버의 Keepalived와 Haproxy를 stop 시킨 후, VIP로 호출시 www1, www2 가 잘 나오면 정상

→ www1, www2의 access_log를 보면, healthcheck와 브라우저 호출 로그가 잘 찍히면 정상이다.

 

 

※ 주의사항

haproxy 설정파일에서 Listen부분은 반드시 VIP를 넣으면 안되고, 각 서버의 IP를 넣어야 한다.

(삽질함..ㅡㅡ)

'Infra > 기타(가상화 등)' 카테고리의 다른 글

Zabbix 구성-2 (Zabbix Agent)(RHEL7)  (0) 2023.10.26
Zabbix 구성-1 (Zabbix Server)(RHEL8)  (0) 2023.10.26
서비스 가동률(MTTR, 가용도 등 관련)  (0) 2023.08.31
Network 기본 내용  (0) 2023.08.13
Haproxy, Keepalived 란?  (0) 2023.07.24

※ 사전내용 ※

1. 로드 밸런싱

- 서버가 처리해야 할 요청이 많을 경우, 요청을 여러 서버에 분배해주는 것

 

2. 로드 밸런서가 필요한 이유와 방법

- 요청이 많아짐에 따라, 서버에는 더 많은 부하가 걸리게 된다. 이를 해소하기 위해 로드밸런서를 사용한다.

- 서버측에서는 서버의 사양을 업그레이드하는 방식(Scale-up)과 서버의 수량을 늘리는 방식(Scale-out)방식으로 서버

 

→ HAproxy는 SW 로드밸런서이며, Scale-out 방식을 선택할 때 고려해 볼 수 있다.

 

참고 URL1 https://dev-youngjun.tistory.com/97

참고 URL2 https://leffept.tistory.com/309

 

 

1. Haproxy란?

- L4, L7 HW 로드밸런서를 대체하기 위해 만들어진 오픈소스 SW로드밸런서이다.

- HAproxy 뒤에 있는 Web 서버에 대해 Health check 기능을 지원하며, Down 상태의 인스턴스에는 트래픽을 보내지 않는다.

- Keepalived와 같이 사용한다.

 

2. Keepalived란?

- 가상의 IP(=VIP)를 기반으로 Active 노드에 장애가 발생했을때 자동으로 Standby 노드로 failover 해주는 기능을 지원한다.

참고 URL

https://navercloudplatform.medium.com/keepalived%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-ha-%EA%B5%AC%EC%84%B1%ED%95%B4%EB%B3%B4%EA%B8%B0-c840b90149a5

※ 사전 내용 ※

1. 프로그램(Program)

- OS 상에서 실행할 수 있는 파일

- 메모리에 올라가 있지 않고, 실행되기를 기다리는 정적 데이터의 묶음

- 프로그램을 실행하면, 메모리에 올라가게 되고 동적 상태가 된다.

 

2. 프로세스(Process)

- 메모리에 올라와 실행되고 있는 프로그램 인스턴스

- 각 프로세스는 OS에게 독립된 메모리 영역을 할당받는다. 각 프로세스의 메모리 영역은 타 프로세스가 접근할 수 없다.

- 각 프로세스는 Code / Data / Stack / Heap 로 구성된 독립적인 메모리 영역이다.

 

3. 쓰레드(Thread)

- 하나의 프로세스 내에서 실행되는 여러 흐름의 단위

- 쓰레드는 프로세스 내의 Stack을 할당받고 Heap, Code, Data는 쓰레드간에 공유한다.

 

4. 멀티 프로세스

- 하나의 프로그램을 처리할 때, 여러 프로세스를 사용하여 처리

- 여러 프로세스 중 하나의 프로세스가 죽어도 타 프로세스에 영향을 받지 않고 정상적으로 처리된다.

- 멀티 쓰레딩 방식에 비해서 리소스 사용량이 많다.

 

5. 멀티 쓰레딩(Multi-Threading)

- 멀티 쓰레딩은 하나의 프로세스를 여러 개의 쓰레드로 구성하여 처리

- 각 쓰레드는 서로 자원을 공유하고 효율적으로 처리하기 때문에,  빠른 처리속도와 효율적인 리소스 사용 효과가 있다.

 

참고 URL

https://goodmilktea.tistory.com/24

 

 

Apache MPM

 

1. Apache MPM이란?

- Apache가 받은 요청을 처리하기 위해서 자식 프로세스에게 분배하는 모듈

- 종류 : Prefork, Worker, Event

 

2. Prefork 방식

1) 특징

- 1개의 요청에 1개의 프로세스를 할당하여 처리한다.

- 1개 프로세스에 1개의 쓰레드를 갖는다.

- 자식 프로세스들을 "StartServers" 설정값만큼 미리 생성한다.(최대 1024개까지 생성 가능)

* 요청 : 프로세스 : 쓰레드 = 1 : 1: 1

→ 1개의 요청에 대해 1개의 프로세스 속에 있는 1개 쓰레드에서 처리

 

2) 장점

- 각 요청은 각 프로세스가 처리하기 때문에, 특정 프로세스에서 문제가 발생해도 타 프로세스에 영향이 없다.

- 쓰레드간 독립적으로 메모리를 사용하므로 안정적이다.

 

3) 단점

- 다량의 요청을 처리하기 위해서는 많은 수의 프로세스가 필요하기 때문에 리소스 사용량이 증가한다.

- 통신량이 많은 서버에서는 상대적으로 불리하다.

 

3. Worker 방식

1) 특징

- 여러 개의 요청에 대해 1개 프로세스 내에 여러 쓰레드를 생성 및 할당하여 처리하는 방식

- 1개 프로세스 내에 여러 쓰레드를 생성한다.

* 요청 : 프로세스 : 쓰레드 = 5 : 1 : 5

→ 5개의 요청에 대해서 1개 프로세스 내 5개의 쓰레드가 처리

 

2) 장점

- 1개 프로세스에 할당된 리소스를 여러 쓰레드가 공유하므로 리소스 사용량이 비교적 적고 효율적으로 쓸 수 있다.

- 통신량이 많은 서버에서 비교적 유리하다.

 

3) 단점

- 각 프로세스 내에 여러 쓰레드가 있으므로, 프로세스 오류 발생하면 해당 프로세스의 모든 쓰레드가 영향받는다.

 

4. Event 방식

1) 특징

- Worker 방식을 토대로 하며, Nginx에서 사용하는 방식

- 고정된 프로세스 개수를 생성하여 처리한다.

 

2) 장점

- 동시에 요청이 많더라도 프로세스와 쓰레드 생성에 대한 비용이 발생하지 않는다.

- Event-driven(비동기 방식)을 이용하여 처리하며, 요청이 순서대로 처리되기까지 대기/중단되는 현상이 감소할 수 있다.

 

3) 단점

- 특정 요청에 대한 처리 시간이 길어진다면, 다른 요청의 처리 시간도 길어지는 현상이 발생할 수 있다.

 

5. MPM 지시어

1) Prefork

 

<IfModule mpm_prefork_module>

  StartServers                 64
  MinSpareServers         128
  MaxSpareServers         256
  ServerLimit                   2048
  MaxClients                   2048
  MaxRequestsPerChild     512

</IfModule>
StartServers Apache start시 자식 프로세스 개수
MinSpareServers Apache가 유지할 최소 자식 프로세스 개수
MaxSpareServers Apache가 유지할 최대 자식 프로세스 개수
ServerLimit Apache가 생성 가능한 최대 자식 프로세스 개수
(설정 값 이상 자식 프로세스를 생성 불가)
MaxClients 동시에 접속 할 수 있는 Client의 최대 값
MaxRequestsPerChild 1개의 자식 프로세스가 받을 수 있는 최대 요청 개수

 

2) Worker방식

 

<IfModule mpm_worker_module>
  StartServers                 3
  MinSpareThreads        256
  MaxSpareThreads        512
  ThreadLimit               4096
  ThreadsPerChild        128
  ServerLimit                32
  MaxClients               4096
  MaxRequestsPerChild  10000
</IfModule>
StartServers Apache start시 자식 프로세스 개수
MinSpareThreads Request spike를 처리할 최소한의 idle 쓰레드 개수
MaxSpareThreads idle 쓰레드 최대 개수
ThreadLimit 자식 프로세스 1개에 구성할 수 있는 최대 값
ThreadsPerChild 자식 프로세스가 생성할 쓰레드 개수
ServerLimit 생성 가능한 자식 프로세스의 개수
MaxClients
(=MaxRequestWorker)
동시에 처리될 커넥션 최대 개수
MaxRequestsPerChild
(=MaxConnectionsPerChild)
자식 프로세스가 처리할 request/커넥션 개수

 

 

참고 URL1

https://m.blog.naver.com/viaweb/222190352925

 

참고 URL2

https://sangchul.kr/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%95%84%ED%8C%8C%EC%B9%98-%EC%9B%B9%EC%84%9C%EB%B2%84-MPMprefork-worker-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95

참고URL

https://joont.tistory.com/42

 

톰캣 메모리 설정

JVM 구조유지보수를 진행하다 처음보게 된 Out Of Memory .. 굉장히 난감했었으나 다행히 해결하게 되어 글로써 남기고자 합니다 ㅋㅋ개인이 공부할 때나, 개발 도중 단위 테스트만으로는 발견하기

joont.tistory.com

 

Tomcact의 메모리 설정은 Tomcat 설치경로/bin/setenv.sh에서 선언해주면 된다.

(* catalina.sh에서 선언해도 되지만, setenv.sh에 넣으라고 적혀있다.)

setenv.sh를 만들어서 설정을 추가해준다.

$ vi setenv.sh
## Tomcat Memory Config

JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m -XX:MaxPermSize=128m"
<size>부분에 용량을 지정하면 된다.

- Xms<size>  : Java Heap의 최소 크기값을 지정
- Xmx<size>  : Java Heap의 최대 크기값을 지정
- XX:PermSize=<size>  : Permanent Generation의 최초 크기를 지정
- XX:MaxPermSize=<size>  : Permanent Generation의 최대 크기를 지정

설정을 적용하고 톰캣을 재기동하면 된다.

아래 그림의 표시한 부분처럼 메모리 설정이 적용 된 것을 확인 할 수 있다.

 

'Infra > Tomcat' 카테고리의 다른 글

Tomcat 세션 클러스터링(RHEL8)  (0) 2023.10.23

[실행환경]

CentOS Linux release 7.9.2009 (Core)

openjdk version "11.0.19" 2023-04-18 LTS

Apache 2.4.6

Tomcat 10.1.11

 

앞서 진행한, 아파치-톰캣 연동 진행 내용에 이어지는 내용이다.

https://jparkk.tistory.com/15

 

아파치와 톰캣 연동

[실행환경] CentOS Linux release 7.9.2009 (Core) openjdk version "11.0.19" 2023-04-18 LTS Apache 2.4.6 Tomcat 10.1.11 1. 톰캣 홈페이지에서 다운로드 링크를 복사하고, 원하는 위치에 wget으로 다운로드 한다. 다운 받은 후

jparkk.tistory.com

 

1. 톰캣 설정파일에서(server.xml)에서 포트를 변경한다.

여러개의 톰캣을 연동하기 위해서 포트를 변경해야 하고, 각 톰캣의 포트 번호를 아래와 같이 변경했다.

(기본적용 포트 번호 → ajp 8009, 셧다운포트 8005, 톰캣http포트 8080)

tomcat-test1 http 포트 8180, 셧다운 포트 8105, ajp 포트 8109

tomcat-test2 http포트 8280, 셧다운 포트 8205, ajp 포트 8209

* 포트가 겹치게 되면 정상적으로 작동하지 않음

 

2. mod_jk.so 모듈 사용할 수 있도록 설정하기

1) conf.d 아래에 mod_jk.conf 만들기

LoadModule jk_module modules/mod_jk.so

<ifModule jk_module>
        JkWorkersFile conf.d/workers.properties

        JkShmFile logs/mod_jk.shm
        JkLogFile logs/mod_jk.log

        JkLogLevel error
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
</ifModule>

 

2) workers.properties

→ balancer가 node1, node2에게 분배하는 방식

####################################################
# worker list
####################################################
worker.list=node1,node2,balancer

####################################################
# balancer
####################################################
worker.balancer.type=lb
worker.balancer.balance_workers=node1,node2

####################################################
# tomcat-test1
####################################################
worker.node1.reference=worker.template
worker.node1.host=localhost
worker.node1.port=8109

####################################################
# tomcat-test2
####################################################
worker.node2.reference=worker.template
worker.node2.host=localhost
worker.node2.port=8209

####################################################
# Worker Setting
####################################################
worker.template.type=ajp13
worker.template.socket_connect_timeout=7000
worker.template.socket_keepalive=true
worker.template.ping_mode=A
worker.template.ping_timeout=10000
worker.template.connection_pool_minsize=0
worker.template.connection_pool_timeout=600
worker.template.reply_timeout=300000
worker.template.recovery_options=3

ex2)

#worker_list
worker.list=balancer

#balancer
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2

worker.tomcat1.type=ajp13
worker.tomcat1.port=8109
worker.tomcat1.host=localhost

worker.tomcat2.type=ajp13
worker.tomcat2.port=8209
worker.tomcat2.host=localhost

 

3. 가상호스트에서 특정 도메인으로 접근시, 톰캣 인스턴스에게 분배되게 설정 하기

/etc/httpd/conf.d/vhosts.conf에서 아래 내용 추가

 

ex1)

<VirtualHost *:80>
       ServerName vhost3.hello.com
       DocumentRoot /var/www/html_vhost2
       ErrorLog "logs/vhost3.hello.com_error_logs"
       CustomLog "logs/vhost3.hello.com_access_logs" combined
       JkMount	/* balancer  >>>>>>>>>>>>> 이 부분이 두 톰캣 인스턴스에 분배 되게 하는 설정임
</VirtualHost>

ex2)

<VirtualHost *:80>
	ServerName www1.test.com

	CustomLog	"|/usr/bin/rotatelogs /usr/local/src/httpd-2.4.58/logs/www1.test.com.log 3600 " combined env=!VLOG
	ErrorLog	"|/usr/bin/rotatelogs /usr/local/src/httpd-2.4.58/logs/www1.test.com.error 3600 "

	JkMount		/* balancer
</VirtualHost>

 

 

[실행환경]

CentOS Linux release 7.9.2009 (Core)

openjdk version "11.0.19" 2023-04-18 LTS

Apache 2.4.6

Tomcat 10.1.15


1. 톰캣 홈페이지에서 다운로드 링크를 복사하고, 원하는 위치에 wget으로 다운로드 한다.

다운 받은 후, 압축을 풀고 원하는 수량 만큼 인스턴스를 압축해제 한다.

wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz

 

2. 필요한 패키지 다운로드

※ apache 소스설치를 했다면,  httpd-devel(=apxs)를 빼고 yum설치를 해야한다.

# 아파치를 yum 설치했을 때
yum install java-11-openjdk.x86_64 autoconf libtool httpd-devel

# 아파치를 소스설치 했을 때
yum install java-11-openjdk.x86_64 autoconf libtool

* 톰캣 10.1버전은 지원되는 자바 버전이 11이상이다. → 톰캣 홈페이지 참고(https://tomcat.apache.org/whichversion.html)

 

3. 톰캣 홈페이지에서 커넥터 다운로드, 다운 받은 파일 압축해제 & mod_jk 컴파일 설치를 진행한다.

wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.49-src.tar.gz
# 톰캣 connector 디렉토리로 이동
cd tomcat-connectors-1.2.49-src

# native 디렉토리로 이동
cd native

# 컴파일 설치 진행
# apxs 경로를 알 수 없다고 나올 경우, whereis apxs로 확인 필요
# 아파치를 소스설치 한 경우, apxs 경로 확인 필요!!!!!
# apxs 경로 예시) /usr/local/src/httpd-2.4.57/bin/apxs
./configure --with-apxs=/usr/bin/apxs

make && make install

# mod_jk.so 파일이 정상적으로 설치 된 것인지 확인한다.
# find 명령어로 검색되지 않으면 제대로 설치 되지 않은 것
find / -name "mod_jk.so"

# apache를 소스설치 한 경우, mod_jk.so 파일을 소스설치 경로로 복사해준다.
cp -arp mod_jk.so /usr/local/src/httpd-2.4.57/modules

make install 진행 후, /usr/lib64/httpd/modules경로에 mod_jk.so가 있으면 정상적으로 진행 된 것이다.

 

※  configure: error: You must specify a valid --with-apxs path → 에러 발생시 처리방법(RHEL 8 에서 발생)

- 아파치 소스설치한 경로로 이동

- apxs 파일을 열어서 1번 줄 문장을 아래와 같이 수정해주면 해결된다.

vi /usr/local/src/httpd-2.4.57/bin/apxs

# apxs 파일의 1번줄 기존 내용
#!/replace/with/path/to/perl/interpreter -w

# apxs 파일의 1번줄 내용을 아래와 같이 바꿔준다.
#!/usr/bin/perl

 

4. 아파치 - 톰캣 연동 진행

 

1) Apache conf 파일에서 내용 추가한다.

LoadModule jk_module modules/mod_jk.so

<VirtualHost *:80>	
	JkMount /* balancer
</VirtualHost>
 
<ifModule jk_module>
        JkWorkersFile conf/workers.properties

        JkShmFile logs/mod_jk.shm
        JkLogFile logs/mod_jk.log

        JkLogLevel error

        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
</ifModule>

 

2) workers.properties 내용을 아래와 같이 추가한다.

vi workers.properties

# worker list
worker.list=balancer

# balancer
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1

# tomcat1
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13

 

3) 톰캣 server.xml 파일에서 AJP 포트 활성화

address="0.0.0.0"  secretRequired="false" 를 넣지 않으면 정상작동 하지 않으니 주의!!!

(중략)
    <Connector protocol="AJP/1.3"
               address="0.0.0.0"
               secretRequired="false"
               port="8009"
               redirectPort="8443"
               maxParameterCount="1000"
               />
(중략)

 

1) 톰캣을 start한다.

/home/tomcat-test1/bin/startup.sh

* 톰캣 중지는 bin/shutdown.sh 이다.

 

 

2) 톰캣 포트가 올라왔는지 확인한다.(디폴트 상태라면 8080포트가 LISTEN상태다.)

 

3) 브라우저로 80포트 접근시 톰캣 그림 출력 된다면, 정상적으로 아파치-톰캣 연동 완료

+ Recent posts