[DevOps] Nginx 컴파일 설치
안녕하세요? 정리하는 개발자 워니즈 입니다. 2022년의 첫 포스팅입니다. 그동안 업무로 인해 블로그 정리에 대해서 소홀했던 것 같습니다. 저의 블로그에 방문해주시는 모든 분들 새해복 많이 많이 받으셨으면 좋겠습니다. 🙇
1월 경에는 이것저것 설치와 구성을 많이 하는 달이였던 것 같습니다. 특히 필자는 nginx에 관심이 굉장히 많습니다. nginx는 간단한게 웹서버를 구성해줄 수 있을 뿐더러, reverse proxy 역할을 수행함으로써 적절한 LB의 역할도 수행을 해줍니다.
Nginx에 관한 시리즈 포스팅은 아래에서 확인이 가능합니다.
- [DevOps] Nginx 컴파일 설치
- [DevOps] ansible nginx config 배포 구성
- [DevOps] Nginx Logrotation 설정
- [DevOps] Nginx GeoIP 모듈 적용
- [DevOps] Nginx Log Aggregation & Dashboard
- [DevOps] Nginx Rate Limit
- [DevOps] Nginx Lua module 사용법
1. Nginx compile 설치
필자는 그동안 package manager를 통해서 간편하게 nginx를 설치했었습니다. 이렇게 설치했을 경우에는 별도의 module을 설치하거나 customizing을 하기 어렵다는 단점이 있습니다. 정형화된 nginx만을 사용하게 됩니다.
1. 필수 패키지 다운로드
nginx를 compile 방식으로 설치하기 위해서는 반드시 필요한 의존성 라이브러리들이 있습니다.
- PCRE(Perl Compatible Regular Expressions)
Nginx는 Perl5에서 사용하는 정규표현식 라이브러리인 PCRE를 사용합니다. Ngix의 재작성모듈과 HTTP 코어 모듈은 PCRE 구문에 따르는 정규표현식을 사용합니다.
- openssl
https 모듈인 HttpSslModule을 사용하기 위해서는 openssl 이 필요합니다.
- zlib
zlib 라이브러리는 개발자에게 압축 알고리즘을 제공합니다. ngx_http_gzip_module 을 사용하기 위해서는 zlib 라이브러리가 있어야 합니다.
필자는 위의 소스를 다음과 같은 방법으로 다운로드를 받았습니다.
#root 계정을 통해서 pkgs 폴더 생성
$ cd /
$ mkdir pkgs
$ cd pkgs
#필수 패키지 다운로드
$ wget http://nginx.org/download/nginx-1.20.1.tar.gz
$ wget https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1l.tar.gz
$ wget https://free.nchc.org.tw/osdn//sfnet/p/pc/pcre/pcre/8.44/pcre-8.44.tar.gz
$ wget https://fossies.org/linux/misc/zlib-1.2.11.tar.gz
#압축 해제
$ tar -zxvf nginx-1.20.1.tar.gz
$ tar -zxvf openssl-1.1.1l.tar.gz
$ tar -zxvf pcre-8.44.tar.gz
$ tar -zxvf zlib-1.2.11.tar.gz
설치는 아래의 순서대로 진행하게 됩니다.
- configure : 환경설정
-
make : 설치파일을 컴파일
-
make install : 설치파일을 이용해서 설치
2. configure를 통한
이제 필요한 준비는 모두 됐습니다. 아래의 순서대로 설치가 진행이 됩니다. 먼저 configure를 통해서 위에 준비한 재료들을 사용한다고 설정(configure)를 진행합니다.
# variable 설정
NGINX_VERSION=1.20.1
PCRE_VERSION=8.44
OPENSSL_VERSION=1.1.1l
ZLIB_VERSION=1.2.11
NGINX_PATH=/home1/irteam/apps/nginx-${NGINX_VERSION}
# 필요 패키지 설치
$ yum install gcc-c++ pcre-devel zlib-devel make wget openssl-devel which libxml2-devel unzip libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel git gperftools-devel libcurl-devel file -y
# nginx 경로 생성
$ mkdir -p /pkgs /home1/irteam/apps
# configure
./configure --prefix=${NGINX_PATH} \
--user=irteamsu --group=irteamsu \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_v2_module \
--with-pcre=/pkgs/pcre-${PCRE_VERSION} \
--with-openssl=/pkgs/openssl-${OPENSSL_VERSION} \
--with-zlib=/pkgs/zlib-${ZLIB_VERSION}
위의 설정은 금방 진행이 됩니다.
- –with-(zlib | pcre | openssl) : NGINX가 의존하고 있는 라이브러리들의 소스 경로
- –with-(http_ssl_module | debug) : NGINX를 설치할 때 ssl, debug 모듈을 활성화한다. 이 모듈들은 NGINX가 제공하는 내부 모듈이지만 기본적으로는 설치가 되지 않는 옵션사항이다.
- –prefix : NGINX가 설치될 기본 디렉토리를 의미한다. 이 디렉토리 하위에 NGINX의 실행, 로깅, 설정 파일들이 설치된다. 각각의 항목을 바꿀 수도 있다. 메뉴얼을 참고하자.
- –user, –gourp : irteam 사용자의 권한으로 NGXIN를 실행시킨다. Irteam 사용자가 없다면 만들어야 한다. 사용자의 리스트는 아래의 명령을 통해서 알 수 있다. irteam가 아니라 자기 자신의 계정을 사용해도 된다.
3. make & make install
이제는 소스코드의 compile을 진행합니다. 이부분은 다소 시간이 소요되는 부분입니다.
$ make
아래와 같이 설정한 directory에서 정상적으로 빠져나왔다는 문구가 출력이 되면, 컴파일이 정상적으로 된 것입니다.
sed -e "s|%%PREFIX%%|/home1/irteam/apps/nginx-1.20.1|" \
-e "s|%%PID_PATH%%|/home1/irteam/apps/nginx-1.20.1/logs/nginx.pid|" \
-e "s|%%CONF_PATH%%|/home1/irteam/apps/nginx-1.20.1/conf/nginx.conf|" \
-e "s|%%ERROR_LOG_PATH%%|/home1/irteam/apps/nginx-1.20.1/logs/error.log|" \
< man/nginx.8 > objs/nginx.8
make[1]: Leaving directory `/pkgs/nginx-1.20.1'
정상적으로 compile된 내용물을 설치(디렉토리를 옮김)하는 과정입니다.
$ make install
아래와 같이 정상적으로 지정한 폴더에 내용물을 옮기는 과정이 출력됩니다.
make -f objs/Makefile install
make[1]: Entering directory `/pkgs/nginx-1.20.1'
test -d '/home1/irteam/apps/nginx-1.20.1' || mkdir -p '/home1/irteam/apps/nginx-1.20.1'
test -d '/home1/irteam/apps/nginx-1.20.1/sbin' \
|| mkdir -p '/home1/irteam/apps/nginx-1.20.1/sbin'
test ! -f '/home1/irteam/apps/nginx-1.20.1/sbin/nginx' \
|| mv '/home1/irteam/apps/nginx-1.20.1/sbin/nginx' \
'/home1/irteam/apps/nginx-1.20.1/sbin/nginx.old'
cp objs/nginx '/home1/irteam/apps/nginx-1.20.1/sbin/nginx'
test -d '/home1/irteam/apps/nginx-1.20.1/conf' \
|| mkdir -p '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/koi-win '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/koi-utf '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/win-utf '/home1/irteam/apps/nginx-1.20.1/conf'
test -f '/home1/irteam/apps/nginx-1.20.1/conf/mime.types' \
|| cp conf/mime.types '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/mime.types '/home1/irteam/apps/nginx-1.20.1/conf/mime.types.default'
test -f '/home1/irteam/apps/nginx-1.20.1/conf/fastcgi_params' \
|| cp conf/fastcgi_params '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/fastcgi_params \
'/home1/irteam/apps/nginx-1.20.1/conf/fastcgi_params.default'
test -f '/home1/irteam/apps/nginx-1.20.1/conf/fastcgi.conf' \
|| cp conf/fastcgi.conf '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/fastcgi.conf '/home1/irteam/apps/nginx-1.20.1/conf/fastcgi.conf.default'
test -f '/home1/irteam/apps/nginx-1.20.1/conf/uwsgi_params' \
|| cp conf/uwsgi_params '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/uwsgi_params \
'/home1/irteam/apps/nginx-1.20.1/conf/uwsgi_params.default'
test -f '/home1/irteam/apps/nginx-1.20.1/conf/scgi_params' \
|| cp conf/scgi_params '/home1/irteam/apps/nginx-1.20.1/conf'
cp conf/scgi_params \
'/home1/irteam/apps/nginx-1.20.1/conf/scgi_params.default'
test -f '/home1/irteam/apps/nginx-1.20.1/conf/nginx.conf' \
|| cp conf/nginx.conf '/home1/irteam/apps/nginx-1.20.1/conf/nginx.conf'
cp conf/nginx.conf '/home1/irteam/apps/nginx-1.20.1/conf/nginx.conf.default'
test -d '/home1/irteam/apps/nginx-1.20.1/logs' \
|| mkdir -p '/home1/irteam/apps/nginx-1.20.1/logs'
test -d '/home1/irteam/apps/nginx-1.20.1/logs' \
|| mkdir -p '/home1/irteam/apps/nginx-1.20.1/logs'
test -d '/home1/irteam/apps/nginx-1.20.1/html' \
|| cp -R html '/home1/irteam/apps/nginx-1.20.1'
test -d '/home1/irteam/apps/nginx-1.20.1/logs' \
|| mkdir -p '/home1/irteam/apps/nginx-1.20.1/logs'
make[1]: Leaving directory `/pkgs/nginx-1.20.1'
2. 기본 설정
1. /usr/bin
global 하게 nginx binary를 실행할 수 있도록 /usr/bin/경로로 nginx binary를 copy해줍니다.
$ cp /home1/irteam/apps/nginx-1.20.1/sbin/nginx /usr/bin
먼저 설치한 경로로 이동을 해봅니다.
2. systemd 설정
daemon 형태로 명령어를 사용하기 위해서 systemd에 등록을 해줍니다.
$ vi /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/nginx -t
ExecStart=/usr/bin/nginx
ExecReload=/usr/bin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
3. symbolic link 설정
이부분은 필자만의 custom 사용인데, package manager를 사용하여 설치하게 되면 /etc/nginx 경로에 설치가 됩니다. 필자는 이경로로에서 config 제어를 하기 위해서 symbolic link를 걸어두기로 했습니다.
$ ln -s /etc/nginx/nginx.conf /home1/irteam/apps/nginx-1.20.1/conf/nginx.conf
3. 정상 설치 확인
먼저 nginx의 설정이 정상적인지를 체크합니다.
$ nginx -t
nginx: the configuration file /home1/irteam/apps/nginx-1.20.1/conf/nginx.conf syntax is ok
nginx: configuration file /home1/irteam/apps/nginx-1.20.1/conf/nginx.conf test is successful
nginx의 daemon 상태를 확인합니다.
$ systemctl status nginx
Loaded: loaded (/etc/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: inactive (dead)
nginx의 daemon을 기동합니다
$ systemctl start nginx
$ systemctl status nginx
● nginx.service - The NGINX HTTP and reverse proxy server
Loaded: loaded (/etc/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2022-02-09 10:26:30 JST; 1s ago
Process: 149360 ExecStart=/usr/bin/nginx (code=exited, status=0/SUCCESS)
Process: 149359 ExecStartPre=/usr/bin/nginx -t (code=exited, status=0/SUCCESS)
Main PID: 149363 (nginx)
CGroup: /system.slice/nginx.service
├─149363 nginx: master process /usr/bin/nginx
└─149364 nginx: worker process
Feb 09 10:26:30 ansible001-lnk8s-temp-jp2v-prod nginx[149359]: nginx: the configura...
Feb 09 10:26:30 ansible001-lnk8s-temp-jp2v-prod nginx[149359]: nginx: configuration...
Hint: Some lines were ellipsized, use -l to show in full.
4. Module 추가
서두에 정리했다시피, nginx를 위의 과정을 통해서 compile하는 이유는 module을 설치할 수 있다는 장점이 있습니다. 모듈에 대한 리스트는 아래의 페이지에서 확인할 수 있습니다.
필요한 모듈을 설치 과정에서 pkgs 폴더에 다운로드를 받습니다. 그렇게 된 상태에서 configure과정에서 add-module을 통해서 모듈을 참조하도록 해줍니다. 위의 설치 과정과 다른 부분은 마지막줄이 다릅니다.
./configure --prefix=${NGINX_PATH} \
--user=irteamsu --group=irteamsu \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_v2_module \
--with-pcre=/pkgs/pcre-${PCRE_VERSION} \
--with-openssl=/pkgs/openssl-${OPENSSL_VERSION} \
--with-zlib=/pkgs/zlib-${ZLIB_VERSION} \
--add-module=/pkgs/sample_module-${SAMPLE_VERSION}-x64
이러한 과정을 통해서 필요한 외부의 모듈을 탑재할 수 있습니다.
5. 마치며…
이번시간에는 nginx의 compile을 통해서 설치하는 과정에 대해서 정리를 해보았습니다. 그동안 패키지 매니저에 너무 익숙해져서 왜 이렇게 복잡한 과정을 걸쳐서 설치를 하는지 이해를 못했었습니다. 하지만, 이러한 과정에는 모듈의 설정이 연관이 있다는 것을 알게 됐습니다.
DevOps 입장에서 이러한 과정들을 하나로 엮어서 자동화 했으면 하는 생각이 들었습니다. 우선 다음시간에는 ansible을 통해서 nginx의 config 설정을 업데이트 하는 내용에 대해서 정리를 해보려고 합니다. 그리고 이후에는 nginx의 설치 과정에 대해서도 ansible을 통해서 손쉽게 구성이 가능하도록 해보려 합니다.
6. 참조
[Web Server] Nginx 1.6.2 컴파일 설치