웹사이트 검색

CentOS 7의 소스에서 Nginx를 빌드하는 방법


이 페이지에서

  1. 안정 버전과 메인라인 버전
  2. 핵심 모듈과 타사 모듈 비교\n
  3. 정적 모듈 대 동적 모듈
  4. 소스에서 Nginx를 빌드하기 위한 요구 사항\n
  5. 요구 사항\n
  6. 소스에서 Nginx 빌드

Nginx("engine x"로 발음)는 높은 동시성을 염두에 두고 설계된 오픈 소스 웹 서버 소프트웨어로 HTTP/HTTPS 서버, 역방향 프록시 서버, 메일 프록시 서버, 소프트웨어 로드 밸런서, TLS 터미네이터, 캐싱 서버 ...

매우 모듈화된 소프트웨어입니다. GZIP 또는 SSL과 같이 겉보기에 "내장"된 것처럼 보이는 일부 소프트웨어도 실제로는 빌드 시간 동안 활성화 및 비활성화할 수 있는 모듈로 빌드됩니다.

커뮤니티에서 만든 코어 (네이티브) 모듈타사(외부) 모듈 이 있습니다. 현재 우리가 활용할 수 있는 타사 모듈이 100개가 넘습니다.

매우 빠르고 가벼운 소프트웨어인 C 언어로 작성되었습니다.

소스 코드에서 Nginx를 설치하는 것은 상대적으로 "쉬움"입니다. Nginx 소스 코드의 최신 버전을 다운로드하고 구성, 빌드 및 설치합니다.

mainline 또는 stable 버전을 다운로드할지 선택해야 하지만 빌드하는 방법은 완전히 동일합니다.

이 튜토리얼에서는 Nginx의 오픈 소스 버전에서 사용 가능한 모든 모듈을 사용하여 Nginx를 빌드하고 이 작성 시점에 1.15.7에 있는 메인라인 버전을 사용합니다. 최신 버전을 사용할 수 있게 되면 버전 번호를 업데이트하십시오.

안정적인 버전과 메인라인 버전

Nginx 오픈 소스는 두 가지 버전으로 제공됩니다.

  • 메인라인 – 최신 기능과 버그 수정이 포함되어 있으며 항상 최신 상태를 유지합니다. 신뢰할 수 있지만 몇 가지 실험적인 모듈이 포함될 수 있으며 몇 가지 새로운 버그가 있을 수도 있습니다.\n
  • 안정적 – 모든 최신 기능을 포함하지는 않지만 항상 기본 버전으로 백포트되는 중요한 버그 수정이 있습니다.\n

핵심 모듈 대 타사 모듈

Nginx에는 핵심 모듈타사 모듈이라는 두 가지 유형의 모듈을 활용할 수 있습니다.

핵심 모듈은 핵심 Nginx 개발자에 의해 구축되며 소프트웨어 자체의 일부입니다.

타사 모듈은 커뮤니티에서 빌드하며 이를 사용하여 Nginx 기능을 확장할 수 있습니다. 유용한 타사 모듈이 많이 있으며 그중에서 가장 유명한 모듈은 PageSpeed, ModSecurity, RTMP, Lua 등입니다.

정적 모듈 대 동적 모듈

정적 모듈은 Nginx의 첫 번째 버전부터 존재합니다. 동적 모듈은 2016년 2월 Nginx 1.9.11+와 함께 도입되었습니다.

정적 모듈을 사용하면 Nginx 바이너리를 구성하는 모듈 집합이 컴파일 시 ./configure 스크립트에 의해 고정됩니다. 정적 모듈은 --with-foo_bar_module 또는 --add-module=PATH 구문을 사용합니다.

핵심(표준) 모듈을 동적으로 컴파일하려면 =dynamic을 추가합니다(예: --with-http_image_filter_module=dynamic).

타사 모듈을 동적으로 컴파일하려면 --add-dynamic-module=/path/to/module 구문을 사용한 다음 load_module 지시문을 사용하여 로드합니다. nginx.conf 파일의 전역 컨텍스트입니다.

소스에서 Nginx를 빌드하기 위한 요구 사항

