본문으로 바로가기

WEB Server ( Apache )

category Linux/Linux Network 2017. 9. 11. 19:23
  •  HTTP ( Hypertext Transfer Protocol )
http://www.daum.net:80

https://www.daum.net:443

다음에 자세히 다루도록 하겠습니다. 

  • 웹 서버 ( Web Server )
웹 브라우저를 이용하여 World Wide Web을 사용하는 클라이언트에게 미리 저장된 하이퍼 텍스트를 제공하는 서버를 지칭한다.


-웹서버의 종류

- Apache

아파치 공식 홈페이지 : http://www.apache.org

현재는 일반적인 웹서버로 광범위하게 사용중이다.


  • Web server 구성

프로그램: httpd-2.2.3-31 httpd-manual system-config-httpd

데몬 & 포트 & 프로토콜: /usr/sbin/httpd, 80, TCP( Stateless TCP)

설정 파일: /etc/httpd/conf/httpd.conf

하위 설정 파일: /etc/httpd/conf.d/*.conf

스크립트: /etc/init.d/httpd


실습

# rpm -qa | grep httpd

# grep http /etc/services | more


# cd /etc/httpd/conf

# ls -l

합계 52

-rw-r--r-- 1 root root 33726  7월 19  2016 httpd.conf

-rw-r--r-- 1 root root 13139  7월 19  2016 magic


# cp /etc/passwd /var/www/html/index.html

# service httpd restart

# firefox http://www.linux.example.com (GUI)



# lynx http://www.linux.example.com (TUI)
yum -y install lynx
종료시에는 q y  또는 Q

[참고] lynx
 # lynx -head http://www.linux.example.com  /* 서비스 헤드 정보를 출력해준다 */


-> Server에 아파치 버전 정보가 나온다 이러한 정보는 해킹할때 유용하게 쓰이므로 안보이도록 설정하는 것이 좋다.

[참고] 어피치 버전과 운영체제 정보 숨기기
# vi /etc/httpd/conf/httpd.conf
........중략......
ServerToken OS        ->     ServerToken Prod
........중략.....
[참고] telnet으로 확인하는 방법
# telnet www.linux.example.com 80
> GET             /* 입력하면 확인할 수 있다. */

[참고] netstat
# netstat -an      /* 모든 서비스: TCP + UDP + 소켓 */
# netstat -ant     /* TCP 서비스만 */
# netstat -anu     /* UDP 서비스만 */

# netstat -anp     /* 모든 서비스: TCP + UDP + 소켓, 프로그램이름/PID 표시 */
# netstat -antp /* TCP 서비스만, 프로그램 이름/PID 표시 */
# netstat -anup    /* UDP 서비스만, 프로그램 이름/PID 표시 */

  • 사용자를 위한 웹 기본 설정
(전제조건) 
사용자를 미리 만들어주세요.
# useradd user01
# passwd user01

# su -user01

$ mkdir public_html
$ cd public_html
$ vi index.html
<H1><CENTER>Web Server(linux120 : /home/user01)</CENTER></H1>

$ cd
$ ls -ld
$ chmod 755 /home/user01    /*  r-x 권한을 줘야 확인할 수 있습니다. */

$ exit
#

# vi /etc/httpd/conf/httpd.conf

 

.... 중략 ..... 

<IfModule mod_userdir.c>

    #

    # UserDir is disabled by default since it can confirm the presence

    # of a username on the system (depending on home directory

    # permissions).

    #

    #UserDir disable    /* 주석 추가 */


    #

    # To enable requests to /~user/ to serve the user's public_html

    # directory, remove the "UserDir disable" line above, and uncomment

    # the following line instead:

    #

    UserDir public_html  /* 주석 제거 */


</IfModule>

.... 중략 .....

 


# service httpd restart


# firefox http://www.linux.example.com/~user01 &


- http://www.linux.example.com/~user01/
- http://www.linux.example.com/user01/

# vi /etc/httpd/conf/httpd.conf

 

 #

# Aliases: Add here as many aliases as you need (with no limit). The format is

# Alias fakename realname

#

# Note that if you include a trailing / on fakename then the server will

# require it to be present in the URL.  So "/icons" isn't aliased in this

# example, only "/icons/".  If the fakename is slash-terminated, then the

# realname must also be slash terminated, and if the fakename omits the

