본문 바로가기
Nginx

Nginx 소스 컴파일 설치하기 (With. Docker + CentOS 7)

by WangTak 2021. 12. 14.
반응형

Nginx에 third party module을 추가해야 될 일이 생겼습니다. 기존 개발 서버와 운영 서버는 패키지로 Nginx를 설치했었는데, 패키지 설치는 third party module 추가가 불가능했습니다. Nginx를 소스 컴파일 방식으로 설치한 내용을 공유해보려고 합니다. 아무래도 개발 서버에 바로 들이박으면 롤백하기 너무 힘들 거 같아서 Docker에 CentOS 컨테이너를 띄워서 작업했습니다.

 

버전 정보

  • CentOS: 7.8.2003
  • Nginx: 1.20.1

 

Docker에 CentOS 이미지 가져오고 컨테이너 띄우기

docker pull centos:7.8.2003

docker run --privileged --restart always --name dev -p 80:80 -p 443:443 -v D:\Docker\dev:/mnt -dt centos:7.8.2003 /sbin/init

docker exec -it dev /bin/bash

1. docker의 public repository에서 centos 이미지를 당겨옵니다.

2. 가져온 이미지를 실행하기 위한 docker run 명령어를 사용해줍니다.

3. docker exec 명령어를 사용하여 dev 컨테이너에 접속합니다.

 

사용한 option 정리

# --privileged ~~ /sbin/init = centos 내에서 systemctl 권한을 얻기 위한 옵션

# --restart always = 도커가 실행될 때 컨테이너를 자동으로 실행하는 옵션

# -p  80:80 -p 443:443 = -p는 port를 지정할 수 있도록 하는 옵션입니다. 콜론(:)을 기준으로 왼쪽은 host 포트, 오른쪽은 컨테이너의 포트입니다. 호스트에서 ip:80으로 접근을 하게 되면, 컨테이너에서 80 포트로 포워딩됩니다.

# -v  D:\Docker\dev:/mnt = -v는 디스크 볼륨 마운트를 할 수 있도록 하는 옵션입니다. 콜론(:)을 기준으로 왼쪽은 호스트의 디렉터리, 오른쪽은 컨테이너의 디렉터리입니다.

# -d  = -d는 detached로 컨테이너가 백그라운드로 실행되도록 하는 옵션

# -t  = tty를 활성화 화여 bash 쉘을 이용하도록 하는 옵션 (가상 터미널 환경을 에뮬레이션 해주겠다)

# -i  = 상호 입출력을 활성화하는 옵션 (Client가 입출력할 수 있도록)

 

CentOS에서 Nginx 소스 컴파일 설치

yum 최신 업데이트

yum -y update

 

nginx 소스 컴파일에 필요한 패키지 및 편의를 위한 라이브러리 설치

yum -y install wget vim
yum -y install make openssl gcc gcc-c++

 

필수 라이브러리 설치

// 필수 라이브러리를 모아 둘 임시 디렉터리 생성
cd /
mkdir nginx_source
cd nginx_source

 

1. zlib

wget https://zlib.net/zlib-1.2.11.tar.gz
tar zxf zlib-1.2.11.tar.gz

 

2. openssl

wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar zxf openssl-1.1.1l.tar.gz

 

3. pcre

wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
tar zxf pcre-8.45.tar.gz

 

4. nginx

wget https://nginx.org/download/nginx-1.20.1.tar.gz
tar zxf nginx-1.20.1.tar.gz

 

5. nginx를 돌릴 임시 유저 생성

useradd --shell /usr/sbin/nologin nginx
cd nginx-1.20.1

 

6. configure를 이용한 nginx 환경 설정

./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/mmc/nginx.pid \
--lock-path=/usr/local/nginx/mmc/nginx.lock \
--error-log-path=/usr/local/nginx/mmc/error.log \
--http-log-path=/usr/local/nginx/mmc/access-log \
--with-zlib=../zlib-1.2.11 \
--with-pcre=../pcre-8.45 \
--with-openssl=../openssl-1.1.1l \
--with-http_ssl_module \
--with-debug \
--user=nginx \
--group=nginx
make && make install
configure: 소스 파일에 대한 환경 설정을 해주는 명령어, --prefix=/usr/local/nginx는 옵션, 필요에 따라 옵션을 추가해주면 됩니다. [옵션은 기호에 맞게 바꿔도 됩니다.]
make: 소스를 컴파일하는 명령어, make가 정상적으로 수행되면 설치 파일이 생성
make install: make를 통해 생겨난 설치 파일을 통해 설치

 