다른 UNIX/Linux 소프트웨어와 비교할 때 Nginx는 매우 가볍고 라이브러리 종속성이 많지 않습니다. 기본 빌드 구성은 설치할 라이브러리 3개(OpenSSL/LibreSSL/BoringSSL, Zlib 및 PCRE)에만 의존합니다.

  • 필수 요구 사항:\n
    • GNU 컴파일러 컬렉션(GCC)
    • BoringSSL 라이브러리
    • 1.1.3 - 1.2.11 사이의 Zlib 라이브러리 버전
    • 4.4 - 8.42 사이의 PCRE 라이브러리 버전

    • LibGD
    • MaxMind GeoIP 레거시 C 라이브러리
    • libxml2
    • libxslt

    참고: Nginx는 OpenSSL 대신 LibreSSL 및 BoringSSL 암호화 라이브러리에 대해 컴파일할 수도 있습니다.

    요구 사항

    • CentOS 7 시스템을 실행하는 서버.\n
    • sudo 권한이 있는 루트가 아닌 사용자.\n

    초기 단계

    CentOS 버전 확인:

    cat /etc/centos-release
    # CentOS Linux release 7.6.1810 (Core)

    시간대 설정:

    timedatectl list-timezones
    sudo timedatectl set-timezone 'Region/City'

    CentOS 운영 체제 패키지 업데이트:

    sudo yum update -y

    vim, curl, wget 및 tree 패키지를 설치합니다.

    sudo yum install -y vim curl wget tree

    소스에서 Nginx 빌드

    Nginx는 C로 작성된 프로그램이므로 먼저 컴파일러 도구를 설치해야 합니다.

    sudo yum groupinstall -y 'Development Tools'

    Nginx 소스 코드의 최신 메인라인 버전을 다운로드하고 압축을 풉니다. Nginx 소스 코드는 대부분의 Unix 및 Linux 소프트웨어와 마찬가지로 압축 아카이브(gzipped tarball)로 배포됩니다.

    wget https://nginx.org/download/nginx-1.15.7.tar.gz && tar zxvf nginx-1.15.7.tar.gz

    필수 Nginx 종속성 소스 코드를 다운로드하고 압축을 풉니다.

    # PCRE version 8.42
    wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz

    # zlib version 1.2.11
    wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

    # OpenSSL version 1.1.1a
    wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz && tar xzvf openssl-1.1.1a.tar.gz

    선택적 Nginx 종속성을 설치합니다.

    sudo yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel

    모든 .tar.gz 파일을 정리합니다. 더 이상 필요하지 않습니다.

    rm -rf *.tar.gz

    Nginx 소스 디렉터리를 입력합니다.

    cd ~/nginx-1.15.7

    tree 유틸리티를 사용하여 Nginx 소스 코드를 구성하는 올바른 측정 목록 디렉토리 및 파일의 경우:

    tree -L 2 .

    Nginx 매뉴얼 페이지를 /usr/share/man/man8/ 디렉토리에 복사합니다.

    sudo cp ~/nginx-1.15.7/man/nginx.8 /usr/share/man/man8
    sudo gzip /usr/share/man/man8/nginx.8
    ls /usr/share/man/man8/ | grep nginx.8.gz
    # Check that Man page for Nginx is working:
    man nginx

    도움이 필요한 경우 다음을 실행하여 최신 Nginx 컴파일 타임 옵션의 전체 목록을 볼 수 있습니다.

    ./configure --help
    # To see want core modules can be build as dynamic run:
    ./configure --help | grep -F =dynamic

    NGINX 구성, 컴파일 및 설치:

    ./configure --prefix=/etc/nginx \
                --sbin-path=/usr/sbin/nginx \
                --modules-path=/usr/lib64/nginx/modules \
                --conf-path=/etc/nginx/nginx.conf \
                --error-log-path=/var/log/nginx/error.log \
                --pid-path=/var/run/nginx.pid \
                --lock-path=/var/run/nginx.lock \
                --user=nginx \
                --group=nginx \
                --build=CentOS \
                --builddir=nginx-1.15.7 \
                --with-select_module \
                --with-poll_module \
                --with-threads \
                --with-file-aio \
                --with-http_ssl_module \
                --with-http_v2_module \
                --with-http_realip_module \
                --with-http_addition_module \
                --with-http_xslt_module=dynamic \
                --with-http_image_filter_module=dynamic \
                --with-http_geoip_module=dynamic \
                --with-http_sub_module \
                --with-http_dav_module \
                --with-http_flv_module \
                --with-http_mp4_module \
                --with-http_gunzip_module \
                --with-http_gzip_static_module \
                --with-http_auth_request_module \
                --with-http_random_index_module \
                --with-http_secure_link_module \
                --with-http_degradation_module \
                --with-http_slice_module \
                --with-http_stub_status_module \
                --with-http_perl_module=dynamic \
                --with-perl_modules_path=/usr/lib64/perl5 \
                --with-perl=/usr/bin/perl \
                --http-log-path=/var/log/nginx/access.log \
                --http-client-body-temp-path=/var/cache/nginx/client_temp \
                --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
                --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
                --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
                --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
                --with-mail=dynamic \
                --with-mail_ssl_module \
                --with-stream=dynamic \
                --with-stream_ssl_module \
                --with-stream_realip_module \
                --with-stream_geoip_module=dynamic \
                --with-stream_ssl_preread_module \
                --with-compat \
                --with-pcre=../pcre-8.42 \
                --with-pcre-jit \
                --with-zlib=../zlib-1.2.11 \
                --with-openssl=../openssl-1.1.1a \
                --with-openssl-opt=no-nextprotoneg \
                --with-debug


    make
    sudo make install

    Nginx를 빌드한 후 홈(~) 디렉토리로 이동합니다.

    cd ~

    Symlink /usr/lib64/nginx/modules/etc/nginx/modules 디렉토리로 연결합니다. etc/nginx/modules는 Nginx 모듈의 표준 위치입니다.

    sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules

    Nginx 버전, 컴파일러 버전을 인쇄하고 스크립트 매개변수를 구성합니다.

    sudo nginx -V
    # nginx version: nginx/1.15.7 (CentOS)
    # built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
    # built with OpenSSL 1.1.1a  20 Nov 2018
    # TLS SNI support enabled
    # configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules
    # . . .
    # . . .

    Nginx 시스템 그룹 및 사용자 생성:

    sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginx

    Nginx 구문 및 잠재적 오류를 확인합니다.

    sudo nginx -t

    Nginx 시스템 단위 파일 생성:

    sudo vim /etc/systemd/system/nginx.service

    아래 내용을 /etc/systemd/system/nginx.service 파일에 복사/붙여넣기:

    참고: PID 파일과 Nginx 바이너리의 위치는 Nginx가 컴파일된 방식에 따라 다를 수 있습니다.

    [Unit]
    Description=nginx - high performance web server
    Documentation=https://nginx.org/en/docs/
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
    ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s TERM $MAINPID
    
    [Install]
    WantedBy=multi-user.target

    Nginx가 부팅 시 시작되도록 활성화하고 Nginx를 즉시 시작합니다.

    sudo systemctl enable nginx.service
    sudo systemctl start nginx.service

    재부팅 후 Nginx가 자동으로 시작되는지 확인합니다.

    sudo systemctl is-enabled nginx.service
    # enabled

    다음 명령 중 하나를 실행하여 Nginx가 실행 중인지 확인합니다.

    sudo systemctl status nginx.service
    # or
    ps aux | grep nginx
    # or
    curl -I 127.0.0.1

    브라우저를 열고 도메인/IP 주소로 이동하여 기본 Nginx 페이지를 볼 수도 있습니다. 이는 Nginx가 실행 중이라는 표시입니다.

    Nginx는 기본적으로 /etc/nginx에 백업 .default 파일을 생성합니다. /etc/nginx 디렉토리에서 .default 파일을 제거합니다.

    sudo rm /etc/nginx/*.default

    Vim 편집기용 Nginx 구성의 구문 강조 표시를 ~/.vim에 배치합니다.

    # For regular non-root user
    mkdir ~/.vim/
    cp -r ~/nginx-1.15.7/contrib/vim/* ~/.vim/
    # For root user
    sudo mkdir /root/.vim/
    sudo cp -r ~/nginx-1.15.7/contrib/vim/* /root/.vim/

    참고: 위 단계를 수행하면 Vim 편집기에서 Nginx 구성 파일을 편집할 때 멋진 구문 강조 표시가 나타납니다.

    conf.d, snippets, sites-availablesites-enabled 디렉토리를 /etc/에 생성합니다. nginx 디렉토리:

    sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

    Nginx 로그 파일의 권한 및 그룹 소유권 변경:

    sudo chmod 640 /var/log/nginx/*
    sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

    Nginx용 로그 회전 구성을 만듭니다.

    sudo vim /etc/logrotate.d/nginx

    아래 텍스트로 파일을 채운 다음 저장하고 종료합니다.

    /var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
    if [ -f /var/run/nginx.pid ]; then
    kill -USR1 `cat /var/run/nginx.pid`
    fi
    endscript
    }

    홈 디렉토리에서 다운로드한 모든 파일 제거:

    cd ~
    rm -rf nginx-1.15.7/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/

    그게 다야. 이제 소스 코드에서 빌드하여 최신 버전의 Nginx를 설치했습니다. OpenSSL과 같은 일부 중요한 라이브러리에 대해 정적으로 컴파일됩니다. OpenSSL의 시스템 제공 버전이 오래된 경우가 많습니다. 최신 버전의 OpenSSL과 함께 설치하는 이 방법을 사용하면 CHACHA20_POLY1305와 같은 새로운 암호와 OpenSSL 1.1.1에서 지원되는 TLS 1.3과 같은 프로토콜을 활용할 수 있습니다. 또한 자신의 바이너리를 컴파일하면 Nginx가 제공할 기능을 조정할 수 있으며 이는 미리 빌드된 바이너리를 설치하는 것보다 훨씬 더 유연합니다.