파일 업로드 라이브러리 선택(COS,Apache Commons Upload)에 대해 포스팅 했던 글에 이어 이번에는 파일 업로드

구현 예제에 대해 올려보겠습니다. 파일 업로드시에 보통 작은 데이터의 경우 손쉽게 jQuery의 ajaxStart, ajaxStop function을

통해 AJAX 요청 시작시, 완료시에 대한 이벤트를 처리 할 수 있으므로 ajaxStart()시에 GIF이미지 등을 화면에 띄워줘서

처리 상태를 사용자에게 알릴 수 있습니다. 보통 큰 용량의 파일이 업로드 될때는 JSP등의 페이지로 처리 하기 보다는 별도의

업로드 모듈을 사용하는것이 낫겠지만 5MB~10MB내의 파일이 오갈때에는 굳이 그럴 필요없이 웹으로만 구현하는것도

충분하다고 생각합니다. PC의 경우 굳이 프로그레스바를 보여주는것 보다는 간단하게 위와 같은 방법으로 처리하는것이

나을지 모르겠으나 스마트폰의 전송속도는 3G망이나 4G나 일반 유선통신 속도와 비교할것이 못되기도 하고 잘 안터지는

지역에서는 스피너 이미지로 프로그레스바를 보이는것 만으로는 사용자가 작업 완료 여부를 알 수 없기 때문에 만들어

보게 됐습니다.


progressbarex.zip

※압축첨부한 예제 파일들의 경우 거의 그대로 적용하시면 실행 되실겁니다. JAVA파일의 경우 package를 환경에 맞게

추가 하시면 됩니다. 구현이 목적으로 성능등은 고민한 흔적같은 것 없습니다. 그냥 예제로 봐주세요.ㅋ

그리고 Spring MVC컨트롤러에 대한 이해가 없으신 분들은 *.do로 호출되는 기능들만 따로 떼서 구현해보셔도 되겠습니다.

예전에 JAVA의 Swing을 사용해서 Thread 구현하여 만들어본 프로그레스바 외에는 이제까지 웹으로 프로그레스바를

구현해본적이 없어서 바로 감이 오지는 않았고 사실 구현 전에는 적당한 예제 소스를 많이 검색해 봤습니다. 근데 괜찮다 싶은

모듈이어도 적용하기가 어려운 경우가 많고 모바일 웹 화면에서 사용하려면 UI도 수정해야 되는 경우가 많았고 대부분의

예제는 JSP → <form> action으로 서블릿 호출 → 서블릿에서 Apache Commons Upload를 통해

전송상태를 PrintWriter로 출력 하는 것이 대부분이었습니다. 또한 파일 업로드 자체는 XMLHttpRequest에서 지원하지

않아 jQuery.form 라이브러리를 사용한 ajaxForm()등을 사용하여 업로드 하는 방식을 많이 보게 됐는데 잘 적용되지

않았습니다. 저의 경우 Spring Web MVC를 사용하여 구현하고 있었는데 이 구조 특성상 request가 완료된후 페이지로

포워딩 하므로 중간에 프로그레스 상태를 listen하여 화면에 출력될때 어떻게 하면 좋을까 고민이 됐습니다. 한참 고민중에

세션이 생각이 나더군요. 제가 만든 예제의 대략적인 프로그레스바 출력 흐름은 다음과 같습니다.

progressbardemo.jsp 에서 파일 선택후 전송버튼 클릭시 AJAX로 fileupload.do

(스프링 컨트롤러(Controller.java)에 매핑된 주소) 호출 ,

호출시에 jQuery.ajaxStart()에서 uploadstatus.do를 호출하여 fileupload.do가 실행중의 프로그레스 상태를

얻어오기 위해 주기적으로 UploadProgressListener를 호출함

fileupload.do에서 Apache Commons Upload를 사용하여 업로드 처리 중

UploadProgressListener에 세션을 셋팅 →

UploadProgressListener의 update()메소드에서 업로드 진행상태를

세션에 셋팅해서 upstatus.jsp로 포워딩함 →

초기에 progressbardemo.jsp에서 ajaxStart()에서 uploadstatus.do가 호출될때 세션에 셋팅된 파일의 전송정보

(읽은 바이트수, 전체크기, 전송속도) 등을 JSON으로 출력함 →

전송완료후 clearInterval로 setInterval로 확인하던 업로드 상태를 중지시킴

jQuery가 AJAX요청시에 지원하는 표현 간단하면서 강력한 기능들이 많은 도움이 됐네요. 이걸 이전 방식으로 XMLHttpRequest

를 일일히 얻어와서 구현하는 형태로 만들었다면 소스량도 많아지고 많이 복잡했겠지요. 예제 내용은 사실 효율적으로 보면

매우 좋지 않습니다. 결과만 보기위해서 만들긴 했습니다만 일단 실 서비스에 적용해서 사용한다면 파일 업로드가 진행중일때

upstatus.jsp가 JSON String을 얻어오기 위해 계속해서 호출이 되므로 여러 사용자가 사용시 서버에 많은 부하가 걸릴 수

있습니다. 이 방법보다는 MVC컨트롤러가 호출될때 세션에 셋팅된 파일 전송 정보 JSON Object를 얻을수 있는 방법을

전에 어느분의 블로그에서 본것 같은데 기억이 가물하네요. 찾아서 한번 적용해 봐야겠습니다.

또한 Spring Framework 자체에서 Apache Commons Upload를 Injection해서 사용할 수 있는 방법도 봤습니다만

일단은 익숙해진 방법으로 구현했습니다. 좀 더 효율적인 방법으로 수정해서 사용하실 분은 공유 해주셨으면 좋겠네요.

보통 파일 업로드 모듈이 Flash나 Flex를 사용한 환경이 많아 모바일 환경에서 사용자체는 가능하나 잘 맞지 않고 현재 제가

만든 게시판의 경우 하이브리드 앱 형태로 웹뷰를 사용한 앱위에서 웹페이지를 호출하는 형태인데 자료를 찾다보니 이 또한

안드로이드 앱 자체에서 업로드 진행상태 구현 방법에 대해서만 많이 나와 있어서 구현해 보게 됐습니다. 다운로드의 경우

에도 구현할수는 있겠지만 보통 다운로드의 경우 브라우저에서 진행상태를 보여주는 경우가 많으므로 생략했습니다.

좀 더 효율적인 방법 제시해주시는 분들은 언제나 환영입니다^^


신고

얼마전 공부겸 해서 Spring Framework 2.5, jQuery, iBatis를 사용한 모바일 전용 게시판을 제작 했습니다.

처음에는 그냥 기본적인 기능만 만들고 다른것 좀 공부 하려고 했는데 만들다 보니 재미가 붙어서 파일 업로드 기능도

추가 하게 됐습니다. 다중 업로드도 구현하려고 했지만 귀찮아서 단일 업로드만 구현하게 됐네요.

여튼.. 파일 업로드를 워낙 오랜만에 구현하려다 보니 기억나는 것도 없고 뭘 사용할까 고민이 됐습니다. 그래서 검색하다보니

가장 많이 사용하는듯 한 라이브러리로 cos.jar가 눈에 띄었습니다.

(com.oreilly.servlet의 약자이죠. 오라일리 책 시리즈로 으로 유명한..)

하나는 Apache Commons Upload 였는데 둘다 구현하기가 까다로운 편은 아니나 cos.jar가 구현방식 자체는 상당히

간편해 보였습니다. 그래서 cos.jar를 사용해서 파일 업로드를 구현하기로 맘 먹게 됐습니다. 하지만 cos.jar를

사용해서 구현 후에 다시 Apache Commons Upload를 사용하게 되었는데 구현시의 다른 부가적인 조작 편의성에 대해

의견을 써볼까 합니다.

※구현 방법등에 대해선 다루지 않겠습니다. 다른 훌륭한 분들이 올리신 구현 소스들은 조금만 검색해보셔도 많으니까요.

   또한 사용예로 제가 중간에 넣은 소스들은 단지 비교를 위한 예제 이므로 동작하지 않습니다. 참고만 하세요.


