안녕, 세상!

1-1. Lamp 소스 설치 및 구현 - apache2.4 컴파일 설치 본문

It공부/Server

1-1. Lamp 소스 설치 및 구현 - apache2.4 컴파일 설치

dev_Lumin 2021. 1. 25. 15:51

(1) 서버 개요

서버는 크게 다음과 같은 형태로 상호작용을 하여 구성이 되어 있습니다.

위와 같이 상호작용을 하면서 동작을 하는데

웹서버, 즉 서버의 특징은 3가지가 있습니다.

 

1. 클라이언트 : 서버 = n : 1    ( 클라이언트와 서버는 n대1관계)

2. 서버 : 서버 = n : 1             ( 서버 또한 특정 서버에 대해 n대1 관계가 될 수 있음, 고정이 아닌 가변적)

3. 상호작용하는 요소들에 의존하지 않고 스스로 처리할 수 있는 기능들을 가지고 있음

 

위의 요소들 중 대표적으로 apache / php / mysql을 같이 묶어서 종종 사용됩니다.

그래서 각각의 앞 글자를 따서 apm이라고 불립니다. (mysql이 mariaDB가 될 수도 있음)

또한 apm은 사용하는 운영체제 환경에 따라 다르게 불립니다.

 

Window : Wamp

Linux : Lamp

Mac : Mamp

 

이렇게 종종 묶여서 사용되다 보니 설치도 묶어서 설치할 수 있는 프로그램이 존재합니다.

Bitnami 에서 각 운영체제에 맞는 amp를 묶어서 한 번에 설치 가능한 프로그램들을 제공해줍니다.

bitnami.com/stack/wamp/installer

 

Install WAMP, Download WAMP

show MD5 4693f36e1c49dd8f2d13bc031e6b8381 SHA1 e9eb910949151a5401689c4527c2267c3de166ee SHA256 db4b15a834f67f7746e08847823ff65ddb96d86746946c92664f518397372f0a

bitnami.com

앞으로의 실습은 Linux 운영체제 환경에서 실행을 하면서 공부를 할 것입니다.

위의 bitnami 사이트에서 gui의 환경에서 다운이 가능하지만, 

리눅스 운영체제의 환경의 장점은 바로 커널입니다.

커널에 명령어 단 몇 줄만으로 설치 및 수정들이 가능하기 때문입니다.

 

리눅스 운영체제 계열 마다 설치를 하도록 하는 명령어는 다릅니다.

Redhat 계열 CentOS의 명령어는 yum

데미안계열 Ubuntu의 명령어는 apt-get install 

 

위의 명령어만을 이용하여, 즉 package manager을 이용하여 apm을 구축하는 것은 어렵지 않습니다.

위의 설치 명령어들로 설치하게 된다면 많은 패키지들이 묶인 상태로 다운이 되어서 쉽게 금방 다운을 할 수 있지만,

apm을 구축하는데 불필요한 파일들까지 모두 다운로드가 될 수 있습니다.

 

그러므로 직접 의존성을 모두 고려해가며 설치를 하는 컴파일 설치(소스 설치)로 apm을 구축해보겠습니다.

 

리눅스 운영체제 중에 Ubuntu를 사용해서 실습을 진행할 것입니다.

Ubuntu의 버전 종류에 대해서 인지하고 있으면 좋습니다.

Ubuntu는 6개월마다(주로 4월, 10월) 새로운 버전을 출시합니다.

크게 LTS버전일반 버전으로 나뉩니다.

 

LTS버전

최대 5년까지 지원(업데이트)하지만, 기능 업데이트는 느림

기능 업데이트가 느리기 때문에 주로 서버에서 사용함

일반적으로 짝수년도의 4월에 출시  ( ex) ubuntu 16.04.05, ubuntu 18.04.05, ubuntu 20.04.05 )

 

일반 버전

지원 기간이 9개월로 짧으며, 새로운 버전 출시 주기가 짧음

