프로젝트를 진행하면서 서버 이중화를 위해 LB서버로 Nginx를 이용하여 구성한 내용을 정리했습니다.
리눅스 환경에서 개발환경을 조성할 때 설치방법이 패키지 설치와 컴파일 설치가 있는데, 관리의 용이성을 위해 컴파일 설치로 진행했습니다.
먼저 컴파일 설치와 패키지 설치의 장단점을 비교해보고 nginx를 컴파일 설치하는 방법을 정리하겠습니다.
패키지 설치 vs 컴파일 설치
패키지 설치
리눅스에서 필요한 환경을 설치할 때 yum, apt 등의 명령어를 이용하여 간단하게 설치할 수 있다.
이러한 yum, apt 같은 명령어를 package manager라고 한다.
package manager는 소프트웨어의 설치, 업데이트, 구성 등을 관리하는 시스템이다.
리눅스에서는 패키지 관리자를 통해 프로그램을 설치할 때, 의존성이 있는 프로그램들을 같이 설치해주고, OS 종류 / 버전에 맞춰서 설치를 진행하기 때문에 사용자가 소프트웨어를 쉽게 관리할 수 있는 장점이 있다.
yum 패키지 설치의 동작 방식
예를들어 yum은 RPM 기반의 패키지 관리 도구인데, 이 패키지들은 yum repository라고 하는 저장소에 위치한다.
yum의 동작 과정을 살펴보면
yum 명령어를 입력했을 때 /etc/yum.repos.d 디렉터리 아래에 위치한 *.repo 형식의 파일을 확인한 후 yum이 사용하는 repository에서 파일을 연다. RHEL 기반의 리눅스인 Rocky의 경우 rocky.repo 파일에 대부분의 패키지를 다운받을 수 있는 저장소 정보가 있다.
패키지 관리자는 이미 컴파일 된 소프트웨어를 저장소에서 다운로드하여 설치를 진행하는 방식이기 때문에 매우 간단하고 빠르다.
그러나 패키지 설치는 컴파일 설치에 비해 커스터마이징이 제한적이고, 패키지 버전이 최신 버전보다 다소 늦을 수도 있다.
컴파일 설치
컴파일 설치의 경우 소스 패키지를 다운로드하여 make 등의 명령어로 컴파일 후 설치하는 것을 말한다.
소스 패키지의 경우 일반적으로 여러 파일이 포함되어있으며, 주로 tar.gz 형식으로 압축되어있다.
이러한 소스패키지를 Tarball 이라고 하며, Tarball은 Linux 시스템 패키징 도구로, 소스패키지를 압축한 파일이다.
소프트웨어를 컴파일 설치하게 되면 좀 더 세밀하게 커스터마이징할 수 있어, 특정 모듈이나 최적화 옵션을 추가하기 위해서는 컴파일 설치로 진행한다.
그러나 소스코드를 컴파일하고 설치하는 시간이 많이 걸리고, 필요한 라이브러리와 의존성을 사전에 설치해야 한다. 또한 업데이트와 보안 패치 적용을 수동으로 해야하기 때문에 관리가 복잡할 수 있다는 단점이 있다.
이번 프로젝트에서는 nginx의 설치 경로를 지정하고, 모니터링 모듈을 포함하여 설치하기 위해 컴파일 설치를 진행했다.
Nginx 컴파일 설치 과정
방화벽 오픈
firewall-cmd --zone=public --permanent --add-port=80/tcp #http
firewall-cmd --zone=public --permanent --add-port=443/tcp #https
firewall-cmd --reload
firewall-cmd --zone=public --list-all
SELinux 중지
# 현재 환경에 적용
setenforce 0
# 자동 실행 설정 - 재시작 필요
vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
nignx를 실행할 때 SELinux의 정책으로 인해 문제가 발생할 수 있기 때문에 이번 프로젝트에서는 간단하게 SELinux를 disable 하고 진행했다.
컴파일에 필요한 라이브러리 설치
yum -y update
yum -y install gcc make gcc-c++ libxslt-devel expat-devel zlib-devel perl
pcre 다운로드 및 컴파일 설치(pcre2는 안됨)
# download : https://sourceforge.net/projects/pcre/
mkdir -p /app/program && cd /app/program
wget --no-check-certificate https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
tar xvf pcre-8.45.tar.gz
cd pcre-8.45
./configure
make
make install
다운로드 받은 경로에 들어가 컴파일 후 설치한다.
openssl 다운로드 및 컴파일 설치
# download : https://openssl.org/source/
cd /app/program
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
tar xvf openssl-1.1.0h.tar.gz
cd openssl-1.1.0h
./config
make
make install
# ssl 라이브러리 확인
ldconfig -p | grep ssl
# 라이브러리 참조 변경
vi /etc/ld.so.conf
/app/nginx/openssl/lib
include ld.so.conf.d/*.conf
nginx 다운로드
# download : https://nginx.org/download/
# nginx option : https://nginx.org/en/docs/configure.html
cd /app/program
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar xvf nginx-1.20.2.tar.gz
nginx health check 모듈 설정(생략 가능)
# https://github.com/yaoweibin/nginx_upstream_check_module
yum install -y git patch
cd /app/program
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
# 이후 nginx 설치 폴더로 들어가서 health check module을 patch
cd nginx-1.20.2
patch -p1 < /app/program/nginx_upstream_check_module/check_1.16.1+.patch
nginx에서 클러스터링 한 서버들의 health check 상태를 간단한 UI로 보여주는 모듈이다.
깃허브에서 모듈을 다운로드 하여 nginx 컴파일 설치를 할 때 옵션으로 필요한 모듈 파일을 넣고 함께 컴파일을 하게 된다.
nginx 1.20.2 버전에서는 모듈 1.16.1 버전을 함께 설치 했는데, 컴파일 설치를 할 때 nginx 의 버전과 호환이 되지 않는 경우가 있어 한번 알아보는 것이 좋을것 같다.
nginx 컴파일 설치
# config option 확인하기
./configure --help
./configure \
--prefix=/app/nginx \
--sbin-path=/app/nginx/sbin/nginx \
--conf-path=/app/nginx/conf/nginx.conf \
--pid-path=/app/nginx/mmc/nginx.pid \
--lock-path=/app/nginx/mmc/nginx.lock \
--error-log-path=/app/nginx/logs/error.log \
--http-log-path=/app/nginx/logs/access.log \
--add-module=/app/program/nginx_upstream_check_module \ # health check module
--with-http_addition_module \
--with-http_dav_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_sub_module \
--with-http_xslt_module \
--with-openssl=/app/program/openssl-1.1.0h \
--with-pcre=/app/program/pcre-8.45 \
--with-pcre-jit
make
make install
.configure는 make로 컴파일 후 make install로 설치를 진행하기 전에 시스템 환경을 검사하여 컴파일이 가능한지를 확인하는 명령어이다.
다양한 옵션으로 모듈과 설정 내용을 포함시켜 makefile을 생성한다. 이 파일은 실제 컴파일 과정에서 사용되며, 소프트웨어가 어떻게 빌드될지를 결정한다.
이렇게 생성된 makefile의 내용은 다음과 같다.
default: build
clean:
rm -rf Makefile objs
.PHONY: default clean
build:
$(MAKE) -f objs/Makefile
install:
$(MAKE) -f objs/Makefile install
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/app/nginx/sbin/nginx -t
kill -USR2 `cat /app/nginx/mmc/nginx.pid`
sleep 1
test -f /app/nginx/mmc/nginx.pid.oldbin
kill -QUIT `cat /app/nginx/mmc/nginx.pid.oldbin`
.PHONY: build install modules upgrade
Makefile의 작성 방법은 다음에 정리하려고 한다.
이렇게 설치된 nginx의 구조는 다음과 같이 되어있다.
[root@localhost nginx]# tree
.
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
│ ├── access.log
│ └── error.log
├── mmc
│ └── nginx.pid
├── sbin
│ └── nginx
└── system
└── systemd
└── nginx.service
주요 파일을 간단하게 살펴보면
- conf/nginx.conf
nginx의 주요 설정 파일이다.
이 파일에서는 웹 서버의 동작 방식, 로깅, 프록시 설정등을 구성할 수 있다.
nginx.conf.default도 nginx의 기본 설정 내용으로 구성되어 있다. - system/systemd/nginx.service
nginx를 시스템 서비스로 관리하기 위한 systemd 서비스 유닛 파일이다.
이 파일을 통해 nginx 서버의 시작, 중지, 재시작 등을 systemd 명령어로 관리할 수 있다.
nginx.service 파일이 없는경우 파일을 생성하여 작성할 수도 있다. - sbin/nginx
nginx의 실행파일이다.
nginx 버전 확인 및 path 설정
cd /app/nginx/sbin
./nginx -v
# nginx path 설정
echo 'export PATH="/app/nginx/sbin:$PATH"' >> ~/.bashrc
source ~/.bashrc
nginx -v
nginx를 systemctl에 등록하여 서비스 시작하기
mkdir -p /app/nginx/system/systemd
vim /app/nginx/system/systemd/nginx.service
[Unit]
Description=Nginx Load Balancer
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/app/nginx/mmc/nginx.pid
ExecStart=/app/nginx/sbin/nginx -c /app/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
# 설정한 파일 /etc/systemd/system 에 등록하기
ln -s /app/nginx/system/systemd/nginx.service /etc/systemd/system/nginx.service
# 기존 nginx 서비스 종료
pkill -9 nginx
# nginx 서비스 명령어
systemctl daemon-reload
systemctl enable nginx.service
systemctl start nginx
systemctl status nginx
systemctl stop nginx
# Log file 확인
tail -f /app/nginx/logs/*
이렇게 nginx 컴파일 설치하는 방법을 정리해봤다.
다음 글에서는 nginx.conf 의 구성 방법과 다양한 옵션등을 정리하려고 한다.
참고자료
- https://kim-dragon.tistory.com/232
- https://velog.io/@leesomyoung/%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%B9%98-vs-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%84%A4%EC%B9%98
- https://jinseok12.tistory.com/61
- https://github.com/binghe819/TIL/blob/master/Infra&DevOps/NGINX/NGINX%20%EB%A1%9C%EB%93%9C%20%EB%B0%B8%EB%9F%B0%EC%8B%B1%20(%EB%AC%B4%EB%A3%8C%20%ED%97%AC%EC%8A%A4%EC%B2%B4%ED%81%AC%EB%A5%BC%20%EA%B3%81%EB%93%A4%EC%9D%B8).md#nginx-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%B9%98-with-module
'DevOps' 카테고리의 다른 글
Nginx LB 서버 - nginx.conf (0) | 2024.03.12 |
---|---|
GitHub Action CI/CD 파이프라인 구축하기(1) (0) | 2023.11.26 |
Github Action이란 (0) | 2023.11.26 |
[AWS] ECR - Elastic Container Registry (0) | 2023.11.26 |
Vagrant란? (0) | 2023.06.29 |