Nginx HTTP Server - 2. 설치

## 소스 코드를 통한 설치


패키지 매니저를 통해 설치할 수도 있지만, 옵션 등을 제어하려면 소스 코드를 직접 컴파일하는 것이 좋다.




## 의존 라이브러리


### pcre


엔진엑스를 컴파일하려면 펄 호환 정규표현식(PCRE, Perl Compatible Regular Expression)이 필요하다.


재작성 모듈(rewrite)과 HTTP 코어 모듈이 PCRE 구문에 따른 정규표현식을 사용하기 때문이다.


`pcre`와 `pcre-devel` 의 설치가 필요하다.

`pcre`는 컴파일된 버전의 라이브러리이고, `pcre-devel`은 프로젝트를 컴파일하기 위한 개발용 헤더와 소스코드이다.



$ yum install pcre pcre-devel


$ apt-get install libpcre3 libpcre3-dev



맥에서는 brew를 사용하거나 아래처럼 직접 소스를 받아 컴파일한다.



임시 디렉토리에서.


$ curl -O ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.30.tar.gz


$ tar xzf pcre-8.30.tar.gz


$ cd pcre-8.30


$ ./configure

$ make

$ make install



### zlib


모듈에서 gzip 압축을 사용하기 위해 zlib 가 필요하다.


`zlib`와  `zlib-devel`가 모두 필요하다.


$ yum install zlib*


$ apt-get install zlib1g zlib1g-dev



### OpenSSL


범용 암호화 라이브러리이다.


전송계층보안 (TLS, Transport Layer Security v1), 보안 소켓 계층(SSL, Secure Sockets Layer v2/v3)를 구현하고 있다.


$ yum install openssl openssl-devel


$ apt-get install openssl libssl-dev




## 설치하기


### 다운로드


http://nginx.org/en/download.html 에서 엔진엑스의 소스를 다운로드 받는다.



$ wget http://nginx.org/download/nginx-1.4.4.tar.gz


또는 


$ curl -O http://nginx.org/download/nginx-1.4.4.tar.gz




### 기본 설치


$ tar xzf nginx-1.4.4.tar.gz

$ cd nginx-1.4.4



$ ./configure 

설정하고,


$ make

빌드하고,


$ make install

컴파일된 리소스를 인스톨 디렉토리로 복사한다.

(기본 디렉토리는 /usr/local/nginx)



권한 때문에 설치가 되지 않는다면, `/usr/local/nginx`의 디렉토리가 현재 사용자의 소유가 아니기 때문이다.


$ sudo chown -R $(whoami) /usr/local/nginx


로 해당 디렉토리의 소유를 현재 사용자로 변환한다.



또는,


$ sudo make install


을 실행한다.




### 컴파일 옵션


컴파일 시점의 옵션이 있다.


$ ./configure --help


로 확인 가능하다.



### 경로 옵션


--prefix : 엔진엑스가 설치되는 기본 디렉토리 (기본값: `/usr/local/nginx`)

               나머지 설정은 이 경로의 상대경로로 연결된다.


--sbin-path : 엔진엑스의 바이너리 파일이 설치되는 경로 (기본값: `<prefix>/sbin/ngnix`)


--conf-path : 주 환경 설정 파일의 경로 (기본값: `<prefix>/conf/nginx.conf`)


--error-log-path : 에러 로그 파일 (기본값: `<prefix>/logs/error.log`)


--pid-path : 엔진엑스 pid 파일 경로 (기본값: `<prefix>/logs/nginx.pid`)



--with-per_modules_path : 펄 모듈의 경로



--http-log-path : 접근 로그의 위치

--http-client-body-path : 클라이언트 요청에 의한 임시 파일의 저장에 사용되는 디렉토리 (기본값: `<prefix>/client_body_temp`)

--http-proxy-temp-path : 프록시가 사용하는 임시 파일 위치 (기본값: `<prefix>/proxy_temp`)



### 선행 요소 옵션


선행 요소는 라이브러리와 바이너리로 형태로 제공하는데, 컴파일 시점에서 모든 선행 요소가 시스템에 설치되어 있어야 한다.

이미 시스템에 있더라도 환경 설정 스크립트가 선행 요소의 위치를 찾지 못하는 경우도 있다.

이를 해결하기 위해 여러 스위치가 있다.


예를 들어, `--with-cc`, `--without-pcre` 등



### 모듈 옵션


애플리케이션을 컴파일하기 전에 모듈을 선택할 필요가 있다.


이에 관한 스위치도 제공한다.


예를 들어, `--without-http_charset_module`, `--without-http_access_module` 등등



### 기본 제외 모듈


몇 가지 기능들은 기본적으로 제외되어 있다.

