프로젝트 사이트에서 RedHat 7.x대의 OS에서 TLSv1.3을 사용하기를 원했는데 기존 OpenSSL의 버전이 낮아 사용할 수가 없었다. 폐쇄망 환경이기 때문에 필요한 라이브러리 rpm파일과 tar.gz 파일도 모두 찾아서 가야했다.
우선 버전업 전에 테스트를 위해 기존 서버에 수동설치를 해보았다.
필요한 파일은 다음과 같았다.
대부분 구글링을 통해서 찾게 되었고, nginx는 공식 홈페이지에서 다운로드 할 수 있다.
필요한 내용들은 중간중간마다 발생하는 Error 로그를 보고 참조했기 때문에 외에 필요한 내용이 있다면 그건 설치 중에 로그가 발생할 것이기 때문에 나중에 생각하기로 했다.
수동으로 설치하기 때문에 사용자 계정의 홈 디렉터리에 OpenSSL과 Nginx를 설치했다.
gcc가 필요하긴 했지만 서버에 이미 설치되어있는 상태였기 때문에 바로 OpenSSL을 설치했다.
우선 openssl을 설치하기 위한 설치 과정은 다음과 같았다.
tar -zxvf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
./config --prefix=/home/kmw/ssl --openssldir=/home/kmw/ssl shared zlib
이렇게 하면 make
명령을 위한 config가 구성된다.
이후 make & make install
을 통해 make파일을 만들고 설치를 진행할 수 있게 된다.
cd /home/kmw/ssl
을 통해 이동하면 openssl-1.1.1k가 설치된 것을 확인할 수 있다.
이제 사용을 위해 conf파일에 lib를 지정해줘야한다.
vi /etc/ld.so.conf.d/openssl-1.1.1k.conf
에 /home/kmw/ssl/lib
를 넣고 저장한다.
# 심볼릭 링크 생성
`ln -s /usr/local/ssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1`
`ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1`
그럼에도 bash에 openssl -version
을 입력하면 기존 버전이 나오는데 이는 1.1.1k버전 설치 이전에 기본적으로 사용하던 openssl이 /usr/bin
에 잡혀있기 때문이다.
기본적으로 openssl을 bash에 입력하면 1.1.1k를 사용하도록 하기위해서는
ln -s /home/kmw/ssl/bin/openssl /usr/bin/openssl
로 심볼릭 링크를 생성해 주면 된다.
이 때, 기존에 설치된 openssl는 mv 명령으로 이름을 바꿔 백업한 다음 심볼릭 링크를 생성해주었다.
이후 openssl version
을 입력하면 버전이 바뀐 것을 알 수 있다.
nginx 수동 설치도 과정은 비슷하다. 설치 과정은 다음과 같았다.
tar -zxvf nginx.1.26.3.tar.gz # tar 압출 풀기
cd nginx.1.26.3 # nginx 설치 폴더 이동
./configure --prefix=/home/user/apps/nginx/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-openssl=/home/kmw/openssl-1.1.1k \
make && make install
proxy_pass를 사용하기 위해서 필요한 모듈을 추가한다. 이 때, with-openssl
의 path는 openssl을 수동설치하기 위해 압축해제했던 openssl-1.1.1k 디렉터리로 지정하면된다. user
는 nginx를 실행 시 어떤 권한으로 실행되는지를 결정하기 때문에 root 권한으로 진행할 것이라면 기재하지 않아도 된다.
처음에는 실행파일을 입력해야하는 줄 알고 /usr/bin/openssl
로 지정해줬었지만 이렇게하면 정상적으로 make가 이루어지지 않았다.
install까지 이루어졌다면 prefix로 지정한 위치에 nginx가 생성되었을 것이다.sbin
폴더에 nginx로 기동이 가능하며 conf
에서 config 설정이 가능하다.
수동으로 설치하게되면 systemd에 자동으로 등록이 되지 않는다.
이 때, shell 파일이 아니라 systemctl 명령으로 관리하고 싶다면 수동으로 서비스에 등록해줘야한다.
vi /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/home/user/apps/nginx/nginx -t
ExecStart=/home/user/apps/nginx/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
user 모드
로 service에 등록하고 싶다면 /etc/systemd/user
에 파일을 만들어주고 rootful
로 service를 등록하고 싶다면 /etc/systemd/service
에 파일을 등록해주면 된다.
나는 sudo 권한으로 nginx를 기동 및 중지할 것이기 때문에 vi /etc/systemd/service/nginx.service
명령으로 service 정보를 생성하고 위 스크립트를 등록했다.
이후 systemctl start nginx
명령으로 기동하여 정상적으로 동작하는 것을 확인할 수 있었다.