ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CentOS 7] Apache 웹 서버 " 1 "
    Linux/CentOS 2017. 9. 11. 22:51

    인터넷 서비스 중에서 사용자들에게 가장 인기 있는 웹 서비스는 이 서비스를 제공하는 서버와 이를 이용하는 클라이언트로 구성된다. 인터넷 사용자들이 이용하는 웹 클라이언트를 웹 브라우저라고 부르며 IE, 파이어폭스, 크롬, 사파리 등이 대표적인 프로그램이다. 사용자들에게 인기 있는 웹 서버 프로그램으로 Apache, Nginx, IIS 등이 있다. Apache 서버는 아파치 소프트웨어 재단에서 제공하는 대표적인 오픈소스 HTTP 서버이다. Apache 웹 서버는 1995년 NCSA 웹 서버를 기반으로 개발이 시작돼 1996년 가장 있는 있는 웹 서버로 자리매김했고, 초기 WWW(Worold Wide Web)을 성장시키는데 아주 중요한 역할을 했다. 2015년 웹 서버 시장에서 50% 이상의 점유율을 차지하고 있을 정도로 이 분야에서 막강한 영향력을 끼치고 있다. Apache 서버는 자체적으로 다양한 기능을 제공하지만, 다양한 종류의 서드파티 모듈을 통해 여러 기능들을 사용자 환경에 맞게 언제든지 추가와 삭제가 가능하고, 업데이트 또한 매우 활발하게 이뤄지고 있다. 또한 SSL/TLS를 비롯한 여러 보안 프로그램을 제공함으로써 보안 또한 우수한 편으로 평가되고 있다.


    1. Apache 웹 서버 설치와 서비스 시작


    1.1 Apache 서버 설치와 기본 설정

    Apache 서버 패키지를 설치하고 그 후에 설정 파일을 사용해 기본적인 웹 서버를 설정하는 방법을 알아보자. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    # yum을 이용해 Apapche 패키지를 설치한다.
    [root@master ~]# yum install -y httpd
     
    # 설치된 패키지를 확인하는데, httpd와 의존 관계에 있는 다픈 패키지도 동시에 설치됐음을 알 수 있다.
    [root@master ~]# rpm -qa | grep http
    httpd-tools-2.4.6-45.el7.centos.4.x86_64
    httpd-2.4.6-45.el7.centos.4.x86_64
     
    # Apache 서버 정보 (MPM prefork)
    [root@master ~]# httpd -V Server version: Apache/2.4.6 (CentOS) Server built: Apr 12 2017 21:03:28 Server's Module Magic Number: 20120211:24 Server loaded: APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -D DEFAULT_PIDLOG="/run/httpd/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf"

    # 패키지 설치가 완료되면 Apache 서버의 설정 파일이 위치한 디렉토릴 확인한다.
    [root@master ~]# ls /etc/httpd
    conf  conf.d  conf.modules.d  logs  modules  run
     
    # Apache 서버가 브라우저상에서 인식할 데이터가 저장될 디렉토리다.
    [root@master ~]# ls -l /var/www
    total 0
    drwxr-xr-x. 2 root root 6 Apr 12 21:04 cgi-bin
    drwxr-xr-x. 2 root root 6 Apr 12 21:04 html
     
    # Apache 서버의 로그 파일이 저장된 디렉토리를 확인한다.
    [root@master ~]# ls /var/log/httpd/
    access_log  error_log
     
    # 설치 이후 기본 설정을 위해 Apache 서버가 사용하는 설정 파일을 vim으로 실행한다.
    [root@master ~]# vi /etc/httpd/conf/httpd.conf
    ServerRoot "/etc/httpd"  # 서버가 사용할 설정 파일들이 저장될 디렉토리를 지정
    Listen 192.168.80.5:80  # 어떤 IP 주소로 클라이언트의 접속을 받아들일지 결정하고, 포트 번호만 입력하는 경우 모든 주소 사용한다는 의미
    ServerAdmin root@jeong.com  # 문제가 발생하는 경우 서버가 보낼 이메일 주소를 입력
    ServerName www.jeong.com:80  # 서버가 사용할 이름(DNS에서 설정)과 포트를 설정하고, 그렇지 않은 경우 IP 주소를 사용가능
    DocumentRoot "/var/www/html"  # 서버가 인식할 데이터들이 저장될 디렉토리를 지정
    DirectoryIndex index.html index.php  # 클라이언트 웹 서버 접속 시 초기 화면으로 보여줄 파일명 지정
    ErrorLog "logs/error_log"  # 에러가 발생한 경우 기록할  로그 파일을 지정
    CustomLog "logs/access_log" combined # 서버에 접속하는 접속 정보를 기록할 로그 파일을 지정
    cs


    1.2 Apache 서버 서비스 시작과  PHP 사용

    a. 서비스 시작과 접속

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # Apache 서비스가 부팅 이후 자동으로 시작하게 설정한다.
    [root@master ~]# systemctl enable httpd
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
     
    # Apache 서버의 httpd 데몬을 시작한다.
    [root@master ~]# systemctl start httpd
     
    # Apache 서버의 상태를 확인하는데, Active와 서버가 시작됐다는 메시지를 찾을 수 있다.
    [root@master ~]# systemctl status httpd
    â httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2017-08-31 15:09:35 UTC; 2s ago
         Docs: man:httpd(8)
               man:apachectl(8)
     Main PID: 5973 (httpd)
       Status: "Processing requests..."
       CGroup: /system.slice/httpd.service
               ââ5973 /usr/sbin/httpd -DFOREGROUND
               ââ5974 /usr/sbin/httpd -DFOREGROUND
               ââ5975 /usr/sbin/httpd -DFOREGROUND
               ââ5976 /usr/sbin/httpd -DFOREGROUND
               ââ5977 /usr/sbin/httpd -DFOREGROUND
               ââ5978 /usr/sbin/httpd -DFOREGROUND
    Aug 31 15:09:35 master.chul.com systemd[1]: Starting The Apache HTTP Server...
    Aug 31 15:09:35 master.chul.com systemd[1]: Started The Apache HTTP Server...
     
    # httpd 데몬이 사용하는 포트와 프로토콜, 그리고 PID를 확인할 수 있다.
    [root@master ~]# netstat -ntlp | grep httpd
    tcp        0      0 192.168.80.5:80         0.0.0.0:*               LISTEN      5973/httpd
     
    # lsof를 통해 포트 80번을 확인하여 명령어 httpd가 http 서비스를 제공하고 있음을 알 수 있다.
    #
    [root@master ~]# lsof -i tcp:80
    COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    httpd   5973   root    3u  IPv4  26580      0t0  TCP master.chul.com:http (LISTEN)
    httpd   5974 apache    3u  IPv4  26580      0t0  TCP master.chul.com:http (LISTEN)
    httpd   5975 apache    3u  IPv4  26580      0t0  TCP master.chul.com:http (LISTEN)
    httpd   5976 apache    3u  IPv4  26580      0t0  TCP master.chul.com:http (LISTEN)
    httpd   5977 apache    3u  IPv4  26580      0t0  TCP master.chul.com:http (LISTEN)
    httpd   5978 apache    3u  IPv4  26580      0t0  TCP master.chul.com:http (LISTEN)
     
    # v옵션을 사용하면 Apache 서버의 버전 정보를 확인할 수 있다.
    [root@master ~]# httpd -v
    Server version: Apache/2.4.6 (CentOS)
    Server built:   Apr 12 2017 21:03:28
    cs


    b. PHP 사용

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # PHP 패키지를 설치한다. php-pear는 재사용이 가능한 php 구성요소들을 지원하는 패키지다.
    [root@master ~]# yum install php php-pear -y
     
    # php, php-pear를 제외하고도 의존 관계에 있는 다수의 패키지를 볼 수 있다.
    [root@master ~]# rpm -qa | grep php
    php-common-5.4.16-42.el7.x86_64
    php-xml-5.4.16-42.el7.x86_64
    php-cli-5.4.16-42.el7.x86_64
    php-pear-1.9.4-21.el7.noarch
    php-process-5.4.16-42.el7.x86_64
    php-5.4.16-42.el7.x86_64
     
    # php 테스트를 위해 index.php 파일을 생성해서 php 정보를 출력하는 함수를 사용한다.
    [root@master ~]# echo -e "<?php\nphpinfo();\n?>" > /var/www/html/index.php
    [root@master ~]# cat /var/www/html/index.php
    <?php
    phpinfo();
    ?>
     
    # php 설정 파일에서 현재 자신이 사용하는 시간대를 설정한다.
    [root@master ~]# vim /etc/php.ini
    878 date.timezone = Asia/Seoul
     
    # php에 관련된 설정을 정의하는 파일인데, 이 파일은 php 패키지를 설치하면 사용할 수 있다.
    [root@master ~]# ls -l /etc/httpd/conf.d/php.conf
    -rw-r--r--1 root root 691 Nov  6  2016 /etc/httpd/conf.d/php.conf
     
    # php를 Apache 서버에서 사용하기 위해 필요한 모듈을 정의한 파일이며, 이 파일도 php패키지를 설치해야 사용할 수 있다.
    [root@master ~]# ls -l /etc/httpd/conf.modules.d/10-php.conf
    -rw-r--r--1 root root 216 Nov  6  2016 /etc/httpd/conf.modules.d/10-php.conf
     
    # php가 사용하는 모듈 이름이며, 이 모듈은 php 패키지를 설치하면 사용할 수 있다.
    [root@master ~]# ls -l /etc/httpd/modules/libphp5.so
    -rwxr-xr-x. 1 root root 4592592 Nov  6  2016 /etc/httpd/modules/libphp5.so
     
    # 위의 변경 사항들이 적용되도록 Apache 서버를 다시 시작한다.
    [root@master ~]# systemctl restart httpd
    cs

    php 파일을 생성한 경우 아래와 같이 입력하고 접속하면 그림과 같이 php 정보를 확인할 수 있다. 이때 DNS가 작동되지 않는다면 도메인 대신에 IP 주소를 입력해도 동일한 결과를 그림처럼 확인할 수 있다.



    1.3 방화벽 설정

    Apache 웹 서버가 정상적으로 시작됐다면 Iptables나 Firewalld 같은 방화벽 프로그램에서 이를 허용하는 설정은 다음과 같다. 두 가지 중 한 가지만 선택해서 사용하기 바란다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 리눅스가 제공하는 서비스 이름과 그 포트를 정의하는 파일을 확인할 수 있다.
    [root@master ~]# cat /etc/services | egrep '(^http|^https)'
    http            80/tcp          www www-http    # WorldWideWeb HTTP
    http            80/udp          www www-http    # HyperText Transfer Protocol
    http            80/sctp                         # HyperText Transfer Protocol
    https           443/tcp                         # http protocol over TLS/SSL
    https           443/udp                         # http protocol over TLS/SSL
    https           443/sctp                        # http protocol over TLS/SSL
     
    # iptables 방화벽을 이용해 포트 80,443번을 목적지로 하는 패킷을 허용하도록 설정한다.
    [root@master ~]# iptables -A INPUT -m state --NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT
    [root@master ~]# iptables -A INPUT -m state --NEW,ESTABLISHED -p tcp --dport 443 -j ACCEPT
     
    # firewalld 방화벽을 이용해 http, https 서비스를 허용 목록에 추가한다.
    [root@master ~]# firewall-cmd --permanent --add-service=http --zone=public
    success
    [root@master ~]# firewall-cmd --permanent --add-service=https --zone=public
    success
    # 변경된 사항을 적용하기 위해 방화벽을 다시 시작한다.
    [root@master ~]# firewall-cmd --reload
    success
    # 위에서 추가한 서비스들이 제대로 추가됐는지 확인한다.
    [root@master ~]# firewall-cmd --list-service
    dhcpv6-client http ssh https
    cs




    2. Apache CGI와 UserDir 사용


    웹 서버가 클라이언트에게 제공하는 데이터는 HTML(Hyper Text Markup Language)로 작성됐다. 이러한 HTML로 작성된 데이터는 프로토콜 HTTP에 의해 클라이언트에게 전달된다. 그런데 이러한 HTML은 사용자들이 요구하는 동적인 데이터를 제공하지 못하기 때문에 이러한 목적을 위해 사용하는 것이 php, perl, python같은 서버 사이드 스크립트(Server Side Script)다. 이러한 서버 사이드 스크립트와 웹 서버가 서로 통신하는 방법을 정의한 것이 바로 CGI(Common Gateway Interface)다. 


    2.1 Perl 사용

    먼저 CGI 언어 중 첫 번째로 비교적 오래전에 개발된 perl에 대해 알아보자.

    a. 서버 설정 확인

    CGI를 사용하려면 먼저 Apache 서버에서 이를 허용하는 설정을 해줘야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # yum을 이용해 Perl을 사용하기 위한 패키지를 설치한다. perl-CGI는 CGI에 대한 HTTP의 요청과 응답을 담당하는 역할을 한다.
    [root@master ~]# yum install perl perl-CGI -y
     
    # Apache 서버가 사용하는 설정 파일 명령어 vim을 열어서 수정한다.
    [root@master ~]# vi /etc/httpd/conf/httpd.conf
    # 지시어 ScriptAlias를 사용해 URL상에서의 디렉토리 cgi-bin은 시스템상에서 /var/www/cgi-bin을 가리킨다고 선언한다.
    247    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 
    255    <Directory "/var/www/cgi-bin">  # CGI 데이터를 저장하고 실행할 디렉토리를 정의하는데
    257    AllowOverride None  
    258    Options  +ExecCGI  # ExecCGI 옵션을 추가해 Apache 서버가 이 디렉토리에서 CGI 실행을 허용한도록 한다.
    259    Require all granted  
    260    </Directory>
    294    AddHandler cgi-script .cgi .pl  # 파일의 확장자가 .cgi .pl로 끝나는 파일을 CGI로 인식하도록 설정한다.
     
    # 위의 변경 사항들이 적용되도록 Apache 서버를 다시 시작한다.
    [root@master ~]# systemctl restart httpd
    cs


    b. Perl 테스트 파일 작성과 확인

    서버에서 Perl을 사용할 수 있게 설정했으므로 테스트를 해보자. 먼저 테스트용 파일을 생성하고 그런 다음에 브라우저에서 실제 URL로 접속해 Perl이 제대로 작동하는지 테스트를 진행한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Perl 테스트를 위해 파일을 명령어 vi로 생성한다. 
    [root@master ~]# vi /var/www/cgi-bin/first.pl
    #!/bin/perl  # 쉬방(Shebang #!)은 아래 스크립트를 읽어 실행할 프로그램 Perl의 경로를 정의한다.
    print "Content-type: text/html\n\n";
    print "<html>\n<body>\n";
    print "<div style=\"width: 100%; font-size: 80px; font-weight: bold; text-align: center;\">\n";
    print "Perl Test Page in www.chul.com";  # 실제 브라우저에서 읽어 들일 텍스트 내용이다.
    print "\n</div>\n";
    print "</vody>\n</html>\n";
     
    # 클라이언트에서 이 파일을 읽고 실행 가능하도록 명령어 chmod를 이용해 그 권한을 수정한다.
    [root@master ~]# chmod 705 /var/www/cgi-bin/first.pl 
    cs

    위의 파일을 생성하고 브라우저에서 URL www.192.168.80.5/cgi-bin/first.pl로 접속하면 아래와 같은 페이지를 볼 수 있다.


    2.2 파이썬 사용

    두 번째 CGi 언어로 Perl과 자주 비교되며 가독성이 뛰어난 파이썬을 사용하는 방법을 알아보자.

    a. 서버 설정 확인

    파이썬을 사용하기 위해 Apache 서버에서 이를 허용하는 설정을 해줘야 하는데, Perl과 대부분 동일하므로 다른 부분만 설명한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # yum을 이용해 python 패키지를 설치한다.
    [root@master ~]# yum install python -y
     
    # Apache 설정 파일을 열어 파이썬의 확장자 .py를 추가해 이 서버가 이 확장자를 가진 파일도 CGI로 인식하도록 추가한다.
    [root@master ~]# vi /etc/httpd/conf/httpd.conf
    294    AddHandler cgi-script .cgi .pl .py
     
    # 변경 사항이 적용되도록 Apache 서버를 다시 시작한다.
    [root@master ~]# systemctl restart httpd
    cs


    b. Python 테스트 페이지 작성과 확인

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # vim으로 파이썬 테스트 파일을 생성한다.
    [root@master cgi-bin]# vi /var/www/cgi-bin/first.py
    # env는 설치된 파이썬의 버전이 여러 가지인 경우 명령어의 경로를 정의하는 환경 변수 $PATH에서 첫 번째 파이썬 명령어를 사용하라는 의미다.
    #!/bin/env python
    print "Content-type: text/html\n\n";
    print "<html>\n<body>\n";
    print "<div style=\"width: 100%; font-size: 80px; font-weight: bold; text-align: center;\">\n";
    print "Python Test Page in www.chul.com";
    print "\n</div>\n";
    print "</vody>\n</html>\n";
     
    # 클라이언트에서 이 파일을 일기고 실행 가능하도록 명령어 chmod를 이용해 권한을 수정한다.
    [root@master cgi-bin]# chmod 705 /var/www/cgi-bin/first.py
    cs

    위의 파일을 생성하고 브라우저에서 URL www.192.168.80.5/cgi-bin/first.py로 접속하면 아래와 같은 테스트 페이지를 볼 수 있다.


    2.3 루비 사용

    세 번째 CGI로서 파이썬처럼 가독성이 뛰어난 루비를 사용하는 방법을 알아본다.

    a. 서버 설정 확인

    루비를 사용하려면 Apache 서버에서 이를 허용하는 설정을 해줘야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # yum으로 ruby 패키지를 설정한다.
    [root@master cgi-bin]# yum install ruby -y
     
    # Apache 설정 파일을 열어서 루비의 확장자 rb를 추가해 Apache 서버가 이 확장자를 가진 파일도 CGi로 인식하도록 추가한다.
    [root@master cgi-bin]# vi /etc/httpd/conf/httpd.conf
    294    AddHandler cgi-script .cgi .pl .py .rb
     
    # 변경 사항이 적용되도록 Apache 서버를 다시 시작한다.
    [root@master cgi-bin]# systemctl restart httpd
    cs


    b. 루비 테스트 페이지 작성과 확인

    서버에서 루비를 사용할 수 있게 설정했으므로 테스트를 해보자. 먼저 테스트용 파일을 생성하고 그 다음에 브라우저에서 실제 URL로 접속해 루비가 작동하는지 테스트한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # vim으로 루비 테스트 파일을 cgi-bin 디렉토리에 생성한다.
    [root@master cgi-bin]# vi /var/www/cgi-bin/first.rb
    #!/bin/ruby
    print "Content-type: text/html\n\n";
    print "<html>\n<body>\n";
    print "<div style=\"width: 100%; font-size: 80px; font-weight: bold; text-align: center;\">\n";
    print "Ruby Test Page in www.chul.com";
    print "\n</div>\n";
    print "</vody>\n</html>\n";
     
    # 이 파일을 읽고 실행 가능하도록 명령어 chmod를 이용해 권한을 수정한다.
    [root@master cgi-bin]# chmod 705 /var/www/cgi-bin/first.rb
    cs

    위의 파일을 생성하고 브라우저에서 URL www.192.168.80.5/cgi-bin/first.rb로 접속하면 아래와 같은 페이지를 볼 수 있다.


    2.4 USERDIR에서 CGI 사용

    리눅스 시스템에 존재하는 사용자에게 웹사이트를 제공하고, 그 웹사이트에서 CGI 사용을 허용하기 위한 설정은 다음과 같다. 사용자에게 웹사이트를 제공하기 위해 필요한 지시어는 UserDir이며, 이 지시어는 mod_userdir 모듈이 제공하는 이 모듈은 httpd 패키지를 설치하면 사용할 수 있다. 

    a. 서버에서 허용

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Vim으로 UserDir 설정 파일을 열어서
    [root@master cgi-bin]# vi /etc/httpd/conf.d/userdir.conf
    1. 전체의 사용자가 아니고 소수의 사용자에게만 웹 사이트를 허용하는 경우 사용 방법이다.
        UserDir disabled
        UserDir enabled kim lee park
    2. 모든 사용자에게 웹 사이트를 허용하고 특히 root를 비롯한 일부의 사용자에게는 허용하지 않는 경우의 사용 방법이다.
        UserDir enabled
        UserDir disabled root lee
    3. 모든 사용자에게 웹사이트를 허용하는 경우의 설정 방법이다.
        #UserDir disabled
        UserDir public_html
     
    # 위에서 정의한 디렉토리 이름은 모든(*) 사용자들의 홈 디렉토리에서 웹사이트를 제공할 데이터가 저장된 이름으로 지정한다.
    <Directory "/home/*/public_html">
        Options +ExecCGI  # 일반 사용자의 웹사이트에서도 CGI 사용을 허가하기 위한 옵션이다.
        AllowOverride None  # 디렉토리 접근 제어를 위해 사용되는 파일 .htaccess를 읽어 들일지를 결정하는 지시어인데, None인 경우 무시한다.
        Require method GET POST OPTIONS  
    </Directory>
     
    # 변경 사항들이 적용되도록 Apache 서버를 다시 시작한다.
    [root@master cgi-bin]# systemctl restart httpd
    cs


    b. 사용자 디렉토리 생성

    이제 사용자의 홈 디렉토리에서 웹 사이트를 생성하기 위한 준비를 해야 한다. 테스트를 위해 사용자 lee의 홈 디렉토리를 사용하겠다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 사용자 lee의 홈 디렉토리 접근을 위해 권한 조정한다. 기본 700으로 돼 있어 그 사용자 외에는 접근이 불가하다.
    [lee@master ~]$ ll /home/
    total 0
    drwx------2 lee     lee      62 Sep  4 14:07 lee
    [lee@master ~]$ chmod 755 /home/lee/
     
    # 웹사이트를 제공할 디렉토리를 명령어 mkdir로 생성한다.
    [lee@master ~]$ mkdir public_html
    # 웹에서 CGI 파일에 접근할 수 있도록 권한을 조정하고 해당 디렉토리로 이동한다.
    [lee@master ~]$ chmod 755 public_html/ ; cd public_html/
     
    # CGI 테스트를 위해 파이썬 파일 명령어 vim으로 생성한다.
    [lee@master public_html]$ vi index.py
    #!/usr/bin/env python
    print "Content-type: text/html\n\n"
    print "<html>\n<body>"
    print "<div style=\"width: 100%; font-size: 80px; font-weight: bold; text-align: center;\">"
    print "CGI Test Page for Lee in www.192.168.80.5/~lee/"
    print "</div>\n</body>\n</html>"
    cs

    위의 설정이 완료됐다면 브라우저에서 www.192.168.80.5/~lee/index.py로 접속하면 아래와 같은 페이지를 볼 수 있다. UserDir과 CGI 테스트가 정상적으로 이뤄지고 있다.




    3. Apache 인증 사용


    Apache 인증 기법은 특정 디렉토리에 접근할 때 사용자의 ID와 패스워드를 요구하도록 설정하는 방법을 의미한다. 사용자의 인증이 중요한 디렉토리를 제공할 때 유용하게 사용할 수 있는 방법이다. Apache가 제공하는 인증 기법에는 여러 가지 방법이 있는데, 가장 널리 사용되는 방법이 Basic과 Digest를 이용하는 방법이다. 기타 PAM, LDAP, Kerberos 인증방법도 사용되고 있다.


    3.1 Basic 인증

    HTTP Basic Authentication이라고 하며, 일반적으로 사용자의 ID와 패스워드를 정의한 파일을 이용해 사용자 인증을 처리한다. 그런데 이때 웹 클라이언트가 서버에 보내는 인증정보는 암호화되지 않고 단지 Base64[각주:1]로 인코딩돼 평문으로 전달되기 때문에 안전한 인증방법이라 할 수 없다. Basic 인증을 사용하기 위해서는 mod_auth_basic 모듈이 필요하며, 이 모듈은 httpd 패키지를 설치하면 사용할 수 있다. 

    a. 서버에서의 설정

    Basic 인증을 사용하기 위한 서버에서의 설정은 다음과 같다. Basic 인증을 설정할 때 일반 사용자별, 또는 그룹별로 설정하는 방법이 약간 다르므로 구분해서 사용하자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    1. 일반 사용자를 허용하는 경우
    # 명령어 vim으로 Basic 인증을 설정할 파일을 생성
    [root@master ~]# vi /etc/httpd/conf.d/auth_basic.conf
    <Directory /var/www/html/basic>  # Basic 인증을 사용할 디렉토리를 정의
            AuthType Basic  # 인증의 종류를 정의하는데, Basic or Digest 중에서 선택
            AuthName "Basic Authentication Test"  # 인증 사용자가 접속할 때 인증 화면에 보여줄 메시지를 작성
            AuthUserFile /etc/httpd/.htpasswd  # 인증 사용자의 패스워드가 저장될 파일의 경로를 지정
            Require user jaehwan root lee park  # 소수의 인증 사용자가 필요한 경우 사용자명을 각각 입력
            Require Valid-user  # 패스워드 파일에 등록된 모든 사용자를 허용할 경우 사용하고, 위에 옵션중에 선택해서 사용해야함.
            Order deny,allow  # 인증과 더블어 접근 통제를 할 경우 지시어 Order를 사용해
            Deny from all  # 먼저 모든 네트워크 주소에서의 접근을 거부하고
            Allow from 127.0.0.1 192.168.80  # 오직 두 네트워크에서의 접근만 허용하도록 설정한다. 대신 도메인 이름을 사용할 수 있다.
    </Directory>
     
     
    2. 그룹 사용자를 허용하는 경우
    [root@master ~]# vi /etc/httpd/conf.d/auth_basic.conf
    <Directory /var/www/html/basic>
            AuthType Basic
            AuthName "Basic Authentication Test"
            AuthUserFile /etc/httpd/.htpasswd
            Require group Admin  # 디렉토리 인증이 허용된 그룹의 이름을 지정한다. 
            Order deny,allow
            Deny from all
            Allow from 127.0.0.1 192.168.80
    </Directory>
    [root@master ~]# vi /etc/httpd/groups # vim으로 생성해서 위에서 정의한 그룹 이름과 그 그룹의 멤버들을 지정한다.
    admin: kim lee park jeong
    cs

    b. 사용자와 패스워드 생성
    위의 A절에서 디렉토리 접근을 위해 사용자와 그룹을 정의했다면 이제 이러한 사용자들에 대한 정보를 생성하고 파일에 저장해야 한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # htpasswd를 이용해 사용자의 패스워드가 저장될 파일을 생성하는데 사용자 lee를 그 목록에 추가하고, 두 번째 사용자부터 옵션 c를 사용하지 않는다.
    [root@master ~]# htpasswd -c /etc/httpd/.htpasswd lee
    New password:
    Re-type new password:
    Adding password for user lee
     
    # 생성된 패스워드 파일을 읽어보면 사용자의 패스워드가 해시 함수 MD5로 암호화돼 저장돼 있다.
    [root@master ~]# cat /etc/httpd/.htpasswd
    lee:$apr1$SzzVVG.O$D1mn27j9ptLKnrqUMr0VQ1
     
    # 변경된 설정을 적용하기 위해 Apache 서버를 다시 시작한다.
    [root@master ~]# systemctl restart httpd
     
    # 인증을 적용할 디렉토리를 명령어 mkdir로 생성하고, 이 디렉토리 접근 성공 시 보여줄 초기 화면 파일을 생성한다.
    [root@master httpd]# mkdir /var/www/html/basic
    [root@master ~]# vi /var/www/html/basic/index.html
    <html>
    <head>
    <title>www.jeong.com</title></head>
    <div sytle="width: 100%; font-size: 80px; font_weight: bold; text-align: center;">
    Basic Auth Test in www.jeong.com
    </div>
    </body>
    </html>
    cs


    c. Basic 인증 테스트

    1. 브라우저에서 www.192.168.80.5/basic으로 접속해 아래와 같은 화면이 나타나면 위에서 생성했던 인증 정보를 입력한다.

    2. 인증이 성공하면 위에서 생성했던 index.html 파일의 내용을 읽을 수 있다. 

    3. Allow from에서 허용할 네트워크가 없을 시에는 아래와 같이 Forbidden 이라는 메시지가 발생하면서 접근이 불가하다.


    3.2 Digest 인증

    HTTP Digest Authentication이라고 하며, 사용자의 ID와 패스워드를 정의한 파일을 이용해  사용자 인증을 처리하는 것은 Basic 인증과 동일하다. 그런데 Digest 인증에서 사용자의 인증 정보는 MD5와 같은 해시 함수가 적용돼 암호화된 후에 서버로 보내지기 때문에 Basic 인증보다 더 안전하다. 그러나 모든 브라우저가 아니라 일부 브라우저는 이 인증방법을 지원하지 않는다는 단점이 있다. 이러한 Digest 인증을 사용하기 위해서는 mod_auth_digest 모듈이 필요하며, 이 모듈은 httpd 패키지를 설치하면 사용할 수 있다.

    a. 서버에서의 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # Digest 인증을 설정할 파일을 vi로 생성한다.
    [root@master httpd]# vi /etc/httpd/conf.d/auth_digest.conf
    <Directory /var/www/html/digest>    # Digest 인증을 적용할 디렉토리를 지정
            AuthType Digest        # 인증 방식을 Digest로 설정
            AuthName "Private Area"        # 인증 시에 인증 화면에서 사용자에게 보여줄 메시지고, 사용자 생성 시 Realm으로 사용된다.
            AuthDigestDomain http://www.192.168.80.5/digest/    # Digest 인증이 적용돼 보호하는 영역의 기본 URL을 지정
            AuthUserFile /etc/httpd/.htdigest    # 사용자의 패스워가 지정될 파일의 경로를 지정
            Require valid-user
            Order deny,allow
            Deny from all
            Allow from 127.0.0.1 192.168.80
    </Directory>
     
    # Digest 인증을 사용할 사용자를 생성하는데 저장할 파일명 .htdigest와 AuthName은 동일해야하고, Realm은 사용자가 속한 영역을 의미한다.
    [root@master httpd]# htdigest -c /etc/httpd/.htdigest 'Private Area' park
    Adding password for park in realm Private Area.
    New password:
    Re-type new password:
     
    # htdigest로 생성한 파일을 읽어보면 사용자 이름과 Realm, 그리고 패스워드가 MD5로 암호화돼 저장돼 있다.
    [root@master httpd]# cat /etc/httpd/.htdigest
    park:Private Area:5b9b9604ff4b449e3e5ee8d9aad2b661
     
    # Apache 설정 파일의 문법을 검사하기 위해 사용하고, 설정 적용을 위해 재시작한다.
    [root@master httpd]# apachectl configtest
    Syntax OK
    [root@master digest]# systemctl restart httpd
     
    # Digest 인증이 적용될 디렉토리를 명령어 mkdir로 생성하고, 인증 성공 시 사용자에게 보여줄 초기 화면 파일을 생성한다.
    [root@master httpd]# mkdir /var/www/html/digest
    [root@master httpd]# vi /var/www/html/digest/index.html
    <html>
    <head>
    <title>www.jeong.com</title></head>
    <div sytle="width: 100%; font-size: 80px; font_weight: bold; text-align: center;">
    Digest Auth Test in www.jeong.com
    </div>
    </body>
    </html>
    cs


    b. Digest 인증 테스트

    1. URL로 접속하기

    2. 인증 성공하기




    4. 가상 호스트 설정


    가상 호스트 Virtual Host는 한 서버에서 여러 웹사이트를 서비스하는 Apache 서버의 기능을 의미한다. 가상 호스트 방식에는 크게 세 가지 종류가 있다. 첫 번째로 각 웹사이트마다 다른 IP 주소를 사용하는 IP 기반(IP-base) 가상 호소트, 두 번째로 한 IP 주소를 사용해 여러 웹사이트를 제공하는 이름 기반(name-base) 가상 호스트 방식이 있고, 세 번째로 다른 포트를 사용해 여러 웹사이트를 제공할 수 있는 포트 기반(port-base) 가상 호스트 방식이 있다. 가상 호스트 방식은 각 상황에 따라 단독으로 또는 혼합해 사용할 수 있다.


    4.1 이름 기반 가상 호스트

    이름 기반 가상 호스트는 앞서 설명한 대로 한 개의 IP 주소를 사용해 여러 웹사이트를 제공한다고 했는데, 여기에선 서버의 IP 192.168.80.5를 사용하게 한다. 이름 기반 가상 호스트 설정 과정은 먼저 Apache 서버에서 설정을 하고 그 다음에 클라이언트 호스트에서 브라우저를 통해 접속 테스트를 한다. 테스트를 위해 웹사이트로서 도메인 www.jeong.com을 사용하겠다.

    a. 가상 호스트 설정

    먼저 Apache 서버를 위해 가상 호스트 관련 설정 파일을 생성해줘야 하고, 그 다음에 가상 호스트가 사용할 디렉토리를 생성해줘야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    1. 가상 호스트 설정
    # 가상 호스트로 가용할 도메인을 host를 이용해 검색해 그 IP 주소와 도메인 정보를 제공하는 DNS 서버 정보를 확인한다. 
    [root@master ~]# host -a www.jeong.com
    Trying "www.jeong.com"
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14641
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
    ;; QUESTION SECTION:
    ;www.jeong.com.                 IN      ANY
    ;; ANSWER SECTION:
    www.jeong.com.          86400   IN      A       192.168.80.5
     
    # 가상 호스트 설정을 위한 파일을 명령어 vim으로 생성하는데
    [root@master ~]# vi /etc/httpd/conf.d/vhost.conf
    <VirtualHost 192.168.80.5:80>    # 먼저 가상 호스트 기능을 제공할 IP 주소와 포트 번호를 지정하고
            DocumentRoot /var/www/html
            ServerName www.chul.com    # 주 도메인도 추가하는데, 여기서 추가하지 않으면 아래 ServerName에 추가한 도메인이 주 도메인이 인식한다.
    </VirtualHost>
     
    <VirtualHost 192.168.80.5:80>    # 가상 호스트를 위한 IP 주소와 포트 번호를 위와 동일하게 지정하고
            DocumentRoot /vhost/jeong/www    # 가상 호스트의 데이터를 저장할 디렉토리를 지정한다. 이 디렉토리에 저장된 데이터가 브라우저상에서 보인다.
            ServerName www.jeong.com    # 이 가상 호스트의 이름을 지정한다.
            ServerAlias jeong.com    # 가상 호스트 www.jeong.을 그냥 jeong.com으로도 인식
            ServerAdmin admin@jeong.com        # 가상 호스트가 사용할 관리자의 이메일 주소
            ErrorLog /vhost/jeong/logs/error_log    # 가상 호스트의 에러를 저장할 로그 파일을 지정
            CustomLog /vhost/jeong/logs/access_log combined        # 가상 호스트의 접속 정보를 저장할 로그 파일을 지정
            <Directory "/vhost/jeong/www">    # 가상 호스트가 사용할 루트 디렉토리를 지정하고 기본 옵션을 추가
                    Options Indexes
                    AllowOverride None
                    Require all granted
            </Directory>
    </VirtualHost>
    [root@master conf.d]# httpd -t
    Syntax OK
     
    2. 가상 호스트 설정 완료하기
    # 가상 호스트 설정에서 정의한 데이터와 로그 파일 저장을 위한 디렉토리 생성한다.
    [root@master ~]# mkdir -p /vhost/jeong/{logs,www}
    # 디렉토리의 권한을 일반 사용자도 접근할 수 있도록 수정한다.
    [root@master ~]# chmod -R 755 /vhost
    # 모든 변경 사항이 적용되도록 웹 서버를 다시 시작한다.
    [root@master ~]# systemctl restart httpd
    # 가상 호스트 설정 정보를 확인하기 위해 httpd 데몬에 S 옵션을 사용했다. 여기서 주 도메인과 가상 호스트 정보를 확인할 수 있다.
    [root@master conf.d]# httpd -S
    \VirtualHost configuration:
    *:80        is a NameVirtualHost
             default server www.chul.com (/etc/httpd/conf.d/vhost.conf:1)
             port 80 namevhost www.chul.com (/etc/httpd/conf.d/vhost.conf:1)
             port 80 namevhost www.jeong.com (/etc/httpd/conf.d/vhost.conf:5)
                     alias jeong.com
    ServerRoot: "/etc/httpd"
    Main DocumentRoot: "/var/www/html"
    Main ErrorLog: "/etc/httpd/logs/error_log"
    ...
    User: name="apache" id=48
    Group: name="apache" id=48
    # 가상 호스트 메인으로 접속할 때에 보여줄 초기 화면 파일을 생성한다.
    [root@master ~]# vi /vhost/jeong/www/index.html
    <html>
    <head>
    <title> www.jeong.com </title> </head>
    <body>
    <div style="width: 100%; font-size: 80px; font-weight: bold; text-align: center;">
    Virtual Host Page in www.jeong.com
    </div> </body> </html>
    cs


    b. 가상 호스트 테스트

    테스트를 위해 브라우저에서 jeong.com/index.html로 접속하면 아래와 같은 내용을 확인할 수 있다. ServerAlias가 적용돼 www.jeong.com이 아닌 jeong.com으로 접속했다. 

     



    4.2 IP 기반 가상 호스트

    IP 기반 가상 호스트는 웹 서버에서 각 웹사이트마다 서로 다른 IP 주소를 사용한다고 앞서 설명했다. IP 기반 가상 호스트를 설정하는 방법은 크게 두 가지인데, 첫 번째는 각 호스트마다 각 도메인별로 별도의 웹 서버를 실행하는 방법이고, 두 번째는 모든 가상 호스트를 지원하는 서버 한 개를 실행하는 방법이다. 서버 하나로 모든 가상 호스트를 지원하는 경우 서버는 물리적으로 여러 네트워크 인터페이스를 설치해 각각 IP 주소를 할당하거나 ip aliases[각주:2]라고 불리는 가상 인터페이스를 사용하는 방법이 있다. 여기에선 현재 Apache 서버로 사용되고 있는 master 노드가 물리적으로 세 개의 IP 주소를 사용하고 있다. 그중 설정을 위해 주 도메인 www.chul.com에는 IP 192.168.80.5를 가상 호스트인 www.jeong.com에는 IP 192.168.80.50를 사용하겠다.

    a. 서버에서 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    # 먼저 주 도메인의 IP 주소를 명령어 host로 호가인
    [root@master named]# host www.chul.com
    www.chul.com has address 192.168.80.5
    # 가상 호스트로 사용할 도메인의 IP 주소를 명령어 host로 확인
    [root@master named]# host www.jeong.com
    www.jeong.com has address 192.168.80.50
    [root@master named]# vi /etc/httpd/conf/httpd.conf
    Listen 80
     
    [root@master named]# vi /etc/httpd/conf.d/vhost.conf
    <VirtualHost 192.168.80.5>    # 주 도메인에 사용할 IP 주소를 입력
            DocumentRoot /var/www/html
            ServerName www.chul.com
    </VirtualHost>
    <VirtualHost 192.168.80.50>    # 가상 호스트를 위해 사용할 IP 주소를 입력
            DocumentRoot /vhost/jeong/www
            ServerName www.jeong.com
            ServerAlias jeong.com
            ServerAdmin admin@jeong.com
            ErrorLog /vhost/jeong/logs/error_log
            CustomLog /vhost/jeong/logs/access_log combined
            <Directory "/vhost/jeong/www">
                    Options Indexes
                    AllowOverride None
                    Require all granted
            </Directory>
    </VirtualHost>
     
    # 변경 사항들이 적용되도록 웹 서버를 다시 시작
    [root@master named]# systemctl restart httpd    
    # 가상 호스트의 변경된 정보, 특히 IP 주소 확인을 위해 사용한다.
    [root@master named]# httpd -S
    VirtualHost configuration:
    192.168.80.50:80       www.jeong.com (/etc/httpd/conf.d/vhost.conf:5)
    192.168.80.5:80        www.chul.com (/etc/httpd/conf.d/vhost.conf:1)
    ServerRoot: "/etc/httpd"
    Main DocumentRoot: "/var/www/html"
    Main ErrorLog: "/etc/httpd/logs/error_log"
    "/run/httpd/" mechanism=default
    ...
    User: name="apache" id=48
    Group: name="apache" id=48
    cs


    b. 가상 호스트 테스트

    설정한 가상 호스트를 테스트하면 아래와 같다. 브라우저에서 주 도메인 www.chul.com으로 접속한 화면과 가상호스트로 사용되는  www.jeong.com으로 접속한 화면이다.

    1. Base64는 바이너리 데이터를 ASCII텍스트 형식의 문자로 전송하기 위해 사용되는 데이터 인코딩 방법으로, 데이터 전송 시에 손실이 발생되지 않게 하기 위해 사용된다. 여기서 Base64라는 용어는 본래 이메일의 MIME content transfer encoding에서 기원한 것이다. 여기서 인코딩된 문자열은 알파넷의 대문자(26개), 소문자(26개), 특수문자(=,/2개)로 모두 64개로 구성돼 있다. [본문으로]
    2. IP Alias란 하나의 물리적 네트워크 인터페이스에 여러 개의 가상 IP 주소를 할당하는 방법이다. IP Alias를 할당하는 방법은 두 가지가 있는데, 첫 번째는 단지 명령어만(일시적)을 사용해서 할당하는 것이고 두 번째는 파일(영구적)을 사용해 할당하는 방법이다. (첫번째 방법은 ifconfig eth0:0 192.168.80.6 up, 두번째 방법은 /etc/sysconfig/network-scripts/ificonfig-eth0 ifcfg-eth0:0 ) [본문으로]

    'Linux > CentOS' 카테고리의 다른 글

    [CentOS 7] Apache 웹 서버 " 2 "  (2) 2017.10.26
    네트워크  (0) 2017.09.12
    [CentOS 7] Firewalld 방화벽  (5) 2017.08.23
    [CentOS 7] MariaDB 데이터베이스 서버 " 2 "  (0) 2017.08.19
    [CentOS 7] MariaDB 데이터베이스 서버 " 1 "  (0) 2017.08.11

    댓글

작은거인's Blog / Designed by TISTORY