이 모듈을 설정에 포함할 수 있다.


예를 들어, `--with-http_ssl_module`, `--with-http_addtion_module` 등등



### 오류 확인


컴파일에 실패한 경우, `objs/autoconf.err` 파일을 참조한다.




설정 서머리에서 의도한 선행 요소가 모두 인스톨 됐는지 확인한다.


예를 들어, `openssl`이 설치되지 않았다면, 라이브러리 파일의 위치를 지정할 수 있다.


$ which openssl

현재 바이너리가 어느 디렉토리에 있는지 확인하고,


$ ./configure --with-openssl=/usr/bin

지정한 디렉토리에서 openssl 라이브러리 파일이 발견돼야 한다.




## 버전 변경에 유용하게 대응하기


1. `configure`를 실행할 때 `prefix` 스위치에 버전명을 포함한 디렉토리로 한다.


    $ ./configure —prefix=/usr/local/ngingx-1.4.4


2. `/usr/local/nginx`에 심볼릭 링크를 걸어둔다.


    $ ln -s /usr/local/nginx-1.4.4 /usr/local/nginx


3. 엔진엑스를 구동하는 `init` 스크립트에서는 심볼릭 링크를 바라보게 한다.



## 컴파일 및 빌드하기


$ make


$ make install




## 실행하기



### foreground & daemon


서비스는 foreground 와 background 로 동작할 수 있는데,

background 로 동작하는 건 흔히 데몬(daemon)이라고 부른다.


데몬으로 동작하는 서비스들의 끝은 `d` 접미사를 붙이곤 하는데,

`httpd` (HTTP 서버 데몬), `named` (네임 서버 데몬), `crond` (스케쥴러 데몬) 등이 있다.


`nginx`도 데몬의 형태이지만, 끝자리에 `d`가 붙어있진 않다.



### 사용자와 그룹


엔진엑스를 구동하기 전에, 프로세스 구조와 프로세스에 적용되는 사용자 그룹의 이해가 필요하다.



1. 엔진엑스 마스터 프로세스 (master process)


루트 계정으로 실행해야 한다. 대부분의 유닉스 계열 시스템에서는 루트 계정으로 실행되는 프로세스는 모든 포트에 TCP 소켓을 오픈할 수 있지만, 다른 사용자 계정인 경우 1024 이상의 포트에서만 소켓을 리슨할 수 있기 때문이다.


엔진엑스를 루트 계정으로 실행하지 않으면, 80/443 같은 표준 포트에 접근할 수 없을 뿐 아니라,

작업자 프로세스에서 사용자 그룹을 부여하는 `user` 지시어도 수행하지 못한다.


2. 엔진엑스 작업자 프로세스 (worker process)


환경 설정 파일에서 `user` 지시어로 지정한 계정으로 실행된다.

환경 설정 파일의 설정이 커맨드 스위치보다 우선하며, 아무 계정도 지정하지 않으면 `nobody` 사용자와 `nobody` 그룹으로 실행된다.



### 데몬의 시작과 중지


$ cd /usr/local/nginx/sbin

$ ./nginx


`nginx` 커맨드의 스위치로 프로세스에 시그널을 보낼 수 있다.


$ ./nginx -s stop # 즉각 중단 (TERM 신호)

$ ./nginx -s quit # 정상 중단 (QUIT 신호)

$ ./nginx -s reopen # 로그 파일을 다시 오픈한다.

$ ./nginx -s reload # 환경 설정을 다시 로드한다.




### 환경 설정 테스트


운영 중이 서비스에서 환경 설정을 변경할 때엔 주의가 필요하다.


$ ./nginx -t

 

위 명령은 환경 설정의 구문, 유효성, 무결성을 체크한다.



서버가 서비스 중에 있을 때 환경 설정 파일을 다루는 것은 매우 위험하므로,

새 환경 설정을 별도의 임시 파일로 옮겨놓고 그 위에서 테스트하는 것이 좋다.

`-c` 스위치를 이용하면 된다.


$ ./nginx -t -c /home/temp/test.conf



검증이 완료되면 복사한 후 다시 로드한다.


$ cp /home/temp/test.conf /usr/local/nginx/conf/nginx.conf

$ ./nginx -s reload




### 기타 스위치


버전 정보 보기

$ ./nginx -v


`./configure` 단계에서 넘긴 스위치 정보 보기

$ ./nginx -V




## 시스템 서비스에 엔진엑스 추가


두 가지 방법이 있다.


1. 표준 명령을 사용해 데몬을 제어

2. 시스템이 시동할 때마다 데몬이 자동으로 실행되도록



### 시스템 V 스크립트


리눅스 기반 운영체제는 대부분 시스템 V 방식의 `init` 데몬을 사용한다.