# trailing slash, the realname must also omit it.

#

# We include the /icons/ alias for FancyIndexed directory listings.  If you

# do not use FancyIndexing, you may comment this out.

#

Alias /icons/ "/var/www/icons/"

Alias /user01/ "/home/user01/public_html/"   /* 추가 */

 


# service httpd restart


# firefox http://www.linux.example.com/user01/

-> /~user01 과 같은 페이지가 나옵니다. 


  • 아파치 웹서버 ( Apache Web Server )
- 아파치 웹서버에 관련한 파일/ 디렉토리


- 기본 설정 확인
# tree -C /etc/httpd
/etc/httpd
|-- conf
|   |-- httpd.conf
|   `-- magic
|-- conf.d
|   |-- README
|   |-- manual.conf
|   |-- perl.conf
|   |-- proxy_ajp.conf
|   |-- python.conf
|   |-- squid.conf
|   |-- ssl.conf
|   |-- webalizer.conf
|   `-- welcome.conf
|-- logs -> ../../var/log/httpd
|-- modules -> ../../usr/lib/httpd/modules
`-- run -> ../../var/run

# httpd -t                     /* httpd.conf 문법 확인 */
# httpd -v                     /* httpd 버전 확인 */
# httpd -f httpd_test.conf /* httpd_test.conf 파일의 설정대로 데몬을 띄운다. */


- 웹서버 설정 
# vi /etc/httpd/conf/httpd.conf

 

..............중략............. 

#

# ServerAdmin: Your address, where problems with the server should be

# e-mailed.  This address appears on some server-generated pages, such

# as error documents.  e.g. admin@your-domain.com

#

ServerAdmin root@linux.example.com


#

# ServerName gives the name and port that the server uses to identify itself.

# This can often be determined automatically, but we recommend you specify

# it explicitly to prevent problems during startup.

#

# If this is not set to valid DNS name for your host, server-generated

# redirections will not work.  See also the UseCanonicalName directive.

#

# If your host doesn't have a registered DNS name, enter its IP address here.

# You will have to access it by its address anyway, and this will make

# redirections work in a sensible way.

#

ServerName www.linux.example.com:80

..........중략...............

 


# service httpd restart


# lynx http://www.linux.example.com    /* 확인 */

- CGI(Common Gateway Interface) 

웹서버(정보 제공)와 클라이언트(정보 이용)간에 필요한 정보 교환을 가능하가 해 주는 일종의 웹인터페이스이다.

클라이언트가 서버에게 실행시켜달라고 요청함

CGI 제작 도구 -> PHP, PERL, PYTHON, etc


(실습구조)

http://www.linux.example.com ------------------------> /www1/index.html

http://www.linux.example.com/cgi-bin/test.cgi -------> /www1/cgi-bin/test.cgi


# mkdir /www1

# vi /www1/index.html

<H1><CENTER> www1 (linux:/www1) </CENTER></H1>


# vi /etc/httpd/conf/httpd.conf

 

..........중략............ 

#<VirtualHost *:80>

#    ServerAdmin webmaster@dummy-host.example.com

#    DocumentRoot /www/docs/dummy-host.example.com

#    ServerName dummy-host.example.com

#    ErrorLog logs/dummy-host.example.com-error_log

#    CustomLog logs/dummy-host.example.com-access_log common

#</VirtualHost>


NameVirtualHost 192.168.17.120:80

<VirtualHost 192.168.17.120:80>

    ServerAdmin root@linux.example.com

    DocumentRoot /www1

    ServerName www.linux.example.com

    <Directory /www1>

        Options Indexes Includes

    </Directory>

</VirtualHost>


 


# lynx http://www.linux.example.com (# firefox http://www.linux.example.com )

-> 웹페이지 확인


- ScriptAlias 설정

# vi /etc/httpd/conf/httpd.conf

 

.....중략.....

NameVirtualHost 192.168.17.120:80

<VirtualHost 192.168.17.120:80>

    ServerAdmin root@linux.example.com

    DocumentRoot /www1

    ServerName www.linux.example.com

    <Directory /www1>

        Options Indexes Includes

    </Directory>

     ScriptAlias /cgi-bin/ /www1/cgi-bin/   /* 추가 */

</VirtualHost>

 

 


/* cgi 파일 작성 */

# mkdir /www1/cgi-bin

# vi /www1/cgi-bin/test.cgi

 

 #!/bin/bash


echo "Content-Type: text/html"

echo ""


echo "<pre>"

echo "My username is : "

whoami 

echo ""


echo "My id is : "

id 

echo ""


echo "</pre>"

 


# chmod 555 /www1/cgi-bin/test.cgi /* 실행권한 추가 */


# httpd -t /* 문법 확인 */
# service httpd restart

# firefox http://www.linux.example.com/cgi-bin/test.cgi (# lynx http://www.linux.example.com/cgi-bin/test.cgi)



[참고] Perl 스크립트 사용

(perl) 설치 확인

# rpm -q mod_perl

mod_perl-2.0.4-6.el5

-> 설치가 안되어 있으면 설치한다.
# vi /etc/resolv.conf
nameserver 168.126.63.1
# yum -y install mod_perl

 

perl 스크립트를 사용하기 위한 주 설정 파일 설정 및 변경 사항 적용

# vi /etc/httpd/conf.d/perl.conf

..... (중략) .....

Alias /perl /var/www/perl <-----+

<Directory /var/www/perl> |

SetHandler perl-script |

PerlResponseHandler ModPerl::Registry +----- 주석 제거

PerlOptions +ParseHeaders |

Options +ExecCGI |

</Directory> <-----+

 

# This will allow remote server configuration reports, with the URL of

# http://servername/perl-status

# Change the ".example.com" to match your domain to enable.

#

#<Location /perl-status>

# SetHandler perl-script

# PerlResponseHandler Apache2::Status

# Order deny,allow

# Deny from all

# Allow from .example.com

#</Location>

-> perl.conf 파일의 가장 마지막 페이지에서 설정한다.

 

# service httpd restart

-> 서비스 재 시작

 

/var/www/perl/test.pl 펄 스크립트 파일 생성 및 실행 권한 부여

# mkdir -p /var/www/perl

# vi /var/www/perl/test.pl

#!/usr/bin/perl

 

use strict;

print "Content-Type: text/html; charset=ISO-8859-1\n\n";

print "<HTML><BODY><H1><CENTER>";

print "The current Perl time is:<BR>";

print scalar localtime();

print "</CENTER></H1></BODY></HTML>"

 

# chmod 755 /var/www/perl/test.pl

#

 

확인

# firefox http://www.linux2XX.example.com/perl/test.pl 


[참고] PHP 스크립트 사용

PHP 설치 확인

# rpm -q php

php-5.1.6-23.2.el5_3

-> 설치가 안되어 있으면 설치한다.
# vi /etc/resolv.conf
nameserver 168.126.63.1
# yum -y install php

 

/www1/phpinfo.php 파일 생성

# echo "<?php phpinfo(); ?>" > /www1/index.php

 

확인

# firefox http://www.linux2XX.example.com/index.php

 

새로운 PHP 스크립트 생성

# vi /www1/test.php

<HTML><BODY><CENTER><H1>

The current PHP time is: <BR>

<?php

// This is a comment

print strftime("%c");

?>

</H1></CENTER></BODY></HTML>

 

확인

# firefox http://www.linux2XX.example.com/test.php 




- .htaccess 파일을 이용한 웹 보안

# vi /www1/.htaccess

 

AuthName        "restricted stuff"

AuthType        Basic

AuthUserFile    /etc/httpd/conf/mypasswd

require         valid-user

 

-> /etc/httpd/conf/httpd.conf 파일에 AllowOverride 설정이 되어 있으면, 특정한 웹페이지에 대해서 사용자 인

   증을 할 수 있다.


[참고] AllowOverride 설정

옵 션

설 명

AuthConfig

인증 방법 명령을 사용할 수 있으며, AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등을 쓸수 있다.

Fileinfo

AddEncoding, AddLanguage, AddType, DefaultType, LanguagePriority 명령을 사용할 수 있도록 한다.

Indexes

AddDescription, Addlcon, AddlconByEncoding, AddlconByType, Defaultlcon, Directorylndex, Fancylndexing, HeaderName, lndexlgnore, lndexOptions, ReadmeName 등 디렉토리 인텍싱 관리 명령을 사용할 수 있다.

Limit

서버 접근을 제어할 수 있는 allow, deny, order 명령을 사용할 수 있다.


[참고] .htaccess 파일안에 사용할 수 있는 인증 지시자

지시자

설 명

AuthType

인증 타입은 Basic, Diget가 있지만, 현재 Basic만 지원한다.

AuthName

인증 영역에 대한 이름을 지정하는 지시자. 클라이언트의 웹 브라우저에 전달 되어 유저 인증 윈도우 내의 영역에 표시되며 주의할 점은 영역 이름을 기입할 때 스페이스가 들어가서는 안된다. 만일 영역 이름에 스페이스가 들어 갈 때는 반드시 큰 따옴표로 묶어 주어야 한다.

AuthUserFile

인증 사용자와 패스워드를 가진 패스워드 파일을 지정하는 지시자. 사용자 인증 패스워드 파일을 지정할 때 슬래쉬가 없는 경우, 즉 디렉토리르 지정하지 않으면 서버 루트 디렉토리를 기본으로 한다.

AuthGroupFile

인증 사용자들의 그룹 파일을 지정하는 지시자. 그룹 지정 형식은 그룹: 유저1 유저2 유저3 ... 같이 그룹과 유저 사이를 콜론으로 구분하고 유저와 유저는 스페이스로 띄어 구분한다. 디렉토리를 지정할 경우 서버 루트가 기본 디렉토리로 동작하게 된다.

require user

지정한 유저만 디렉토리 접근을 허용한다.

require valid-user

패스워드 인증이 올바르게 된 사용들만 접근을 허용한다.

require group

지정한 그룹에 있는 유저들만 디렉토리 접근을 허용한다.`


