티스토리 뷰

아래와 같은 구성으로 진행됩니다.


[내가 만든 웹 페이지 서버에 배포하기]

(1) Django를 활용한 웹페이지 만들기

(2) Django에 DB/Cache 연결하기

(3) Django를 uWSGI와 NGINX를 이용해 배포하기

(4) 내가 배포한 웹으로 HAproxy 구성하기    𖦹현재 포스터𖦹

 

 

[포스터 참고]

(1) Django를 활용한 웹페이지 만들기:  https://hyewon-s-dev.tistory.com/8

 

[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (1) Django를 활용한 웹페이지 만들기

아래와 같은 구성으로 포스터 업로드 예정입니다. 참고해주세요. [내가 만든 웹 페이지 서버에 배포하기] (1) Django를 활용한 웹페이지 만들기 𖦹현재 포스터𖦹 (2) Django에 DB/Cache 연결하기 (3) Djan

hyewon-s-dev.tistory.com

 

(2) Django에 DB/Cache 연결하기: https://hyewon-s-dev.tistory.com/9

 

[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (2) Django에 DB/Cache 연결하기

아래와 같은 구성으로 포스터 업로드 예정입니다. 참고해주세요. [내가 만든 웹 페이지 서버에 배포하기] (1) Django를 활용한 웹페이지 만들기 (2) Django에 DB/Cache 연결하기 𖦹현재 포스터𖦹 (3) Djan

hyewon-s-dev.tistory.com

 

(3) Django를 uWSGI와 NGINX를 이용해 배포하기: https://hyewon-s-dev.tistory.com/11

 

[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (3) Django를 uWSGI와 NGINX를 이용해 배포하기

아래와 같은 구성으로 포스터 업로드 예정입니다. 참고해주세요. [내가 만든 웹 페이지 서버에 배포하기] (1) Django를 활용한 웹페이지 만들기 (2) Django에 DB/Cache 연결하기 (3) Django를 uWSGI와 NGINX를

hyewon-s-dev.tistory.com

 


 

설치에 앞서 간단하게 HAproxy 존재 이유로드밸런싱 흐름에 대해 정리하겠습니다.

 

서버는 한정적인 자원을 가지고 있어, 클라이언트의 요청이 많아지게 되면, 요청에 대해 모두 응답하지 못하게 됩니다.

따라서, 이러한 문제를 해결하기 위해 서버의 사양을 높이는 (1) scale-up 방법과,

여러 서버에게 트래픽을 분산해주는 (2) scale-out 방법을 제안하는데, 

이 중 HAproxy는 scale-out 방법을 이용하며, 여러 대의 서버로 트래픽을 균등하게 분산해주게 됩니다. (사진 참고)

사진 출처: https://velog.io/@ektmf4411/Load-Balancer%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C

 

참고로, 매번 저만 읽는 법 궁금할지 모르겠는데, HAproxy는 High Availability proxy 줄임말로, 대문자로 작성된 알파벳 따로따로 읽어서 '에이치 에이 프록시' 라고 읽습니다.. (맨날 하프록시라 읽어서 창피했던..)

 

 

HAproxy는 같은 기능을 가지고 있는 앱 서버 여러 대를 번갈아가며 로드밸런싱 시켜주게 됩니다. 이해를 돕기 위해 예시로 아래 구성도를 그려보았습니다.

 

서버 B와 서버 C에 각각 설치된 데이터베이스 PostgreSQL과 캐시 redis는 APP을 만들 때 이용하였으며, (전 포스터들 참고)

 

사용자는 HAproxy가 설치된 로드밸런서 서버 A로 접속하게 되면, 서버 B와 서버 C에 있는 APP(반드시 동일한 프로그램이 구성되어있어야 합니다.) 이 번갈아가며 사용자에게 보여지게 됩니다. 

 

 

 

그럼, 앞서 세 포스터에서 Django 를 이용해 만든 웹 페이지를 uWSGI, NGINX로 배포한 서버들을 HAproxy와 연결해보겠습니다.

 

[진행 환경] Linux CentOS7

HAproxy 설치는 yum을 이용하지 않고 수동으로 설치합니다.

 

1. HAproxy 수동 설치

먼저, 설치에 필요한 dependency library를 설치해줍니다.

yum install gcc pcre-static pcre-devel -y

 

HAproxy 2.1.2 버전의 압축 파일을 설치합니다.

cd /home/user/apps/haproxy
wget https://www.haproxy.org/download/2.1/src/haproxy-2.1.2.tar.gz --no-check-certificate
tar -zxvf haproxy-2.1.2.tar.gz
cd haproxy-2.1.2

 

HAproxy 설치 옵션을 참고해 설치시켜주었습니다.

make TARGET=linux-glic USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_PCRE=1
make PREFIX=/home/user/apps/haproxy/haproxy DESTDIR= install
설치 옵션 명 설명
USE_OPENSSL SSL 인증서 활성화. https 사용하는 경우 필수
USE_ZLIB 압축을 사용할 경우
USE_SYSTEMD systemd를 통해 서비스 컨트롤
USE_PCRE 펄 호한 정규식을 사용할 경우

 

install 하시게 되면 {prefix에 지정한 경로}/sbin 안에 haproxy 데몬파일이 있을 것입니다. 아래 코드 작성하여, 버전 확인으로 설치 잘 되었는지 확인해주세요.

cd /home/user/apps/haproxy/haproxy/sbin
./haproxy -v

 

 

2. HAproxy log 구성

만약 HAproxy 로그가 딱히 필요 없다면 안해도 무관하지만, 만약 오류가 생겼을 때 문제 찾기 위해 사용하는 것을 추천합니다.

 

보통 로그는 자체 오픈소스에서 제공하기 마련인데, HAproxy는 단순히 파일에 대한 로깅을 지원하지 않아 syslog를 이용해 log를 확인해야 합니다.

[참고] https://www.haproxy.com/blog/introduction-to-haproxy-logging

 

Introduction to HAProxy Logging

In this blog post, we show how to set up HAProxy logging, target a Syslog server, understand the log fields, and suggest helpful tools for parsing log files.

www.haproxy.com

 

먼저 필요한 라이브러리 syslog를 설치해줍니다.

yum install syslog

 

syslog는 systemctl을 이용해 구동되며, 먼저 HAproxy 로그를 어디에 저장할지 syslog에 config를 작성해줍니다. 아래 코드를 입력하여 vi 에디터를 키고,

vi /etc/rsyslog.d/haproxy.conf

아래 형식에 맞춰 저장하고자 하는 로그를 작성해주고, 원하는 위치를 지정해줍니다.

# Collect log with UDP
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514

# Creating separate log files based on severity
local0.* /home/user/apps/haproxy/logs/haproxy-traffic.log
local0.notice /home/user/apps/haproxy/logs/haproxy-admin.log

 

그리고 restart 해주면 됩니다.

systemctl restart rsyslog

 

[참고] 만약 haproxy 로그 구성만 보시는 분이시라면, cfg 파일 내에서 log 옵션 수정해주셔야 합니다. 아래 참고해주세요.

 

3. haproxy.cfg 구성

서버 두 대(혹은 그 이상)를 로드밸런싱 하기 위해서 config 파일 작성이 가장 중요합니다. 저는 아래 경로에 haproxy.cfg를 구성해주었습니다.

cd /home/user/apps/haproxy/haproxy
vi haproxy.cfg

 

haproxy config 파일에는 총 5가지 영역이 있습니다.

Global 전체 영역에 걸쳐서 적용되는 설정
Defaults 그 다음에 오는 section에 적용되는 공통 설정 내역
Frontend 클라이언트 연결에 관한 설정
Backend Frontend에서 접속된 트래픽을 전달할 프록시 서버에 대한 설정과 healthcheck 등의 설정
Listen FrontendBackend의 기능이 결합된 완전한 프록시.
트래픽을 분할해야 하거나 애플리케이션이 커지는 경우에는 개별 frontend backend 섹션을 사용하는 것이 좋음

서버 2대를 로드밸런싱하기 위해서 Frontend와 Backend를 활용해주고,

monitoring page 같은 경우는 간단하게 listen으로 구성합니다.

 

 

구성한 config 파일 전체 입니다.

global	# 프로세스 전체에 영향을 주는 내용
	log 	127.0.0.1:514 local0	# 경고 및 문제 기록
	user	user(사용자 이름 작성해주시면 됩니다)
	daemon							# background mode process
	maxconn	4096					# 프로세스 당 최대 연결 개수
	uid	500					
	gid	500
	pidfile	/home/user/apps/haproxy/haproxy/haproxy.pid	# 실행 피드명
	tune.ssl.default-dh-param 2048

	ssl-default-bind-options no-sslv3 no-tls-tickets	# 이전 프로토콜에 대한 지원을 비활성화 하는 옵션

#-------------------------------------------------
defaults # front, back, listen 에 관련된 전역 섹션
	mode	http			# http 프로토콜을 사용하는 로드밸런싱 모드(default tcp)
	log	global				# log는 global 설정에 따름
	option	httplog			# 기본 log는 SIP, DIP와 Name만 표기하므로, 이 옵션을 사용하여 디테일을 높임
	option	dontlognull		# 로그 비대화 방지를 위해, Probe(정찰, 스캔) 같은 기록을 haproxy log화하지 않는 옵션
	option	dontlog-normal		
	option	http-server-close	# 클라이언트와 리얼서버 연결 종료 시, handshake 종료하여 더 빠르게 새로운 세션을 준비할 수 있도록
	option	forwardfor		# 클라이언트 IP 확인가

	timeout	http-request	10s	# DoS 방어를 위해, HTTP 요청 타임아웃시간 설정(request 시 헤더에만 적용)
	timeout	queue	1m		# 서버의 maxconn 에 도달 시, HTTP 503응답을 보내며 연결을 버리기까지의 시간
	timeout	connect	10s		# TCP 패킷손실을 막기 위한 real 서버로의 연결 최대 지연시간 설정(backand에 적용)
	timeout	client	1m		# 외부 클라이언트의 요청이나 데이터와의 연결 최대 시간(request와 같이 사용)
	timeout	server	1m		# 서버가 데이터를 승인하거나, 전송해야 할 때의 연결 최대 시간
	timeout	http-keep-alive	10s	# 클라이언트의 요청에 따른 응답 전송 후, 다음 요청까지의 대기 시간. http-request가 선행함.
	timeout	check	10s		# timeout server와 동일하거나 작은 값
#--------------------------------------------------
# http 80/ https 443 ssl setting
frontend http-in
	bind	*:80
	bind	*:443 ssl crt /home/user/apps/ssl/mydomain.pem

	default_backend servers
#---------------------------------------------------
backend servers
	balance	roundrobin
	http-check expect status 200
	server {ip 주소}:80 check
    	server {ip 주소}:80 check
    	...

#---------------------------------------------------
listen stats # stats라는 이름으로 listen 지정
	mode	http
	bind	*:9000				# 접속 포트
	stats	enable
	stats	realm Haproxy\	Statistics	# 브라우저 타이틀
	stats	uri	/haproxy_stats		# stat를 제공할 URI

 

SSL 인증서 발급을 안하셨다면, 아래 포스터를 참고하시어 self-signed ssl 발급받으시면 됩니다.

 

[WEB Server/Linux] NGINX 수동 설치 및 HTTP/HTTPS + stats page 적용

CentOS에서 yum을 이용하지 않고 수동으로 설치합니다. [설치 환경] CentOS7 1. NGINX 파일 설치 및 압축 풀기 NGINX 버전 1.16.1로 설치 진행했습니다. 아래 링크에서 버전 확인하고 설치하시면 될 것 같습

hyewon-s-dev.tistory.com

 

 

4. HAproxy 데몬 권한 설정

외부 ip를 통해 웹 페이지에 접속하기 위해서는 권한 변경이 필요합니다.

 

1024 아래 포트들을 할당하기 위해서는 root의 권한이 필요하기 때문에 소유권을 root로 변경시켜주고, (관련 포스터)

실행 가능 권한(+x, 4) 을 줌으로써 다른 사용자도 접속할 수 있도록 해줍니다.

 

[HAproxy/Error] [ALERT] cannot bind socket [0.0.0.0:80]

HAproxy 실행 시 뜬 에러 에러 발생 시 보안 정책때문에 포트 할당이 안되는건가 싶어 확인해보았지만, 그 문제는 아니었다. [참고] https://skysoo1111.tistory.com/49 # haproxy 에러 [ALERT] 015/013939 (22640) : Start

hyewon-s-dev.tistory.com

 

cd /home/user/apps/haproxy/haproxy/sbin
sudo chown -R root:user ./haproxy
sudo chmod 4777 ./haproxy

 

 

5. HAproxy 실행

이제 다 구성이 되었으니, 실행시키시면 됩니다.

cd /home/user/apps/haproxy/haproxy/sbin
./haproxy -f ../haproxy.cfg -p ../haproxy.pid

 

실행 확인

sudo netstat -tupln | grep haproxy

잘 실행중이라면, 아래 사진과 같이 80, 443, 9000포트가 haproxy에 할당된 것을 확인하실 수 있습니다.

 

이제 {ip 주소}:80, {ip 주소}:443 으로 접속하셨을 때, haproxy.cfg에 작성하신 서버들이 번갈아가며 뜨는 것을 확인하실 수 있고,

{ip 주소}:9000/haproxy_stats 로 접속하셨을 때, 모니터링 및 상태를 확인할 수 있는 페이지를 확인하실 수 있습니다.

(모니터링 페이지 같은 경우, 9000 포트로 접속 뿐만 아니라 정의하신 uri까지 입력하셔야 확인 가능하십니다!)

 

 

 

[작업 중 발생한 HAproxy 에러]

 

(1) [503 에러] haproxy.cfg 에 작성한 서버 웹페이지가 정상적으로 작동하는지 확인하기

저 같은 경우, haproxy에 작성한 서버에 웹페이지가 둘 다 안띄운 상태여서, 확인 안하고 작업했다가 시간 많이 잡아먹었습니다.

 

(2) [404 에러] haproxy.cfg에 작성한 서버들의 웹페이지가 요청 url이 동일한지, 같은 웹 서비스를 제공하는지 확인해보기.

연습용으로 하나는 제가 만든 웹을 띄워놓고, 하나는 그냥 nginx 기본 페이지로 냅뒀었는데,

db, cache 이용하여 데이터 불러오는게 번갈아가며 발생하는 오류가 발생했었습니다.

로드밸런싱 할 때 페이지가 바뀌지 않아도(ajax 같은거), 요청이 오가는 것 또한 로드밸런싱 되기 때문에, 반드시 haproxy.cfg 서버 구성 시, 동일한 기능을 하는 APP으로 등록하셔야 합니다.

 

(3) CSS 적용 안되는 에러

 

[WEB/Error] Django + uWSGI + NGINX + HAproxy 진행 시 CSS 적용 안되는 에러 및 해결 방법 총정리

제대로 정리된게 없어서 진짜 오진장 삽질하고, 이건 써야겠다 하고 생각만 오만번 하다가 이제 정리.. 여기서의 에러는 크롬 검사 눌렀을 때, css 파일 자체가 보이지 않는 상황을 말함. 서버에

hyewon-s-dev.tistory.com

 

 

 

[HAproxy 개념 출처]

https://velog.io/@ektmf4411/Load-Balancer%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C

https://dev-youngjun.tistory.com/97

 

 

 

피드백, 틀린 부분 지적 환영입니다 :)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함