웹의 개념과 구성요소
1) 웹의 개요
- 웹이란 다양한 시스템이 인터넷으로 상호 연결되어 문서와 정보를 공유하는 서비스를 의미
- 웹 므라우저를 사용하여 Hypertext 형식으로 구성된 웹 문서를 탐색하며, 이때 Hyperlink를 참조.
- Hypertext : link를 이용해 상호연결된 문서. 즉시 접근하여 자유롭게 참조할 수 있는 형식.
웹은 HTML과 HTTP를 이용해 구현 - Hyperlink : 하이퍼텍스트 문서에서 문서, 이미지 등 자료를 연결하고 가리킬 수 있는 참조정보. URL 형식으로 구성.
2) 웹의 구성요소
1. 웹문서 HTML
- W3C에서 주관하여 관리
- .html 확장자를 가징 정적 문서와 .php, .jsp .asp 등의 확장자를 가진 동적 문서로 구성
- 동적 웹 문서는 PHP, 자바 서블릿, 파이썬 등 함께 설치된 외부 모듈에 의해 동적으로 생성.
- 자바 스크립트와 같은 웹 브라우저에서 실행되는 프로그램 루틴을 추가해 정적 문서의 제한된 기능을 보완.
2. 웹서버
- 웹 브라우저의 요청에 따라 웹 문서를 전달하는 서비스 프로그램.
- 단순한 웹 문서를 전달하는 초기의 웹서버에서 최근 웹서버는 동적페이지, 로그인 및 세션관리, 다중 웹호스팅, QoS 제한 등 다양한 기능과 확장 모듈을 제공.
주요 웹서버의 특징
Apache | 아파치 재단이 주도하는 오른소스 웹서버 자용자의 요청에 따라 별도의 프로세스 혹은 쓰레드를 생성하여 처리 Loadable Module 기능을 제공하여 서버의 동작을 확장 |
IIS | 마이크로소프트가 개발 및 제공하는 웹서버 ASP 지원하며 GUI 기반의 관리 콘솔을 이용한 설정 및 관리가 편리 |
Nginx | NGINX 사가 개발 및 제공하는 웹서버로 비동기 이벤트 방식으로 동작 로드밸런스, HTTP 캐시, 리버스 프록시 등의 기능을 제공 |
GWS | 구글이 제공하는 웹서버 |
3. 웹 브라우저
사용자의 요청을 웹서버에 전달하고 필요한 HTML 문서 및 관련 컨텐츠를 전송받아 사용자에 표시.
개발자도구를 사용해 웹 동작 방식과 내부 구조를 분석.
4. HTTP 프로토콜
웹 브라우저와 웹 서버가 상호 통신하기 위해 사용하는 프로토콜. 데이터를 요청 및 전송하기위해 사용하는 표준 규약.
3) 웹의 발전 동향
정적 HTML 중신의 단순한 웹 -> 웹을 중심으로 한 서비스 플랫폼
-> 시멘틱 웹 기술을 기반으로 컴퓨터에 의해 정보를 처리하여 제공하는 지능형 웹
웹의 동작 원리와 HTTP 프로토콜
1) 웹의 동작원리
1. 기본구조
2. 웹 브라우저에 웹 페이지가 표시되는 과정
- 사용자가 웹 브라우저에 URL입력하거나 링크 클릭
- DNS 조회를 통해 IP 주소로 변환
- TCP의 3way-handshaking 연결방식으로 웹서버에 연결, 일반적으로 80포트 이용.
HTTPS일 경우 443 포트를 이용해 접속. - HTTP 프로토콜을 이용하여 웹서버에 Request.
- show.php는 서버에서 실행되는 기능으로 관련 기능에 따라 WAS와 상호 연동.
필요할 경우 데이터베이스의 정보를 이용. - 웹서버는 최종 정보를 웹 브라우저에 응답 Response 하고, 웹브라우저는 전송 받은 내용을 표시.
- TCP의 4way-handshaking 연결 종료 방식으로 웹서버와의 연결을 종료.
2) HTTP 프로토콜
1. HTTP(HyperText Transfer Protocol) 프로토콜
웹클라이언트와 웹서버 사이에 데이터를 요청 및 전송하기 위한 표준 규약.
2. HTTP 요청 메소드
클라이언트가 서버에게 데이터 및 관련 정보를 요청하기 위해 전달하는 명령어
GET | URL 형식으로 리소스 데이터를 요청 |
HEAD | 리소스의 헤더 정보를 요청, 서버는 응답 메시지로 body를 제외한 헤더 정보만 사용. |
POST | HTTP 요청을 헤더와 바디로 구분하여 사용. 요청할 내용을 바디에 담아 전송. 주로 form 데이터 전송에 사용. |
PUT | 새로운 문서를 만들거나 기존 정보를 갱신하기 위해 사용. |
DELETE | 윕의 리소스를 삭제하기 위해 사용 |
CONNECT | 프록시와 같은 중간 서버에 접속하기 위해 사용 |
TRACE | 요청한 리소스가 수신되는 경로를 확인하기 위해 사용 |
OPTION | 웹 서버가 제공하는 메소드를 확인하기 위해 사용. |
3. HTTP 응답과 응답 코드 HTTP Response Code
- 웹서버는 HTTP 프로토콜의 버전, 웹 서버 정보, 상태 코드, 데이터 정보 등을 함께 전송.
- 상태코드는 HTTP 규약에 RFC 2616 에 정의된 값.
응답 정보 및 서버의 상태를 확인하는데 사용. - 상태코드는 1xx (조건부응답, 정보교환), 2xx(성공), 3xx(리다이렉션), 4xx(요청오류), 5xx(서버오류) 로 구분.
4. HTTP 헤더 구조
- 헤더(부가정보)와 바디(실제데이터)로 구성
- 헤더와 바디는 개행문자인 '\r\n'으로 구분. 헤더와 바디사이에 한개의 빈줄이 존재
- 헤더는 공통헤더, HTTP 요청헤더, HTTP 응답헤더로 구분
웹 관련 서비스의 설치와 설정
1) 웹 서비스 구성을 위한 설치 목록과 고려사항
1. 아파치 웹 서버
- 프로세스 기반느올 동작하여, 하나의 요청을 하나의 프로세스가 담당.
동시 접속자가 증가하면 프로세스 수가 증가하여 시스템 성능에 영향을 준다. - MPM(Apache Multi-Processing Module) 을 지원하고, 프로세스와 쓰레드를 이용하여 요청을 효과적으로 처리.
prefork와 worker의 두가지 방식으로 클라이언트의 요청을 자식 프로세스들에게 할당. - 다양한 Module을 적재 loading 하여 사용. 적재하는 방법은 정적인 방법, 동적인 방법으로 나뉨.
- 아파치 2.4 부터 지원하는 Event MPM 방식은 클라이언트 요청을 동작중인 프로세스, 스레드와 바로 연결하지않고 요청을 처리하는 별도의 쓰레드를 이용해 효율적으로 분산 처리하는 구조.
prefork | 하나의 프로세스가 하나의 쓰레드를 가진다 실행중인 프로세스를 복제 fork 하여 미리 동작시킨 후 클라이언트 요청 처리 쓰레드간 메모리 공유하지 않으므로 상태적으로 안정적으로 동작하나 시스템 메모리 많이 사용함. 최대 1024 자식 프로세스 사용 리눅스의 기본 설정방식 |
worker | 프로세스당 여러개의 쓰레드를 갖는 구조, 각 쓰레드가 클라이언트 요청 처리. 촉 구동할 프로세스 수를 지정하고, 프로세스당 최대 쓰레드 개수는 64개. 이를 초과할 경우 새로운 프로세스 생성. 동시 접속자가 많은 사이트에 적합한 구조. |
정적 적재 | - Static Object 방식 - 필요한 모듈을 아파치 웹 서버와 함께 컴파일한 후 , 아파치 웹 서버의 시작 시 동시에 적재함. |
- 필요한 모듈이 빠르게 동작 - 자주 사용하지 않는 모듈도 항상 적제되므로 효율이 떨어짐. - 새로운 모듈을 추가할 경우 컴파일 등 복잡한 과정 필요. |
동적 적재 | - DSO(Dynamic Shared Object) 방식 - 아파치 웹 서버를 실행한 후, 사용자의 요청이 있을경우 필요한 모듈을 적재. |
- 필요한 모듈을 원하는 시점에 바로 적재가능하고, 모듈의 추가 및 삭제가 편리. - 모듈을 적재하는 시간이 필요하고, 사용자 요청에 대한 응답시간이 느려질 수 있음. |
2. PHP (PHP-Hypertext Preprocessor)
- 웹서비스 로직을 구현하고 동적으로 웹페이지를 생성할 수 있도록 고안된 언어.
- 서버에서 실행되는 언어 Server-Side Script. DSO(Dynimic Shared Object) 방식으로 동작.
3. MySQL
- 관계형 데이터 베이스 관리 시스템 RDBMS.
- 오픈소스로 개발되어 Sun에 인수, 현재 Oracle 이 관리.
- 기본적으로 TCP 3306 포트를 이용하여 통신.
- PHP는 /tmp/mysql.sock 파일을 소켓으로 아용하여 MySQL에 접속.
4. 웹 관련 서비스 컴파일 및 설치 시 고려사항
- 프로그램을 설치 설정 운영하기 위해 관리자 권한 필요.
- 최근 리눅스 배포판을 아파치 웹서버를 기본으로 포함함.
- httpd -v, rpm -qa | grep httpd 로 확인
- systemctl status httpd 실행여부 확인. killall httpd 아파치 서버 데몬 종료.
- 아파치 웹 서버 패키지는 yum remove httpd 로 제거
- 일반적으로 소스코드는 /usr/local/src 에서 다운로드. 프로그램은 /usr/local 아래에 설치.
- 인터넷에서 소스코드 등을 다운로드할 경우 임의의 변조 여부를 점겅하기 위해 MD5 해시값 이용.
- Apache 와 PHP는 configure->make->make install 방식으로 소스코드를 컴파일 및 설치.
configure 시 설정할 수 있는 다양한 속성은 ./configure --help 로 확인. - MySQL은 cmake->make install 방식으로 소스코드를 컴파일 설치
- 일반적으로 Apache->MySQL->PHP 순으로 설치하여 동작 확인.
- 실무에서는 소스코드응 이용해 필요한 프로그램을 설치하는 방식보다 패키지관리 프로그램 yum으로 설치하는 방식 선호.
2) 아파치 웹 서버 소스코드 컴파일과 설치
1. APR(Apache Protability Runtime) 설치
$wget http://achache.mirror.cdnetworks.com/apr/apr-1.7.9.tar.gz
$tar xvfz apr-1.7.0.tar.gz |
함께 설치할 apr-util은 expat-devel 라이브러리가 필요하므로 먼저 설치후 수동설치
$yum -y install expat-devel $wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.1.tar.gz $tar xvfz apr-util-1.6.1.tar.gz |
2. 아파치 웹 서버 소스코드 준비
$wget http://archive.apache.org/dist/httpd/httpd-2.4.12.tar.bz2
$tar xvfj httpd-s.4.12.tar.bz2 |
3. 소스코드 빌드 설정 실행
압축해제한 소스 디렉터리 이동후 설정작업 수행 configure 설정후 Makefile 생성.
$cd httpd-2.4.12 $./configure --prefix=/usr/local/apache --enable-mods-shared=all $ls Makefile |
4. 아파치 웹 서버의 소스코드 컴파일 및 설치
make 명령으로 컴파일한 후 make install 명령어로 설치
$make $make install |
5. 아파치 웹 서버 설치 및 확인
설정 과정에서 설치 경로로 지정한 /usr/local/apache 내용을 확인. 버전 확인.
$ls /usr/local/apache -l $/usr/local/apache/bin/httpd -version |
telnet 설치. 아파치 데몬을 실행한 후 telnet 으로 접속 확인.
리눅스 부팅시 데몬 자동 실행 위해 /etc/rc.d/rc.local 에 필요한 명령을 등록.
$yum -y install telnet $/usr/local/apache/bin/httpd $telnet localhost 80 $cat >> /etc/rc.d/rc.local /ust/local/apache/bin/apachectl start |
3) MySQL 소스코드 컴파일과 설치
1. cmake 설치
$yum -y install cmake
2. MySQL 컴파일에 필요한 bost 라이브러리 다운로드한 후 압축 해제
$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 |
3. MySQL 소스코드 준비
wget 명형 이용하여 소스코드 다운로드하고, tar 명령으로 압축을 해제
$wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.28.tar.gz
$tar xvfz mysql-boost-5.7.28.tar.gz |
4. 소스코드 빌드 설정 cmake 실행
압축해제한 소스디렉터리로 이동한 후 , cmake 를 이용해 환경설정 작업 수행
$cd mysql-5.7.28/ $cmake -DCMAKE_INSTALL_PREFIX-/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ ... --Configuring done --Generating done --Build files have been written to: /usr/local/src/mysql-5.6.28 |
5. MySQL 소스코드 컴파일 및 설치
make 명령으로 컴파일한 후, make install 명령어로 설치
$make $maek install |
6. MySQL 서버 설치 확인
설정 cmake 과정에서 설치 경로로 지정한 /usr/local/mysql 내용 확인
버전설치 확인
$ls /usr/local/mysql -l $/usr/local/mysql/bin/mysql --version |
7. MySQL 계정 생성과 소유권 변경
사용자로 mysql 계정을 생성하여 사용
$useradd -d /usr/local/mysql mysql |
8. MySQL 기본 DB, 테스트 DB 및 테이블 생성
필요한 DB 생성.
$/usr/local/mysql/bin/mysqld --initialize |
명령의 실행 결과로 root@localhost로 접속하기 위한 임시 패스워드가 생성됨.
4) PHP 소스코드 컴파일과 설치
1. PHP 소스코드 준비
wget 명령 이용해 소스코드 다운로드하고, tar 명령으로 압축 해제
2. 소스코드 빌드 설정 cmake 실행
압축 해제한 소스디렉토리 이동후 configure를 이용하여 환경설정 작업 수행
3. PHP 소스코드 컴파일 및 설치
make 로 컴파일한 후, make install 명령어로 설치
$make $make install |
4. PHP 설치 확인
설정과정에 설치경로 지정한 내용 확인
버전 확인
$ls /usr/local/php/ -l $/usr/local/php/bin/php --version |
5. php.ini 파일 복사 및 웹 브라우저 연동 확인
configure 과정에서 설정한 /usr/local/apache/conf 경로에 php.ini 복사
웹서버가 .php 파일을 인식할 수 있도록 httpd.conf 파일에 MIME 타입을 설정
웹서버 재시작
$cd ./php/ini-production /usr/local/apache/conf/php/ini $vi /usr/local/apache/conf/httpd.conf ... AddType application/x-httpd-php .php .php5 AddType application/x-httpd-source .phps ... $/usr/local/apache/bin/apachectl restart |