즉, `init`이라 부르는 데몬이 시동 과정을 관리하나는데, 옛날 시스템 V 유닉스 기반 운영체제에서 상속된 방식이다.


`init` 데몬은 런레벨(`runlevel`) 개념을 기반으로 실행된다.

런레벨에 부여된 의미


     0: 시스템 중지

     1: 싱글유저 모드(복구모드)

     2: 멀티유저 모드, NFS 지원 없음

     3: 완전 멀티유저 모드

     4: 사용되지 않음

     5: 그래픽 인터페이스 모드

     6: 시스템 재부팅


수작업으로 런레벨을 변경할 수 있다.

예를 들면, 컴퓨터를 종료하려면 `telinit 0` 재부팅하려면 `telinit 6` 명령을 실행하면 된다.


“런레벨 전환이 이뤄질 때마다 해당 런레벨에 속하는 서비스 세트가 실행된다”


컴퓨터가 중지됐을 때의 런레벨은 0,

컴퓨터를 켜면 런레벨 0으로부터 기본 시동 런레벨로 전환된다.


기본 시동 런레벨은 시스템 환경 설정인 `/etc/inittab` 파일에 정의되어 있고, 배포판에 따라 기본값이 다르다.


     데비안, 우분투는 런레벨 2,

     레드햇과 페도라는 런레벨 3 또는 5

     센트오에스와 젠투는 런레벨 3 을 기본 시동 런레벨로 사용한다.



하나의 서비스가 특정 런레벨에서 시작되게 스케쥴링하는 방법으로,

런레벨마다 해당 런레벨에서 실행할 스크립트를 포함하는 디렉토리가 있다.


이들 디렉토리(`/etc/rc.d`)에는 `init.d` 디렉토리에 있는 스크립트를 가리키는 심볼릭 링크만 있다.

실제 시동 스크립트는 `init.d`에 있고, 스크립트를 각 런레벨 디렉토리에 배치하는 도구에 의해 링크가 생성된다.



맥에는 `init.d`의 역할을 하는 `launchd` 커맨드가 있다.



### init 스크립트


`init` 스크립트는 서비스 시동 스크립트며, `sysv` 스크립트로 알려져있고, 표준에 따른 쉘 스크립트다.


이 스크립트는 `start`, `stop` 등의 명령에 따라 데몬 애플리케이션을 제어하며 두 가지 방법으로 작동한다.


우선, 컴퓨터 시동 시에 시스템 런레벨에서 서비스가 시작되게 예정돼 있다면,

`init` 데몬이 `start` 인자를 사용해 스크립트를 실행한다.


다른 방법은 쉘에서 수동으로 호출해 스크립트를 실행하는 것이다.

수동 호출하는 것은, `service` 명령을 사용한다.


$ service https start


시스템에 `service` 명령이 없다면, 아래처럼 한다.


$ /etc/init.d/httpd start


시스템이 서비스를 시작하고 종료할 수 있어야 하므로, 스크립트는 최소한 `start`, `stop`을 수용해야 한다.

그 외, `reload`나 `restart` 같은 인자는 추가로 구현해도 좋다.


`/etc/init.d/httpd start`가 모든 운영체제에서 작동한다는 점 외에는,

수행하는 일이 `service httpd start`와 근본적으로 동일하다.



### 엔진엑스용 init 스크립트 생성


`nginx` 라는 파일에 `init` 스크립트 내용을 넣고,

`/etc/init.d` 디렉토리에 저장한다. (루트 권한 필요)



### init 스크립트 설치


스크립트를 실행 가능하게 만들어야 한다.


$ chmod +x /etc/init.d/nginx


이제, 스크립트가 적절한 런레벨에서 자동으로 시작하게 만들어야 한다.



- 데비안 기반

$ update-rc.d -f nginx defaults


이 명령은 기본 시스템 런레벨 디렉토리에 링크를 생성한다.     


- 레드햇 기반

$ chkconfig —add nginx


아래 명령어로 확인할 수 있다.

$ chkconfig —list nginx


- 맥

맥에서는 아래 위키 링크를 참고하자.

http://wiki.nginx.org/OSX_launchd




서비스에 따라 `init` 스크립트 없이 빌드 도구에서 바로 `nginx`를 실행하는 경우도 많다.



=====

Nginx HTTP Server - 1. 작업환경 준비하기

Nginx HTTP Server - 2. 설치

Nginx HTTP Server - 3. 환경설정

Nginx HTTP Server - 4. HTTP 환경설정

Nginx HTTP Server - 5. 모듈 환경설정

Nginx HTTP Server - 6. 참고/주의

저작자 표시 비영리 변경 금지
신고