nginx

markyang92·2022년 3월 22일
2

network

목록 보기
18/21
post-thumbnail
post-custom-banner

nginx

  • nginx: Web Server, HTTP Server
    • 경량 웹서버
    • 웹 호스팅은 웹서버를 업체에서 제공하는 서비스다. 현 시ㅁ에서 nginx를 웹서버로 제공하는 웹호스팅 서비스는 없고, 대부분 아파치를 제공하고 있다.
  • Document Root
    • /usr/share/nginx/html/
  • 설정 파일
    • /etc/nginx/
  • 로그 파일
    • /var/log/nginx/

User

  • nginx는 Master ProcessWorker Process를 가지고 있다.
$ ps aux | grep nginx
  • Master Process: root 계정으로 실행되면서 80, 443 포트의 소켓과의 통신을 담당한다.
  • Worker Process: 실제로 데이터를 처리하는 프로세스. 이 프로세스를 핸들링할 사용자를 만들어야 한다.
    • 일반적으로 웹서버의 워커 유저는 www-data를 사용한다.
      • www-data를 만드는 법은 아래와 같다.
        • Ubuntu: $ useradd --shell /usr/sbin/nologin www-data
          • --shell은 로그인 할 수 없는 유저라는 뜻이다.
            nginx를 실행할 때만 사용될 뿐 허가되지 않은 일을 하지 못하는 유저라는 의미이다.

컴파일

  • 버전 소개: stable, development, legacy 3가지 버전이 있다.
$ wget https://nginx.org/download/nginx-1.20.2.tar.gz
$ tar -zxvf ./nginx-1.20.2.tar.gz -C ./

dependency

  1. PCRE: Perl5에서 사용하는 정규표현식 라이브러리 PCRE
$ wget https://ftp.exim.org/pub/pcre/pcre2-10.37.tar.gz
$ tar -zxvf ./pcre2-10.37.tar.gz
$ cd ./pcre2-10.37.tar.gz
$ mkdir build
$ cd build && cmake ..
(pcre2-10.37.tar.gz/build) $ make
(pcre2-10.37.tar.gz/build) $ sudo make install

  1. openssl: https 모듈인 HttpSslModule을 사용하기 위해서는 openssl이 필요하다.