정상적으로 설치가 되었는지 확인

cd /usr/local/nginx/sbin
./nginx
curl localhost

 

nginx 실행 파일이 있는 곳으로 이동해서 nginx를 실행하여 curl을 통해 nginx 서버가 잘 실행됐는지 확인해봅니다. 또한 호스트 브라우저에 localhost를 해도 nginx에서 제공하는 index.html이 보여야 합니다.

 

[Optional] 추가 설정

nginx의 설정 파일을 수정한 후에 오류가 없는지 확인하거나, nginx의 가동, 중지, 상태 확인을 위해서는 추가적으로 설정을 해야 합니다.

 

nginx 환경 변수 추가하기

nginx를 패키지로 설치하게 되면 nginx -t와 같은 명령어를 어디서든 사용할 수 있지만 소스 컴파일 방식으로 설치를 하게 되면 직접 환경 변수에 등록해야 합니다.

 

vi /etc/profile
[아래 2줄을 추가해줍니다.]
```
export NGINX_HOME=/usr/local/nginx
export PATH=$NGINX_HOME/sbin:$PATH
```
source /etc/profile

 

위와 같이 설정을 해주면 /usr/local/sbin 위치가 아니더라도 nginx -t와 같은 실행 명령을 할 수 있습니다.

 

nginx.service 등록하기

저는 systemctl 명령어를 사용하여 nginx의 상태, 가동, 중지를 했습니다. 그래서 소스 컴파일은 따로 서비스를 등록해줘야 사용할 수 있었습니다. 다음과 같이 말이죠

cd /etc/systemd/system
vi nginx.service
// 아래 내용 추가
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.targetremote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/mmc/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
// nginx.service 작성 완료 후
systemctl daemon-reload
systemctl status nginx
systemctl stop nginx
systemctl start nginx
// 위와 같은 명령어를 자유롭게 수행할 수 있습니다.

 

추가 설정 정리

위에서 Nginx를 환경 변수로 설정함으로써 nginx -t와 같은 nginx 명령어를 사용할 수 있었습니다. 그러나 root 계정 이외에서 nginx -t를 했을 때 sudo 권한이 필요했고 [nginx -t를 하는 과정에서 error-log, nginx.pid를 확인해야 하는데 2개의 파일이 root 소유였기 때문에 일반 계정의 경우는 접근 할 수 없습니다] , sudo 권한을 가진 계정으로 sudo nginx -t와 같은 명령어를 실행했습니다. 결과는? sudo: nginx: command not found 였습니다.. 그래서 이 문제를 해결하려고 했지만 어떻게 해결해야 할 지 몰라서 nginx -t를 alias로 영구 등록하여 사용했습니다.

 

Nginx의 설정을 전담할, Nginx 명령어를 사용할 계정으로 로그인 하시고(sudo 권한이 있어야 합니다.) 다음과 같이 진행합니다.

alias nxt='sudo /usr/local/nginx/sbin/nginx -t'

alias는 key, value 형태로 등록합니다.

왼쪽에는 nxt와 같이 원하시는 별칭을 지정해주시면 됩니다. 띄워쓰기가 가능하지 않았으며, Single & Double 쿼테이션으로 묶는 것도 가능하지 않았습니다. 

우측에는 수행할 명령어를 적어줍니다.

 

cd ~
vi .bashrc

아래 사진처럼 등록 할 alias를 적어줍니다.

 

.bashrc에 alias 등록

 

source ~/.bashrc

source 명령어로 마무리해주시면 영구적으로 alias가 등록되고 nxt를 할 때 sudo 명령어를 사용한 거처럼 비밀번호를 입력하면 정상적으로 nginx 명령어가 실행되는 것을 확인할 수 있습니다.

 

alias 등록 확인

 

반응형