본문 바로가기
기타/nginx

소스코드로 Nginx 시작하기

by oneny 2023. 9. 28.

Nginx 시작하기

 

Nginx란?

Nginx는 고성능이면서 경량의 오픈소스 웹 서버 및 리버스 프록시 서버 소프트웨어이다. Nginx는 많은 웹 사이트 및 웹 애플리케이션에서 사용되며, 그 기능과 특징 때문에 매우 인기가 있다. Nginx는 C10K 문제와 같은 대규모 연결을 처리하는데 탁월한 성능을 제공하고자 개발되었다. Nginx가 C10K 문제를 해결하는데 효과적인 이유는 다음과 같다.

  1. 이벤트 기반 아키텍처: Nginx는 단일 스레드 또는 워커 프로세스를 사용하여 이벤트 기반 아키텍처를 채택하고 있다. 이러한 아키텍처는 많은 연결을 동시에 처리할 수 있는 확장성을 제공하며, 블로킹 I/O 대신 비동기 I/O를 사용하여 더 효율적으로 작동한다.
  2. 비동기 처리: Nginx는 클라이언트 요청을 비동기적으로 처리하여, 하나의 워커 프로세스가 수천 개 이상의 연결을 동시에 처리할 수 있다.
  3. 리버스 프록시: Nginx는 리버스 프록시로 사용되어 WAS로 요청을 전달하는 역할을 수행한다. 이를 통해 서버 부하 분산과 로드 밸런싱을 구현할 수 있으며, 동시에 WAS의 가용성과 안전성을 향상시킬 수 있다.

 

참고: C10K Problem
동시 연결(Concurrent Connections)이 10,000개 이상인 상황에서 어떻게 서버가 효율적으로 처리할 수 있는가?라는 과제를 나타낸다.

 

Nginx 특징

  • 고성능 웹 서버: Nginx는 매우 빠른 성능을 제공하는 웹 서버로, 동시 접속 처리 및 요청 응답 시간을 최저고하한다. 이러한 성능 특징으로 대규모 웹 트래픽을 처리하기에 적합하다.
  • 리버스 프록시 서버: Nginx는 클라이언트 요청을 WAS로 전달하는 리버스 프록시 서버로 사용할 수 있다. 이를 통해 로드 밸런싱, SSL 종료, 액세스 제어 및 캐싱과 같은 기능을 제공할 수 있다.
  • 정적 콘텐츠 서빙: Nginx는 정적 파일(ex: HTML, CSS, 이미지 파일 등)을 제공하는데 탁월하다.
  • 가벼운 리소스 사용: Nginx는 메모리 및 CPU 리소스를 효율적으로 사용하며, 높은 동시 접속을 처리하면서도 시스템 리소스를 절약한다.
  • 모듈 시스템: Nginx는 다양한 모듈을 지원하며, 필요한 모듈을 활성화하고 사용하여 기능을 확장할 수 있다.
  • SSL/TLS 지원: Nginx는 SSL/TLS를 통한 암호화를 지원하므로 안전한 통신을 제공한다.
  • 가용성 및 로드 밸런싱: Nginx를 사용하여 다중 서버 간의 로드 밸런싱을 설정하고, 서버 다운 시 요청을 다른 서버로 전환하는 등의 가용성 관리를 수행할 수 있다.
  • WAF(Web Application Firewall): 리버스 프록시와 실제 서비스를 제공하는 서버가 분리되어 있기 때문에 방화벽 역할을 하게 되며, 접속자 입장에서는 내부 서버를 알 수 없기 때문에 서버 정보가 숨겨지니 보안상 좀 더 안전하다.
  • 캐싱: 리버스 프록시에서 캐싱을 할 경우, 내부 서버에 가해지는 부하가 줄어들기 때문에 좀 더 빠른 사이트 운용이 가능해진다.

 

Nginx 시작하기

M1에서는 arm64 아키텍처로 변경되면서 VirtualBox와 같은 몇몇 VM을 사용할 수 없어 무료로 사용 가능하고, arm64 아키텍처를 지원하는 UTM을 사용했다. 관련 블로그는 아래 게시글을 참고했다.

 

[M1 mac] 가상환경에 Linux 설치하기(UTM / Ubuntu)

mac 환경에서 사용할 수 있는 VM 은 패러렐즈, VMWare Fusion, UTM, VirtualBox 등이있다... m1 으로 넘어오면서 인텔 x86_64 아키텍쳐에서 arm64 아키텍쳐로 변경되서 몇몇 VM 은 사용할 수 없다..(VirtualBox). VMWare

ssunw.tistory.com

 

apt 명령어로 설치하는 방법과 url을 통해 설치하는 방법을 나눠서 살펴보자.

 

apt 명령어로 설치

apt 명령어는 Debian 계열의 리눅스 배포판에서 패키지 관리와 관련된 작업을 수행하는데 사용되는 명령어로 위처럼 명령어를 실행해 nginx 패키지를 설치하자.

 

