WWW Build, Refine and Management 특히 1993년 NCSA (URL: http://www.ncsa.uiuc.edu) 에서 GUI 기반의 Browser 인 Mosaic 이 Internet 에 출현한 이후로 WWW 의 성장율은 네트웍의 성장율을 능가할 정도였고, Internet 의 사용이 곧 WWW 의 사용이라는 도식이 형성될 정도로 발전하였으며, 앞으로도 고속성장은 지속될 전망이다.
이러한 일련의 성장의 분위기는 '정보의 보고' 라고 일컬어지는 Internet 에서 단순히 자신이 필요한 정보를 찾기만 하는 것이 아니라, 자신이 직접 정보의 제공자 역할을 하고 싶다는 욕구를 창출하게 되었고 이것이 Web 서버수의 폭발적 증가의 주요 요인으로 등장하게 되었다.
이 문서에서는 그러한 욕구를 만족시키기 위해서 초보자들도 쉽게 Web 서버를 설치할 수 있도록 setup 과정을 자세히 설명하고, CGI (Common Gateway Interface) 의 개념과 CGI 프로그래밍을 이해하고 실제로 설치해 봄으로써 CGI 를 사용할 수 있도록 한다. 또한, Web 서버를 구동할 때 생성되는 Log file 들이 어떻게 구성되어 있으며 분석 Tool 을 사용해서 분석하는 방법과 분석한 자료들을 어떻게 이용할 것인지에 대해서 논의해 보기로 한다.
Web 서버의 역할은 Browser 를 통하여 접수된 사용자(End-User) 의 요구(Request)에 답하여(Response) 잘 정리된 (HTML 로 쓰여진) 데이타를 사용자에게 전송하는 것이다.
말하자면, Web 서버는 사용자의 요구에 응하여 HTML 형태로 정리된 데이타를 전송하는
역할을 하는 것이다. 이외에도 Web 서버는 보안(Security) 과 사용기록(Account)를
위한 Log file 을 생성하고 CGI 등을 통해서 여러가지 환경을 제공한다.
무상으로 제공되는 Web 서버도 현재 다양한 제품이 나와 있으므로, 서버를 선택할때는 우선 각 서버의 장/단점을 파악하고, 서버 설치와 유지의 용이성 및 성능의 측면을 고려해야 할 것이다. 성능의 측면에서는 잘 정리된 자료 (URL: http://www.ncsa.uiuc.edu/InformationServers/Performance/V1.4/report.html) 를 구할 수 있다.
고성능이며 서버 Configuration 이 비교적 용이하다고 알려진 NCSA 서버를 고쳐서 만들었다는 A PAtCHe Server (URL: http://www.apache.org) 를 보면 NCSA 서버보다 더 빠르고 효율적이라는 것을 알 수 있다.
우리는 APACHE HTTP Server 를 선택 하였다.
물론, 한국에 있다면 APACHE 서버의 미러링 사이트 (URL: http://cosmos.kaist.ac.kr/packages/www/apache/) 를 이용하는 것이 더 빠를 것이다.
현재의 APACHE 서버의 버전은 1.1.1 이다. 1.0.0 에서의 개선사항중 주요한 몇가지는 다음과 같고, 더 자세한 내용은 New Features (URL: http://cosmos.kaist.ac.kr/packages/www/apache/docs/1.1/)를 참고하면 된다.
% gzip -cd apache_1.1.1-sparc-sun.sunos4.1.4.tar.gz | tar xvf -apache_1.1.1 이란 디렉토리가 생기게 되고, 그 밑에 모든 자료들과 프로그램들이 위치하게 된다. 기존에 설치된 서버의 Configuration file 을 그대로 이용하기 위해서는 apache_1.1.1 디렉토리를 httpd 로 이름을 바꾸어주던가 Symbolic link 를 시켜줘야 한다. 다음은 SunOS 4.1.4 시스템의 httpd 디렉토리 구조를 보여준다.
total 21 drwxr-xr-x 9 loveiris staff 512 Oct 15 11:27 ./ drwxr-xr-x 4 loveiris staff 512 Oct 14 22:50 ../ -rw-r--r-- 1 loveiris staff 3738 Mar 13 1996 CHANGES -rw-r--r-- 1 loveiris staff 2604 Feb 22 1996 LICENSE -rw-r--r-- 1 loveiris staff 3059 Jul 3 15:24 README drwxr-xr-x 2 loveiris staff 512 Jul 9 04:04 cgi-bin/ drwxr-xr-x 2 loveiris staff 512 Oct 15 11:12 conf/ drwxr-xr-x 2 loveiris staff 512 Jul 9 04:04 htdocs/ drwxr-xr-x 2 loveiris staff 2048 Jul 9 04:04 icons/ drwxr-xr-x 2 loveiris staff 512 Jul 9 04:04 logs/ drwxr-xr-x 2 loveiris staff 2048 Oct 5 10:18 src/ drwxr-xr-x 2 loveiris staff 512 Oct 5 10:19 support/
# This should be changed to whatever you set DocumentRoot to. <Directory /usr/local/etc/httpd/htdocs> # This may also be "None", "All", or any combination of "Indexes", # "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews". # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you (or at least, not yet). Options Indexes FollowSymLinksDocumentRoot 는 사용자가 Web 서버에 접속했을때 가장 먼저 보여주는 HTML 문서가 위치할 곳을 지정해 주는 곳이며, Web 서버에서 제공하는 각종 문서들이 저장되고 관리되는 일종의 홈 디렉토리이다. 이것을 사용할때 'Option' 을 지정해 줄 수 있는데, 이는 디렉토리 화일들에 대한 서버의 활용 방법을 지정해 주는 역할을 한다. 여러가지 Option 이 있을 수 있는데 몇가지만 살펴보도록 한다.
# This controls which options the .htaccess files in directories can # override. Can also be "All", or any combination of "Options", "FileInfo", # "AuthConfig", and "Limit" AllowOverride NoneAllowOverride 라는 것은 어떤 디렉토리나 화일에 대한 접속을 특정 집단이나 사용자들 에게만 허용할 목적으로 그 디렉토리에 .htaccess 를 설치하였을때 그 디렉토리의 내용을 보여줄 것인지 아닌지를 결정하게 한다.
# Controls who can get stuff from this server. order allow,deny allow from all </Directory>order 라는 것은 서버가 접근 제어를 수행할때 실행되는 순서를 나타낸다. 위의 경우는 allow 기능을 수행한 후에 deny 기능을 수행하는 것을 나타낸다. 'deny, allow' , 'allow, deny', 'mutual-failure' 의 3가지 중에서 하나를 선택해야 한다. 마지막의 mutual-failure의 경우에는 접근을 허용하거나 거부할 호스트 주소를 allow 와 deny 에 반드시 나타내야 한다. 이 경우 allow 에 나타나는 주소는 어떤 것이든지 접근이 허용되고, deny 에 나타나는 것은 어떤 것이든지 거부되며, 어느 쪽에든 명시되지 않은 것들은 접근 거부된다.
deny from 은 열거된 주소들에 대해서는 접근을 거부하겠다는 것을 나타내며, 주소를 나타낼때는 도메인이름, 호스트이름, 호스트 IP, IP 앞부분 3 바이트를 쓸 수 있고, 모든 호스트에 대해 일차적인 접근 거부를 나타낼때는 all 이 쓰인다.
allow from 은 나열되어 있는 주소들에 대해 접근을 허용하겠다는 것을 나타내며 주소를 나타내는 방법은 위와 동일하다.
# /usr/local/etc/httpd/cgi-bin should be changed to whatever your ScriptAliased # CGI directory exists, if you have that configured. <Directory /usr/local/etc/httpd/cgi-bin> AllowOverride None Options None </Directory>이 부분은 WWW 서버가 사용할 CGI 들이 들어있는 디렉토리를 지정하는 것이고 Option, AllowOverride 는 위의 것과 같은 역할을 하게 된다.
# Allow server status reports, with the URL of http://servername/status # Change the ".nowhere.com" to match your domain to enable. #<Location /status> #SetHandler server-status #order deny,allow #deny from all #allow from .nowhere.com #</Location>APACHE httpd 1.1.1 에서 추가된 부분으로, 이 부분을 설정해 두면 특정 호스트 혹은 도메인에서 접속하는 Client 들에 대한 정보를 얻을 수 있게 된다. Server Statistics 를 보는 방법은 아래와 같다.
http://your.server.name/status/
# ServerType is either inetd, or standalone. ServerType standalone # If you are running from inetd, go to "ServerAdmin".
inetd 방식이라는 것은 inetd 라는 process 가 있다가 사용자의 요구가 들어올때마다 새로운 httpd process 를 생성시켜서 사용자의 요구를 처리하도록 하는 방식이고, standalone 방식이라는 것은 Server pool 방식과 같은 것으로서 서버 process 를 미리 만들어 놓고 사용자의 요구가 들어오는대로 대기하고 있는 서버 process 에게 일을 할당하는 방식이다. 이 방법은 사용자의 요구가 있을때마다 새로운 process 를 생성(fork) 하는 inetd 방식보다 서버를 새로 생성하는 시간을 줄임으로서 보다 빠른 반응속도를 얻을 수 있다는 장점이 있다. Unix 에서 fork 는 시간이 많이 걸리는 작업중 하나로 Server pool 방식은 사용자의 수가 많아질수록 상당한 성능의 향상을 가져오게
되며, 실제의 실험결과 (URL: http://www.ncsa.uiuc.edu/InformationServers/Performance/V1.4/report.html) 도 이 사실을 입증해 준다.
# Port: The port the standalone listens to. For ports < 1023, you will # need httpd to be run as root initially. Port 800 에서 1023 까지의 port 는 시스템에 미리 예약이 되어 있으며 주요 서비스에 대해서는 고유 port 번호가 할당되어 있다. httpd 을 위한 port 번호는 80 번이고 이것을 Default 로 사용한다. 1024 번보다 큰 port 번호의 사용은 일반 사용자도 가능하도록 되어 있으며 접속할때는 아래의 예와 같이 URL 에 port 번호까지 명시를 해주어야 한다.
http://ktmp.kaist.ac.kr:8080/
# HostnameLookups: Log the names of clients or just their IP numbers # e.g. www.apache.org (on) or 204.62.129.132 (off) HostnameLookups onLog file 에 기록되는 Client 들이 어디에서 접속하였는지에 대한 정보를 IP address 로 남길것인지 혹은 호스트 이름으로 남길것인지를 결정하는 부분이다.
# If you wish httpd to run as a different user or group, you must run # httpd as root initially and it will switch. # User/Group: The name (or #number) of the user/group to run httpd as. # On SCO (ODT 3) use User nouser and Group nogroup User nobody Group #-1standalone 방식으로 서버를 구동시켰을때 사용되는 것으로 httpd 서버가 사용자들의 요구에 대해서 생성시키는 Child process 에 대한 UID, GID 를 지정해 주는 부분이다. root 와 같이 시스템을 관리하는 사람의 UID 나 GID 를 사용하는 경우는 httpd process 가 root 의 권한을 가지게 되므로 잘못하면 시스템이 크래킹을 당할수도 있게 된다. 그러므로 대개 nobody 그룹및 nobody 사용자에 대해 정의를 하게 된다. OS 의 종류에 따라서 설정하는 방식이 다르므로 주의해야 한다.
# ServerAdmin: Your address, where problems with the server should be # e-mailed. ServerAdmin you@your.address # ServerRoot: The directory the server's config, error, and log files # are kept in ServerRoot /usr/local/etc/httpd서버 관리자의 E-mail address 를 적어주는 곳이고, ServerRoot 라는 것은 httpd 서버 프로그램이 설치된 디렉토리를 적어주면 된다.
# BindAddress: You can support virtual hosts with this option. This option # is used to tell the server which IP address to listen to. It can either # contain "*", an IP address, or a fully qualified Internet domain name. # See also the VirtualHost directive. #BindAddress *BindAddress 뒤에 나열된 호스트 주소에서의 접속만을 허용한다. 접근 통제를 목적으로 이용될 수 있으며 뒤에서 설명될 Virtual host 와는 함게 쓰일 수 없다.
# ErrorLog: The location of the error log file. If this does not start # with /, ServerRoot is prepended to it. ErrorLog logs/error_log # TransferLog: The location of the transfer log file. If this does not # start with /, ServerRoot is prepended to it. TransferLog logs/access_log # PidFile: The file the server should log its pid to PidFile logs/httpd.pid # ScoreBoardFile: File used to store internal server process information ScoreBoardFile logs/apache_statusLog file 의 이름과 위치를 지정해주는 부분이다. 자세한 것은 Log analyzer 부분에서 다루도록 한다.
# ServerName allows you to set a host name which is sent back to clients for # your server if it's different than the one the program would get (i.e. use # "www" instead of the host's real name). # # Note: You cannot just invent host names and hope they work. The name you # define here must be a valid DNS name for your host. If you don't understand # this, ask your network administrator. #ServerName new.host.nameWeb 서버의 이름을 정하는 부분으로 보통 호스트의 이름을 써주지만, 꼭 호스트 이름과 같을 필요는 없다. 예를 들어, www.your.domain.name 이라고 하면 그 도메인의 대표 Web 서버가 되는 것이 보통이다.
# KeepAlive: The number of Keep-Alive persistent requests to accept # per connection. Set to 0 to deactivate Keep-Alive support KeepAlive 5 # KeepAliveTimeout: Number of seconds to wait for the next request KeepAliveTimeout 15원하는 자료를 찾기 위해서 특정 서버에 접속을 했다고 했을때, 보통의 경우 단 한가지의 자료만을 얻기 위해서 접속한 경우는 드물 것이다. 대부분 여러개의 문서들을 뒤적이면서 찾아야 할 경우가 많다. 그런데, 실제로 어떤 Browser 가 서버에서 데이타를 가지고 올때는 각각의 화일마다 다른 TCP connection 을 이루어서 문서를 가져오게 된다. 즉, 우리가 10 개의 화일이 필요해서 받아올때는 10개의 서로 다른 TCP connection 이 생기게 되는 것이다. 속도가 빠른 경우라면 별 문제가 없겠지만 만약 속도가 너무나 느린 경우라면 사용자의 관점에서는 짜증나는 일이 될 것이다.
이를 해결하기 위해서 APACHE 서버에서는 어떤 서버에 접속을 한 경우, 일정 시간동안은 사용자의 요구가 없더라도 연결을 지속시킨다. 그러다가, 어떤 일정 시간동안 사용자의 요구가 없으면 비로소 연결을 종료시킨다. 이 방법은 어떤 서버에 빈번하게 접속하는 경우에 속도의 향상을 가져올 수 있다.
하지만 이를 시스템의 관점에서 보면 어떻게 될까? 서버의 관점에서 사용자의 요구도 없는데 계속해서 Connection 을 맺고 있는다는 것은 큰 부하로 작용하게 된다. 즉, 이를 방지하기 위해서 KeepAliveTimeout 을 설정하게 된다. 위의 예에서 15 라는 것은 15 초를 의미한다. 즉, 15초동안 사용자의 요구가 없었다면 Connection 을 종료시키겠다는 것을 나타낸다.
# Server-pool size regulation. Rather than making you guess how many # server processes you need, Apache dynamically adapts to the load it # sees --- that is, it tries to maintain enough server processes to # handle the current load, plus a few spare servers to handle transient # load spikes (e.g., multiple simultaneous requests from a single # Netscape browser). # It does this by periodically checking how many servers are waiting # for a request. If there are fewer than MinSpareServers, it creates # a new spare. If there are more than MaxSpareServers, some of the # spares die off. These values are probably OK for most sites --- MinSpareServers 5 MaxSpareServers 10 # Number of servers to start --- should be a reasonable ballpark figure. StartServers 5 # Limit on total number of servers running, i.e., limit on the number # of clients who can simultaneously connect --- if this limit is ever # reached, clients will be LOCKED OUT, so it should NOT BE SET TOO LOW. # It is intended mainly as a brake to keep a runaway server from taking # Unix with it as it spirals down... MaxClients 150 # MaxRequestsPerChild: the number of requests each child process is # allowed to process before the child dies. # The child will exit so as to avoid problems after prolonged use when # Apache (and maybe the libraries it uses) leak. On most systems, this # isn't really needed, but a few (such as Solaris) do have notable leaks # in the libraries. MaxRequestsPerChild 30앞서 언급한 Server pool 방식을 이용할때 이용되는 부분으로서 StartServers 는 최초에 몇 개의 httpd process 를 생성시켜 놓을 것인가 지정하는 것이고, Min/Max Spare Servers 라는 것은 일정 시간마다 현재 대기하고 있는 서버의 갯수를 확인하여 최소 서버의 수보다 적을때는 process 를 더 생성시키고 남을 경우는 process 를 없애는 역할을 해서 항상 일정 숫자의 서버가 대기하고 있도록 해주는 역할을 하며, MaxClients 는 서비스를 제공하는 동안 최대 몇 개의 process 를 생성 가능하게 할 것인가 지정하는 것이다.
최대 갯수 제한의 목적은 httpd process 에 의해 시스템이 지나친 부하를 받지 않게 하는데 있고, 이를 초과하는 사용자 요구가 동시에 들어오는 경우는 서비스를 거부하게 된다.
# Listen: Allows you to bind Apache to specific IP addresses and/or # ports, in addition to the default. See also the VirtualHost command #Listen 3000 #Listen 12.34.56.78:80지정된 호스트의 port 에서 Socket connection 을 열어두고 대기하겠다는 것을 나타낸다.
# VirtualHost: Allows the daemon to respond to requests for more than one # server address, if your server machine is configured to accept IP packets # for multiple addresses. This can be accomplished with the ifconfig # alias flag, or through kernel patches like VIF. # Any httpd.conf or srm.conf directive may go into a VirtualHost command. # See alto the BindAddress entry. #<VirtualHost host.foo.com> #ServerAdmin webmaster@host.foo.com #DocumentRoot /www/docs/host.foo.com #ServerName host.foo.com #ErrorLog logs/host.foo.com-error_log #TransferLog logs/host.foo.com-access_log #</VirtualHost>Virtual Host 란 하나의 서버에 몇 개의 IP 주소를 할당하여, 어느 IP 주소로 들어온 서비스 요구인지 알아내어 해당하는 별도의 서버 홈페이지로 연결해주는 것을 말한다. 이것을 이용하여 한 대의 호스트에서 서로 다른 IP 주소를 가지는 여러 곳의 서버 홈페이지를 구성할 수가 있다.
호스트 내 사용자와 외부에서 접속하는 사용자에 대해 다른 서비스를 제공해주자 할 때 위와 같은 방식으로 서비스 할 수 있다. 물론, 이런 기능을 이용하기 위해서는 하나의 호스트에 여러 개의 IP 주소를 할당할 수 있는 시스템이라야한다.
# DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. DocumentRoot /usr/local/etc/httpd/htdocs앞에서 언급된 access.conf 화일의 DocumentRoot 와 같은 기능을 한다.
# UserDir: The name of the directory which is appended onto a user's home # directory if a ~user request is recieved. UserDir public_html각 사용자들의 개인 Home page 디렉토리를 지정한다. 이때의 디렉토리명은 /etc/passwd 화일에 나타난 사용자의 Home 디렉토리에서 상대적으로 지정된다. 만약 개인 사용자가 자신의 Home page 를 구축하려 한다면 자신의 Home 디렉토리 밑에 public_html 이란 디렉토리를 만들고 그것을 Home 디렉토리로 하여 HTML 문서들을 작성하면 된다.
# DirectoryIndex: Name of the file or files to use as a pre-written HTML # directory index. Separate multiple entries with spaces. DirectoryIndex index.html특정 화일을 지정하지 않고 디렉토리이름으로만 URL 을 지정하였을때 그 디렉토리에서 Default 로 찾게되는 화일의 이름을 나타낸다. 여러개를 지정할 수 있다.
# FancyIndexing is whether you want fancy directory indexing or standard FancyIndexing on디렉토리나 화일의 목록을 보여줄때, 화일의 크기나 종류 또는 확장자에 따라서 지정된 Icon 으로 보여줄 것인지를 지정해 주는 부분이다.
# AddIcon tells the server which icon to show for different files or filename # extensions AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip AddIconByType (TXT,/icons/text.gif) text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/* ...디렉토리 index 의 주어진 화일 형태에 대해서 출력할 Icon 을 미리 지정해 주는 부분이다. 사용자의 편의에 따라서 덧붙일 수 있다.
# DefaultIcon is which icon to show for files which do not have an icon # explicitly set. DefaultIcon /icons/unknown.gif위에서 지정한 Icon 정보가 없는 화일을 보여줄때 Default 로 보여지는 Icon 을 나타낸다.
# AddDescription allows you to place a short description after a file in # server-generated indexes. # Format: AddDescription "description" filenameFancyIndexing 에서 사용되는 화일에 대한 간단한 설명을 지정해주는 부분이다. 'filename' 부분에는 확장자나 화일이름 혹은 Wildcard 표현방법이 들어갈 수 있다.
# ReadmeName is the name of the README file the server will look for by # default. Format: ReadmeName name # # The server will first look for name.html, include it if found, and it will # then look for name and include it as plaintext if found. # # HeaderName is the name of a file which should be prepended to # directory indexes. ReadmeName README디렉토리 목록을 출력할때, 디렉토리 index 뒷부분에 같이 출력해줄 화일명을 지정해 주는 부분이다. WWW 를 이용하여 Ftp service 를 겸하고자 하는 경우 유용하게 사용되는 부분이다.
HeaderName HEADER위의 것과는 달리 앞부분에 덧붙일 디렉토리의 Custom header 화일을 지정하는 부분이다.
# IndexIgnore is a set of filenames which directory indexing should ignore # Format: IndexIgnore name1 name2... IndexIgnore */.??* *~ *# */HEADER* */README* */RCS디렉토리 index 를 출력할때 무시할 화일명을 지정한다.
# AccessFileName: The name of the file to look for in each directory # for access control information. AccessFileName .htaccessClient 로 문서가 전달될때 서버는 각 디렉토리마다 AccessFileName 에서 지정한 이름을 가진 화일이 있는지를 찾아본 후에 접근 제어를 할 것인지 아닌지를 결정하게 된다.
# DefaultType is the default MIME type for documents which the server # cannot find the type of from filename extensions. DefaultType text/plain어떤 화일의 형태가 서버가 가지고 있는 MIME.type 과 일치하지 않을때, 그 화일을 어떤 형태로 보여줄 것인지를 결정하는 변수이다.
# AddEncoding allows you to have certain browsers (Mosaic/X 2.1+) uncompress # information on the fly. Note: Not all browsers support this. AddEncoding x-compress Z AddEncoding x-gzip gz화일의 확장자에 따라 지정된 화일형태로 인식을 하도록 정의해 주는 부분이다.
# Redirect allows you to tell clients about documents which used to exist in # your server's namespace, but do not anymore. This allows you to tell the # clients where to look for the relocated document. # Format: Redirect fakename url특정한 이름으로 들어오는 서비스 요청을 직접 처리하지 않고 다른 서버에게 넘겨주고자 할때 사용된다. 여러 곳에 분산되어 있는 서버의 데이타를 하나의 URL 에서 처리를 해줄 수 있다는 장점이 있다.
# Aliases: Add here as many aliases as you need (with no limit). The format is # Alias fakename realname #Alias /icons/ /usr/local/etc/httpd/icons/서버 관리자가 어떤 사정에 의해서 현재까지 사용하던 디렉토리의 경로를 바꾼다던가 혹은 디렉토리의 이름을 바꾸었을때 기존의 사용자들이 아무런 불편없이 계속해서 사용할 수 있도록 조처를 취해줄때나 혹은 복잡한 디렉토리구조를 가지고 있는 경우 복잡함을 줄이기위해 사용할 수 있는 방법이며, 지정할 수 있는 Alias 의 수는 제한이 없다.
# ScriptAlias: This controls which directories contain server scripts. # Format: ScriptAlias fakename realname #ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/Web 서버에서 사용하는 CGI script 를 저장하고 있는 디렉토리를 지정한다. 이 디렉토리 내에 있는 화일은 읽혀지는것이 아니라 실행되게 된다.
# AddHandler allows you to map certain file extensions to "handlers", # actions unrelated to filetype. These can be either built into the server # or added with the Action command (see below) # Format: AddHandler action-name ext1 # To use CGI scripts: #AddHandler cgi-script .cgi # To use server-parsed HTML files #AddType text/html .shtml #AddHandler server-parsed .shtml # Uncomment the following line to enable Apache's send-asis HTTP file # feature #AddHandler send-as-is asis # If you wish to use server-parsed imagemap files, use #AddHandler imap-file map # To enable type maps, you might want to use #AddHandler type-map var화일의 특정한 확장자를 지정해서 그 확장자를 가진 화일은 어떤 프로그램으로 인식 하라는 것을 지정해 주는 부분이다. 윗 부분을 설정해 주면, 서버는 .cgi 라는 확장자를 가지는 화일은 CGI-script 로 인식을 하게 되고, .shtml 라는 확장자를 가진 화일은 Server-parsed HTML 로 인식하게 된다.
# Action lets you define media types that will execute a script whenever # a matching file is called. This eliminates the need for repeated URL # pathnames for oft-used CGI file processors. # Format: Action media/type /cgi-script/location # Format: Action handler-name /cgi-script/location # For example to add a footer (footer.html in your document root) to # files with extension .foot (e.g. foo.html.foot), you could use: #AddHandler foot-action foot #Action foot-action /cgi-bin/footer # Or to do this for all HTML files, for example, use: #Action text/html /cgi-bin/footer정의된 Media type 이 나오게 되면 특정 CGI script 를 실행해주는 역할을 한다.
# MetaDir: specifies the name of the directory in which Apache can find # meta information files. These files contain additional HTTP headers # to include when sending the document #MetaDir .web # MetaSuffix: specifies the file name suffix for the file containing the # meta information. #MetaSuffix .metaHTTP header 부분에 들어가는 meta 정보들을 포함하는 디렉토리와 그 화일의 확장자를 지정해주는 부분이다.
# Customizable error response (Apache style)
# these come in three flavors
#
# 1) plain text
#ErrorDocument 500 "The server made a boo boo.
# n.b. the (") marks it as text, it does not get output
#
# 2) local redirects
#ErrorDocument 404 /missing.html
# to redirect to local url /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# n.b. can redirect to a script or a document using server-side-includes.
#
# 3) external redirects
#ErrorDocument 402 http://other.server.com/subscription_info.html
어떤 page 에 접속을 했을때 그 page 가 없어지거나 혹은 다른 곳으로 옮겨졌거나
했을때 발생하는 Error 의 처리를 어떻게 할 것인지를 지정해 주는 부분이다.
기본적으로 제공되는 Error message 만 출력해 줄수도 있고 관리자가 만든 Error
message 를 출력해 줄수도 있으며 옮겨진 page 를 알려주는 Message 를 넣어줄 수도
있다.
standalone 으로 실행하는 경우는 다음과 같다.
% httpd -r conf_file_path이때 80 번 port 를 사용한다면 root 의 권한으로 실행을 시켜줘야 한다. 그리고, 호스트가 Rebooting 될때마다 자동적으로 실행이 되기를 원한다면, SunOS 4.x 를 사용하는 시스템의 경우는 /etc/rc.local 의 한줄을 추가해야 하며, Solaris 2.x 를 사용하는 시스템 이라면 /etc/rc3.d 디렉토리에 S90locald 라는 이름으로 화일을 만들어서 위의 명령어를 넣어주면 된다.
inetd 로 실행하는 경우에는 /etc/services 라는 화일에 httpd 80/tcp 라는 줄을 추가하고 /etc/inetd.conf 화일에 다음을 첨가하도록 한다.
http stream tcp nowait nobody httpd_path httpd_command만약 NIS 를 실행중이라면, NIS source 화일을 고쳐야하고 다 고친후에 ypmake 를 통해서 해당 호스트에 전달되어야 제대로 작동하게 된다. 그리고나서 inetd 에게 kill -1 로 Hangup Signal 을 주면, 그때부터 HTTP
연결요구가 올때마다 httpd 가 자동적으로 생성되게 된다.
% ps -awux | grep httpdConfiguration file 을 변경한 경우 변경된 내용이 실제로 적용이 되려면 Hangup Signal 을 준다. 그렇게 하면 httpd 를 중단시키지 않고 Configuration file 을 다시 읽도록 할 수 있다.
inetd 로 실행된 경우는 HTTP 연결요구가 올때마다 process 가 생기는 것이므로 /etc/inetd.conf 의 http 부분을 삭제하지 않는 이상 실행을 중지시킬 수 있는 방법은 없다.
서버측에서만 설치를 하면 여러가지 Client 에 대해서 서버 관리자가 각각 해 주어야 할 일이 줄어들게 된다.
그렇다면 단점에는 어떤 것들이 있는지 알아보도록 하겠다.
CGI 는 서버와는 완전히 독립적인 하나의 process 를 생성하는 것을 말한다. 이것은 서버의 종류에 관계없고 서버 소프트웨어와 호환성이 좋으며, 아주 다양한 분야의 Public Domain Program 이 개발되어 있기 때문에 구현하기가 쉽고 그만큼 널리 사용되고 있다. 이러한 사실들이 CGI 를 Information Server 와 호환되는 외부 Application 의 표준으로 만든 것이다.
이런 강력한(!) 장점을 가지고 있는 반면 각각이 독립적인 process 이기 때문에 Resource 의 낭비가 심하다는 단점을 가진다. 서버가 각각의 Client 의 요구에 새로운 CGI 프로그램을 실행시켜야 한다는 것이다. 이 경우 사용자의 요구가 적을때에는 문제가 되지 않지만, CGI 프로그램이 빈번히 접속된다면 각 요구에 새로운 process 를 생성(fork)하는 것이 서버의 수행능력에 심각한 영향을 미칠것이다.
API 는 서버의 API 를 이용해서 기능을 확장하는 것을 의미한다. Web 서버를 그대로 확장한 결과이기 때문에 속도가 빠르고 효율적이지만 어느 특정 서버의 API 를 이용할 경우엔 다른 서버에서는 사용할 수 없다는 큰 단점이 있다.
Netscape Server API (NSAPI) 는 고성능과 뛰어난 기능 - CGI 프로그램을 작성할때 Shared Library 형태로 만들게 되고, 실행할때에는 Web 서버가 Shared Library 의 함수를 호출하기 때문에 새로운 process 가 생기지 않게 된다- 을 제공하는 CGI 같은 애플리케이션을 만들기 위한 수단으로 제공된다. 예를 들어, NSAPI 는 사용자 접근제어, 에러처리, DB 연결 -CGI 로 구현한다면 서버에 부담을 많이 줄 작업들- 과 같은 일을 처리하기 위해서 사용자 Function 을 작성하는데 사용될 수 있다. 이렇게 NSAPI 가 개발자에게 보다 향상된 기능의 Web 애플리케이션을 만들수 있도록 해주는 반면에 인터페이스에 사용되는 프로그램은 또다른 서버를 지원하기 어렵기 때문에, Netscape Server 에만 연결되어야 한다는 단점이 있다.
이 기능은 서비스를 요구하는 사용자에게 서버 사용자로서 프로그램 실행을 가능하게 하는 역할을 하고 있으므로 시스템 보안상의 문제를 일으킬수도 있다. 그럼에도 불구하고 SSI 는 CGI 를 사용하지 않고서도 제한된 범위의 동적인 HTML 화일을 쉽게 만들 수 있다는 점과 서버측에서 parsing 을 하므로 CGI 의 경우보다 시스템에 부담을 적게 준다는 점이 장점이다.
우선, 기존의 다른 프로그램과 기본적으로 다른 점은 다음과 같다.
1. GET
사용자의 Form 이나 URL 에서 데이타가 오는 방법으로, Form 의 경우 아래와 같은
형태로 보내지게 된다.