[리눅스마스터 1급] 이기적 이론서 11회차 정리 - 웹 관련 서비스

🏁 이기적 이론서 학습 범위

  • PART 03 네트워크 및 서비스의 활용
    • CHAPTER 01 네트워크 서비스 (SECTION 01 웹 관련 서비스)

웹 관련 서비스

☑️ 웹의 개념과 구성요소

  • 웹(Web) : 컴퓨터, 프로그램 등 다양한 시스템이 인터넷으로 상호 연결되어 문서와 정보를 공유하는 서비스
  • 웹 브라우저를 사용하여 하이퍼텍스트 형식으로 구성된 웹 문서를 하이퍼링크를 참조하여 탐색한다.
    • 하이퍼텍스트: 링크를 이용하여 상호 연결된 문서로, 즉시 접근하여 자유롭게 참조할 수 있다. 웹은 HTML과 HTTP를 이용하여 구현된다.
    • 하이퍼링크: 하이퍼텍스트 문서에서 문서, 이미지 등 모든 자료를 연결하고 가리킬 수 있는 참조 정보이다. URL 형식으로 구성되며, 인터넷 상에서 유일한 위치를 가리킨다.

웹의 구성요소

  • 웹 문서(HTML)
    • HTML은 W3C(http://www.w3c.org)에서 주관하여 관리한다.
    • .html 확장자를 가진 정적 HTML 문서와 .php, .jsp, .asp 등의 확장자를 가진 동적 문서로 구성된다.
      • 동적 웹 문서는 PHP, 자바 서블릿, 파이썬 등 웹과 함께 설치된 외부 모듈에 의해 동적으로 생성된다.
      • HTML 문서에 자바 스크립트와 같은 웹 브라우저(웹 클라이언트)에서 실행되는 프로그램 루틴을 추가하여, 정적 문서의 제한된 기능을 보완한다.
  • 웹 서버
    • 웹 브라우저의 요청에 따라 웹 문서를 전달한다.
    • Apache, IIS, Nginx, GWS와 같은 다양한 종류의 웹 서버가 존재한다.
    • 주요 웹 서버
      • 최근 웹 서버는 동적 페이지, 로그인 및 세션 관리, 다중 웹 호스팅, QoS(Quality of Service) 제한 등 다양한 기능을 자체 기능 또는 확장 모듈을 이용하여 제공한다.
      웹 서버특징
      Apache- 아파치 재단이 주도하는 대표적인 오픈소스 웹 서버
      - 사용자 요청에 따라 별도의 프로세스나 스레드를 생성하여 처리한다.
      - Loadable Module 기능을 제공하여 서버 동작을 확장한다.
      IIS- 마이크로소프트가 개발 및 제공하는 웹 서버
      - 마이크로소프트 ASP를 지원하며, GUI 기반의 관리 콘솔을 이용한 설정 및 관리가 편리하다.
      Nginx- Nginx사가 개발 및 제공하는 웹 서버로 비동기 이벤트 방식으로 동작한다.
      - 로드밸런스(Load Balance), HTTP 캐시 (Cache), 리버스 프록시 (Reverse Proxy) 등의 기능을 기본으로 제공한다.
      GWS구글이 제공하는 웹 서버(Google Web Server)
    • 마이크로 서비스 아키텍처(MSA, Micro Service Architecture)
      • 전체 서비스를 작은 단위의 독립적인 서비스로 설계 및 구현한 후, 상호 연동하는 방식으로 서비스를 개발한다.
  • 웹 브라우저
    • 사용자 요청을 웹 서버에 전달하고 필요한 HTML 문서 및 관련 컨텐츠를 전송받아 사용자에게 표시한다.

      웹 브라우저특징
      파이어폭스(Firefox)- 모질라 재단에서 개발한 오픈소스 웹 브라우저
      - 리눅스, 윈도우, macOS 등 다양한 운영체제에서 동작한다.
      - 게코(Gecko) 엔진을 기반으로 HTML을 해석하여 화면에 표시한다.
      크롬(Chrome)- 구글에서 개발한 웹 브라우저로 구글이 제공하는 다양한 서비스와 잘 연동된다.
      - 웹킷(Webkit) 엔진을 기반으로 HTML을 해석하여 화면에 표시한다.
      오페라(Opera)노르웨이의 오페라 소프트웨어 ASA(Opera Software ASA)에서 개발한 웹 브라우저로 탭브라우징 등을 최초로 선보였다.
      Microsoft Edge 브라우저- 마이크로소프트 윈도우에 기본 탑재된 웹 브라우저
      - ActiveX 컨트롤을 사용하지 않고 HTML5를 기반으로 동작한다.
      사파리(Safari)애플 macOS에 기본 탑재된 웹 브라우저
    • 최근에는 북마크, 다운로드 목록 관리, 검색 엔진 설정 등의 기능을 기본 제공하며, 제 3자가 개발한 부가기능 모듈을 추가하여 사용할 수 있다.
    • 개발자 도구를 사용하여 웹의 동작 방식과 내부 구조를 분석할 수 있다.
  • HTTP 프로토콜
    • 웹 브라우저와 웹 서버가 상호통신하기 위해 사용하는 프로토콜
    • 데이터를 요청 및 전송하기 위해 사용하는 표준 규약
    • REST(Representational State Transfer)
      • 자원(resource)을 URI(Uniform Resource Identifier)로 명시하고 HTTP의 주요 메서드인 GET, POST, PUT, DELETE 등을 이용하여 처리하는 방식
      • 웹을 기반으로 한 서비스들의 주요기능을 호출하고 상호 연동하기 위한 표준 프로토콜로 많이 사용된다.
  • 웹의 발전 동향

    구분특징
    웹 1.0- 1990년대의 정적 HTML 중심의 웹이다.
    - 웹 사이트를 체계적으로 분류한 디렉터리를 이용해 자료를 검색한다.
    웹 2.0- 2004년 오라일리(O’Reilly)가 주창한 참여, 공유 중심의 웹이다.
    - 위키피디아와 같은 집단지성을 활용한 서비스가 등장한다.
    - 웹시 서비스 플랫폼으로 확장되는 계기가 되었다.
    웹 3.0- 시멘틱 웹 기술을 기반으로 컴퓨터에 의해 정보를 처리하여 제공하는 지능형 웹
    - 자원을 관계와 의미 정보로 처리할 수 있는 온톨로지(Ontology)로 표현하고, 사용자에게 맞춤형 콘텐츠 및 서비스를 제공한다.
  • 웹 관련 주요 용어
    • 크로스 브라우징(Cross Browsing)
      • 웹 표준 기술을 이용해 인터넷 익스플로러, 크롬, 사파리 등 웹 브라우저의 기술적 특징과 관계없이 동일한 정보를 보여줄 수 있다.
      • 국내의 경우 최소 3종 이상의 브라우저 지원을 권장한다.
    • 반응형 웹(Responsive Web)
      • 데스크톱(PC), 모바일 장치와 같이 화면 해상도 등이 다른 환경에 적절히 반응하여 웹 콘텐츠를 표시하는 방법으로, HTML5와 CSS3을 주요 기술로 사용한다.
    • HTML5
      • W3C의 차세대 HTML 표준으로 웹 페이지의 구조적인 개발, 멀티미디어 콘텐츠 재생, 비동기 기능 구현 등을 위한 태그와 API를 포함한다.

☑️ 웹의 동작 원리와 HTTP 프로토콜

웹의 동작 원리

  • 웹의 기본 구조
    • 기본적으로 방화벽, 웹 서버, WAS(Web Application Server), DB(Database) 서버로 구성된다.

      항목설명
      방화벽(Firewall)- 네트워크를 이용한 악의적인 공격으로부터 내부망과 내부 시스템을 보호하기 위한 보안장비
      - 주로 IP 주소와 포트 번호를 기반으로 서비스 접속의 허가 여부를 결정한다.
      웹 서버(Web Server)- HTTP 프로토콜을 이용하여 웹 클라이언트의 요청을 처리하고 응답한다.
      - 사용자 요청에 빠르게 응답하며, 최적의 UI(화면구성)을 제공하는 걸 목적으로 한다.
      웹 응용 서버(WAS)- 웹 기반 서비스의 응용 역할을 담당한다.
      - 웹 서버와 응용 서버를 분리하여 구성하므로 ‘사용자 요청에 대한 응답에 최적화된 웹 서버’의 장점과 ‘복잡한 로직을 처리하고 기능의 확장에 유리한 응용 서버’의 장점을 모두 제공한다.
      DB(Database) 서버서비스를 위한 주요 데이터, 사용자 데이터 등을 저장하고 관리한다.
  • 웹 브라우저에 웹 페이지가 표시되는 과정
    1. 사용자가 ‘http://www.youngin.com/show.php?name=master’와 같은 URL을 웹 브라우저의 주소창에 직접 입력하거나, 링크를 클릭한다.
    2. DNS(Domain Name System) 조회(Query)를 통해 www.younggin.com을 IP 주소로 변환한다.
    3. TCP3 way-handshaking 연결 방식으로 웹 서버에 연결하며, 일반적으로 80 포트를 이용한다.
      1. HTTP일 경우 443 포트를 이용하여 접속한다.
    4. HTTP 프로토콜을 이용하여 웹 서버에 ‘/show.php?name=master’ 를 요청(Request)한다.
    5. show.php는 서버에서 실행되는 기능으로, 관련 기능에 따라 WAS와 상호 연동한다.
      1. 필요할 경우 데이터베이스의 정보를 이용한다.
    6. 웹 서버는 최종 정보를 웹 브라우저에 응답(Response)하고, 웹 브라우저는 전송 받은 내용을 표시한다.
    7. TCP4 way-handshaking 연결 종료 방식으로 웹 서버와의 연결을 종료(Close)한다.
  • HTTP v1.1의 Keep-Alive 기능 확인
    • HTTP v1.0은 연결을 유지하지 않는 비연결성(stateless) 방식으로 동작하며, HTTP 프로토콜을 이용하여 정보를 주고받은 후 연결을 종료한다.
      • 이미지 등 다양한 콘텐츠로 구성된 HTML을 표시하기 위해 여러 번 연결 및 연결 종료 과정을 거친다.
    • HTTP v1.1은 Keep-Alive 방식을 기본으로 지원한다.
      • Keep-Alive : 특정 시간동안 연결을 유지하며, 여러 개의 요청 및 응답을 처리하는 효율적인 방식

HTTP 프로토콜

  • HTTP (HyperText Transfer Protocol) 프로토콜
    • 웹 클라이언트(HTTP Client, 웹 브라우저)와 웹 서버(HTTP Server) 사이에 데이터를 요청 및 전송하기 위한 표준 규약
  • HTTP 요청 메서드(Request Method)
    • 클라이언트가 서버에게 데이터 및 관련 정보를 요청하기 위해 전달하는 명령어
    • HTTP 주요 요청 메서드

      메서드설명
      GETURL 형식으로 리소스 데이터를 요청
      HEAD리소스의 헤더(Header) 정보를 요청하며, 서버는 응답 메시지로 본문(body)을 제외한 헤더 정보만 사용
      POST- HTTP 요청을 헤더와 바디로 구분하여 사용하고, 요청할 내용을 바디에 담아 서버에 전송한다.
      - 주로, 폼(form)문으로 데이터를 전송한다.
      PUT새로운 문서를 만들거나 기존 정보를 갱신하기 위해 사용
      DELETE웹의 리소스(파일)을 삭제하기 위해 사용
      CONNECT프록시(proxy)와 같은 중간 서버에 접속하기 위해 사용
      TRACE요청 리소스가 수신되는 경로를 확인하기 위해 사용
      OPTIONS웹 서버가 제공하는 메소드를 확인하기 위해 사용
  • HTTP 응답과 응답코드(HTTP Response Code)
    • 웹 클라이언트의 요청에 대한 응답 시, 웹 서버는 HTTP 프로토콜의 버전, 웹 서버 정보, 상태코드, 데이터 정보(Header 정보) 등을 함께 전송한다.
    • 상태코드는 HTTP 규약에 정의된 값으로, 응답 정보 및 서버 상태를 확인하는데 사용된다.
    • 1xx(조건부 응답, 정보교환), 2xx(성공), 3xx(리다이렉션), 4xx(요청오류), 5xx(서버오류)
    • HTTP 1xx 상태코드

      상태코드설명
      100Continue
      101Switching Protocols
    • HTTP 2xx 상태코드

      상태코드설명
      200- OK - 오류없이 전송 성공
      201Created
      202Accepted
      203Non-Authoritative Information
      204No Content
      205Reset Content
      206Partial Content
    • HTTP 3xx 상태코드

      상태코드설명
      300Multiple Choices
      301Moved Permanently
      302Moved Temporary
      303See Other
      304Not Modified
      305Use Proxy
    • HTTP 4xx 상태코드

      상태코드설명상태코드설명
      400- Bad Request
      - 클라이언트의 요청이 잘못됨 (문법오류)
      408- Request Timeout
      - 요청 시간이 오래되어 연결을 끊음
      401- Unauthorized
      - 요청에 대한 권한 부족 (인증 실패)
      409Conflict
      402- Payment Required
      - 결재가 필요한 요청
      410Gone
      403- Forbidden
      - 리소스에 대한 권한 없음 (인가 실패)
      411Length Required
      404- Not Found
      - 존재하지 않은 리소스 요청
      412Precondition Failed
      405- Method Not Allowed
      - 지정된 방식으로 요청할 수 없음
      413Request Entity Too Large
      405Not Acceptable414Request URI Too Large
      407Proxy Authentication Required415Unsupported Media Type
    • HTTP 5xx 상태코드

      상태코드설명
      500- Internal Server Error
      - 서버 내부 오류
      501Not Implemented
      502Bad Gateway
      503Service Unavailable
      504Gateway Timeout
      505HTTP Version Not Supported
  • HTTP 헤더(Header) 구조
    • HTTP 프로토콜의 요청과 응답은 헤더와 바디로 구성된다.
    • HTTP의 헤더와 바디는 개행문자인 ‘\r\n’ 으로 구분된다.
      • 헤더와 바디 사이에 한 개의 빈 줄이 존재하는 것
    • 요청과 응답에 공통으로 사용되는 공통 헤더, HTTP 요청 헤더, HTTP 응답 헤더로 구분한다.
    • HTTP 공통 헤더의 주요 항목

      공통 헤더 주요 항목설명
      Date- HTTP 메시지를 생성한 일시로 RFC 1123을 따른다.
      - ex. Tue, 19 Nov 2019 04:13:24 GMT
      Connection- Keep-Alive를 설정할 수 있다.
      - ex. Connection: keep-alive
      Cache-Control- Cache 속성을 설정한다.
      - no-store(캐시 저장하지 않음). no-cache(서버에 확인후 캐시 저장), public(공유 캐시에 저장), private(특정 사용자 환경에서만 저장), max-age(캐시 유효기간 명시) 등을 설정한다.
      Content-Type- 이미지, 오디오, 텍스트 등 콘텐츠 종류를 지정한다.
      - 텍스트일 경우 문자 인코딩 방식을 지정할 수 있다.
      - ex. Content-Type: text/html; charset=utf-8
      Content-Encoding- 데이터의 압축 방식을 지정한다.
      - ex. Content-Encoding: gzip, deflate
      Content-Length- 전송할 데이터 크기를 지정한다.
      - ex. Content-Length: 34
    • HTTP 요청 헤더의 주요 항목

      요청 헤더 주요 항목설명
      Method, URL, HTTP 버전- GET, POST 등 HTTP 요청 메서드
      - 요청하는 URL
      - HTTP 버전 정보
      - ex. GET /example/test.html HTTP/1.1
      Accept- 서버로부터 전송받고자 하는 콘텐츠의 마임(MIME) 타입을 지정한다. 이를 통해 웹 브라우저에 최적화된 타입의 데이터를 사용할 수 있다.
      - Accept-Charset(문자 인코딩 타입), Accept-Language(지원 언어), Accept-Encoding(gzip과 같은 압축 형식) 등을 지정할 수 있다.
      - ex. Accept: image/gif. image/png
      - ex. Accept-Language: ko, en-US
      If-Modified-Since- 지정한 날짜 이후로 변경된 경우에만 수신하도록 지정한다.
      - If-Modified-Since: Mon. 18 Jul 2016 12:15:00 GMT
      User-Agent- 웹 브라우저(웹 클라이언트)의 정보를 지정한다.
      - User-Agent: Mozilla/5.0 (Windows NT 10.0: Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/78.03904.97 Safari/537.36
      Cookie- 웹 서버의 요청에 의해 클라이언트에 저장해놓은 쿠키를 키와 값의 쌍으로 전송한다.
      - 대표적으로 Session ID가 있다.
      Host- 대상 서버의 도메인 이름으로 포트 정보를 포함할 수 있다.
      - Host: www.youngjin.com
      Origin해당 요청이 어느 주소에서 시작되었는지 명시한다.
      Referer- 이번 요청 이전의 페이지 주소를 지정한다.
      - ex. Referer: https://www.google.com/
    • HTTP 응답 헤더의 주요 항목

      응답 헤더 주요 항목설명
      HTTP 버전, 응답 코드- HTTP 버전 정보
      - HTTP 프로토콜에 정의된 응답코드
      - ex. HTTP/1.1 200 OK
      Server- 웹 서버 정보를 명시 - Server: Apache/2.2.24
      Location응답 코드 301, 302 리다이렉션 상태에서 위치 정보를 지정한다.
      Set-Cookie- 클라이언트에 저장할 쿠키 정보를 지정한다.
      - Expires(만료일), Secure(HTTPS에서만 사용), HttpOnly(스크립트에서 접근 불가), Domain(같은 도메인에서만 사용) 등을 함께 설정할 수 있다.
      Expires해당 리소스의 유효 일시를 지정한다.
      Allow응답코드 405 Method Not Allowed 상태에서 서버가 제공할 수 있는 HTTP 메서드를 지정한다.

☑️ 웹 관련 서비스의 설치와 설정

설치 목록과 고려사항

  • 아파치(Apache) 웹 서버
    • 오픈소스로 제공되는 대표적인 웹 서버이다.
      • 리눅스, 윈도우, macOS 등 다양한 운영체제에 설치하여 사용할 수 있다.
    • 아파치 1.x는 프로세스 기반으로 동작하여 하나의 사용자 요청을 하나의 프로세스가 담당하였다.
      • 동시 접속자 증가 시 프로세스의 수가 증가하여 시스템 성능에 영향을 준다.
    • 아파치 2.x는 MPM(Apache Multi-Processing Module)을 지원하며, 프로세스와 스레드를 이용하여 사용자 요청을 효과적으로 처리한다.
    • MPM은 preforkworker 두 가지 방식으로 클라이언트의 요청을 자식 프로세스들에게 할당한다.

      구분특징
      prefork- 아파치 1.x와 같은 방식으로 하나의 프로세스가 하나의 스레드를 갖는다.
      - 실행중인 프로세스를 복제(fork)하여 미리 동작시킨 후 클라이언트의 요청을 처리한다.
      - 스레드 간 메모리 공유를 하지 않으므로 상대적으로 안정적으로 동작하나 시스템 메모리를 많이 사용하는 구조이다.
      - 최대 1,024개의 자식 프로세스를 사용한다.
      - 리눅스의 기본 설정 방식이다.
      worker- 프로세스당 여러 개의 스레드를 갖는 구조로, 각 스레드가 클라이언트의 요청을 처리한다.
      - 초기에 구동할 프로세스 수를 지정하며, 프로세스당 최대 스레드의 개수는 64개이다.
      - 이를 초과할 경우 새로운 프로세스를 생성하게 된다.
      - 동시 접속자가 많은 사이트에 적합한 구조이다.
    • 아파치 웹 서버는 다양한 모듈을 적재(Loading)하여 사용할 수 있으며, 적재 방법은 정적인 방법과 동적인 방법으로 나뉜다.
      • 아파치 2.x 버전은 동적 적재 방식만 지원하며, 시스템 자원을 효율적으로 사용하고 필요한 모듈을 편리하게 관리할 수 있다.
      구분동작 방식특징
      정적 적재- Static Object 방식
      - 필요한 모듈을 아파치 웹 서버와 함께 컴파일 한 후, 아파치 웹 서버의 시작 시 동시에 적재한다.
      - 필요한 모듈이 빠르게 동작한다.
      - 자주 사용하지 않는 모듈도 항상 적재되므로 시스템 효율이 떨어진다.
      - 새로운 모듈을 추가할 경우 컴파일 등 복잡한 과정이 필요하다.
      동적 적재- DSO(Dynamic Shared Object) 방식이다.
      - 아파치 웹 서버를 실행한 후, 사용자의 요청이 있을 경우 필요한 모듈을 적재한다.
      - 필요한 모듈을 원하시는 시점에 바로 적재할 수 있으며, 모듈의 추가 및 삭제가 편리하다.
      - 모듈 적재 시간이 필요하여, 사용자 요청에 대한 응답 시간이 다소 느려질 수 잇다.
    • 사용자별 맞춤 페이지, 게시판 등 다양한 서비스를 동적으로 제공하기 위해 일반적으로 PHP, MySQL 등을 함께 설치하여 사용한다.
      • 이를 LAMP라고도 하며, Linux+Apache+MySQL+PHP를 함께 사용하는 환경이다.
      • 최근 MySQL 대신 MariaDB를 이용하기도 한다.
  • PHP(PHP-Hypertext Preprocessor)
    • 웹 서비스의 로직을 구현하고 동적으로 웹 페이지를 생성할 수 있도록 고안된 스크립트 언어로 PHP Group에서 관리한다.
    • PHP는 서버에서 실행되는 언어(Server-Side Script)이다.
    • DSO(Dynamic Shared Objects) 방식으로 동작한다.
  • MySQL
    • 관계형 데이터베이스 관리 시스템
    • 오픈소스로 개발된 MySQL은 현재 Oracle Corporation이 관리하고 있다.
      • MySQL에 기반한 MariaDB가 등장하였고, MySQL을 대체하는 추세이다.
    • C, C++, JAVA, PHP 등 다양한 프로그래밍 언어를 위한 인터페이스를 제공하며, php-mysql 패키지를 이용하여 PHP와 연동할 수 있다.
    • 기본적으로 TCP 3306포트를 이용하여 통신하며, PHP는 /tmp/mysql.sock 파일을 소켓으로 이용하여 MySQL에 접속한다.
  • 웹 관련 서비스 컴파일 및 설치 시 고려사항
    • 프로그램을 컴파일, 설치, 설정 및 운영하기 위해 관리자 권한이 필요하다.
    • sudo , su 를 사용하여 관리자 권한으로 작업을 진행한다.

        $ su -
      
    • 아파치 웹 서버의 설치는 httpd -v , rpm -qa | grep httpd 로 확인한다.

        # 아파치 웹 서버 설치 확인
        $ httpd -v
        OR
        $ rpm -qa | grep httpd
              
        # 서비스 실행 여부 확인
        $ systemctl status httpd
        OR
        $ systemctl status httpd.service
              
        # 서비스 중단
        $ systemctl stop httpd
        OR
        $ systemctl stop httpd.service
              
        # 아파치 웹서버의 데몬 강제종료
        $ pkill -9 httpd
              
        # 아파치 웹 서버 패키지 제거
        $ yum remove httpd
      
    • Apache, PHP, MySQL을 컴파일 하기 위해 컴파일러, 라이브러리, 헤더 파일 등 필요한 패키지를 설치해야 한다.

        $ yum -y install gcc pcre pcre-devel --enablerepo-devel pcre-tools
              
        $ yum -y install perl-Data-Dumper openssl-devel cmake ncurses-devel gcc-c++
              
        $ yum -y install libxml2-devel libpng-devel
      
    • Apache와 PHP는 configure → make → make install 방식으로 소스코드를 컴파일 및 설치하여 사용할 수 있다.
      • configure 사용 시 다양한 속성을 설정할 수 있는데, ./configure —help 로 세부 내용을 확인할 수 있다.
    • MySQL은 cmake → make install 방식으로 소스코드를 컴파일 및 설치하여 사용한다.
    • 일반적으로 Apache → MySQL → PHP 순으로 설치하며 동작을 확인한다.
    • sudo와 dnf
      • yum 명령어 실행 시 권한 관련 오류가 발생할 경우 sudo 명령어를 함께 이용한다.
      • sudo : 다른 계정의 권한으로 명령을 실행할 수 있고, 특별한 옵션을 지정하지 않는 경우 기본으로 root 계정의 권한을 이용한다.
      • 오류 발생 예

          $ yum remove httpd
          Error: This command has to be run with superuser privileges (under the root user on most systems)
        
      • sudo 명령을 함께 사용한 예

          $ sudo yum remove httpd
        
      • 최근 리눅스는 yum 과 함께 dnf 를 함께 지원한다.
        • dnf(Dandified Yum)은 RHEL, CentOS, Rocky Linux와 같은 RPM 기반 리눅스 배포판을 위한 패키지 관리 도구로, yum 의 낮은 성능과 종속성 문제 등을 개선한 도구이다.
          $ sudo dnf install httpd # dnf를 사용하여 Apache 설치
                    
          $ sudo dnf remove httpd # dnf를 사용한 Apache 삭제
        
    • 일반적으로 소스코드는 /usr/local/src 에 다운로드하여 저장하고, 프로그램은 /usr/local 아래에 설치한다.
    • 인터넷에서 소스코드 등을 다운할 경우, 임의의 변조 여부를 점검하기 위해 MD5 해시값을 이용한다.
      • 해시함수는 동일한 입력 데이터에 대해 같은 해시값을 생성하므로, 이를 사용하여 데이터 변조 여부를 확인할 수 있다.
      • 검증 방법: md5sum 함수를 이용하여 생성한 값을 사이트에서 제공하는 MD5값과 비교한다.

          $ ls
                    
          $ cat httpd-2.4.37.tar.bz2.md5
                    
          $ md5sum httpd-2.4.37.tar.bz2
        

아파치 웹 서버 소스코드 컴파일과 설치

  • APR(Apache Portability Runtime) 설치
    • 설치하고자 하는 아파치 버전은 APR이 필요하므로, 이를 수동으로 설치한다.

        $ wget http://mirror.apache-kr.org/apr/apr-1.7.4.tar.gz
              
        $ tar xvfz apr-1.7.4.tar.gz
              
        $ ./configure --prefix=/usr/local/apr
              
        $ make && make install
      
    • 함께 설치할 apr-utilexpat-devel 라이브러리가 필요하여 먼저 설치 후, apr-util을 수동설치한다.

        $ yum -y install expat-devel # expat-devel 설치
              
        # apr-util 설치 
        $ wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.3.tar.gz
              
        $ tar xvfz apr-util-1.6.3.tar.gz 
              
        $ cd apr-util-1.6.3
              
        $ ./configure --with-apr=/usr/local/apr
              
        $ make && make install
      
  • 아파치 웹 서버 소스코드 준비
    • wget 을 이용하여 아파치 웹 서버의 소스코드를 다운로드하고, tar 로 압축 해제한다.
      • tar 로 압축해제 시 bzip2 명령어를 찾지 못할 경우, yum -y install bzip2 으로 bzip2를 설치한 후 다시 시도한다.
        # 아파치 웹 서버의 소스코드 다운로드
        $ wget http://archive.apache.org/dist/httpd/httpd-2.4.37.tar.bz2 
              
        # 압축 해제
        $ tar xvfj httpd-2.4.37.tar.bz2
      
  • 소스코드 빌드 설정(Configure) 실행
    • 압축을 해제한 소스 디렉터리로 이동한 후 설정(configure) 작업을 수행한다.
      • configure : 소스코드를 컴파일하기 위해 운영체제의 특징, 컴파일러, 라이브러리, 종속성 등을 설정한 후 Makefile을 생성한다.
        $ cd httpd-2.4.37 # 압축이 해제된 소스 디렉터리로 이동
              
        # 설정 작업 수행
        $ ./configure --prefix=/usr/local/apache --enable-mods-shared=all
              
        $ ls Makefile
      
    • configure 옵션으로 다양한 속성을 지정한다.

        $ ./configure --help # 사용할 수 있는 전체 옵션 확인
      
    • Apache 소스코드의 configure 주요 옵션

      주요 옵션설명
      —prefix=/usr/local/apache- 아파치 웹 서버 관련 파일들이 설치될 경로를 지정한다.
      —enable-mods-shared=all모든 모듈을 DSO 방식으로 설치하도록 구성한다.
      —enable-so- mod_so가 제공하는 DSO(Dynamic Shared Object) 기능을 사용한다.
      - enable-mods-shared 옵션을 이용할 경우 자동으로 포함된다.
      —enable-sslmod_ssl이 제공하는 SSL/TLS 기능을 사용한다.
      —with-mpm=MPMMPM에 ‘prefork, worker’ 등을 지정하여 MPM(Apache Multi-Processing Module) 동작 방식을 설정할 수 있다.
      —disable-status아파치 프로세스와 스레드에 대한 모니터링을 하지않도록 설정한다.
      —enable-disk-cache디스크 캐싱 기능을 활성화한다.
      —enable-mem-cache메모리 캐싱 기능을 활성화한다.
  • 아파치 웹 서버의 소스코드 컴파일 및 설치

      $ make # 컴파일
        
      $ make install # 설치
        
      $ /usr/local/apache/httpd -version # httpd -version로 2.4.37 버전이 잘 설치되었는지 확인
        
      # 아파치 데몬을 실행한 후 telnet으로 접속을 확인한다.
      $ yum -y install telnet # telnet 설치
      $ /usr/local/apache/bin/httpd
      $ telnet localhost 80
        
      $ 리눅스 부팅 시 아파치 데몬을 자동으로 실행하기 위해 /etc/rc.d/rc.local에 필요한 명령 등록
      $ cat >> /etc/rc.d/rc.local
    
    • 최근 리눅스는 systemd를 기반으로 관리하며, systemctl 명령을 이용하여 서비스를 시작, 멈춤, 등록(부팅 시 자동 실행) 혹은 등록 해제한다.
      • 이전 버전의 리눅스에서와 같이 /etc/rc.d/rc.local 에 필요한 명령을 등록할 수 있으나, 등록한 파일에 실행 권한을 부여해야 한다.
    • httpd.conf 파일을 수정하여 domain name 관련 문제를 해결할 수 있다.
      • 아파치 서버 설치 후 httpd 데몬을 구동하면 domain name 관련 문제가 발생할 수 있다.
      • httpd.confServerName을 설정하여 원하는 도메인 이름을 지정하거나 IP 주소를 사용할 수 있다.
        	# vi 편집기를 사용하여 해당 내용의 주석을 해제해야 한다.
        	$ vi usr/local/apache/conf/httpd.conf
      
      • 소스코드를 컴파일하여 설치할 경우 httpd.conf 의 기본 경로는 usr/local/apache/conf/httpd.conf 이다.
        $ /usr/local/apache/bin/apahectl restart # 아파치 서버를 재시작하여 관련 문제가 해결된 것을 확인
      
  • MySQL 소스코드 컴파일과 설치
    • cmake 가 설치되어 있지 않으면, yum -y install cmake 로 설치한다.
      • cmake 를 이용하면 이후 make 과정에서 컴파일 등의 진행사항을 진행률(%)과 함께 색상(color)로 표시한다.
    • MySQL 컴파일에 필요한 boost 라이브러리를 다운로드한 후, 압축을 해제한다.

        $ wget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
              
        $ tar xvfz boost_1_59_0.tar.gz
      
      • certificate 관련 문제가 보고되면 —no-check-certificate 옵션을 명령에 추가한다.
    • MySQL 소스코드 준비

        $ wget https://dev.mysql.com/get/Downloads/MySQL-5.7.28.tar.gz # wget으로 소스코드 다운로드
        $ tar xvfz mysql-boost-5.7.28.tar.gz # tar로 압축을 해제
      
    • 소스코드 빌드 설정(cmake) 실행

        # 소스코드 빌드를 위해 필요한 라이브러리와 도구를 설치
        $ yum -y install libtirpc
              
        $ yum -y install libtirpc-dev
              
        $ dnt -y install epel-release
              
        $ dnt config-manager --set-enabled powertools
              
        $ dnt install rpcgen libtirpc-devel
              
        # 압축을 해제한 소스 디렉터리로 이동
        $ cd mysql-5.7.28/
              
        # cmake를 이용하여 환경설정 작업 수행
        $ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql\
      
      • mySQL 소스코드의 cmake 주요 옵션

        주요 옵션설명
        -DCMAKE_INSTALL_PREFIX=/usr/local/mysql- MySQL 파일들이 설치될 경로를 지정한다.
        - 예제의 경우 /usr/local/mysql에 설치된다.
        -DDEFAULT_CHARSET=utf8문자 데이터의 인코딩 타입을 UTF8로 한다.
        -DMYSQL_DATADIR=/usr/local/mysql/dataMySQL의 데이터가 저장되는 경로를 지정한다.
        -DDOWNLOAD_BOOST=1 - DWITH_BOOST=경로명MySQL 컴파일 시 필요한 Boost 라이브러리의 위치를 지정한다.
          $ cmake -L # MySQL 소스코드 설정 옵션 확인
        
  • MySQL의 소스코드 컴파일 및 설치

      # make로 컴파일
      $ make
        
      # make install로 설치
      $ make install
    
  • MySQL 서버 설치 확인

      $ ls /usr/local/mysql -l # 설정(cmake) 과정에서 설치 경로로 지정한 /usr/local/mysql의 내용 확인
        
      $ /usr/local/mysql/bin/mysql --version # mysql --version으로 버전이 잘 설치됐는지 확인
    
  • MySQL 계정 생성과 소유권 변경

      $ useradd -d /usr/local/mysql mysql # MySQL 사용자로 mysql 계정을 생성하여 사용
    
  • MySQL의 기본 DB, 테스트 DB 및 테이블 생성

      # mysqld --initialize 를 이용하여 필요한 DB 생성
      # 명령의 결과로 root@localhost로 접속하기 위한 임시 패스워드가 생성됨
      $ /usr/local/mysql/bin/mysqld --initialize
    
    • 이전에는 mysql_install_db 를 사용하였다.

PHP 소스코드 컴파일과 설치

  • PHP 소스코드 준비

      $ wget https://www.php.net/distributions/php-5.6.31.tar.bz2 # wget을 통해 소스코드 다운로드
        
      $ tar xvfj php-5.6.31.tar.bz2 # tar을 통해 압축 해제
    
  • 소스코드 빌드 환경 설정(configure) 실행

      $ cd php-5.6.31/ # 압축을 해제한 소스 디렉터리로 이동
        
      $ ./configure --prefix=/usr/local/php \ # configure를 이용해 환경설정 작업 수행
    
    • PHP 소스코드의 configure 주요 옵션

      주요 옵션설명
      —prefix=/usr/local/php- PHP 파일들이 설치될 경로 지정
      —with-apxs2아파치에 DSO(Dynamic Shared Object)로 로딩하기 위해 사용하는 apxs의 위치 지정
      —with-mysqlMySQL와 연동하기 위한 MySQL 설치 경로 지정
      —with-config-file-pathPHP 설정 파일인 php.ini가 위치할 경로 지정
    • configure 과정 중, mysql library 관련 오류

      • mysql 또는 phd의 컴파일 옵션에 따라 필요한 라이브러리를 찾을 수 없기 때문에, 최신 버전의 소스코드의 경우 관련 내용을 지원하지 않는 추세이다.
      • 이러한 문제 발생 시

        - -with-mysql=mysqlnd - -with-pdo-mysql=mysqlnd - -with-mysqli=mysqlnd

        configure 과정을 진행할 수 있다.

  • PHP 소스코드 컴파일 및 설치

      $ make # 컴파일
        
      $ make install # 설치
    
  • PHP 설치 확인

      $ ls /usr/local/php -l # 설정(configure) 과정에서 설치 경로로 지정한 /usr/local/php 내용 확인
        
      # php--version으로 버전이 잘 설치되었는지 확인
      $ /usr/local/php/bin/php --version
    
  • php.ini 파일 복사 및 웹 브라우저 연동 확인

      # configure 과정에서 설정한 /usr/local/apache/conf 경로에 php.ini를 복사
      $ cp ./php.ini-production /usr/local/apache/conf/php.ini
        
      # 아파치 웹서버가 .php 파일을 인식할 수 있도록 httpd.conf 파일에 MIME 타입 설정
      # vi 에디터로 편집
      $ vi /usr/local/apache/conf/httpd.conf
        
      # 아마피 웹 서버 재시작
      $ /usr/local/apache/bin/apachectl restart
    
    • 아파치 웹서버의 웹 페이지를 저장하는 /usr/local/apache/htdocs샘플 php 파일을 생성한 후 웹 브라우저를 이용하여 접속한다.
      • phpinfo() : 시스템에 설치된 PHP의 정보를 HTML 형식으로 출력한다.
      $ echo "<?php phpinfo(); ?>" > /usr/local/apache/htdocs/sampe.php
      $ cat /usr/local/apache/htdocs/sample.php
      <?php phpinfo(); ?> 
    
  • php.ini의 short_open_tag 지시자

    • PHP 5.3 버전부터 <?php ~?> 형식으로 소스코드를 작성하도록 변경됐고, 이전 사용하던 <? ~?> 방식은 더이상 지원하지 않는다.
    • 이전 방식을 지원하려면 php.ini 파일의 Language Options 항목 중 short_open_tag = On 으로 설정한다.
    • php.ini의 주요 설정 항목

      설정 항목설명
      short_open_tag- <? ~> 형식의 이전 소스코드 방식에 대한 지원 여부를 설정한다.
      - ex. short_open_tag = On
      max_execution_time- 요청을 처리할 최대 시간으로, 설정한 시간을 초과할 경우 타임아웃이 발생한다.
      - ex. max_execution_time = 30
      display_errors- PHP 프로그램 실행 중 오류 발생 시 해당 내용을 출력할 건지 지정한다.
      - 보통 개발할 때 On으로 설정하고 운영 시에는 Off로 설정한다.
      - ex. display_errors = Off
      post_max_size- PHP를 통해 POST 방식으로 업로드 할 수 있는 최대 크기를 지정한다.
      - ex. post_max_size = 10M
      max_file_uploads- 한 번의 요청으로 업로드할 수 있는 파일의 최대 개수를 지정한다.
      - ex. max_file_uploads = 10
      allow_url_open- HTTP, FTP 등 URL을 이용하여 파일을 오픈할 수 있도록 구성한다.
      - 보통 보안을 위해 Off로 설정한다.
      - ex. allow_url_open = Off
      allow_url_include- HTTP, FTP 등 URL을 이용하여 파일을 포함(include)할 수 있도록 구성한다.
      - 보안을 위해 Off로 설정한다.
      - ex. allow_url_include = Off

패키지 관리자를 이용한 APM 설치와 연동

  • 사전 확인 및 준비사항
    • 리눅스 초기 설치 상태에서 APM이 설치되지 않은 상황을 가정하여 진행한다.

        $ rpm -qa | egrep "^(httpd|php|mysql)" # rpm을 통해 APM 설치 여부 확인
      
  • 아파치 웹 서버 설치와 기본 동작 확인

      $ yum -y install httpd # 아파치 웹 서버 설치
        
      $ systemctl start httpd.service 아파치 웹 서버 실행
        
      # 데몬 동작 확인
      # netstat 명령어가 존재하지 않으면 yum -y install net-tools로 네트워크 관련 명령어 설치
      $ netstat -nlp | grep httpd
        
      $ ps -el | grep httpd
    
    • 최신 리눅스는 대부분의 서비스 관리 스크립트들이 .service 로 끝나는 파일인 서비스 유닛(Unit)으로 변경되었으며 systemctl 명령어로 제어된다.
    • service 명령을 이용하여 서비스 제어 시 systemctl 명령을 사용하는 방식으로 재요청(Redirecting)된다.

        $ service httpd start
      
    • 웹 브라우저를 이용해 localhost(127.0.0.1)에 접속 시 기본 HTML 문서를 확인할 수 있다.
  • MySQL 설치와 기본 동작 확인

      $ yum -y install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm # yum을 통해 MySQL 설치에 필요한 파일 설치
        
      $ yum repolist enabled | grep "mysql*-community.*" # MySQL Repository 설치 상태 확인
        
      # Rocky Linux 기본 패키지에 포함된 mysql 패키지 비활성화
      $ yum module disable mysql 
        
      # mysql 설치
      $ yum -y install mysql-community-server
        
      # MySQL 서버 실행# 패스워드 설정
      $ systemctl start mysqld.service
        
      # MySQL 서비스 실행 여부 확인
      $ systemctl status mysqld.service
        
      # 설치 과정 중 생성된 임시 패스워드는 /var/log/mysqld.log 에서 확인 가능
      $ cat /var/log/mysqld.log | grep "A temporary password"
        
      # mysqladmin을 통해 root의 패스워드 변경
      $ mysqladmin -uroot -p'.Z4pu_vm1o/d' password Ab@1234567
        
      # MySQL에 접속하여 기본 정보 확인
      $ mysql -uroot -p'Ab@1234567'
    
    • mysql 패스워드는 설정된 정책에 따라 변경해야 한다.
      • user id를 포함하지 않고, 8자 이상, 대소문자를 최소 1개 이상, 숫자 최소 1개 이상, 특수문자 최소 1개 이상 사용해야 한다.
    • MariaDB
      • MySQL과 동일한 소스코드를 기반으로 개발된 GPL v2 라이선스 기반의 오픈소스 관계형 데이터베이스 관리 시스템
      • ORACLE이 MySQL 라이선스를 변경한 것에 반발하여 오픈소스 진영에 의해 개발되었다.
      • MySQL과 높은 호환성을 유지하며 더 높은 성능을 제공한다.
    • MongoDB
      • 비정형 데이터 또는 문서지향 데이터베이스 관리 시스템으로 빅데이터와 함께 언급되는 대표적인 NoSQL DBMS
      • MongoDB를 위한 저장소를 등록한 후 설치하여 사용할 수 있다.

          $ vi /etc/yum.repos.d/mongodb.repo
                    
          $ yum -y install mongodb-org
                    
          $ mongo --version
        
  • PHP 설치와 기본 동작 확인

      $ yum -y install php php-mysqlnd # yum을 통해 PHP 및 관련 모듈 설치
        
      $ php -r 'echo "Hello Linux Master\n";' # php를 통해 PHP 동작 확인
        
      # 아파치 웹 서버가 .php 파일을 인식하도록 /etc/httpd/conf/httpd.conf 파일에 PHP 관련 정보 설정
      $ vi /etc/httpd/conf/httpd.conf
        
      ...
      AddType application/x-httpd-php .php .php3 .php4 .php5 # AddType을 통해 특정한 확장자를 해석하는 방식 지정
      ...
      DirectoryIndex index.html index.php # DirectoryIndex를 통해 웹 서버에서 기본 페이지로 인식할 파일명 지정
        
      $ apachectl restart # 아파치 웹 서버 재시작
    
  • Apache, PHP, MySQL 연동 테스트

      $ vi /var/www/html/testdb.php # vi 편집기로 PHP-MySQL 연동 소스코드를 /var/www/html/testdb.php로 작성
        
      # curl을 통해 testdb.php에 접속해 웹 서버에 요청을 전달하고 결과를 확인
      $ curl localhost/testdb.php
    
  • 서비스 자동 실행 등록 및 방화벽 설정

      # systemctl을 통해 리눅스 부팅 시 자동으로 실행되도록 구성
      $ systemctl enable mysqld.service
      $ systemctl enable httpd.service
        
      # 구성 내용 확인
      $ systemctl list-unit-files --type service | egrep "mysqld|httpd"
        
      # 아파치 웹 서버를 외부에서 접속할 수 있도록 기본 포트인 80 포트를 방화벽에서 연다.
      # 리눅스의 방화벽 관리 명령어인 firewall-cmd 이용
      $ firewall-cmd --get-active-zones 
      $ firewall-cmd --permanent --zone=public --add-service=mysql
      $ firewall-cmd --permanent --zone=public --add-service=http
      $ firewall-cmd --reload
    

아파치 웹 서버의 구조와 세부 설정

  • 아파치 웹 서버의 주요 디렉터리
    • 아파치 웹서버를 소스코드 컴파일 방식으로 설치하면 configure 설정에 따라 /usr/local/apache 관련 파일이 설치된다.

        ls /usr/local/apache -l
      
    • /user/local/apache의 주요 디렉터리

      디렉터리명설명
      bin아파치 웹 서버의 실행 및 관리를 위한 프로그램들이 저장된 경로
      build컴파일 등에 사용한 스크립트 파일들이 저장된 경로
      cgi-binCGI(Common Gateway Interface) 스크립트 파일들이 저장된 경로
      conf- 아파치 웹서버의 환경설정 파일(httpd.conf)이 저장된 경로
      - conf/extra 디렉터리에는 추가 설정 파일들이 저장
      errorHTTP 에러 발생 시 표시될 메시지 문서가 저장된 경로
      htdocsHTML 등 웹 페이지가 저장되는 기본 경로
      icons아파치 웹 서버가 사용하는 이미지들이 저장된 경로
      include헤더 파일들이 위치
      logs아파치 웹 서버의 동작 시 발생하는 로그 파일이 저장
      manManual 파일이 저장되어 있는 경로
      manualHTML 파일 형식으로 아파치 관련 매뉴얼 저장
      modules아파치 웹 서버가 사용하는 모듈 파일이 저장된 경로
    • 아파치 웹 서버를 패키지 관리자를 이용하여 설치하면 리눅스 시스템의 디렉터리 특징에 따라 아파치 관련 파일들이 저장된다. (rpm -ql httpd 명령어로 관련 내용 확인 가능)
    • 아파치 웹 서버의 주요 디렉터리

      디렉터리명설명
      /var/www/htmlHTML 등 웹 페이지가 저장되는 기본 경로
      /var/www/cgi-binCGI(Common Gateway Interface) 스크립트 파일들이 저장된 경로
      /var/www/error- HTTP 에러 발생 시 표시될 메시지 문서가 저장된 경로
      - 필요에 따라 생성하여 사용
      - ex. HTTP_NOT_FOUND.html.var
      /var/www/icons아파치 웹 서버가 사용하는 이미지들이 저장된 경로로 필요에 따라 생성하여 사용
      /var/logs/httpdaccess_log, error_log 등 아파치 웹 서버의 웹 로그가 저장되는 경로
      - access_log: 홈페이지 방문자들의 방문 정보 기록
      - error_log: 에러 발생 시 관련 내용 기록
      /etc/httpd/conf아파치 웹 서버의 환경설정 파일(httpd.conf)이 저장된 경로
      /etc/httpd/conf.d- 아파치 웹 서버의 추가 설정 파일이 저장된 경로
      - autoindex.conf: 디렉터리 내용의 로딩 방식 결정
      - userdir.conf: 사용자 홈페이지 디렉터리 설정
      - welcom.conf: 초기 기본 페이지 설정
      /usr/lib64/httpd/modules- 아파치 웹 서버가 사용하는 모듈 파일이 저장된 경로
      - mod_alias.so와 같은 파일명을 따르며, DSO(Dynamic Shared Object) 방식으로 적재된다. 이를 위해 httpd.conf 설정 파일에서 LoadModule 구문을 이용
  • 아파치 웹 서버의 실행 파일 목록
    • 패키지 관리자를 이용하여 설치한 경우, /usr/bin , /usr/sbin 에 아파치 웹 서버 관련 실행파일이 저장된다.
    • 아파치 웹 서버의 주요 실행 파일

      실행 파일명설명
      ab아파치 벤치마킹 도구
      apachectl- 아파치 웹 서버의 실행, 종료, 재시작을 위한 도구
      - 아파치 웹 서버 설정 파일인 httpd.conf를 검사하는 기능 제공
      htpasswd암호 인증이 필요한 웹 페이지를 대상으로 아이디와 암호 생성
      hpdigest사용자 인증 파일을 생성하고 업데이트 하는 도구
      httpd아파치 웹 서버의 데몬 프로그램
      logresolve아파치 웹 서버의 로그 파일에서 IP 주소를 호스트 네임으로 변환하는 도구
      rotatelogs아파치 웹 서버의 로그 로테이트(Log Rotate)를 위한 도구
    • httpd 명령은 httpd [옵션] [파일이름]의 형식을 따른다.

      옵션설명
      -t환경설정 파일인 httpd.conf의 문법적 오류 점검
      -f특정 환경설정 파일을 지정하여 아파치 데몬을 실행
      -S현재 설정된 가상 호스트 목록 출력
      -l아파치 웹 서버와 함께 컴파일 된 모듈 목록 출력
      -M로딩된 모든 모듈의 목록 출력(static, shared)
    • apachectl 명령은 apachectl [명령] 의 형식을 따른다.

      옵션설명
      start아파치 데몬 시작
      stop아파치 데몬 중지
      restart아파치 데몬을 재시작하고, 실행중이 아닌 상태일 경우 데몬을 시작
      configtest환경설정 파일인 httpd.conf의 문법적 오류 점검
      graceful현재 연결된 클라이언트의 접속을 유지하면서 설정 파일인 httpd.conf 를 다시 읽어서 구성
      status or fullstatus- 웹 서버의 상태를 출력
      - fullstatus : mod_status의 모든 상태를 출력하며, mod_status 모듈이 설치되고, httpd.conf의 <Location / server-status> 영역이 설정되어 있어야 동작한다.
  • 아파치 웹 서버의 환경설정 파일
    • /etc/httpd/conf/httpd.conf 파일을 기본으로 이용한다.
      • 아파치 2.2 이후 버전부터 관리 편의성을 위해 별도의 설정 파일로 구성할 수 있으며 /etc/httpd/conf.d 디렉터리에 저장된다.
    • 별도의 설정 파일은 /etc/httpd/conf/httpd.conf 설정 파일에서 Include 지시자로 포함할 수 있다.
      • 기본값으로는 Include conf.d/*.conf 로 설정되어 모든 설정 파일들이 포함된다.
    • 아파치 웹 서버의 주요 설정 파일

      주요 설정 파일설명
      httpd.conf아파치 웹 서버의 기본 설정 파일
      httpd-mpm.confMPM(Apache Multi-Processing Module) 관련 설정 파일
      httpd-multilang-errordoc.confHTTP 에러처리에 대한 다국어 문서 설정 파일
      httpd-autoindex.conf디렉터리 목록의 표시 방법 설정 파일
      httpd-userdir.conf개인 사용자의 홈 디렉터리 설정 파일
      httpd-info.conf아파치 웹 서버의 실행 상태 모니터링을 위한 설정 파일
      httpd-vhosts.conf버추얼 호스트 설정 파일
      httpd-dav.conf- WebDAV(Web-based Distributed Authoring and Version) 설정 파일
      - WebDAV : 웹 서버에서 파일 목록 조회, 수정, 삭제 등을 할 수 있는 프로토콜
      httpd-default.conf웹 서버의 기본 설정값을 설정하는 파일
      httpd-languages.conf웹 문서의 언어 설정 파일
      httpd-ssl.confSSL(Secure Socket Layer) 지원을 위한 설정 파일
      • 설정 파일 변경 후, apachectl restart 로 아파치 웹 서버를 재시작해야 설정 파일이 적용된다.
  • httpd.conf를 이용한 아파치 웹 서버의 기본 설정
    • /etc/httpd/conf/httpd.conf 의 주요 설정 항목은 너무 많아 생략
    • httpd -M 을 통해 현재 로딩된 모듈 항목을 확인할 수 있다.
    • httpd -L 을 통해 설정 가능한 지시자를 확인할 수 잇다.

        $ httpd -M
        $ httpd -L
      
    • ** ~ </DIrectory>의 세부 설정 항목**

      설정 항목설명
      NoneNone을 설정하면 이외의 다른 모든 설정들이 무시되며, 결과적으로 접근이 거부된다.
      All- Multiviews를 제외한 모든 설정값이 적용된다.
      - 기본 설정값이다.
      indexes- default.html , index.php 등 기본 파일이 존재하지 않을 경우, 해당 디렉터리의 모든 파일 목록을 보여준다.
      - 서버의 파일 목록이 표시되고 웹 브라우저를 이용하여 접근할 수 있으므로 보안 취약점이 발생한다. 따라서 설정하지 않는 것을 권장한다.
      FollowSymLinks- 디렉터리 내에서 심볼릭 링크 사용을 허가한다.
      - 웹 브라우저에서 링크 파일의 경로까지 확인할 수 있으므로, 보안 취약점이 발생한다. 설정하지 않는 것을 권장한다.
      ExecCGICGI(Common Gateway Interface)의 실행을 허락한다.
      Includes- SSI(Server Side Includes)를 허용한다.
      - mod_include.c 모듈이 아파치 웹 서버에 로딩되어 있어야 한다.
      IncludesNOEXECSSI는 허락하나 #exec는 허용하지 않는다.
      MultiViews웹 브라우저의 요청과 웹 문서의 종류를 참고하여 가장 적합한 페이지를 보여준다.
    • AllowOverride의 주요 설정 항목

      설정항목설명
      None- .htaccess 와 같이 AccessFileName에 지정한 파일을 액세스 인증 파일로 사용하지 않고 무시하며, Override도 허용하지 않는다.
      - 일반적으로 제한적인 접근만 허용하고자 할 때 사용한다.
      All- httpd.confAccessFileName 항목으로 설정한 파일을 이용하며, Override를 허용한다.
      - AccessFileName은 보통 .htaccess 로 지정되어 있다.
      AuthConfig- AccessFileName에 지정된 파일에 대해 클라이언트 인증 지시자 사용을 허락한다.
      - AuthDBMGroupFIle, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require 등과 같은 지시자가 있다.
      Fileinfo- AccessFileName에 지정된 파일에 대해 문서 유형을 제어하는 지시자 사용을 허락한다.
      - AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등과 같은 지시자가 있다.
      indexes- AccessFileName에 지정된 파일에 대해 디렉터리 인덱싱을 제어하는 지시자 사용을 허락한다.
      - AddDescription, Addicon, AddinconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName 등과 같은 지시자가 있다.
      Limit- AccessFileName에 지정된 파일에 대해 호스트 접근을 제어하는 지시자 사용을 허락한다.
      - Allow, Deny, Order 등과 같은 지시자가 있다.
      Options- AccessFileName에 지정된 파일에 대해 특정 디렉터리 옵션을 제어하는 지시자 사용을 허락한다.
      - Options, XBitHack 등과 같은 지시자가 있다.
  • LogLevel의 세부 설정 항목
    • /ect/rsylog.conf 설정 내의 우선순위와 동일하다.

      세부 항목설명
      emerg- 최상위 레벨로, 매우 위험한 상태에 대한 메시지
      - 시스템을 사용할 수 없는 수준의 긴박한 상황 의미
      alert즉각적인 조치가 필요한 상황에서 발생
      crit시스템에 치명적 문제가 발생한 상황에 대한 메시지
      error에러가 발생한 상황에 대한 메시지
      warn주의를 요하는 경고 메시지
      notice일반적인 알림이나 중요한 수준의 메시지
      info프로그램 동작 상황 등 일반적인 정보
      debug최하위 레벨로, 프로그램 개발을 위한 디버깅 관련 메시지
  • log_config_module을 이용한 로그 설정 방식
    • LogFormat 항목은 기록하는 로그의 형식을 지정한다.
    • LogFormat에서 사용하는 주요 지시자

      주요 지시자설명
      %h요청을 보낸 클라이언트(원격) 호스트명
      %A아파치 웹 서버의 로컬 IP 주소
      %p요청이 처리되는 포트 번호
      %H요청 프로토콜
      %l- 클라이언트가 전송한 원격 로그인 아이디
      - htpasswd를 이용하여 특정 디렉터리에 대한 인증을 설정할 경우, 사용자가 입력한 로그인 아이디
      %u- 사용자 인증을 위한 유저명
      - 요청한 URL이 기본 HTTP 인증을 요구할 경우 사용하는 유저명
      %U클라이언트가 요청한 URL 경로
      %t아파치 데몬이 요청을 받은 시간
      %T아파치 데몬이 요청을 처리하는데 소요한 시간
      %r클라이언트 요청한 내용 중 첫 번째 라인
      %s- 클라이언트의 요청에 따른 서버의 처리 상태
      - %>s를 이용하면 가장 마지막 상태코드만 기록
      %bHTTP 헤더를 제외한 전용량(bytes)으로, CLF 형식과 같이 전송내역이 없는 경우 - 를 사용
      %BHTTP 헤더를 제외한 전체 전송량(bytes)
      %[헤더이름]- 지정한 헤더 이름에 해당하는 정보
      - ex. %[User-Agent}: 클라이언트 (웹 브라우저)의 정보
      %I요청 헤더를 포함하여 수신한 전송량(bytes)
      %O헤더를 포함하여 전송한 전송량
    • CustomLog는 웹 서버에 대한 접근 정보를 기록하는 로그 파일(access_log)의 위치를 지정한다.
      • combined 옵션 지정 시 access, agent, referer 정보를 하나의 파일에 모두 저장한다.
  • httpd-userdir.conf를 이용한 사용자별 홈페이지 구성
    • mod_userdir 모듈을 이용하여 사용자별 홈페이지를 지원하고, 관련 항목을 설정한다.
    • UserDir 지시자의 세부 내용

      항목설명
      UserDir가장 중요한 지시자로, 사용자별 홈 페이지의 사용 여부를 결정한다.
      - UserDir disabled : 사용하지 않는다. UserDir disabled 계정명 과 같은 방식으로 특정 사용자만 제외할 수 있다.
      - UserDir [폴더명] : 웹 페이지를 저장할 기본 경로를 지정한다. 기본값은 public_html이며, ‘/home/사용자명/public_html’ 디렉터리에 HTML 등의 문서를 저장한다. chmod 755 와 같은 명령을 이용해 해당 디렉터리에 대한 접근 권한을 허가해놓아야 한다.
    • 사용자별 홈 페이지는 ~(틸다) 계정명 으로 접근한다.
  • httpd-vhosts.conf를 이용한 가상 호스트 구성
    • VirtualHost를 이용해 하나의 IP 주소로 여러 개의 도메인(호스트)를 설정할 수 있으며, 사용을 원하는 호스트별로 <VirtualHost> ~ </VirtualHost> 항목을 각각 추가한다.
    • VirtualHost의 주요 설정 항목

      항목설명
      <VirtualHost *:80>- IP 주소, 포트 번호와 함께 가상 호스트를 추가한다.
      - 기본 설정은 <VirtualHost *:80> 이며, * 대신 원하는 주소(IP Address)를 지정할 수 있다.
      ServerName도메인(호스트)의 이름을 지정한다.
      ServerAlias- 기본 도메인 이름 외 다른 호스트 이름(별칭)을 추가할 때 사용한다.
      - ex. ServerName example.com
      - ex. ServerAlias www.example.com
    • httpd -S 명령으로 VirtualHost의 설정 상태를 점검한다.

        $ httpd -S
      
    • autoindex의 주요 설정 항목

      항목설명
      IndexOptions디렉터리를 표시(Listing)하는 방법을 지정한다.
      - Standard : 표준 디렉터리 형식으로 표시
      - FancyIndexing : 이후 설정값에 따라 보다 보기 좋은 모습으로 표시
      AddiconByType파일 및 확장자에 따라 표시될 이미지 지정
      DefaultIcon별도의 정의되지 않은 파일에 대한 기본 표시 이미지 지정
      AddDescription파일 뒤에 표시될 간단한 설명 지정
      ReadmeName디렉터리 내용 표시 후, 가장 아랫부분에 표시할 README 파일 지정
      HeaderName디렉터리 내용 표시 전, 가장 윗부분에 표시할 HEADER 파일 지정
      IndexIgnore디렉터리 표시에서 제외할 파일 지정
  • default.conf를 이용한 웹 서버의 기본 설정 지정
    • default.conf 또는 http-default.conf 를 이용하여 아파치 웹 서버의 기본 설정값을 지정한다.
    • 아파치 웹 서버의 주요 기본 설정 항목

      설정 항목설명
      Timeout- 클라이언트의 요청에 대한 응답 제한 시간을 초 단위로 지정 - 기본값: Timeout 60
      KeepAlive- 하나의 TCP 세션을 이용하여 여러 요청을 처리하기 위한 keepAlive 기능 설정
      - TCP 세션은 하나의 프로세스나 스레드와 연결되므로 결과적으로 프로세스나 스레드를 종료하지 않고 계속 사용
      - 기본값: KeepAlive On
      MaxKeepAliveRequests- KeepAlive가 On으로 설정된 경우, 처리할 수 있는 최대 요청 수를 지정
      - TCP 연결을 유지하는 프로세스나 스레드가 MaxKeepAliveRequests에 설정된 만큼을 처리하게 되면 종료됨
      - 기본값: MaxKeepAliveRequests 100 (0으로 지정하면 무제한)
      KeepAliveTimeout- KeepAlive가 On인 상태에서 설정한 시간동안 클라이언트의 요청이 없을 경우 연결 종료
      - 기본값: KeepAliveTimeout 5 초 단위 지정)
      UseCanonicalName- Off: 클라이언트가 제공하는 호스트 이름과 포트를 사용해 URL과 서버 이름 설정
      - On: ServerName 지시자를 이용하여 URL과 서버 이름 설정
      - 기본값: UserCanonicalName Off
      AccessFileName- 디렉터리별 접근제어를 설정하는 파일명 지정
      - 기본값: AccessFileName .htaccess
      ServerToken- 클라이언트(웹 브라우저)에 전송할 서버의 정보 수준 지정
      - Full: 웹 서버의 종류, 버전, 운영체제의 종류, 설치된 모듈 정보 등
      - OS: 웹 서버의 종류, 버전, 운영체제의 종류
      - Min: 웹 서버의 종류와 버전
      - Prod: 웹 서버의 종류 - 기본값: ServerTokenFull
      ServerSignature- 아파치 웹 서버가 생성하는 오류 메시지 등에서 아파치 버전, 가상호스트 정보, 관리자 이메일 주소 등 추가 정보를 포함할 지 결정
      - On: 아파치 버전, 가상 호스트 정보
      - Email: 아파치 버전, 가상호스트 정보, 관리자 이메일 주소
      - Off: 표시하지 않음
      - 기본값: ServerSignature On
      HostnameLookups- 로그 기록클라이언트의 IP 정보를 표시하는 방법 설정
      - On: 도메인명으로 기록함(DNS 조회가 필요하여 웹 서버 성능이 저하될 수 있음)
      - Off: IP 주소로 기록
      - 기본값: HostnameLookups Off
  • httpd-info.conf를 이용한 웹 서버 상태 정보 구성
    • 웹 브라우저를 이용하여 웹 서버의 상태 정보를 확인할 수 있도록 관련 정보를 설정한다.
    • <Location /server-status> ~ </Location>을 이용하면 http://www.example.com/server-status 와 같은 URL을 이용하여 서버 상태 확인 가능
    • ExtendedStatus On 으로 설정 시 최대한의 정보를, ExtendedStatus Off 로 설정 시 최소한의 정보를 제공한다.
      • 기본은 ExtendedStatus Off
    • <Location /server-info> ~ </Location> 이용 시, http://www.example.com/server-info 와 같은 URL을 이용하여 서버 정보를 확인할 수 있다.
      • mode_info.c 모듈이 로딩된 상태여야 한다.
  • httpd-mpm.conf를 이용한 MPM(Apache Multi-Processing Module> 설정
    • mpm_prefork_module을 이용하여 prefork 동작 방식을 설정한다.
    • mpm_prefix_module의 주요 설정 항목

      항목설명
      StartServers아파치 웹 서버 구동 시, 초기 실행할 자식 프로세스의 개수 지정
      MinSpareServers- 유휴 프로세스의 최소 유지 개수 지정
      - 클라이언트의 요청 수가 증가하여 유휴 프로세스의 개수가 설정한 값보다 작은 상태가 되면 새로운 자식 프로세스를 생성한다.
      MaxSpareServers- 유휴 프로세스의 최대 유지 개수를 지정한다.
      - 클라이언트의 요청 수가 감소하여 유휴 프로세스의 개수가 설정한 값보다 큰 상태가 되면 동작 중인 자식 프로세스를 종료한다.
      MaxRequestWorkers- 동시 접속할 수 있는 클라이언트의 최대값을 설정한다.
      MaxConnectionPerChild- 아파치 자식 프로세스 하나가 처리할 최대 요청 수를 설정한다.
      - 설정한 요청 수를 처리하면 프로세스는 종료된다.
      - 0으로 설정하면 무한대가 된다.
    • mpm_worker_module을 이용하여 prefork 동작 방식을 설정한다.
    • mpm_worker_module의 주요 설정 항목

      항목설명
      StartServers아파치 웹 서버 구동 시, 초기 실행할 자식 프로세스의 개수 지정
      MinSpareThread새로운 요청을 처리하기 위해 대기하고 있는 스레드의 최소 개수를 지정한다.
      MaxSpareThread새로운 요청을 처리하기 위해 대기하고 있는 스레드의 최대 개수를 지정한다.
      ThreadPerChild하나의 아파치 프로세스가 생성할 스레드의 개수를 지정한다.
      MaxRequestWorkers동시 접속할 수 있는 클라이언트의 최대값을 설정한다.
      MaxConnectionPerChild- 아파치 스레드 하나가 처리할 최대 요청 수를 설정한다.
      - 0으로 설정하면 무한대가 된다.
  • htpasswd 명령을 이용한 아파치 웹 서버 사용자 인증
    • 아파치 웹 서버의 특정 페이지에 사용자 인증을 설정할 수 있다.
    • 웹 페이지에 사용자 인증 설정 방법

      설정 순서설명
      웹 사용자 생성- htpasswd 명령으로 사용자 생성
      - ex. htpasswd -c /etc/password master : master 사용자를 생성하고 계정 파일로 /etc/password 파일 이용
      httpd.conf 설정대상 디렉터리의 AllowOverride 항목에 AuthConfig 지정
      .htaccess 생성인증 대상 디렉터리에 .htaccess 파일 생성
    • .htaccess의 주요 설정 항목

      항목설명
      AuthTypeBasic, Digest 방식의 인증 방식 지정
      AuthName웹 브라우저의 인증 창에 표시될 이름(메시지) 설정
      AuthUserFile사용자 계정 파일 지정
      Require접속을 허가할 사용자 지정
      - Require valid- user: 사용자 계정 파일에 등록된 사용자 모두를 허가
      - Require [사용자명, 사용자명 …]: 특정 사용자 계정만 허가
    • htpasswd : htpasswd [옵션][계정파일][사용자명]을 실행 옵션으로 하여 사용자 계정 파일을 관리한다.

        $ htpasswd
      
    • .htpasswd의 주요 옵션

      옵션설명
      -c- 사용자 계정 파일 생성
      - 최초 한 번은 -c 옵션으로 계정 파일을 만들어야 한다. 이후 생략 가능
      -D지정한 사용자를 사용자 계정 파일에서 제거
      -sSHA 암호화 방식으로 사용자 계정 파일 암호화
  • mod_ssl을 이용한 HTTPS 사용
    • 웹 클라이언트와 웹 서버 간 HTTP 기반 통신 시, 데이터는 일반 평문으로 전송되어 프록시나 패킷 캡쳐 도구를 이용하여 내용을 알아낼 수 있다.
      • 중요한 데이터 보호를 위해 별도의 암호화 방법이 필요하다.
    • 아파치 웹 서버는 mod_ssl 모듈을 이용해 HTTPS(HTTP over Secure Socket Layer) 방식으로 암호화 통신을 할 수 있고, 443포트를 기본 포트로 이용한다.
    • SSL(Secure Socket Layer)
      • 암호화 기법을 이용하여 인터넷에서 안전하게 데이터를 전송하는 프로토콜이다.
      • 비대칭키를 사용하여 신원 확인과 대칭키 교환을 수행하고, 대칭키를 이용하여 빠르게 데이터를 암호화한다.
  • 아파치 웹 서버의 여러 설정 방법
    • /etc/httpd/conf/http.conf의 단일 설정 항목 이용
    • /etc/httpd/conf/httpd.conf 내에서 <IfModule 모듈명> ~ </IfModule> 관련 모듈 설정 이용
      • 해당 모듈은 로딩되어야 한다.
    • /etc/http/conf.d 디렉터리에 모듈별 설정 파일(.conf)을 작성한 후, /etc/httpd/conf/http.conf 에 포함
      • DSO 방식으로 모듈 적재가 필요할 경우 LoadModule 지시자를 포함한다.

© 2021. All rights reserved.

yaejinkong의 블로그