'ps aux | grep nginx' 명령어는 리눅스 기반 시스템에서 실행 중인 Nginx 웹 서버 프로세스를 확인하기 위해 사용된다. ps 명령어로 현재 실행 중인 모든 프로세스를 나열하고, grep 명령어로 그 중에서 nginx라는 텍스트를 포함하는 프로세스를 필터링하여 위와 같은 실행 중인 Nginx 프로세스 목록이 나온 것을 확인할 수 있다.

  • ps: 프로세스 상태를 보고하는 명령어
  • aux: ps 명령의 옵션 중 하나로, 모든 사용자의 모든 프로세스를 자세히 보여준다.
  • |(파이프): 명령어 체인을 만들 때 사용되며, 앞 명령의 결과를 뒷 명령에 전달한다.
  • grep: 주어진 텍스트를 검색하고, 그 텍스트를 포함하는 라인을 출력한다.
  • nginx: 찾고자 하는 프로세스 이름

 

실행 확인

ip addr show 명령어를 통해 Linux 시스템에서 네트워크 인터페이스의 IP 주소와 관련된 정보를 출력할 수 있다. 그리고 해당 명령어에서 Nginx를 실행한 아이피 주소를 확인할 수 있는데 해당 아이피로 접속하면 위와 같은 결과를 얻을 것을 확인할 수 있다. 그리고 Nginx 웹 서버는 포트번호 80번을 사용한다는 것도 알 수 있다. 

 

종료하기

만약 종료하고 싶은 경우에는 sudo systemctl stop nginx 명령어를 사용하면 된다. 반대로 다시 시작하고 싶다면 sudo systemctl start nginx 명령어를 사용하자.

 

Nginx 소스코드로 설치

 

nginx-1.25.2.tar.get 파일은 Nginx 웹 서버의 소스코드를 포함하는 압축 파일이다.

https://nginx.org/ 사이트 우측에 Download 페이지로 들어가 Mainline version의 url을 복사한다. 그리고 우분투에서 wget 명령어를 사용하면 되는데 wget는 웹에서 파일을 다운로드하는 명령어로 주어진 URL에서 파일을 가져와서 현재 디렉터리에 저장한다. 따라서 ls -l로 파일 및 폴더 목록을 확인하면 nginx-1.25.2.tar.gz가 설치된 것을 볼 수 있다.

 

압축 해제

tar -zxvf nginx-1.25.2.tar.gz 명령어는 '.tar.gz' 형식의 압축 파일을 압축 해제하는 명령어이다.

  • tar: 파일 아카이브를 조작하는 명령어
  • -z: gzip 압축을 사용하여 파일을 압축 해제하겠다는 옵션으로 .tar.gz 파일은 gzip로 압축된 파일이다.
  • -x: 아카이브를 추출(압축 해제)하겠다는 옵션
  • -v: 작업 진행 상황을 자세히 표시하라는 옵션(verbose 모드)
  • -f nginx-1.25.2.tar.gz: 압축 해제할 대상 파일을 지정하는 옵션

 

빌드 전 구성 옵션 커스텀하기

./configure 명령어는 소프트웨어를 소스 코드로부터 빌드하기 전에 소프트웨어의 구성 옵션을 설정하는 스크립트로 주로 오픈소스 소프트웨어의 컴파일 및 빌드 과정에서 사용된다. 즉, 소프트웨어가 설치될 시스템 환경에 맞게 구성 옵션을 조정하고 필요한 빌드 파일을 생성한다.

그리고 맨 아래에 에러메시지가 있는 것을 확인할 수 있는데 이는 Nginx를 컴파일하려고 할 때 HTTP 리라이트 모듈을 사용하려고 하지만 필요한 PCRE 라이브러리가 시스템에 설치되지 않았거나 제대로 찾을 수 없을 때 발생한다. 따라서 아래처럼 패키지들을 설치하여 해결할 수 있다.

 

  • libpcre3: 정규 표현식 처리에 사용되는 라이브러리
  • zlib1g: 데이터 압축 및 해제를 위한 라이브러리
  • libssl-dev: OpenSSL 라이브러리의 개발용 파일과 헤더를 포함한 패키지로 보안 통신 및 암호화 작업에 사용된다.

 