# htpasswd -mc /etc/httpd/conf/mypasswd testuser  /*htpasswd 명령어를 이용한 사용자 암호 설정 */
New password: (사용자 암호 입력)
Re-type new password: (사용자 암호 입력)
Adding password for user testuser

# cat /etc/httpd/conf/mypasswd    /* mypasswd 파일 확인 */

# vi /etc/httpd/conf/httpd.conf

 

........중략 ............... 

NameVirtualHost 192.168.17.120:80

<VirtualHost 192.168.17.120:80>

    ServerAdmin root@linux.example.com

    DocumentRoot /www1

    ServerName www.linux.example.com

    <Directory /www1>

        Options Indexes Includes

        AllowOverride AuthConfig

    </Directory>

        ScriptAlias /cgi-bin/ /www1/cgi-bin/

</VirtualHost>


 


# httpd -t /* 문법 확인 */


# service httpd restart

# firefox http://www.linux.example.com


# rm /www1/.htaccess

  • 가상 호스트 설정 ( Virtual Hosting )

-Virtual Hosting 종류

이름 기반 가상 호스트(Name-based Virtual Hosting) -> 이름이 다르면 다른 페이지

IP 기반 가상 호스트(IP-based Virtual Hosting) -> 아이피 요청에 따라서 다른 페이지