기능구현은 위와 같이 간단히 하기로 했습니다. 파일 선택 부분은 기능 구현 완료시 게시판의 UI에 추가 하기 위해서 스타일링

했네요. cos.jar 를 사용하던 Apache Commons Upload를 사용하던 업로드 시에는 BInary 코드로 보내게 되므로

<form>을 통해 전송시 enctype="multipart/form-data", method="post" 를 추가해서 보내게 되어 있습니다.

이렇게 전송된 데이터는 cos.jar를 사용할 경우 HttpServletRequest자체를 넘겨받아 내부에서 업로드를 몽땅 처리 하도록 되어

있습니다.

사용예)

MultipartRequest multi = null; 
  try{
    multi = new MultipartRequest(request, uploadFilePath, uploadFileSizeLimit, "utf-8",

new DefaultFileRenamePolicy());

   }catch(Exception e){}

위와 같이 MultipartRequest 의 객체가 생성되면서 넘겨받은 HttpServletRequest, 업로드할 경로, 업로드할 사이즈 제한

값등을 넘겨주면 바로 파일이 업로드 됩니다. 간단히 기능 구현시 이와 같이 사용법이 너무 심플하고 편하기 때문에 많이

이용되고 있는것 같습니다. 그럼 이번에는 Apache Commons Upload의 구현 방식을 보겠습니다.

사용예)

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if( isMultipart ) {
    File temporaryDir = new File(uploadFilePath);
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(factoryThresholdLimit);
    factory.setRepository(temporaryDir);
    ServletFileUpload upload = new ServletFileUpload(factory);

    List items = null;
    try {
        items = upload.parseRequest(request);
    } catch (FileUploadException fe){
        System.out.println(fe);
    }
    if(items!=null){
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem fileItem = (FileItem) iter.next();
            if (fileItem.isFormField()){
                //파일을 제외한 나머지 파라미터 처리
            }else{
                //파일 업로드 처리
                try{
                    File uploadedFile = new File(uploadFilePath, serverFileName);
                    fileItem.write(uploadedFile);
                } catch(Exception e){                      
                    System.out.println(e);
                }
            }
        }
    }
}

분석을 떠나서 cos.jar의 구현 방식에 비해 뭔가 좀더 복잡해졌다는 느낌부터 오실 것 같습니다. 물론 더 간단하게 구현은

가능합니다만 그냥 라인 수로만 봤을때 cos.jar가 더 심플합니다. 이제 구현 방식에 대해 비교를 좀 더 해보죠.

cos.jar를 HttpServletRequest를 통채로 넘겨받아 라이브러리 내부에서 전체적인 처리를 합니다. 보통 파일 업로드를

구현할때 단일 모듈로 파일 업로드 자체만을 구현할때도 있겠지만 보통은 파일정보 외의 다른 정보도 처리 해야 할때가

많이 있습니다. cos.jar사용시 기존의 HttpServletRequest로는 파일 정보외의 정보를 받을수가 없습니다. 위의 구현

예로 보시면 MultipartRequest multi 를 통해 다른 파라미터를 처리 할 수 있습니다.

ex) String name = multi.getParameter("name");

cos.jar의 경우 소스를 함께 제공하기 때문에 소스를 수정하여 여러가지 컨트롤을 개발자가 수정할수도 있겠지만

남이 만들어놓은 소스를 일일히 분석해서 구현하기에는 저같이 귀차니즘에 빠진 개발자분들에게는 무리라고 봅니다.

cos.jar가 업데이트가 자주 이뤄지진 않지만 혹시라도 업데이트가 이뤄지면 해당 내용에 맞춰서 다시 수정해야 하는

불편함도 감수해야 할수도 있겠죠. 제 경우에는 외부 라이브러리는 피치못할 사정이 없는한 수정하는 경우를 피하는

편입니다. 어쨋든 저렇게 MultipartRequest의 getParameter()를 사용해서 나머지 파라미터들을 처리 할수는 있으나

파일의 경우 보통 서버에 실 파일명으로 보존하는 경우는 그렇게 많지 않을것 같습니다. 저의 경우 직접 원본파일의

접근을 막기위해 중복되지 않는 난수 키값을 생성해서 원본파일명으로 저장 시키고 사용자가 웹에서 요청시에는

이 파일을 웹에서 접근가능한 context의 Temporary 디렉토리에서 읽어오도록 구현하는 것이 목적이었습니다.

하지만 cos.jar에서는 이와 같은 처리는 소스를 수정하지 않는한 불가능 하며 파일 업로드가 완료된후에 파일명을

바꿔주는 방식으로 밖에는 처리 할수가 없습니다. 혹시나 해서 찾아봤지만 제가 아는한은 수정밖에는 방법이

없었습니다. 그래서 Apache Commons Upload로 업로드 모듈을 교체 하게 됐습니다.

위의 예와 같이

            FileItem fileItem = (FileItem) iter.next();
            if (fileItem.isFormField()){ //
파일을 제외한 나머지 파라미터 처리 }

파일 정보외의 파라미터들을 처리 할수 있으며 이 정보를 HashMap에 담아 처리 할수도 있겠습니다. 물론 cos.jar 사용

시에도 파일정보외의 파라미터들을 처리하는데에는 불편한 점은 없었습니다.

            }else{
                //파일 업로드 처리
                try{
                    File uploadedFile = new File(uploadFilePath, serverFileName);
                    fileItem.write(uploadedFile);
                } catch(Exception e){                      
                    System.out.println(e);
                }
            }


하지만 위와같이 파일 정보에대한 가공처리 후 실제 디스크에 쓰기 작업을 하는 동작이 이뤄져야 할때

Apache Commons Upload를 사용하는 것이 상당히 맘에 들었습니다. 또한 구현하다보니 파일 다운로드 시에는 굳이

진행상태를 표시해줄수 있는 프로그레스바를 구현하지 않아도 진행상태를 알수있어서(모바일의 경우) 구현할 필요가 없었지만

업로드의 경우 프로그레스바가 필요했습니다. 그냥 스피너 프로그레스바로 진행중이라는 상태만 보여줄수도 있겠지만

누구나 내가 기능을 실행했을때 얼마나 진행됐는지를 알고싶어 하는것이 당연하겠지요. 그래서 결국 구현을 하다보니

cos.jar 사용(기본 라이브러리 상태)으로는 이 역시 불가능 하다는 결론을 내렸습니다.

(혹시 방법이 있으신분 있다면 피드백 주시면 대단히 감사하겠습니다!)

Apache Commons Upload의 경우 ProgressListener를 구현하여 프로그레스 상태를 Listen할수 있으므로 진행상태를

웹상에서 보여주는것이 가능합니다.

사용예)

           ProgressListener progressListener = new ProgressListener(){

                private long megaBytes = -1;
                public void update(long pBytesRead, long pContentLength, int pItems) {
                    long mBytes = pBytesRead / 1000000;
                    if (megaBytes == mBytes) {
                        return;
                    }
                    megaBytes = mBytes;
                    System.out.println("We are currently reading item " + pItems);
                    if (pContentLength == -1) {
                        System.out.println("So far, " + pBytesRead + " bytes have been read.");
                    } else {
                        System.out.println("So far, " + pBytesRead + " of " + pContentLength
                                           + " bytes have been read.");
                    }
                }
            };

            //프로그레스 리스너를 파일업로드시 추가한다.
            upload.setProgressListener(progressListener);

실제 디스크에 파일이 저장되기전 Apache Commons Upload의 경우 임시 파일 업로드를 진행합니다. 구현 하기에 따라

임시 업로드 디렉토리를 따뤄둬서 업로드 진행중 실패시 원본 저장소의 데이터를 해치지 않도록 할수도 있겠습니다.

또한 WEB-INF/web.xml 에 org.apache.commons.fileupload.servlet.FileCleanerCleanup 리스너를 추가하여

이와같은 쓰레기 파일들을 알아서 삭제하도록 할수도 있습니다.