새로운 기능을 빨리 체험하고 싶을 때 사용하므로 데스크탑에서 주로 사용함

일반적으로 6개월 마다 출시함 (4월, 10월)

 

또한 동일한 버전에서 Server버전, Desktop버전 두 종류로 나뉩니다.

Server버전 : gui가 없음

Desktop버전 : gui가 있음

 

 

실습을 시작하기 전에 구현 개발 환경을 짚고 넘어가겠습니다.

가상환경 : vmware workstation 16 community player

OS : Ubuntu 18.04.05 Desktop 64bit (LTS)

Apache : Apache 2.4.46

 

(2) 실습 구축 환경

가상 머신 : VMware WorkStation 16 player

운영체제 : ubuntu 18.04.05 Desktop 64bit (LTS)

ubuntu.com/download/alternative-downloads

 

Alternative downloads | Ubuntu

Want to download via-bitTorrent links, get images with more language packs, use the text-based alternate installer or find previous versions of Ubuntu?

ubuntu.com

releases.ubuntu.com/18.04.5/?_ga=2.138008883.2099517076.1611551294-1747001122.1611551294

 

Ubuntu 18.04.5 LTS (Bionic Beaver)

Select an image Ubuntu is distributed on three types of images described below. Desktop image The desktop image allows you to try Ubuntu without changing your computer at all, and at your option to install it permanently later. This type of image is what m

releases.ubuntu.com

 

 

 

 

 

(3) 가상환경 구축

우선 ubuntu-18.04.5-destop 64bit 버전을 installer에 넣어서 설정을 해줍니다.

User의 이름과 비밀번호를 설정합니다.

 

가상환경 이름 설정 및 하드디스크 용량을 설정해주고 최종적으로 finish 버튼을 눌러서 설치를 시작합니다.

터미널을 열어서 현 현재 상태를 알기 위해서 간단한 명령어를 입력합니다.

터미널 열자마자 현 상태

 

(4) apache 소스 설치

앞서 말했듯이 package manager을 사용하지 않고 수동으로 apache 설치에 필요한 소스들을 직접 설치해줄 것입니다.

Linux에 소스를 컴파일하여 설치하는데 기본적으로 알아야하는 규칙이 있습니다.

  • 외부 소스파일들을 다운로드 할 때 /usr/local 에 설치하는 것이 관례입니다.

  • 소스파일은 /usr/local/src에 보관합니다.

  • 컴파일 설정을 마친 후에는 아래 명령어로 설치를 수행합니다.

# ./configure
# make
# make install

# make && make install

 

추가로 아래 적어 놓은 것은

make와 make install을 한 번에 실행시킬 수 있는 명령어입니다.

 

그럼 이제 apache 소스 설치하기 전에 고려해야할 의존성 소스들이 무엇인지 보겠습니다.

최종적으로 apache 소스를 설치하는 과정에서 중 ./configure 과정에서 크게 세 종류의 소스가 사용됩니다.

1. apr 소스

2. apr-util 소스

3. pcre 소스

 

그러므로 apache 소스를 설치하기 전에 위의 3개의 소스를 먼저 설치를 하고 컴파일을 시켜야 합니다.

 

① APR 

APR(Apache Portable Runtime)는 아파치 HTTP 서버 2.x.의 핵심 휴대용 라이브러리입니다.

이러한 APR은 고급 IO 기능(예:sendfile, epoll and OpenSSL 등)에 대한 접근을 포함하여

OS 수준의 기능 (난수 생성, 시스템 상태),

그리고 기본 프로세스 처리(공유 메모리, NT 파이프와 유닉스 소켓) 등 많은 용도로 사용되고 있습니다.

 

앞서 소스 설치 및 컴파일 3가지 규칙중 소스파일은 /usr/local/src에 저장한다는 관례가 있었는데 이 부분은 나중 마지막에 하겠습니다.

 