Nginx를 컴파일하는데 옵션을 설정하여 사용한 것을 확인할 수 있다. 어떤 옵션들이 있는지는 --help 명령어나 https://nginx.org/en/docs/configure.html 해당 url에서 확인할 수 있다. 각 옵션의 의미와 역할을 자세히 알아보자.

  •  --sbin-path=/usr/bin/nginx: 이 옵션은 Nginx 실행 팡리의 설치 경로를 지정한다. 여기서는 /usr/bin/nginx로 설정되어 시스템의 PATH에 있는 바이너리 파일로 Nginx를 설치하겠다는 의미이다.
  • --conf-path=/etc/nginx/nginx.conf: Nginx의 주요 설정 파일의 경로를 지정한다.
  • --error-log-path=/var/log/nginx/error.log: Nginx의 에러 로그 파일의 경로를 지정한다. 에러 로그는 주로 서버 오류 및 문제를 기록하는데 사용된다.
  • --http-log-path=/var/log/nginx/access.log: Nginx의 HTTP 액세스 로그 파일의 경로를 지정한다. HTTP 액세스 로그는 클라이언트 요청과 응답을 기록하는데 사용된다.
  • --with-pcre: 이 옵션은 PCRE(Perl Compatible Regular Expressions) 라이브러리를 사용하여 정규 표현식을 처리하는 기능을 활성화한다. 정규 표현식은 Nginx의 구성에서 URL 리라이팅 및 필터링과 같은 작업에 사용된다.
  • --pid-path=/var/run/nginx.pid: Nginx의 프로세스 ID 파일의 경로를 지정한다. 이 파일은 Nginx 프로세스의 ID를 저장하며, 주로 관리 및 제어 목적으로 사용된다.
  • --with-http_ssl_module: 이 옵션은 SSL(Secure Sockets Layer) 지원을 활성화하는 Nginx 모듈을 포함하도록 구성한다. SSL을 사용하면 웹 서버와 클라이언트 간의 암호화 통신이 가능하며, 보안을 강화할 수 있다.

 

cc 컴파일러 없는 경우

cc 컴파일러가 필요하다는 에러 메시지가 뜨면 위 명령어를 사용해 Nginx를 실행하는데 필요한 패키지들을 설치하자.

 

빌드

make 명령어를 사용하여 실제로 소스 코드를 컴파일하고 실행 파일을 생성한다. make는 Makefile 이라는 빌드 스크립트 파일을 참조하여 컴파일 과정을 수행한다. 이 단계에서는 C, C++ 또는 다른 프로그래밍 언어로 작성된 소스 코드 파일을 컴파일러에 전달하고, 오브젝트 파일을 생성한 다음 실행 파일로 링크한다. 쉽게 말해 Nginx를 빌드할 때, make 명령어를 사용하면 소스 코드에서 Nginx 실행 파일을 컴파일하고 생성하며, 이후에 해당 실행 파일로 웹 서버를 실행할 수 있다.

 

설치

make install 명령어를 사용하여 컴파일된 실행 파일, 라이브러리, 설정 파일 등을 시스템에 설치한다. 이 단계에서는 실행 파일을 지정된 경로로 복사하고, 라이브러리를 라이브러리 경로에 복사하며, 설정 파일을 설정 디렉터리에 복사하는 등의 작업을 수행한다.

 

실행

위 명령어를 통해 실행된 것을 확인할 수 있다. 그리고 빨간 박스에 master process와 worker process가 따로 분리되어 있는 것을 확인할 수 있다. 마스터 프로세스와 워커 프로세스를 분리한 이유는 Nginx 웹 서버를 높은 성능과 안전성을 갖는 웹 서버로 만드는 데 기여하기 때문이다. 마스터 프로세스는 설정 관리와 프로세스 관리를 담당하고, 워커 프로세스는 실제 웹 요청을 병렬로 처리하여 대용량 트래픽에 효과적으로 대응할 수 있다.

 

버전도 맞게 잘 설치된 것을 확인할 수 있다. 설치된 파일들의 경로는 버전에 따라 다를 수 있지만 보통 /etc/nginx/에 있고 해당 폴더로 이동한 후 ls -l로 파일들을 확인할 수 있다.

 

Systemd

systemd는 리눅스 시스템에서 초기화 프로세스 및 서비스 관리를 담당하는 소프트웨어 프레임워크이다. 대부분의 최신 리눅스 배포판에서 기본 초기화 시스템으로 사용되며, 시스템 부팅, 서비스 관리, 로그 기록, 디바이스 관리 등 다양한 시스템 관리 작업을 수행한다. apt 명령어로 Nginx를 설치할 때 systemctl을 사용하여 서비스를 시작, 중지, 재시작 및 상태를 확인할 수 있는 것도 systemd 덕분이다. 아래 사이트를 들어가면 설정에 대한 정보를 확인할 수 있다.

 

 

위 명령어를 실행하여 설정 파일을 편집하자.

 

위에 소스 코드 옵션을 커스텀했기 때문에 약간의 수정이 필요한데 수정한 부분을 빨간 박스로 표시했다. control+O와 control+X로 저장하고 나오자.

 

위처럼 명령어를 실행하면 잘동작하는 것을 확인할 수 있다.

 

 

출처

Nginx WAF 리버스 프록시 - 개념 설명과 환경 구성

NGINX Fundamentals: High Performance Servers from Scratch

'기타 > nginx' 카테고리의 다른 글

Reverse Proxy & Load Balancing  (1) 2023.10.01
Nginx Performance  (0) 2023.09.30
Nginx Configuration (2/2)  (0) 2023.09.30
Nginx Configuration (1/2)  (0) 2023.09.29