성능상의 차이는 체감상 크게 느껴지지 않아서 잘 모르겠습니다. 두 가지 라이브러리가 사용용도에 따라서 훌륭한 모듈이라

모듈의 문제로 속도가 저하 된다거나 하기 보다는 I/O가 발생하는 Task이므로 하드웨어, 전송환경등이 더 중요하다고

생각됩니다. 글을 작성하다보니 cos.jar를 너무 무시 한듯 하네요. ㅎㅎ 정리하자면


cos.jar : 웹 to 웹으로 전송해야되는 간단한 데이터, 진행상태 표시 구현이 필요없는 파일 업로드 기능 구현시

매우 간단하게 구현 가능한 장점을 가짐, 소스가 제공되므로 개발자 편의에 따라 소스를 수정하여 사용할수도 있음.

(다만 얼핏 보기로는 cos.jar가 오픈소스는 아니라고 봤습니다. 이 부분에 대해서는 잘 판단해보시길..)

Apache commons upload : 일반적인 파일 업로드 기능 외에 파일명이나 저장되야할 위치에 대한 조작등 개발

의도에 따른 소스 구현이 좀 더 유연함. 업로드 진행상태를 알 수 있는 프로그레스바 구현을 ProgressListner를

통해 쉽게 구현 할 수 있음.

심플한 구현에 있어서는 cos.jar를 사용하는것이 감히 최고라고 말씀드릴수 있겠네요. 두개의 라이브러리 모두 장점이 있으니

적당한 라이브러리를 선택하셔서 개발시 도움이 됐으면 합니다. 자료를 찾다보니 구현방법은 많이 있는데 딱히 어떤 모듈을 구

현할때 사용햇으면 좋겠다 하는 내용이 없네요.


신고

어제 새벽에 늦은 밤참을 먹고 소화가 안되서 잠시 쉬던중 아파치 서버를 신버전으로 교체

하였습니다. 아직도 리눅스 아파치 서버와는 달리 메모리 누출이 많이 생기고있는데 테스트

해보니 아마도 PHP가 궁합이 맞지 않아서 그런듯 싶습니다. 어제 혹은 지난 주말에 제 블로그

에 방문 하신분들은 페이지가 뜨지 않거나 Out of memory 메시지를 보셨을텐데 고쳐야할것

들이 상당히 많군요. 서버 업데이트를 하면서 필요없는 모듈로딩을 막고 여러가지 설정을

변경,서버를 최대한 단순화 시켰습니다. 트랙백이 안걸리는 이유는 아마도 서버의 보안모듈들

문제인듯 싶은데 이는 몇가지 테스트를 해봐야 알듯 싶습니다. 그래서 일단은 보류 ;;

운영체제.. 비스타 정말 쥐약 이군요. 비스타에서 시험적으로 서버를 개인적으로 운영한지

반년이 지났지만 이전에는 없던 문제들이 아직도 너무나 많네요. 지금까지의 업데이트

수준을 봤을때 조만간 비스타 서비스팩1 이 나올듯 합니다. 어쩌면 비스타는 윈도우

98 SE이후 수많은 오류등으로 외면받았던 윈도우 ME와 비슷한 길을 걷게 되지 않을까

생각해봅니다.. 어쨋든~ 서버를 업데이트 했으니 한번 테스트들 부탁드리구요.

날씨가 갈수록 추워지고 있습니다. 찾아오시는 모든분들 감기 조심하시길 바랍니다.

(트랙백 전송 문제를 해결했습니다. 예상대로 보안모듈과 서버간의 문제가 있었습니다.)

신고

(이 글은 윈도우용 아파치 서버 2.2.x 버전을 기준으로 작성되었습니다. 1.x 버전의 아파치 서버나
 리눅스용 아파치 서버에는 적용되지 않는 부분이 상당수 있으므로 이 점 참고하시기 바랍니다.)