ubuntu에서 패키지를 설치하거나 컴퓨터를 관리할 때 보통 바로 root 접근자로 로그인해서 사용하지 않습니다.

이는 보안성 위험을 방지하고자 하는 습관입니다.

그래서 보통 일반 user로 로그인 후 root권한이 필요한 명령어를 수행할 때 sudo명령어를 통해 그때 그때 필요할 때만 권한을 받아서 사용합니다.

 

하지만 지금 실습에서는 특정 디렉터리에 새로운 디렉터리를 만들거나 

특정 패키지를 다운받을 환경이 많다보니 매번 sudo를 명령어 앞에 넣으면 불편하므로

처음부터 sudo su 명령어로 root권한을 계속 유지한 채로 실습을 하겠습니다.

 

 

1. /usr/local에 apr과 apr-util을 다운 받고 압축을 해제합니다.

# wget http://mirror.navercorp.com/apache//apr/apr-1.7.0.tar.gz
# wget http://mirror.navercorp.com/apache//apr/apr-util-1.6.1.tar.gz
# tar xvfz apr-1.7.0.tar.gz
# tar xvfz apr-util-1.6.1.tar.gz

 

2. apr을 설치 및 컴파일 후 apr-util을 설치 및 컴파일합니다. (apr-util 설치 시 컴파일 된 apr소스 필요함)

$ cd usr/local/apr-1.7.0
$ ./configure --prefix=/usr/local/apr
$ make
$ make install

 

./configure --prefix=/usr/local/apr 명령어 실행 시

    (1) error  : no acceptable C compiler found in $PATH

컴파일러를 찾지 못해서 발생하는 오류로 다음 명령어로 해결합니다.

(이러한 컴파일러 및 의존성 설치부분은 package-manger인 apt-get 명령어를 사용하겠습니다.)

$ apt-get install gcc

설치 후 다시 ./configure 명령어 실행 시

    (2) error : cannot remove 'libtoolT' : No such file or directory

다음 명령어를 입력하여 해결합니다.

$ cp -arp libtool libtoolT

이제 다시 ./configure 부분 명령어를 치면 잘 되지만

make부분에서 또 error가 발생합니다.

    (3) error : Command 'make' not found, but can be installed with apt install make apt install make-guile

이또한 make명령어를 실행시킬 수 있는 패키지가 없으므로 다음과 같은 명령어로 해결합니다.

$ apt-get install --reinstall make

이제 다시 make && make install 명령어를 실행해주면 오류없이 컴파일이 됩니다.

 

 

② APR-util

apr이 설치되었으므로 apr과 마찬가지로 apr-util을 설치해주면 됩니다.

$ cd usr/local/apr-util-1.6.1
$ ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-util 
$ make && make install

이번에는 ./configure 명령어부분은 error가 없지만,

make부분 명령어에서 다음과 같은 오류가 발생합니다.

    (1) error : xml/apr_xml.c:35:10: fatal error: expat.h : No such file or directory

libexpat1-dev라는 패키지가 없어서 뜨는 에러로 다음 명령어로 해결할 수 있습니다.

$ apt-get install libexpat1-dev

이제 다시 make명령어를 실행하면 잘 컴파일이 됩니다.

 

③ PCRE

PCRE(Perl Compatible Regular Expression)는 펄 호환 정규 표현식으로서,

정규식 패턴 일치를 구현하는 함수의 집합입니다.

요즘에는 Apache, PHP, KDE 등을 포함한 오픈 소스 프로젝트에서 사용되고 있으며, 

apache 2.4 버전을 설치할 때는 PCRE설치를 해야합니다.

 

3. /usr/local에 PCRE를 설치 및 압축해제, 컴파일을 합니다.

$ cd usr/local
$ wget ftp://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
$ tar xvfz pcre-8.43.gar.gz
$ cd usr/local/pcre-8.43
$ ./configure --prefix=/usr/local/pcre
$ make
$ make install