$ wget https://www.openssl.org/source/openssl-3.0.2.tar.gz
$ tar -zxvf ./openssl-3.0.2.tar.gz
$ cd openssl-3.0.2
$ ./Configure
$ make
$ sudo make install

  1. zlib: ngx_http_gzip_module(http://nginx.org/en/docs/http/ngx_http_gzip_module.html) 을 사용하기 위해서는 zlib 라이브러리가 있어야한다.
$ wget https://zlib.net/zlib-1.2.11.tar.gz
$ unzip ./zlib-1.2.11.tar.gz

설치

$ sudo ./configure --with-zlib=../zlib-<아까 받은 버전> \
--with-openssl=../openssl-<아까 받은 버전> --with-http_ssl_module --with-debug \
--add-module=../echo-nginx-module-0.45 \
--prefix=/usr/local/nginx \
--user=www-data \
--group=www-data
option                                        description
--with-(zlib |pcre| openssl)NGINX가 의존하고 있는 라이브러리들의 소스 경로
--with-(http_ssl_module | debug)NGINX를 설치할 때 ssl, debug 모듈을 활성화한다.
이 모듈들은 NGINX가 제공하는 내부 모듈이지만 기본적으로는 설치가 되지 않는 옵션사항이다.
--add-module외부 모듈인 echo 모듈의 소스가 위치하는 디렉토리
--prefixNGINX가 설치될 기본 디렉토리를 의미한다.
이 디렉토리 하위에 NGINX의 실행, 로깅, 설정 파일들이 설치된다.
각각의 항목을 바꿀 수도 있다. 메뉴얼을 참고하자.
--user, --gourpwww-data 사용자의 권한으로 NGXIN를 실행시킨다.
www-data 사용자가 없다면 만들어야 한다.
사용자의 리스트는 아래의 명령을 통해서 알 수 있다.
www-data가 아니라 자기 자신의 계정을 사용해도 된다.
$ make
$ sudo make install

설정파일

  • /usr/local/nginx
  • conf: 설정파일
  • html: 기본 document_root
  • logs: 로그 파일
  • sbin: nginx 실행 파일

nginx 구동

  • $ sudo /usr/loca/nginx/sbin/nginx

echo 모듈


설정

  • nginx.conf: 메인 설정 파일
  • fcgi.conf: FastCGI 환경 설정 파일
  • sites-enabled: 활성화된 사이트들의 설정 파일들이 위치
    • 아파치에서는 Virtual host의 설정 파일에 해당한다.
      기본적으로 존재하지 않을 수도 있다.
      이 디렉토리를 직접 만들어서 사용하는 방법은 '가상 호스팅'을 알아보자.
  • sites-available: 비활성화된 사이트들의 설정 파일들이 위치

nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http { 
    include       mime.types;
    server {
        listen       80;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}
  • Core 모듈 설정: 위 예의 work_process같은 지시자 설정 파일 최상단에 위치하면서 nginx의 기본적인 동작 방식을 정의한다. 여기서 사용되는 지시어들은 다른 곳에서 사용되지 않는다.
  • http 블록: server, location의 루트 블록. 여기서 설정된 값을 하위 블록들은 상속한다.
    • http, server, location 블록은 계층구조를 가지고 있다.
      많은 지시어가 각각의 블록에서 동시에 사용할 수 있는데, http의 내용은 server의 기본값이 되고, server의 지시어는 location의 기본 값이된다. 그리고 하위의 블록에서 선언된 지시어는 상위의 선언을 무시하고 적용된다.
  • server 블록: server 블록은 하나의 웹사이트를 선언하는데 사용된다. 가상 호스팅의 개념이다. 예를 들어, 하나의 서버로 http://opentutorials.orghttp://egoing.net 을 동시에 운영하고 싶은 경우 사용할 수 있는 방법이다. 가상 호스팅에 대한 자세한 내용은 가상 호스팅 때 참고
  • location 블록: server 블록 안에 등장하면서 특정 URL을 처리하는 방법을 정의한다.
  • events 블록: 이벤트 블록은 주로 네트워크의 동작방법과 관련된 설정값을 가진다. 이벤트 블록의 지시어들은 이벤트 블록에서만 사용할 수 있고, http, server, location과는 상속관계를 갖지 않는다. 이벤트 모듈 지시어에 대한 설명은 이벤트 모듈 지시어 사전을 참고한다.

서비스 반영

$ sudo systemctl reload nginx

trouble shooting

TCP Connection을 통해서 접속되지 않을 때 문제 해결 방법

  • 증상: File not found
  • 원인: nginx가 fastCGI 인터페이스를 통해 PHP-FPM이 실행할 파일을 지정할 때 사용하는 변수가 SCRIPT_FILENAME인데, 이 값을 잘못 전달되어 PHP_FPM이 실행할 파일을 찾지 못하고 있다.
  • 원인 분석: PHP-FPM이 설치된 머신에서, tcpdump9000 port로 들어오는 패킷을 감청해서 CGI 환경 변수가 잘 전달되고 있는지 확인한다.
$ tcpdump port 9000 -A | strings
  • TCP Connection에서 주로 문제가 발생하는 지점은 SCRIPT_FILENAME이기 때문에 이 값을 파악해 보는 것이 중요하다.SCRIPT_FILENAME: /usr/share/nginx/html/에서 찾고 있다. 만약 여기서 파일이 위치해 있지 않다면, 위치를 수정한다.
profile
pllpokko@alumni.kaist.ac.kr
post-custom-banner

0개의 댓글