APM을 설치하고 나서 기본설정만으로 운영할수는 있으나 서버의 전체적인 성능과 보안을 위한
설정을 해주는것이 좋다. 아래의 내용은 아파치 재단 홈페이지(http://apache.org) 에서 배포하는
윈도우용 2.2.4 아파치를 기준으로 수정했고 RWAPM의 설정파일 내용중 대부분을 참고했다.

-참고사항(수정한 부분, 사용자환경에 맞춰서 바꾸도록 한다.)-
 ⊙ 아파치서버가 설치된 디렉토리 : C:\APM\Apache2
 ⊙ PHP가 설치된 디렉토리 : C:\APM\PHP
 ⊙ PHPmyadmin 이 설치된 디렉토리 : C:\APM\phpmyadmin
 ⊙ '#'은 주석을 의미하며 아래 설정파일 내용은 그대로 복사해서 사용가능하다.

-------------------------------------------------------------------

#서버가 설치된 경로
#가능하면 Apache나 APM은 루트디렉토리에 설치하는것이 좋다. 설정도 편해지고 긴경로가
#정확하지 않으면 기타 모듈들이 제대로 읽히지 않을수도 있다.

ServerRoot "C:\APM/Apache2"

#PID(Process ID) : 아파치 프로세스의 고유ID가 저장되는 파일을 저장하는 경로를 정해준다.

#Timeout : 클라이언트 접속시 받기, 보내기의 타임아웃 시간을 지정한다. 시간이 너무 짧을경우
#클라이언트가 서버의 내용을 제대로 읽지 못하고 튕겨질수 있다.

#KeepAlive : 서버의 전반적인 성능에 영향을 주는 지시문이다. 클라이언트가 한번의 접속으로
#지속적인 요청을 수행할수 있게할지 못하게할지 설정해주는 부분이다. 서버의 사양이 좋지 않다면
#부하가 심할수있으나 접속자가 적고 저사양의 서버라면 Off로 해두는것이 좋다.

#MaxKeepAliveRequests : KeepAlive와 연관된 부분으로 지속된 접속시간동안 처리할수 있는
#최대 요청갯수를 의미한다. 높은값을 주는것이 좋다.

#KeepAliveTimeout : 클라이언트가 접속상태에서 해당 클라이언트의 요청이 타임아웃되는 시간

PidFile logs/httpd.pid
Timeout 300
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 30

#Multiprocessing Module 섹션
#아파치 서버의 1.x 버전에서는 없던 기능이 2.x에서 부터 추가되었으며 1.x버전보다 적은 자원을
#사용해서 여러요청을 처리할수 있게 했다는 한마디로 성능이 향상된 부분이다.

#ThereadsPerChild : 하나의 프로세스당 몇개의 thread를 유지하고 있을지 설정해주는 부분이다.
#최대 1024까지 늘릴수 있는데 리눅스용은 재컴파일을 통해 이를 수정할수 있다. 서버의 사양이
#좋지 않다면 이값을 과도하게 늘리지 않는것이 좋다.

#MaxRequestsPerChild : 하나의 프로세스가 몇번의 요청을 수행하고 죽을지 설정해주는 부분이다.
#아래 내용과 같이 설정하면 10000번의 요청을 수행한뒤 ChildProcess하나가 죽고 새로 생성된다.
#값을 '0'으로 주면 무한대를 의미하며 서버의 사양이 좋지않다면 1000정도의 값을 권장한다. 무한대
#로 설정하는것이 좋을수도 있으나 일반PC를 서버로 쓰는경우 여러가지 오류로 메모리 누출이 생길
#수 있으므로 값을 적당히 설정해주는것이 좋다.

#Win32DisableAcceptEx : 가끔 네트워크를 사용할수 없다는 오류를 에러로그에서 발견할수있는데
#이구문을 활성화 하면 괜찮아진다.

<IfModule mpm_winnt.c>
ThreadsPerChild 200
MaxRequestsPerChild  10000
#Win32DisableAcceptEx
</IfModule>

#읽어들일 포트번호 설정
#기본적으로 80번포트가 웹서버 포트이나 ISP들이 자체적으로 막아놓은 경우가 있다. 이경우엔
#다른 포트를 사용해야 하는데 8080,9999등의 포트가 많이 쓰인다. 이경우 Listen 9999 등으로설정
#해주면 된다.

Listen 80

#Dynamic Shared Object (동적공유객체) 모듈 섹션
#아래내용은 아파치 2.x 버전에서 기본적으로 로딩되는 모듈에 몇가지가 추가 되어있는데
#필요없는 모듈은 주석처리를 해서 읽어들이지 않는것이 좋다. 기본적으로 제공되는 모듈외에
#서드파티 모듈또한 LoadModule 지시어를 사용해 쉽게 읽어들일수 있다. 적재순서에 따라
#성능에 영향을 줄수 있다고 한다.

more..

#PHP 모듈 로딩섹션
#PHP를 연동시키기 위해 반드시 필요한 설정부분이다. 아파치 2.0.x 버전의 경우 php5apache2.dll
#를 읽어들여야 한다.

LoadModule php5_module "../php5/php5apache2_2.dll"

#Third Party 모듈 설정섹션(mod_evasive, mod_bandwidth, mod_security2)
#아파치에서 기본적으로 제공하는 모듈이 아니므로 따로 구해야한다. 구하지 못했다면 이부분은
#그냥 넘어가도 된다.

#Dos(Denial of Service),DDos(Distributed Denial of Service) 공격 방어 모듈설정
#리눅스의 경우 iptable을 사용해 근본적으로 막을수 있으나 윈도우에서는 IPsec등을 사용해야
#한다. 이 모듈은 개인용도의 서버에는 쓸만한 모듈이지만 과도한 공격이 시도될경우 서버가
#뻗어버릴수 있다. 이 모듈은 윈도우용으로 기본제공 되지 않으며 http://apachelounge.com
#에서 구할수 있다.

LoadModule evasive_module modules/mod_evasive.so
<IfModule evasive_module>
    DOSHashTableSize    3097
    DOSPageCount        70
    DOSPageInterval     1
    DOSSiteCount        200
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSLogDir "C:/APM/Apache2/logs"
</IfModule>

#Apache 방화벽 ModSecurity2 설정
#1.x 버전의 경우 한개의 설정파일에서 모든것을 관리했으나 2.x 버전에서는 여러가지 설정으로
#많은 부분의 부적절한 접속 시도를 막아준다. 상용 방화벽에 버금가는 강력한 공개 방화벽 모듈
#로 알려져있다. 윈도우용이 제공되지 않으며 http://apachelounge.com 에서 구할수있다.
#2.0.x , 2.2.x 버전에서 사용가능하다.

LoadModule security2_module modules/mod_security2.so
<IfModule security2_module>
Include conf/security/modsecurity_crs_10_config.conf
Include conf/security/modsecurity_crs_21_protocol_anomalies.conf
Include conf/security/modsecurity_crs_35_bad_robots.conf
Include conf/security/modsecurity_crs_45_trojans.conf
Include conf/security/modsecurity_crs_55_marketing.conf
Include conf/security/modsecurity_crs_20_protocol_violations.conf
Include conf/security/modsecurity_crs_30_http_policy.conf
Include conf/security/modsecurity_crs_40_generic_attacks.conf
Include conf/security/modsecurity_crs_50_outbound.conf
</IfModule>

#Bandwidth(대역폭) 제한모듈 mod_bandwidth 설정
#전송되는 파일의 속도를 일정하게 유지시켜주는 모듈이다. 아래의 LargeFileLimit 부분의
#1024 250000 의 의미는 1024kb 가 넘는 파일은 250kb의 속도로 전송하라는 의미이다. 사용자의
#환경에 맞춰 수정해서 사용하면 된다. 이 모듈역시 http://apachelounge.com 에서 구할수 있고
#없어졌다면 이블로그에서 찾을수 있다.

LoadModule bw_module modules/mod_bw.so
<IfModule bw_module>
BandWidthModule On
ForceBandWidthModule On
LargeFileLimit * 1024  250000
</IfModule>

#압축전송모듈
#Mod_deflate가 활성화 되있어야 사용할수 있다. 설정에서 정해진 파일들을 읽어들이는
#속도의 향상이 있다.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|bmp|zip|tar|rar|alz|a00|ace|txt|mp3|mpe?g|wav|asf|wma|wmv|swf|exe|pdf|doc|xsl|hwp|css|js|java|c|t?gz|bz2|7z)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>

#서버관리자의 정보를 입력하는 부분이다.
#ServerName의 경우 정해진 도메인명의 이름을 써주는것이 좋지만 localhost나 127.0.0.1을 써줘도
#별 영향이 없으나 정확한 IP주소를 입력할경우 리다이렉션이 가능하게 해줄수 있다.
#UseCanonicalName : Off,DNS의 옵션을 써줄수 있는데 off는 이름기반의 호스트에서 쓰이며 DNS
#옵션은 IP기반 호스트에서 쓰인다. 일반적으로는 Off로 해두면 된다.

ServerAdmin test@example.com
ServerName localhost
UseCanonicalName Off

#Document 디렉토리 설정섹션

#저장될 문서디렉토리를 지정해주는 부분이다. 물론 따로 디렉토리를 설정해 줄 부분이 있다면
#<Directory> 구문으로 추가 및 수정을 할수 있다.

#FollowSymLinks : 윈도우의 단축아이콘은 보안상 사용하지 않는것을 권장하고 있다.

#AllOverride : 인증관련 파일인 .htaccess와 관련된 부분이다. 아파치가 접근할수 있는 디렉토리
#들에 대해 어떤 기능을 허용 또는 거부 할것인지 설정할수 있는 부분이다. none을 권장한다.
#Authconfig,Limit,All,Fileinfo 등의 지시자를 사용할수 있으나 특별한 상황이 없는경우 none을
#사용하도록 한다.

#Indexes : 설정해서 읽어들일 html,htm,php등의 파일이 없을때 파일리스트를 불러 들이는 지시
#자 이다. 타인에게 리스트를 보여주고 싶지 않다면 indexes를 삭제하면 된다.

#Order, Deny, Allow : Order로 allow나 deny를 지정해주고 어느부분에서 허용또는 거부할것
#인지 정한다.

DocumentRoot "C:\APM\htdocs"
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "C:\APM\htdocs">
Options FollowSymLinks Multiviews
AllowOverride FileInfo
Order allow,deny
Allow from all
</Directory>

#User 디렉토리 설정섹션
#이 디렉토리를 통해 간단한 호스팅을 할 수 있다. 예를들어 parkdi 라는 디렉토리를 user
#디렉토리에 넣어두면 사용자의 주소는 http://example.com/~parkdi 가 된다.

UserDir "C:\APM\users"

<Directory "C:\APM\users">
AllowOverride FileInfo AuthConfig Limit
Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

#인덱스로 사용할 파일명 설정 스페이스바로 구분한다. 동일 파일명이 있을시 앞쪽 파일이
#우선권을 가진다.

DirectoryIndex index.html index.htm index.php index.php3
AccessFileName .htaccess

#특정파일 형식을 지정해서 접근하지 못하게 한다. 여기서는 ht로 시작되는 모든파일에 대한
#접근금지와 bak,sav,orig,old 파일의 접근을 금지하고 있다.

<FilesMatch "^\.ht">
Order allow,deny
Deny from all
</FilesMatch>
<LocationMatch /*(\~|\.bak|\.sav|\.orig|\.old)$>
deny from all
</LocationMatch>

#mime.types파일이 저장된 위치를 지정하는 부분
TypesConfig conf/mime.types

#파일확장자를 통해 MIME타입을 알수 있는 문서에대해 기본적으로 쓸 MIME타입을 지정해준다.
#텍스트가 위주라면 text/plain으로 이미지나 바이너리 파일이 있다면 파일을 텍스트 형식으로 불러
#들이지 않게 application/octet-stream 을 입력해준다.

DefaultType text/plain

#인터넷 문서의 형식이 지정되있지 않을경우 파일의 내용을 통해 자동결정 하게 된다. 이를 conf
#폴더내의 magic 파일을 통해서 문서형식을 결정하게 된다.

<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>

#EnableMMAP : 메모리매핑에 관련된 부분으로 성능향상을 가져올수 있다고 하는데 충돌이 생겨
#서버가 다운될수도 있으므로 기본값을 유지하는것을 권장하고 있다.

#EnableSendfile : 커널이 지원하는 형식을 통해 파일을 전송한다.

#HostnameLookups : 클라이언트의 IP,이름을 기록할지의 여부를 결정하는 부분이다. 기본값인
#off로 해둘경우 클라이언트의 IP를 저장하게 되며 on으로 해둘경우 이름으로 저장하게 된다.
#on으로 해두면 적어도 한번은 서버에 네임서버 요청이 발생하므로 꺼두는것이 서버의 부하를
#하나라도 줄여주는 길이다.

HostnameLookups Off
EnableMMAP off
EnableSendfile on

#로그파일이 저장될 형식을 지정하는 부분이다. error 로그의 경우 warn,debug,info,notice,crit
#alert 등의 값을 결합할수 있는데 로그파일의 크기가 상당히 커질수 있으므로 warn으로 지정해
#두는것이 좋다.
#LogFormat : CustomLog지시자에서 사용할 형식에 대한 지정부분이다.

ErrorLog logs/error.log
LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# You need to enable mod_logio.c to use %I and %O
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combined

#로그파일의 위치,형식지정
#형식을 지정하지 않으면 모든 메시지를 로그파일에 저장하게 되고 지나치게 큰 로그파일은 서버
#의 속도를 저하시킨다.

CustomLog logs/access.log common
#CustomLog logs/referer.log referer
#CustomLog logs/agent.log agent
#CustomLog logs/access.log combined

#서버의 정보를 어느정도 까지 보여줄지 지정해주는 부분이다.
#ServerTokens Prod : Apache의 모든정보만 보여줌
#ServerTokens Min : Apache의 버전정보만 보여줌
#ServerTokens OS : Apache의 버전과 운영체제를 보여줌
#ServerTokens Full : 모든정보를 표시함
#ServerSignature : Off로 해두면 브라우저에서 보일수 있는 에러페이지의 아파치 서버 정보를
#숨길수 있다.

ServerTokens Full
ServerSignature Off

#별칭(가짜이름)을 지정해주는 부분이다. 적용예는 'Alias 별칭 실제이름' 으로 지정할수 있다.
#이는 서버의 메인디렉토리에 없는 부분을 마치 있는것처럼 속여주는 부분인데 아래의 예와같이
#메인디렉토리에 phpmyadmin 디렉토리에 phpmyadmin이 설치되있다면 alias를 지정시 따로
#별칭을 만들게 되어 운영이 비효율적이게 된다. 참고해서 수정,사용하도록한다. alias를 사용해서
#다른 디스크드라이브에 있는 내용을 마치 메인디렉토리에 있는것 처럼 사용할수 있다.

Alias /phpmyadmin "C:\APM/phpMyAdmin"
Alias /icons/ "C:\APM/Apache2/icons/"

<Directory "C:\APM/Apache2/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

#디렉토리 목록 표시여부를 결정하는(어떻게 보일지) 부분이다.
IndexOptions FancyIndexing VersionSort

#서버에게 파일,확장자에 대해 어떤 아이콘을 보여줄지 설정해주는 부분이다. 이 설정은
#바로 위에서 FancyIndexing 을 사용했을때 적용가능하다.

more..

#ReadmeName : 디렉토리 목록뒤에 내용을 덧붙힐 Readme파일의 이름을 설정한다.
#HeaderName : 디렉토리 인덱스 앞에 내용을 덧붙힐 파일명을 설정한다.
#클라이언트의 요청시 서버는 readme.html파일을 찾게되고 없으면 txt파일을 찾아서 텍스트
#내용으로 표시하게 된다.

ReadmeName README.html
HeaderName HEADER.html

#디렉토리 인덱싱의 목록에서 제외할 파일명을 설정한다.
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

#문서의 언어를 명시하는 부분이다. 웹브라우저가 이해할수 있는 언어의 문서를 제공할 수 있다.

more..


#언어셋 섹션
AddCharset ISO-8859-1  .iso8859-1 .latin1
AddCharset ISO-8859-2  .iso8859-2 .latin2 .cen
AddCharset ISO-8859-3  .iso8859-3 .latin3
AddCharset ISO-8859-4  .iso8859-4 .latin4
AddCharset ISO-8859-5  .iso8859-5 .latin5 .cyr .iso-ru
AddCharset ISO-8859-6  .iso8859-6 .latin6 .arb
AddCharset ISO-8859-7  .iso8859-7 .latin7 .grk
AddCharset ISO-8859-8  .iso8859-8 .latin8 .heb
AddCharset ISO-8859-9  .iso8859-9 .latin9 .trk
AddCharset ISO-2022-JP .iso2022-jp .jis
AddCharset ISO-2022-KR .iso2022-kr .kis
AddCharset ISO-2022-CN .iso2022-cn .cis
AddCharset Big5        .Big5       .big5

# For russian, more than one charset is used (depends on client, mostly):
AddCharset WINDOWS-1251 .cp-1251   .win-1251
AddCharset CP866       .cp866
AddCharset KOI8-r      .koi8-r .koi8-ru
AddCharset KOI8-ru     .koi8-uk .ua
AddCharset ISO-10646-UCS-2 .ucs2
AddCharset ISO-10646-UCS-4 .ucs4
AddCharset UTF-8       .utf8
AddCharset GB2312      .gb2312 .gb
AddCharset utf-7       .utf7
AddCharset utf-8       .utf8
AddCharset big5        .big5 .b5
AddCharset EUC-TW      .euc-tw
AddCharset EUC-JP      .euc-jp
AddCharset EUC-KR      .euc-kr
AddCharset shift_jis   .sjis

#mime.types파일의 수정없이 MIME설정을 할수 있게 해주는 부분이다. 또한 아래와 같이 특정 파일
#들에 대해 특정타입으로 처리할수 있게 해준다.

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

#AddHandler를 사용함으로 파일들의 확장자나 처리기(예 : CGI라면 Perl등..)을 연결하거나 파일
#타입에 대한 동작을 연결할 수 있다.

AddHandler cgi-script .cgi .pl .pm
AddHandler type-map var
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

#PHP를 위한 설정 AddType 사용으로 php확장자의 파일들에 대한 처리 타입을 지정해주고 php.ini
#파일이 있는 위치를 설정해준다.

AddType application/x-httpd-php .php .php3 .htm .html .inc .phtml
PHPIniDir "C:\APM\php5"

#에러 메시지 다국어 표시 섹션


#이부분을 없애버리거나 주석처리 하면 오류페이지 자체가 뜨지 않는다.

more..

#CodeRed/Nimda 로그를 남기지 않게 하고 차단시켜 MS 홈페이지로 리다이렉트로 이동하는 섹션

more..

#버추얼 호스트 설정파일 인클루드. conf 디렉토리에 두는것이 관리가 편하다.
Include conf/vhost.conf

#아파치 2.x 나 2.2.x 버전중 SSL페이지를 사용할수 있는 버전을 다운로드 해서 설치했고 필요
#하다면 인클루드 시킨다.

#LoadFile bin/libeay32.dll
#LoadFile bin/ssleay32.dll
#LoadModule ssl_module modules/mod_ssl.so

# SSL 버추얼 호스트설정파일 인클루드.

#<IfModule mod_ssl.c>
#Include conf/ssl.conf
#</IfModule>

신고
(이 강좌는 운영자의 싸이월드 미니홈피 http://cyworld.com/hy313 에서 보실수 있습니다.)

90년도 후반부터 현재까지 인터넷사용자가 기하급수적으로
 늘어나고 있다. 80년대부터 90년대 까지

VT기반의 텔넷 서비스를
 이용하던 인터넷사용자들은 90년대에 출시된 윈도우3.1과  Novell Netware

에서 개발된 Winsock과 Mosaic을 통한 편리한
 정보검색도구에 매료되어 많은 사용자들이 모뎀을

사용했다.
 시간이 지나 윈도우95에 인터넷익스플로러와 양대산맥을 이루던  넷스케이프 네비게이터

와 함께 한국 인터넷은 발전해갔지만
이때까지만 해도 PPP연결을 위해 약간의 설정을 해줬어야했고

모뎀의 느린속도 덕분에 텔넷서비스는 살아남을수 있었으나
 ISDN이 상용화되고  후로 ADSL의 상용

화로 인터넷속도와
 편의성이 향상됨에 따라  모뎀을 사용하던 텔넷서비스들은 모습을  감췄다. 90년

도 후반에
 정부차원의 인터넷PC붐으로 많은 가정들 이 싼값에 컴퓨터를 보유하고 인터넷을 할수있

게 됐으며 갈수록
 PC부품값이 하락해  요새는 왠만한 가정집들은 PC를 두대이상  보유하고 있다.

다.
 필자의 경우도 PC 세대와 노트북 1대를 보유하고 있다. 일부러 사서 그렇게 된것이 아니라 업그

레이드를 하고 남는
 부품들을 버리지 않고 시스템구축을 해서 놔둔것이라 그렇게 된것이다. 사실 개

인적으로 웹서버를 운영하는데 있어서 PC
 속도는 아주 많이 중요하지 않다. 셀러론 급의 컴퓨터와

높은
 대역폭의 인터넷서비스를 쓰면 개인용으로 충분하다. 기업단위의 웹서버 운영에  있어서는 상

당히 높은 수준의
보안시스템과 수십만의 이용자를  대비해야겠지만 개인웹서버는 이럴필요가 없다.

어떻게 보면 텔넷서비스 시절의 소모임등의
 동호회 운영이 인터넷 카페등으로 발전.. 이제는 점차적

으로
 개인 홈페이지 운영(개인웹서버를통한)으로 발전할것 같다는 개인적인 생각이다. 어쨋든 이렇

게 남는 컴퓨터나 고성능의
최신컴퓨터로 개인 웹서버를 운영하고 싶은 사용자들을 위해 필자의 경

험을 통한 강의(?)를 할것이다. 강좌내용은 기초적인
 것이고 이론을 배제한 오로지 결과만을 위한 강

의가 될것이다.

APM(Apache,PHP,My sql)을 합한 약어이다.. 이론을 모두빼도


이정도까진 알고있어야 할듯싶다. APM을 쓰는 이유는 간단하다.


설치가 쉽고 웹서버 하면 리눅스를 많이 떠올리는데 이것은 윈도우


기반의 웹서버 이다. 웹서버 구축에 접근하기가 쉽다는 것이다.


아직까지 리눅스는 개인사용자에게 어려운감이 없지 않다.


X윈도우가 있긴해도 아직까지 리눅스는 설정을 위해 커맨드를


직접 쳐줘야되는 불편한 시스템이다. 내맘대로 OS를 수정할수


있다라는 것은 많이 아는 사람들 얘기일뿐 리눅스를 제대로 쓰려면


공부를 해야가능하다는 것이다. 5~6년전쯤에 모컴퓨터 판매업체


에서 윈도우 라이센스 비용을 줄이려고 시스템에 리눅스를 설치


해서 판매한적이 있는데 결과는 물론 대실패였다.


윈도우하면 윈도우 95,98,2000,xp,vista 정도로 생각들 많이


할것이다.


그러나 이속에 꽤 많은 제품군이 숨어있다는 것은 모르는 사람


들이 많으며 필요도 없는데 용량만 차지하는 서버군 제품을


사용하는 사람도 많다. 일단 본론으로 돌아가 APMsetup을


사용가능한 윈도우 제품군을 나열해보겠다.


Windows 95 - 아직도 쓰는사람이 있는지 모르겠지만 불가능하다


Windows 95 OSR,OSR2 - 마찬가지로 불가능하다.


Windows 98,98 Second Edition

 - 가능하지만 보안상의 문제와
 
제어가 번거롭다.


Windows 2000 - 물론 가능하다.


Windows 2000,2003 server

 - 가능하지만 윈도우의 서버제품군에는 IIS가 설치되어있다.

    나중에 설명하겠지만 IIS가 있는상태로는 APM을 이용하기가

    약간 번거롭다.


Windows XP(Home Edition,Professional Edition,64bit edition

                   ,Media Center 2005)

 - 모두 가능하다.


Windows Vista(Beta2)


- 아직 정식 출시는 되지 않았지만 시험해본결과 가능하다.
  (덧붙혀서 Windows Vista 정식버전에서도 사용이 가능하다.
   필자의 경우 현재 Vista ultimate(32bit)에디션을 사용중이다.)


앞서의 강좌에서 APM이 사용가능한 윈도우 제품군과 리눅스에 대한 잡소리를 해봤다. 필자는 x윈도

우가 없던 때에 주로 리눅스를
사용하고 군대가기 조금 전부터 갔다온 이후로  리눅스를 전혀 사용해

보지 않아서 그저 도스의 cd명령어 대신 ls를 사용한다는
것밖에 기억나지 않는다.. 램같은 내머리가

원망스러울 뿐이다.
그래서 웹서버 구축을 하기 위해서 알아봤던게 APM이고 이걸 쉽게 설치해주는

패키지 형태인 APMsetup을 쓰게 된것이다.
컴퓨에 대한 전반적인 기본적 이해가 갖춰진 상태면

APMsetup
을 사용하기 무난하다. 하지만 아무리 쉽다고 해도 ADSL모뎀에 접속하는것 처럼 원클릭

으로 끝나는 것은 아니고 이것도 아주약간
의 설정은 거쳐야 된다. 그러나 리눅스에 아파치서버를 사

용하는
것 보다는 정말 굉장히 쉽다. 필자가 쓸 강좌는 APMsetup을 간단히 이용해보는 정도이며

PHP나 JSP,ASP등을 깊이있게
공부하려는 사람들은 별 필요없는 강좌이다. 이강좌의 중점은 실제로

자기
컴퓨터를 이용한 서버구축일 뿐이다. 그외의 옵션은 알아서 해결하길 바란다.


일단 준비물로는 APMSETUP을 다운로드 해야된다.


http://www.apmsetup.com/download/?mirror=1&filename=APM_Setup5_2006_01_23.exe(출처 : 근사모(http://apmsetup.com)


바로 이툴이 APM서버를 편리하게 구축할수있는 APMSETUP이다. 설치방법은 근사모에서

확인하길 바란다.(덧붙혀 설치방법이라고 해봐야 별것 없다. 그냥 다음버튼만 눌러주면 된다

몇가지 주의할점은 처음 인스톨 한다면 반드시 Full install을 할것! 그리고 경로는 기본경로인

C:\APM_Setup을 사용하는것이 좋다.)

근사모에서 설치방법을 확인하면서 설치를 마쳤다면 이제


약간의 설정을 해줄때이다. 이전에 알아둬야 할것은 인터넷


대역폭이다 앞서 강좌에서 잠시 말했듯이 동시 접속자 10명이상을


수용하려면 속도보다는 대역폭이 넓어야 한다는것이다. 대역폭이


좁으면 동시접속자가 많을때 데이터 전송에 어려움이 많다.


대역폭에 대해서는 찾아보길 바란다. 그저 블로그 형태의 게시판


운영이나 작은 크기의 파일을 다루는 웹서버에서는 그다지 필요


없는 개념이지만 많은 웹서버 구축자들이 이렇게만 이용하려고


하진 않을것이라 생각한다. 웹서버에 게시판을 구축하는것은


나중에 알아보기로 하고 일단 몇가지 설정에 대해 설명하겠다.


기본적으로 웹서버는 윈도우에서 80번 포트를 이용한다.


이는 웹서버 포트이다. 흔히들 쓰는 프루나는 4662포트를 기본으로


이용하며 1~1000번 까지의 포트는 윈도우에서 예약사용할 포트


들이 많다. 포트번호는 총 1~65535번 까지의 포트가 있다.


포트번호가 중요한 이유는 APM은 당연히 80번 포트를 사용하기


때문이다. 한마디로 아파치 서버는 80번 웹서버 포트를 사용한다고


하면 되겠다. 여기서 문제는 국내의 ISP들 즉 하나로통신이나


메가패스등은 보안을 목적으로 웹서버 포트를 막아놓은서비스가


대부분이라는 것이다. 이경우에 이 포트가 막힌 서비스를 사용하는


사용자는 아무리 설정을 해줘도 근본적으로 막힌 80번 포트를


사용할수 없다는것이다. 그렇다고 전화해서 80번 포트 뚫어주세요


한다고 될리는 만무할것이고.. 필자의경우는 80번 포트가 뚫려


있다. 80번 포트를 사용하지 않을경우 어떤 문제가 있냐면 제일


먼저 홈페이지 주소가 길어진다는 것이다. 예를 들어 필자의


홈페이지를 보자면 http://xens.apmsetup.net 이다.


80번 포트는 기본포트이므로 http://xens.apmsetup.net:80


에서 80을 쳐주지 않아도 접속 가능 하다는 것이다. 그러나 다른


포트를 사용하게 되면 예를들어 80번 포트대신 9999포트를


사용한다면 http://xens.apmsetup.net:8080 으로 접속을 해야되는


불편이 있다.


앞서 포트번호에 대해 설명하였다. 이제는 80번 포트가 막혔을때 포트 포워딩을 사용한 포트 열기에

대해 알아보도록 하겠다.
포트포워딩을 사용하는 이유는 앞서에서처럼 80포트가 막힌사용자들을 위

한것이다. 이것보다 APM에 대한 설정을 먼저
설명해야 옳지만 일단 포트를 제대로 사용하지 못하면

자신의
웹서버의 홈페이지를 다른 사람들에게 게시하지 못하는 중요한문제가 있어서 먼저 설명하도

록 하겠다. 포트포워딩이란 간단히
쓰지 못하게 막혀있는 포트를 다른포트에 명령을 내려서 쓰게


하는 것이다. 윈도우XP SP2를 사용하는 사용자들은 별쓸데없는
윈도우 기본방화벽때문에 p2p서비

스나 이런 웹서버 사용에 곤란을
겪게되는데 방화벽 해제와 포트포워딩에 대해 설명하겠다.


사용자 삽입 이미지

 

(클릭해서보세요) 제어판의 네트워크 연결을 보면 이렇게 자신의컴퓨터에 연결된 이더넷카드(랜카

드)등의 연결 상태를 보여준다.필자의 경우 필자의 컴퓨터는 현재 인터넷을 다른컴퓨터로 공유받아

쓰는 중이다. 사용자마다 연결되있는 형태가 다양하다.가장 주가 되는것은 직접들어오는 회선에 대

한 설정이다.외장형 ADSL모뎀을 쓰는 사람들은 컴퓨터 안의 랜카드를 통해 접속을 하게 되고 내장

형을 쓰는 사람들은 컴퓨터로 바로 연결이 된다. 여기서는 인터넷 공유에 대한 강좌가 아니므로 넘어

가고다른 인터넷 공유강좌에서 다시 설명하도록 하겠다. 위의 그림과 같이 연결속성에서 설정을

눌러주면..

사용자 삽입 이미지

이렇게 예외라는 항목이 뜨게된다. 매우 간단하다 여기서 보면 현재 APM이 설치된 상태라서 방화벽

을 적용할 예외프로그램에 아파치 서버가 등록되있는것을 볼수있다.. 이걸 보기전에 옆의 탭에서 방

화벽 사용안함 설정을 먼저 해줘야 한다.


사용자 삽입 이미지

이렇게 해줬는데 안될때가 있다 이때는 고급탭에서 연결에 대한 방화벽 사용체크를 해제해주고

서비스 설정에서 80번 포트를 사용
할 IP나 컴퓨터 이름을 써주면 된다. 컴퓨터 이름은 바로

사용자 삽입 이미지

제어판의 이곳에서 확인할수가 있다. 위의 설정에서 물론 사용할 포트추가/편집을 할수가 있다.

80번포트가 근본적으로 막힌경우 81,82 혹은 8080 또는 9999등의 포트를 추가해서 사용하면 된다.


여기까지가 윈도우에서의 포트포워딩에 대한 설명이고 공유기를사용하는 경우엔 공유기의

포트포워딩을 사용하면 된다.

(2장에서 계속됩니다.)



신고
(브라우저에서 http://localhost 를 입력해서 apache가 작동되고있는지 확인한모습..)
사용자 삽입 이미지

앞서 강좌에서 아파치서버를 리눅스에 설치 하는것까지 알아보았다. 이제는 환경설정 파일을 수정

해봐야 할때다. 사실 요즘 홈페이지들 특성상 APM(Apache+PHP+Mysql)을 설치하는 경우가 많으나

여기서는 아파치 서버 구동 자체에만 중점을 두겠다. 일단 웹서버 설치 그리고 구동후 궁금한것이

내가 서버에 올릴 홈페이지를 저장할 폴더가 어디인가일텐데 httpd.conf 파일을 열면 찾아볼수있다

기본적으로는 htdocs라는 디렉토리(사진1 참조) 에 저장되며 이 디렉토리는 아까 설치했던

usr/local/apache 디렉토리 내에서 찾을수있다. 필자의 경우는 이 환경설정 파일에서

기본 디렉토리를 public_html로 수정하였다. 밑의 그림이 그 예이다.
사용자 삽입 이미지

★(사진1)
사용자 삽입 이미지
(학교에서 아파치 서버가 잘 설치 됐는지 안됐는지만 확인할것이라.. 소스는 대충 처박았다..
 이것을 기본 htdocs디렉토리에 저장하고나면 아래와 같은 사진화면을 볼수있게된다.)

밑의 사진은 외부접속과 내부 접속을 확인해본 사진이다. 밑에서 설명하겠지만 이는 Vmware의

NAT설정부분의 포트포워딩을 사용한것으로 80번포트(웹서버포트)를 리눅스에서 사용할수있게

설정해준것이다. 물론 포트는 80번 포트외에 가장 많이 쓰이는 8080이나 9999등을 이용할수도

있다. 케이블 모뎀을 쓰는 경우에 많은 사용자들이 80번 포트가 막혀있는 경우가 있는데 저런

8080,9999등의 포트를 사용하는 방법도 있다. 어쨋든 접속 확인 방법은 브라우저상에서

http://localhost/ 혹은 http://127.0.0.1 혹은 Vmware의 가상랜카드에 부여된 IP넘버를 입력해

보면 된다.
사용자 삽입 이미지

아래 사진은 Vmware의 포트포워드 기능을 설정하려는 사진이다. 사진에서 보는것과 같이

edit->virtual network settings 에 들어간다.
사용자 삽입 이미지

위의 과정을 거치면 여기 띄워진 창의 순서대로 NAT을 누르고 edit란 메뉴가 보이는데 그것을

누르면 NAT settings창이 뜬다. 여기서 port forwarding을 클릭하면 Port Forwarding 창이 뜨는데

 처음엔 아무것도 없다. 여기서 Add를 클릭해주면 Map Incoming port 창이 뜨게 된다.

 Host port가 의미하는것은 가상컴퓨터(vmware)가 아닌 현재 쓰고있는 컴퓨터의 포트를 지정해

 주는 것이고 우리는 웹서버(80)번 포트를 사용할것이기 때문에 80번 포트를 써주었다.

 만약 실제컴퓨터의 OS가 윈도우고 윈도우 서버를 운영한다고 하면 80번 포트 대신에 위에서

 언급했던 8080이나 9999포트를 써줘도 무방하다.

 그밑의 Virtual Machine IP Address는 쉽게 VMware의 가상 랜카드 IP주소를 말한다.(리눅스에서)

 이는 리눅스 터미널에서 'ifconfig' 라는 명령어로 확인할수 있다.(ipconfig는 윈도우용..)

 port는 동일하게 설정해주면 된다. 이런 설정을 거친뒤에 리눅스에서 아파치 서버데몬을 실행

 해보고 호스트 컴퓨터에서(실제컴퓨터) 브라우저로 실제컴퓨터에 부여된 IP를 입력해서

 테스트 해본다 (예:만약 실제 컴퓨터 IP가 123.45.25.2 라면 http://123.45.25.2를 입력해본다.)

 여기서 홈페이지 내용이 뜬다면 성공한것이다.
사용자 삽입 이미지

여기까지 Vmware를 활용한 리눅스 웹서버 설치 강좌를 마친다. 사실 인터넷에서 찾아보면

이에 관해 많은 내용들이 있다. 나도 리눅스를 잘사용하지 않는 초보이기 때문에 같은 초보의

입장에서 설명해줄수 있을듯 해서 이강좌를 만든것이고 도움이 됐으면 한다. 인터넷에서 본

대다수 글에서는 그저 커맨드만 입력하라고 쫙 써놓은 글이 많은데 정말 입문자에게는 터미널이

왜 있는지도 모르는 경우가 많다. 그리고 어디에있는지도 왜써야하는지도.. 그래서 부족한 점도

있지만 처음부터 쭉 설명한것이다. 사진캡쳐가 제멋대로 되어있는부분이 많은데 충분히

할수있을것이라 생각되며 궁금한점은 아는데 까진 답변하도록 노력하겠다.
신고
(매끄러운 진행을 위해..반말좀 쓰겠습니다..죄송 ㅡㅡ;;)
 
리눅스로 웹서버 구축할일은 사실 없었다. 윈도우 아파치 서버를 항상 이용해와서 다들 M$라고

 욕들하지만 난 개인적으로 GUI(Graphic User Interface)를 좋아하기 때문에.. 많은 커맨드 입력을

 요구하는 리눅스는 기피해왔었다. 사실 잘다루지도 못한다. 어쨋든.. 공교롭게도 이번에 학교에서

 해야될것이..1차 과제가 리눅스로 아파치서버를 구축하는 것이어서 제로보드4와 Mysql 5.x와의

 삽질의 후유증이 끝나기도 전에.. 구축을 하게됐다. 사실은 웹서버만 달랑 설치했다고 끝나는건

 아니지만 그래도 설치라도 해야 뭘 설정을 하던 말던 할것 같아 같은 초보의 입장에서 상세히

 이 강좌를 진행하려 한다. 그림파일이 캡쳐하기가 귀찮아서 다소 미흡하지만 이해해주길 바란다..

 일단 필자의 준비물은 다음과 같았다.

1.Vmware workstation 5.5.3 build 34685(현재기준 최신판)
2. Fedora core 4(CD #4)
3. Apache 2.0.50(Linux용 tar.gz형식으로 이루어짐..zip파일은 윈도우용..)
  (파일은 http://www.apache.org 에서 구할수 있다.)
4. 설치를 기다리는 인내심

(Vmware에대해 잘 모른다면 VMware는 가상컴퓨터라고 쉽게 생각하면 되며 이는 나중에 따로
 강좌를 만들 생각입니다. 여기서는 리눅스로 웹서버를 만드는 과정만을 소개하겠습니다.)

사용자 삽입 이미지
여기에 터미널이 숨어있다.. 이렇게 들어가기 불편하면 오른쪽 마우스를 클릭해서 패널에 추가해서

들어가면 편하다.

사용자 삽입 이미지
 이화면은 페도라 코어 6을 설치하고 터미널 창을 실행시킨 모습이다. 터미널창은 프로그램->시스템
 도구->터미널을 살짝 눌러주면 위와 같은 창이 뜨게되며 여기서 명령어를 입력할 수 있게된다.

 사진에서 나오는 모습은 Apache서버 압축(tar.gz)파일을 풀어놓은 상태이다. 여기까지에 대해서

 설명하겠다. 일단 터미널 창을 띄운뒤엔 화면에 '[root@localhost local]# ' 이라고만 뜬다.

 그럼 여기서 나는 usr디렉토리 내의 local디렉토리 내의 apache디렉토리에 아파치서버파일의

 압축을 해제 할것인데 방법은 아래와 같다.

 (터미널창)
 [root@localhost local]# cd usr/local <--cd 부분부터 입력해주면 된다.
 [root@localhost local]# tar xzvf httpd-2.0.50.tar.gz <-- 이파일은 이곳에 옮겨놓은 아파치서버
  압축파일이다. usr/local 디렉토리를 검색하고 싶다면 컴퓨터->파일시스템을 눌러보면 금방
  찾을수있고 저 다운로드 받은 파일은 그냥 잘라서 붙혀넣기 해도 무방하다. 어쨋든 이명령어는
  원본 파일의 압축을 ' httpd-2.0.50 ' 디렉토리에 쫙 풀어줄것이다..

사용자 삽입 이미지
 아파치 서버 파일들을 컴파일 중인 모습이다. 자여기서.. 한가지 팁! 필자의 경우 처음엔 Redhat

 Linux enterprise as4를 설치했으나 그다음에 Fedora 코어 6을 설치했었다. 여기서 중요한 실수를

 한가지 했는데 사용자 설치를 선택했다면 반드시 개발자관련 패키지들을 설치 하라는 것이다.

 다른건 별 쓸모없고 GCC컴파일러가 설치가 안되있다면 소스컴파일 설치를 할수가 없다.

 (윗 사진과 같은 방법이 소스컴파일설치이다..RPM패키지 설치도 있으나 다른사람들도..다들
  소스 컴파일설치를 추천한다..이유는?...나도 잘모른다..;)
 
 윗 화면이 나오게 하려면 다음과 같은 명령어들을 또 쳐줘야 한다.

 (터미널 창)
[root@localhost local]# cd httpd-2.0.50 <-아까 압축을 풀었던곳으로 이동
[root@localhost httpd-2.0.50]# ./configure --prefix=/usr/local/apache --enable- (아래와 쭉붙혀쓴다.) rule=SHARED_CORE --enable-module=so <-설치환경을 지정한다고 보면되겠다. 윗처럼 쭉 써주면 된다.

 실행하고 나면 위와 같이 컴파일 하는 화면이 뜨게 된다. 시간이 쪼금 걸린다.(2~4분정도..)

★사진(1)
사용자 삽입 이미지

★사진(2)
사용자 삽입 이미지
./configure 명령이 다끝나고 터미널에서 다시 [root@localhost httpd-2.0.50]# 이뜨면

거기서 곧장 make란 명령어를 입력하면 사진(1)과 같은 모습을 볼수있고 그게 끝나고다시

[root@localhost httpd-2.0.50]# 이 뜨면 이번엔 make install을 입력하면 사진(2)같은 화면을

2분정도 감상할수있다.(캡쳐하다 어느게 make를 입력했을때였는지 make install때였는지 헷갈

리는데..별상관없다..)

사용자 삽입 이미지

컴파일 성공여부를 확인해본다.
(터미널창)
[root@localhost httpd-2.0.50]# usr/local/apache/bin/httpd -l (i가 아니라L)
mod_actions.c
(..중략)
mod_so.c <-이게 보여야 컴파일이 성공한것이다.

사용자 삽입 이미지
자! 여기까지 다됐다면 위의 화면 처럼 입력해준다.
[root@localhost httpd-2.0.50]# /usr/local/apache/bin/apachectl start

위의 명령어는 아파치서버데몬 실행 명령어이다. 일단 포트가 열리게 되므로 열린뒤에는

로그아웃하여 다른 사용자 계정으로 들어와도 아파치 서버는 살아있게된다.

여기까지 아파치 서버 설치가 끝난것이고 다음강좌는 접속확인법, Vmware에서 해줘야

할 내용을 설명하겠다. 만약 Vmware를 사용하지 않고 리눅스가 메인OS라면 여기까지만

참고하면 될것이다.(홈페이지 수정방법이나 접속확인등은 다음 장에서 참고바람)

(다음강좌에서 계속)


신고