압축해제까지 다 잘되었는데 

./configure 명령부분에서 error가 뜹니다.

    (1) error : configure: error: Invalid C++ compiler or C++ compiler flags

g++라는 C++ 컴파일러가 없어서 생긴 에러이므로 다음과 같이 해결합니다.

$ apt-get install g++

해결 후 다시 ./configure 명령어와 make 명령어를 실행하면 pcre도 잘 컴파일됩니다.

 

④ Apache 2.4.46

이제 Apache를 설치하기 위한 소스들이 모두 컴파일이 되었으므로

4. apache를 본격적으로 설치 및 압축해제, 컴파일을 실행합니다.

다음은 apache 공식 사이트에서 설명하는 설치및 컴파일 방법입니다.

http://httpd.apache.org/docs/current/install.html

 

컴파일과 설치 - Apache HTTP Server Version 2.4

컴파일과 설치 이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요. 이 문서는 유닉스와 유닉스류 시스템에서 아파치를 컴파일하고 설치하는 것만을 다룬다. 윈

httpd.apache.org

이를 참고하여,

http://httpd.apache.org/download.cgi 링크로 들어가서 필요한 버전의 아파치 다운로드 링크를 확인합니다.

링크 복사 방법

$ cd /usr/local
$ wget https://downloads.apache.org//httpd/httpd-2.4.46.tar.gz
$ tar xvfz httpd-2.4.46.tar.gz

 

5. 설치 및 압축해제 완료 후 컴파일을 위한 설치와 컴파일을 합니다.

$ cd httpd-2.4.46
$ ./configure --prefix=/usr/local/apache2.4 \
--enable-module=so --enable-rewrite --enable-so \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/loacl/apr-util \
--with-pcre=/usr/local/pcre \
--enable-mods-shared=all
$ make
$ make install

./configure 부분에서 앞서 설치하고 컴파일한 소스들이 apache를 설치하는데 사용되는 것을 확인할 수 있습니다.

./configure 명령어가 잘 실행되면 다음과 같이 잘 나옵니다.

하지만 make 명령어를 입력하면 오류가 발생합니다.

    (1) error : Makefile:48: recipe for target 'htpasswd' failed

이를 해결하기 위한 방법이 다음 링크에 나와 있습니다.

stackoverflow.com/questions/50865511/makefile48-recipe-for-target-htpasswd-failed

 

Makefile:48: recipe for target 'htpasswd' failed

I am trying to install Apache2 on Linux. I downloaded the latest Apache, apr, and apr-util. I am currently trying to run the make command on terminal, but there is an error message. See below. I ...

stackoverflow.com

이를 참고하여 GNU autoconf, GNU Automake, GNU libtool을 설치합니다.

( GNU 사이트 : www.gnu.org/software/software.html )

 

$ cd /usr/local
$ wget http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.gz
$ tar xvfz m4-1.4.18.tar.gz
$ cd m4-1.4.18
$ ./configure
$ make
$ make install
$ cd /usr/local
$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
$ tar xvfz autoconf-2.69.tar.gz
$ cd autoconf-2.69
$ ./configure
$ make
$ make install
$ cd usr/local
$ wget http://ftp.gnu.org/gnu/automake/automake-1.16.tar.gz
$ tar xvfz automake-1.16.tar.gz
$ cd automake-1.16
$ ./configure
$ make
$ make install
$ cd /usr/local
$ wget http://ftp.jaist.ac.jp/pub/GNU/libtool/libtool-2.4.6.tar.gz
$ tar xvfz libtool-2.4.6.tar.gz
$ cd libtool-2.4.6
$ ./configure
$ make
$ make install

이를 설치하고 다시 make 명령어를 입력했는데 그럼에도 불구하고 똑같은 오류가 나왔습니다.

그래서 오류를 보니 

collect2: error: ld returned 1 exit status