포트 기반 가상 호스트(Port-based Virtual Hosting) -> 포트번호 다르면 다른 페이지

혼합된 형태(Mixed Virtual Hosting



- 호스트 기반 가상 호스팅 ( Name-based Virtual Hosting )
# mkdir /www2 /www3
# vi /www2/index.html
<H1><CENTER> www2 linux(/www2) </CENTER></H1>
# vi /www3/index.html
<H1><CENTER> www3 linux(/www3) </CENTER></H1>

[참고] /etc/hosts 파일을 사용해서 구분가능하지만 DNS를 배웠기때문에 DNS 서버에 추가해준다.
# vi /var/named/choot/var/named/example.zone
www1        IN A     192.168.17.120
www2        IN A     192.168.17.120
www3        IN A     192.168.17.120
-> 추가

# vi /etc/httpd/conf/httpd.conf

 

 NameVirtualHost 192.168.17.120:80

<VirtualHost 192.168.17.120:80>

    ServerAdmin root@linux.example.com

    DocumentRoot /www1

    ServerName www.linux.example.com

    <Directory /www1>

        Options Indexes Includes

        AllowOverride AuthConfig

    </Directory>

        ScriptAlias /cgi-bin/ /www1/cgi-bin/

</VirtualHost>


<VirtualHost 192.168.17.120:80>

    ServerName www1.linux.example.com

    DocumentRoot /www1

</VirtualHost>


<VirtualHost 192.168.17.120:80>

    ServerName www2.linux.example.com

    DocumentRoot /www2

</VirtualHost>


<VirtualHost 192.168.17.120:80>

    ServerName www3.linux.example.com

    DocumentRoot /www3

</VirtualHost>


 


# httpd -t 

# service httpd restart


# lynx http://www1.linux.example.com

# lynx http://www2.linux.example.com

# lynx http://www3.linux.example.com


- IP 기반 가상 호스팅 ( IP-based Virtual Hosting )
가상 인터페이스
eth0    192.168.17.120
eth0:1    192.168.17.121
eth0:2    192.168.17.122

# cd /etc/sysconfig/network-scripts
# vi ifcfg-eth0  /* MAC Address 삭제 */
# cp ifcfg-eth0 ifcfg-eth0:1
# cp ifcfg-eth0:1 ifcfg-eth0:2
/* IP 설정 */
# service network restart
# ifconfig

 

 eth0      Link encap:Ethernet  HWaddr 00:0C:29:D0:C3:B5  

          inet addr:192.168.17.120  Bcast:192.168.17.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fed0:c3b5/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:6736 errors:0 dropped:0 overruns:0 frame:0

          TX packets:3307 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:8298662 (7.9 MiB)  TX bytes:330796 (323.0 KiB)

          Interrupt:75 Base address:0x2024 


eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:D0:C3:B5  

          inet addr:192.168.17.121  Bcast:192.168.17.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:75 Base address:0x2024 


eth0:2    Link encap:Ethernet  HWaddr 00:0C:29:D0:C3:B5  

          inet addr:192.168.17.122  Bcast:192.168.17.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:75 Base address:0x2024

 


# vi /etc/httpd/conf/httpd.conf

 

 ....중략.....

<VirtualHost 192.168.17.120:80>

    ServerName www1.linux.example.com

    DocumentRoot /www1

</VirtualHost>


<VirtualHost 192.168.17.121:80>

    ServerName www2.linux.example.com

    DocumentRoot /www2

</VirtualHost>


<VirtualHost 192.168.17.122:80>

    ServerName www3.linux.example.com

    DocumentRoot /www3

</VirtualHost>


 


# httpd -t

# service httpd restart


# lynx http://192.168.17.120

# lynx http://192.168.17.121
# lynx http://192.168.17.122

(복윈) 

- 가상 인터페이스 삭제 

# rm -f ifcfg-eth0:1 ifcfg-eth0:2

# service network restart

- httpd.conf  가상 호스트 설정 삭제

# vi /etc/httpd/conf/httpd.conf
-> 주석처리
: set nu
:1007,1020s/^/#/            -> 맞는 숫자 입력 
# service httpd restart

  • 서버의 상태 / 통계 모니터링
# vi /etc/httpd/conf/httpd.conf

 

..........중략...........

#

# Allow remote server configuration reports, with the URL of

#  http://servername/server-info (requires that mod_info.c be loaded).

# Change the ".example.com" to match your domain to enable.

#

<Location /server-info>

    SetHandler server-info

    Order deny,allow

    Deny from all

    Allow from 192.168.17.120

</Location>

......중략...........

 

-> 주석 제거


# service httpd restart


# firefox http://www.linux.example.com/server-info


# vi /etc/httpd/conf/httpd.conf

 

..........중략...............

#

# Allow server status reports generated by mod_status,

# with the URL of http://servername/server-status

# Change the ".example.com" to match your domain to enable.

#

<Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from 192.168.17.120

</Location>

.............중략..............

 

-> 주석 제거


# service httpd restart

# firefox http://www.linux.example.com/server-status


- 서버의 사용량 확인

# cat /etc/httpd/conf.d/webalizer.conf

 

 #

# This configuration file maps the webalizer log analysis

# results (generated daily) into the URL space.  By default

# these results are only accessible from the local host.

Alias /usage /var/www/usage


<Location /usage>

    Order deny,allow

    Deny from all

    Allow from 127.0.0.1

    Allow from ::1

    # Allow from .example.com

</Location>


 


# firefox http://localhost/usage &




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

MAIL Server  (0) 2017.09.13
FTP  (0) 2017.09.13
DNS_2 ( Master DNS / Slave DNS )  (0) 2017.09.11
DNS_1 ( 도메인 부하분산, 도메인 위임 )  (0) 2017.09.08
이더채널 본딩 ( Ether Channel Bonding )  (0) 2017.09.07