라는 에러가 있는데 이 에러가 의미하는 바는 

'이전에 어떠한 에러가 있는데 그 에러로 인해서 결과적으로 에러가 발생했다'라는 의미입니다.

그러므로 그 윗 부분이 /usr/local/apr-util 부분에서 error가 났을 것이라고 추측을 하고

apr-util 부분을 다시 삭제하고 위의 apr-util 컴파일 과정을 반복했습니다.

웹으로 부터 다운을 받고 압축을 푼 apr-util-1.6.1은 삭제하지 않고 그대로 두었고,

컴파일된 소스가 담긴 apr-util 디렉터리를 rm -rf 명령어로 삭제를 하고 

다시 ./configure 부분 명령어부터 컴파일을 했습니다.

apr-util 디렉터리를 다시 만들고 

/usr/local/httpd-2.4.46 으로 돌아와서

다시 ./configure 명령어 과정과 make 명령어를 실행하면 잘 컴파일됩니다.

 

오류난 디렉터리 부분은 다시 삭제하고 설치하면 될 수 있는 경우가 이렇게 발생하네요^^

 

 

 

(5) Apache 실행 및 서비스 설정

소스 설치 및 컴파일이 모두 완료되었으므로 실행을 합니다.

$ sudo /usr/local/apache2.4/bin/httpd -k start
$ ps -ef|grep httpd|grep -v grep
$ sudo netstat -anp|grep httpd
$ sudo curl http://127.0.0.1

httpd -k start는 Apache를 실행하는데 사용하는 명령어입니다.

실행을 하면 Servername이 없다는 메시지가 출력되는데 일단 무시해도 됩니다. 

 

ps 명령어로 이전 명령어로 Apache 실행이 잘 되는지 프로세스 확인을 합니다.

실행이 잘 되는 것을 확인할 수 있습니다.

 

netstat는 네트워크 상태를 보여주는 명령어인데 보통 처음에는 없으므로 설치를 해주고 위의 명령어를 입력해줘야 합니다.

curl은 command line 기반 웹 요청도구로 역시나 처음에는 없으므로 설치를 해주고 명령어를 입력하면 됩니다.

$ apt-get install net-tools
$ apt-get install curl

 

curl 부분 명령어는 실제 서버를 관리할 때는 gui환경이 아닌 오직 커널에서만 확인하므로 

나름 시각적으로 웹페이지를 html코드로 확인할 수 있는 명령어입니다.

위와 같이 gui환경에서도 잘 보이는 것을 확인할 수 있습니다.

 

apache 서비스를 중단하려면 start를 stop으로 바꾸면 됩니다.

$ sudo /usr/local/apache2.4/bin/httpd -k stop
$ ps -ef|grep httpd|grep -v grep

그 후 ps 명령어로 확인하면 httpd 관련 프로세스가 뜨지 않는것을 확인할 수 있습니다.

 

이번에는 위에서 servername이 없다는 경고(?)문을 해결하기 위해서

다음과 같이 설정합니다.

$ sudo apt-get install vim
$ cd /usr/local/apache2.4/conf
$ ls
$ sudo vim httpd.conf

vim은 vi를 더 편하게 관리할 수 있는 도구로 추가로 설치했습니다. (필수아님)

206번째 줄에 ServerName을 설정하고 저장하고 나오면 됩니다.

그럼 다음과 같이 apache를 실행할 때 ServerName이 없다고 나오지 않습니다.

 

 

apache를 서비스에 등록하는 방법은 다음과 같습니다.

$ sudo cp /usr/local/apache2.4/bin/apachectl /etc/init.d/httpd

apache 실행 스크립트인 apachectl을 /etc/init.d에 httpd라는 파일명으로 복사합니다.

그 다음 reboot를 시킵니다.

 

그럼 다음과 같이 service 명령어로 간단하게 apache를 실행,종료시키고 상태도 볼 수 있습니다.

$ service httpd start
$ service httpd status
$ service httpd stop

 

/etc/init.d

/etc/init.d는 System V init tools가 사용하는 스크립트들을 담고 있으며,

해당 스크립트들은 리눅스가 사용하는 서비스 관리 프로그램인 init프로세스가 사용하는 스크립트들입니다.

init프로세스는 커널이 초기화되고 나서 가장 처음으로 실행되는 프로세스입니다.

/etc/init.d안에는 init 프로세스가 특정한 서비스들을 start, stop, restart, reload할 수 있는 

쉘 스크립드들이 들어있습니다.

 

( 참조 : jundolssite.wordpress.com/2016/12/21/etcinit-d-%EC%99%80-etcinit-%ED%8F%B4%EB%8D%94%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90/ )

 

 

 

 

Ubuntu를 부팅 시 자동으로 서비스를 등록하는 명령어는 다음과 같습니다.

$ sudo update-rc.d mysqld defaults

그럼 위의 서비스 등록이 자동으로 부팅 시 이루어집니다.

( 그런데 필자는 update-rc.d 명령어를 입력하지 않아도 자동으로 service 명령어로 httpd 서비스를 

start, status, stop 할 수 있었습니다.

아마 해당 우분투버전에서는 그런것 같습니다.)

 

update-rc.d

데비안에서 데몬으로 프로그램을 돌아가게 하려면 /etc/init.d 안에 스크립트를 위치해야 합니다.

그리고 나서 이것을 심볼릭 링크로 실행 단계 디렉터리들에게 걸어줘야 합니다.

이러한 링크를 걸어주는 작업을 해주는 것이 update-rc.d입니다.

( 참조 : wiki.debianusers.or.kr/index.php?title=Update-rc.d )

 

위의 명령어를 해제하는 명령어는 다음과 같습니다.

$ sudo update-rc.d -f httpd remove

( 참조 : code-factory.tistory.com/37 )

 

 

Systemctl

위에서 service 명령어로 서비스를 start, staus, stop 할 수 있었는데 

/etc/init.d/[서비스명] 에 실행파일을 복사함으로써 systemctl 명령어가 잘 됩니다.

역시 마찬가지로 /etc/init.d/[서비스명]에 cp를 했으면 reboot를 해야 systemctl이 잘 됩니다.

$ sudo systemctl httpd start
$ sudo systemctl httpd status
$ sudo systemctl httpd stop

 

 

 

간혹 service를 stop했을 때 커널에서 curl명령어를 입력하면 접속이 되지 않는다고 잘 확인되지만,

gui 웹브라우저에서는 여전히 'It works!'라는 문구가 계속 나올 수도 있습니다.

 

캐시 삭제

이는 웹 캐시의 문제입니다.

캐시메모리를 삭제한 후 웹 브라우저를 새로고침하면 접속이 되지 않는다는 문구가 나옵니다.

리눅스에서 캐시메모리를 삭제하는 방법은 다음과 같습니다.

$ sudo su
# sync; echo 3 > /proc/sys/vm/drop_caches
# free -m

sync; echo 3 > /proc/sys/vm/drop_caches 명령어를 일반 사용자에서 sudo를 붙여서 쓰더라도

다음과 같은 오류가 발생합니다.

bash: /proc/sys/vm/drop_caches: Permission denied

 

그러므로 처음부터 sudo so로 잠시 root사용자로 접근해서 위의 명령어를 입력해줍니다.

 

캐시 메모리를 삭제하는 명령어 부분 중에 숫자 부분을 1,2,3 중에 선택할 수 있는데 차이점은 다음과 같습니다.

( 참조 : www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/ )

 

1 : 오직 Page Cache만 삭제 

2 : inod, dentry cache 해제

3 : Page Cache, inode cache, dentry cache 모두 해제

 

 

 

 

 

 

핵심 참조 : salix97.tistory.com/137?category=837576

Comments