반응형
반응형
반응형

디렉토리 권한 설정.

<Directory /DOCUMENT_ROOT>
    ~~~
    Require all granted
</Directory>

 

반응형
반응형

퍼온 글

 - http://dochi575.egloos.com/4867779



아파치 포트가 1024보다 크고, root 권한으로 실행하는데,
아래와 같은 오류가 발생하면서 아파치 서버가 실행되지 않는 경우가 있다.

service httpd start
Starting httpd: 
(13)Permission denied: make_sock: could not bind to address [::]:8000
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:8000
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]

이 경우 SELinux(Security-Enhanced Linux) 정책으로 인한 문제이므로, 아래와 같이 확인한다.

sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

setenforce 0

service httpd start
Starting httpd: 
                                                           [  OK  ]

setenforce 1

이 방식으로는 restart를 하게 되면 동일한 오류가 또 발생하기 때문에,
setenforce를 아예 꺼버리거나 아니면 semanage를 이용하여 SELinux 설정을 변경한다.

semanage가 없으면 설치한다.
$ sudo yum -y install policycoreutils-python

설치 완료되면, 
http 포트로 지정되어 있는 설정 정보를 확인한다.

semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

사용하려는 포트가 지정된 포트인지 확인한다.
semanage port -m -t http_port_t -p tcp 8000
/usr/sbin/semanage: tcp/800에 대한 포트가 지정되지 않았습니다

포트가 지정되어 있지 않으면, 해당 포트를 추가한다.
semanage port -a -t http_port_t -p tcp 8000

정상적으로 등록되었는지 확인한다.
semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      8000, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

아파치 restart를 다시 실행한다.
# service httpd restart
httpd 를 정지 중:                                          [  OK  ]
httpd (을)를 시작 중:                                      [  OK  ]



반응형

'Server > Apache' 카테고리의 다른 글

client denied by server configuration  (0) 2021.06.29
[설치] DocumentRoot .. does not exist  (0) 2015.09.23
ssl 설정.  (2) 2015.08.16
[설치] DocumentRoot must be a directory  (0) 2015.06.16
에러 : libexpat.so.0: 열기 실패  (0) 2014.03.24
반응형


<VirtualHost *:80>

    DocumentRoot /home/xxx

</VirtualHost>


위 처럼 설정하고 service httpd restart 했는데.. 다음과 같이 에러가 발생. 해당 디렉토리가 있음에도 불구하고..

Starting httpd: Warning: DocumentRoot [/home/xxx] does not exist



아파치 사용자에 대해서 해당 디렉토리 접근 허용해야 한다.

chcon -R -t httpd_user_content_t /home



반응형
반응형

참고 사이트 : http://14.0.82.81/wiki.php/DocbookSgml/SSL-RedHat-HOWTO


비밀키 생성.

openssl genrsa -out file.key 1024


자필 서명 인증서 생성.

openssl req -new -key file.key -x509 -out file.crt


virtual host 정의.

NameVirtualHost *:443

<VirtualHost *:443>

SSLEngine on

SSLCertificateFile /etc/httpd/conf/server.crt

SSLCertificateKeyFile /etc/httpd/conf/server.key

CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

DocumentRoot /home/xxx/root

</VirtualHost>


아파치 재 구동.

service httpd restart


아래와 같은 에러 발생시 조치 사항.

Starting httpd: Syntax error on line 1027 of /etc/httpd/conf/httpd.conf:

Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration


해결 : yum install mod_ssl(Cent OS 환경)

 - /etc/httpd/modules/mod_ssl.so 파일이 설치가 된다.



반응형
반응형



DocumentRoot 를 사용자 계정의 디렉토리로 사용하려고 conf 를 수정하고 재구동 하는데 아래와 같은 에러가 발생.

 - "DocumentRoot must be a directory"


검색해 보니 selinux 설정 때문이란다. 


해결 1.

 - selinux를 비활성화로 설정 변경 후 리부팅.

 - $ vi /etc/selinux/config 

SELINUX=disabled


해결 2.

 - selinux를 계속 사용해야 한다면..

 - $ chcon -R -h -t httpd_sys_content_t /home/[계정 명]


 - 설정 확인.

 - $ ls -lDZ

unconfined_u:object_r:httpd_sys_content_t:s0





반응형

'Server > Apache' 카테고리의 다른 글

[설치] DocumentRoot .. does not exist  (0) 2015.09.23
ssl 설정.  (2) 2015.08.16
에러 : libexpat.so.0: 열기 실패  (0) 2014.03.24
Apache MPM  (0) 2014.03.24
디렉토리 인덱싱 비활성화.  (1) 2011.12.14
반응형


##################

# 아파치 실행시 에러. #

##################

$ cd /data1/childeye/dev/bin

$ ./apachectl start

ld.so.1: /data1/childeye/dev/bin/httpd: 치명적: libexpat.so.0: 열기 실패: 해당 파일이나 디렉토리가 없음


################

# 라이브러리 확인. #

################

$ cd /data1/childeye/dev/bin

$ ldd httpd

        libexpat.so.0 =>         (파일이 없음)


####################

# 라이브러리 설치 확인. #

####################

$ find ./ -name "libexpat.so.0"

/usr/local/software/expat-1.95.5/.libs/libexpat.so.0



#############

# path 에 추가. #

#############

$ cd

$ vi .bashrc

export LD_LIBRARY_PATH="/usr/local/software/expat-1.95.5/.libs:$LD_LIBRARY_PATH"



반응형

'Server > Apache' 카테고리의 다른 글

ssl 설정.  (2) 2015.08.16
[설치] DocumentRoot must be a directory  (0) 2015.06.16
Apache MPM  (0) 2014.03.24
디렉토리 인덱싱 비활성화.  (1) 2011.12.14
아파치 패치 방법  (0) 2009.02.11
반응형


Apache MPM(Multi-Processing Module) : 다중 처리 모듈

 - Apache 가 받아들인 요청을 처리하기 위해 "자식 process" 에게 분배하는 방식

 - 2.2 에서 (유닉스/리눅스) 기본 설치는 prefork



# 설치된 MPM 확인


$ httpd -l

Compiled in modules:

  core.c

  prefork.c ( or worker.c)

  http_core.c

  mod_so.c


$ httpd -V

Server version: Apache/2.2.3

Server built:   Nov 12 2012 08:48:46

Server's Module Magic Number: 20051115:3

Server loaded:  APR 1.2.7, APR-Util 1.2.7

Compiled using: APR 1.2.7, APR-Util 1.2.7

Architecture:   64-bit

Server MPM:     Prefork





Prefork

 - 일반적으로 single CPU 또는 Dual CPU에서 성능이 좋음.

 - 여러 'child process' 가 각각 하나의 'thread'를 사용 : 자식 프로세스는 1024까지 늘일 수 있다.

 - 멀티프로세스에서는 기본적으로 프로세스 간에 메모리를 직접  공유하지는 않는다. 메모리 공간이 독립해 있으므로 안전

 - 실행중인 프로세스 복제하여 실행( 메모리 영역까지 같이 복제) 프로세스가 소비하는 메모리가 많음.

 - 응답프로세스를 미리 띄워놓고 클라이언트 요청시 자식 프로세스가 반응하게 되는 방식.


<IfModule prefork.c>

StartServers       8

MinSpareServers    5

MaxSpareServers   20

ServerLimit      256

MaxClients       256

MaxRequestsPerChild  4000

</IfModule>



Maxclient 를 늘리기 위한 설정

 - apache소스디렉토리/server/mpm/prefork/prefork.c 파일을 편집

 - define DEFAULT_SERVER_LIMIT 256 => 512 혹은 1024 등으로 변경 


ServerLImit : 서버수. 프로세스 수의 상한

MaxClients : 동시에 접속할 수 있는 클라이언트 수의 상한

prefork 에서는 양자가 거의 같은 의미임.

그러면 이 수치를 어떻게 계산할 것인가?

 - /proc/PID/status 에서 특정 프로세스가 실제 사용하고 있는 물리 메모리 영역은 VmHWM 항목임. 

   그러나 리눅스에서는 물리 메모리를 절약하기 위해 부모 프로세스와 자식 프로세스에서 일부 메모리를 공유함. 

   이러한 공유부분 메모리를 고려해야 함



MaxRequestsPerChild

 - Copy On Write 에 의한 메모리 공유는 시간의 경과에 따라 공유율이 하락해감. 

   아파치에서는 정기적으로 자식 프로세스를 종료시키고 새로운 자식 프로세스를 생성시켜 이러한 상태를 피해감.

   이에 대한 설정이 MaxRequestsPerChild 임.

   예를 들어 이 설정이 1024이면 하나의 프로세스당 1024개의 요청을 처리하면 해당 프로세스는 1024번째의 요청완료 직후에 자동으로 종료하고, 부모 프로세스가 새로운 자식 프로세스를 준비함.

   이 설정은 mod_perl 이나 mod_php 등에서 동작하고 있는 애플리케이션이 메모리 누수(Memory Lock)을 일으키고 있는데도 이를 방치해두고 항상 계속해서 메모리를 소비하도록 할 경우의 응급처치에도 유효






Worker

 - 설치 : ./configure --with-mpm=worker

 - 일반적으로 멀티 CPU 시스템에서 성능이 좋음.

 - 여러 'child process' 가 여러 'thread'를 사용

 - 멀티쓰레드에서는 메모리 공간 전체를 복수의 쓰레드가 공유하므로, 리소스 경합이 발생하지 않도록 주의할 필요가 있다

 - 요청을 thread 단위로 처리( 최대 64개의 thread 처리 가능) 지정된 만큼의 프로세스와 각 스레드를 준비하여 클라이언트의 요청을 받아들이는 설정



<IfModule worker.c>

StartServers         2

MaxClients         150

MinSpareThreads     25

MaxSpareThreads     75

ThreadsPerChild     25

MaxRequestsPerChild  0

</IfModule>





Maxclient 를 늘리기 위한 설정

  1) Maxclient 는  StartServers * ThreadsPerChild 로 정해짐 

    => worker 방식은 각각의 자식프로세스별로 여러개의 thread를 생성해서 요청을 처리하기 때문 

  2) Maxclient 를 늘리기 위한 설정 

    apache소스디렉토리/server/mpm/worker/worker.c 파일 을 수정 

    ( define DEFAULT_SERVER_LIMIT 16 을 변경 )




Prefork 방식과 Worker 방식의 차이점

 - Worker가 Prefork에 비해 적은 메모리 사용한다.

   -> 멀티프로세스의 경우에도 부모와 자식 프로세스에서 갱신되지 않는 메모리 공간은 공유(Copy on Write) 되므로 그렇게까지 현저한 차이가 나는 것은 아니다.

 - Worker : 통신량이 많은 서버에 적절한 형태를 가진다.

 - Prefork : 안전하지 않은 제 3자가 만든 모듈을 사용할 수 있다.

 - Prefork : 디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있다.

 - Worker 와 Prefork의 속도는 비슷하다.

 - 높은 확장가능성(scalability)이 필요한 사이트는 worker 를 사용하고, 안정성과 오래된 소프트웨어와의 호환성이 필요한 사이트는 prefork 사용

 - 멀티쓰레드는 메모리 공간을 공유하고 있으므로, 쓰레드 전환에 걸리는 비용이 멀티프로세스보다 적다. (컨텍스트 스위치 비용)

 - prefork 를 worker로 변경하더라도 하나의 클라이언트에 대한 응답시간이 고속화되는 것은 아니다

 - prefork 를 worker 로 변경하더라도 메모리가 충분하다면 동시에 처리할 수 있는 접속 수는 변하지 않는다.

 - prefork 를 worker 로 변경하더라도 대량의 컨텍스트 스위치가 없다면(동시에 병렬적으로 대량의 엑세스가 없다면) 효과는 크지 않다.




prefork 를 worker 로 변경해서 효과적인 부분

- 이용할 수 있는 메모리 용량이 그다지 크지 않은 경우나, 메모리 소비량을 줄이고자 할 경우. 이런 경우 프로세스보다 메모리 소비량이 적은 쓰레드의 이점이 살아난다.

- 컨텍스트 스위치 횟수가 많아서 그만큼의 CPU 리소스를 줄이고자 할 경우, 즉 대량의 엑세스로 인한 CPU 사용줄이 줄이고자 할 경우. 프로세스보다 쓰레드 쪽이 컨텍스트 스위치 비용은 낮으므로 CPU 소비가 줄어든다.






Timeout

접속된 클라이언트가 서버에 아무런 요청이 없을 때 어느정도 시간이 지나면 연결을 끊을지를 초단위로 설정한다. 네트웍의 성능이 낮을수록 이 수치를 높게 설정하는 것이 좋다.

 


MaxClients

웹서버 성능에 가장 큰 영향을 주는 것은 메모리다. 방문자의 요청에 응답하기 위해서 프로세스가 생성되는되 이 지시자의 개수만큼만 생성가능하다. 여기서 지정한 개수 이상의 요청이 들어오면 아파치는 요청을 무시한다.

MaxClients 지시어를 조절하여 웹서버가 스왑을 할 정도로 많은 프로세스를 만들지 않도록 해야 한다. 스왑은 요청당 지연시간을 늘리기 때문에 웹서버는 스왑을 하면 안된다. top으로 프로세스 목록을 보고 아파치 프로세스의 평균 메모리 사용량을 알아낸후, 사용가능한 메모리의 양만큼 조절해준다

 


KeepAlive

로드밸런서를 사용할경우 off 처리는 필수

아파치의 한 프로세스가 접속한 클라이언트의 지속적인 요청작업을 계속해서 처리하게 할 것인지를 결정하는 지시자. 이 지시자의 값을 On으로 되어 있어야 MaxKeepAliveRequests , KeepAliveTimeout 지시자가 유효하게 된다

 


MaxKeepAliveRequests

이전의 KeepAlive 지시어가 On 일때만 유효하다. KeepAlive 를 이용해서  한 프로세스가 접속한 클라인언트의 이어지는 요청을 모두 처리하도록 설정했는데, 이때 무한정 계속 처리하는것이 아니라 이 지시자를 이용해서 처리할 횟수를 지정해준다. MaxKeepAliveRequests 100 처럼 설정해두면 프로세스가 100번의 요청을 처리한후 자신은 죽고 그다음 프로세스가 다시 클라인언트의 요청을 이어서 처리하도록 하는것이다. 방문자가 많은 홈페이지라면 이 값을 좀 올려두는것이 좋다

 


KeepAliveTimeout

이전의 KeepAlive 지시어가 On 일때만 유효하다. KeepAlive 를 사용한다면 프로세스들은 이미 열린 연결에서 추가 요청을 기다리며 대기중이다.

KeepAliveTimeout 15 처럼 설정해두면 클라이언트가 15초동안 아무요청이 없으면 프로세스의 연결을 끊는다. 이 값을 60 초 이상으로 올리면 사용자의 요청을 기다리며 아무일을 하지않는 프로세스가 60초동안 떠있게 되는것이다. 자신의 네트웍대역과 부하에 따라 적절히 조절하자. 기본값 15 로도 무방하다

 


StartServers

아파치 시작시에 실행시킬 프로세스의 개수. 뒤에나오는 MinSpareServers, MaxSpareServers 등의 지시자에 의해서 프로세스는 생성되기도 하고 죽기도 하므로 큰 의미를 가지는것은 아니다.

 


MinSpareServers

항상 대기하고 있을 프로세스의 최소개수. 여기서 지정한 숫자보다 적은 프로세스가 대기되어 있다면 아파치는 가능한 이 숫자를 유지하기위해 노력한다.

 


MaxSpareServers

항상 대기하고 있을 프로세스의 최대개수. 여기서 지정한 숫자보다 많은 프로세스가 대기되어 있다면 아파치는 가능한 이 숫자를 유지하기위해 노력한다.

 


MaxRequestsPerChild

하나의 프로세스당 최대 처리할 수 있는 방문자의 요청횟수

서버사양이 좋다면 이 값을 높여 두는것이 시스템의 부하조절과 자원낭비를 방지하는데 좋다.

 


HostnameLookups

웹서버의 로그(access_log)에 보면 클라이언트의 IP가 기록되어있는데 이 지시자를 On으로 설정하면 IP주소를 도메인명으로 기록하기위해서 노력을 하게된다.

아파치 1.3 이전에 HostnameLookups의 기본값은 On이였다.

이말은 접속을 요청하면 DNS를 검색해서 접속자의 호스트명을 알아내어야 한다는것이다,. 아파치 1.3에서 이 설정의 기본값이 Off로 변경되었다.

아파치의 성능을 생각한다면 반드시 Off 로 설정하기 바란다.

만일 로그파일의 주소를 호스트명으로 변환할 필요가 있다면 아파치에 포함된 logresolve 프로그램을 사용해서 나중에 할수있으니 실제 사용하는 웹서버가 아닌 다른 컴퓨터에서 로그파일을 후처리하길 바란다.

 


다른 설정에서 DNS 질의 고려

Allow from domain이나 Deny from domain 지시어를 사용한다면 (즉, IP 주소가 아닌 호스트명이나 도메인명을 사용한다면) 부득이 중복-역 DNS 검색을 (역검색을 한후 악의로 변경되었는지 확인하기위해 다시 검색) 해야 한다. 그러므로 성능을 높이기 위해 이런 지시어에는 가능하면 이름대신 IP 주소를 사용하자

 


FollowSymLinks와 SymLinksIfOwnerMatch

가능하면 심볼릭링크를 허용하지 않는것이 보안상 좋다. 하지만 꼭 써야한다면 Options SymLinksIfOwnerMatch 보다는 Options FollowSymLinks를 사용하라

Options SymLinksIfOwnerMatch 일 경우 아파치는 심볼릭 링크를 검사하기위해 시스템호출을 한번 더 해야 한다. 좋은 성능을 얻으려면 SymLinksIfOwnerMatch는 피하자

 


AllowOverride

AllowOverride 는 이전에 설정된 아파치 환경설정을 무시하고 새로운 설정을 적용하는 방법에 대한 설정이다. AccessFileName 을 별도로 설정하지 않았다면 아파치는 .htaccess 파일을 디렉토리 접근인증에 사용한다.

설정할수 있는 지시자는 다음과 같다.

 


AuthConfig 

AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등과 같은 클라이언트 인증지시자의 사용을 허용.

FileInfo

AccessFileName 으로 지정한 파일에 대하여 AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등과같은 문서유형을 제어하는 지시자 사용을 허용

Indexes

AccessFileName 으로 지정한 파일에 대하여 AddDescription, AddIcon, AddIconByEncoding, DirectoryIndex, FancyIndexing 등과같은 디렉토리 인덱싱을 제어하는 지시자 사용을 허용

Limit

AccessFileName 으로 지정한 파일에 대하여 allow, deny, order 같은 호스트접근을 제어하는 지시자사용을 허용

Options

AccessFileName 으로 지정한 파일에 대하여 Options 지시자를 이용한 재설정을 허용

All

위에서 이야기한 모든 것을 허용

None

AccessFileName 으로 지정한 파일을 무시. 어떠한 설정도 재설정 할수 없다.

 


만일 overrides를 허용한다면 아파치는 파일명의 각 부분마다 AccessFileName 으로 지정한 파일(대부분 .htaccess)을 열길 시도한다. 예를 들어 설정은 아래와 같고,

 


DocumentRoot /www/htdocs

<Directory />

AllowOverride all

</Directory>

 


/index.html URI에 대한 요청이 있다고 가정하자.

아파치는 /.htaccess, /www/.htaccess, /www/htdocs/.htaccess를 매번 열려고 시도한다. 최고의 성능을 얻으려면 항상 AllowOverride None을 사용하자.

 


EnableMMAP

커널에서 메모리매핑(mmap)을 지원한다면 아파치가 웹문서를 로딩하기 위하여 내부문서를 읽을때에 파일을 메모리 매핑하여 처리한다. 따라서 아파치의 성능이 크게 향상될수 있다.

그러나 메모리대응이 서버의 성능을 떨어트리고 심지어 안정성을 해치는 경우가 있고 smp Solaris 서버에서 아파치 2.0은 종종 mmap을 사용하지 않을때가 더 빠르다. 

또한 NFS 마운트한 파일시스템에 있는 파일을 메모리 대응하는 도중에 다른 NFS 클라이언트에 있는 프로세스가 파일을 지우거나 파일크기를 줄이면, 웹서버 프로세스가 다음 번에 메모리대응한 파일내용을 읽을때 bus error가 발생할 수 있다.

위의 조건에 해당하면 전송하는 파일을 메모리대응하지 않도록 EnableMMAP off를 사용해야 한다.

 


EnableSendfile

아파치는 운영체제가 sendfile을 지원하면 커널 sendfile을 사용하여 정적 파일을 서비스하는 경우 전송할 파일을 직접 읽지않을 수 있다.

sendfile을 사용하면 read와 send를 따로 할 필요가 없어서 매우 빨라진다.

그러나 sendfile을 사용하면 웹서버의 안정성을 해치게되는 경우가 있고, 커널은 자신의 캐쉬를 사용하여 NFS로 마운트한 파일을 안정적으로 서비스할 수 없는 경우가 있으므로

EnableSendfile off를 사용해서 파일을 sendfile 전송하지 않도록 할수 있다.

 

 

 

설정변경후 아파치 성능 테스트

 

Timeout 120

KeepAlive Off

MaxKeepAliveRequests 100

KeepAliveTimeout 15

HostnameLookups On

#EnableMMAP off

#EnableSendfile off

StartServers       8

MinSpareServers    5

MaxSpareServers   20

ServerLimit      256

MaxClients       256

 Timeout 300

KeepAlive On

MaxKeepAliveRequests 10000

KeepAliveTimeout 25

HostnameLookups Off

EnableMMAP On

EnableSendfile On

StartServers       20

MinSpareServers    15

MaxSpareServers   45

ServerLimit      512

MaxClients       512











# apache 동접자 늘리기


Apache 2.2 는 Apache 1.3 과 매우 다른데, httpd.h 파일에는 Max Client 와 관련한 옵션이 없다.

따라서, Apache 2.2 에서는 2개의 파일에서 설정을 바꾸어 주어야 한다.


Apache source 디렉토리로 이동해서 server/mpm/prefork/prefork.c 파일을 열고

#define DEFAULT_SERVER_LIMIT 256 으로 설정되어 있는 값을 2048 으로 변경하여 저장한다.


여기서, 2048 / 256 을 계산하면 8 이라는 배수가 나온다.  


다시 Apache source 디렉토리로 이동해서 server/mpm/work/worker.c 파일을 열고

#define DEFAULT_SERVER_LIMIT 16 으로 설정되어 있는 값을 128 으로 변경하여 저장한다.


./configure -prefix=/usr/local/apache --enable-rewrite 명령으로 재컴파일 


vi /usr/local/apache/conf/extra/httpd-mpm.conf 파일을 열고


<IfModule worker.c> 지시자내 설정 중 

MaxClients 2048 저장하고 Apache 를 재시작해준다.


work 는 스레드 방식으로 아파치가 작동하도록 하기 위한 설정

prefork 는 전통적인 아파치 실행방식은 prefork 방식의 설정 



또다른 방법으로는

KeepAlive Off 하는것이다...


동접자 확인법

netstat -an | grep :80 | grep ESTABLISHED | wc -l



반응형

'Server > Apache' 카테고리의 다른 글

ssl 설정.  (2) 2015.08.16
[설치] DocumentRoot must be a directory  (0) 2015.06.16
에러 : libexpat.so.0: 열기 실패  (0) 2014.03.24
디렉토리 인덱싱 비활성화.  (1) 2011.12.14
아파치 패치 방법  (0) 2009.02.11
반응형


웹 서버 혹은 웹 어플리케이션 서버에서 디렉토리 인덱싱 기능을 비활성 방법.

[tomcat]
<!--web.xml-->
 <init-param>
  <param-name>listings</param-name>
  <param-value>false</param-value>
 </init-param>

[apache]
<!--httpd.conf-->
<Directory "/usr/local/apache/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.
#

수전전    Options Indexes FollowSymLinks MultiViews
수정후    Options FollowSymLinks MultiViews

#
# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
</Directory>

반응형

'Server > Apache' 카테고리의 다른 글

ssl 설정.  (2) 2015.08.16
[설치] DocumentRoot must be a directory  (0) 2015.06.16
에러 : libexpat.so.0: 열기 실패  (0) 2014.03.24
Apache MPM  (0) 2014.03.24
아파치 패치 방법  (0) 2009.02.11
반응형
[ 패치파일 만들어 적용하기 ]


작성자 : 정택진 (nveteran@netian.com)
작성일 : 2002. 6. 23.


1. 패치파일 만들기 (diff 이용)

- diff 의 쓰임 : 두 대상간의 차이점만을 모아 파일로 저장한다.

- 확장자 : .diff or .patch

- 만들기 전에는 make clean, make distclean, make mrproper 등을 수행하여,

컴파일된 파일을 모두 삭제한 뒤 만듭니다.

- 아래 설명들은 pwd 를 항상 생각하면서 도움이 됩니다.



* 실제 소스 코드를 통한 테스트를 합시다.

- 대상 : wu-ftpd-2.6.2.tar.gz

# cd /usr/src/

# tar xzvf wu-ftpd-2.6.2.tar.gz : 압축 해제

# mv wu-ftpd-2.6.2 wu-ftpd-2.6.2-orig : 원본 백업

# tar xzvf wu-ftpd-2.6.2.tar.gz : 압축 해제 2



* 수정을 해 봐야죠?

# cd /usr/src/wu-ftpd-2.6.2

# vi src/ftpd.c

--------- 수정 전 ----------

int main(int argc, char **argv, char **envp)
{
#if defined(UNIXWARE) || defined(AIX)
size_t addrlen;
#else
int addrlen;
#endif

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

}


--------- 수정 후 ----------

#if defined(UNIXWARE) || defined(AIX)
size_t addrlen;
int myaddr; <================ 한 줄 추가.
#else




# vi src/sco.c

--------- 수정 전 ----------

char *
getcwd(pt, size)
char *pt;
int size;
{
register struct dirent *dp;
...... ( 중략 ) ........
}


--------- 수정 후 ----------

char * getcwd(char *pt, int size) <======== 한 줄로 압축.
{
register struct dirent *dp;
...... ( 중략 ) ........
}



--------- 패치 파일 만들기 ----------

# cd /usr/src/
# ls
wu-ftpd-2.6.2
wu-ftpd-2.6.2-orig


# diff -urN wu-ftpd-2.6.2-orig wu-ftp-2.6.2 > wu-ftp-2.6.2-test.diff
diff [옵션] <원본 파일> <수정본>

-u : --unidirectional-new-file
통일된 출력 형식을 사용.
(디렉토리 비교시, 두 디렉토리중
두번째 디렉토리에만 파일이 존재한다면,
첫번째 디렉토리에는 파일이 없어도 있는 것처럼 처리한다)
-r : --recursive, 재귀적. 하위 디렉토리를 모두 검색한다.
-N : --new-file
(비교하는 디렉토리에 파일이 하나의 디렉토리에만
모두 있는 것처럼 처리하지만 사실 다른 한 디렉토리에는
파일이 없다. 새로 만든다.)


# vi wu-ftpd-2.6.2-test.diff
diff -urN wu-ftpd-2.6.2-orig/src/ftpd.c wu-ftpd-2.6.2/src/ftpd.c
--- wu-ftpd-2.6.2-orig/src/ftpd.c Fri Nov 30 01:56:11 2001
+++ wu-ftpd-2.6.2/src/ftpd.c Sun Jun 23 20:04:57 2002
@@ -567,7 +567,8 @@
int main(int argc, char **argv, char **envp)
{
#if defined(UNIXWARE) || defined(AIX)
- size_t addrlen; // 이 한 줄을 빼고,
+ size_t addrlen // 아래 2 줄을 넣어라.
+ int myaddr; //
#else
int addrlen;
#endif
diff -urN wu-ftpd-2.6.2-orig/support/sco.c wu-ftpd-2.6.2/support/sco.c
--- wu-ftpd-2.6.2-orig/support/sco.c Sun Jul 2 03:36:29 2000
+++ wu-ftpd-2.6.2/support/sco.c Sun Jun 23 20:14:47 2002
@@ -429,10 +429,7 @@
(dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
dp->d_name[1] == '.' && dp->d_name[2] == '\0'))

-char * // 아래 4줄을 빼고,
- getcwd(pt, size) //
- char *pt; //
- int size; //
+char *getcwd(char *pt, int size) // 이 한 줄을 넣어라.
{
register struct dirent *dp;
register DIR *dir;

-----------------------------------------------------------------
다른 설명은 필요 없으리라 봅니다.

--- 로 표시된 것은 원본
+++ 로 표시된 것은 수정본

- 로 표시된 줄은 빼고,
+ 로 표시된 줄로 대치한다.


****************************************************************

diff 파일은 ASCII 형태의 파일이므로, 압축을 하면
상당히 그 양을 줄일 수 있습니다.
일반적으로 tar.gz 혹은 gz 을 사용하니 그대로 사용합니다.

# gzip wu-ftpd-2.6.2-test.diff
# ls
wu-ftpd-2.6.2-test.diff.gz



2. 패치파일 적용하기.

이제 패치 파일을 적용시켜 봅시다.

지금부터는 패치를 만드는 과정은 생각하지 않습니다.

즉 새롭게 소스를 다운 받은 상태라고 생각하고 진행하세요.

그렇다면 그 상황을 만들어 봅시다.

# cd /usr/src

# mv wu-ftpd-2.6.2 wu-ftpd-2.6.2-old

# mv wu-ftpd-2.6.2-orig wu-ftpd-2.6.2
혹은
# rm -rf wu-ftpd-2.6.2-orig ; tar xzvf wu-ftpd-2.6.2.tar.gz

이제 상황이 설정되었죠?

그럼 이제 패치할 파일의 정보를 확인해 봅시다.

# zcat wu-ftpd-2.6.2-test.diff.gz | head -3
--------------------------------------------------------------------
diff -urN wu-ftpd-2.6.2-orig/src/ftpd.c wu-ftpd-2.6.2/src/ftpd.c <=== 주목
--- wu-ftpd-2.6.2-orig/src/ftpd.c Fri Nov 30 01:56:11 2001
+++ wu-ftpd-2.6.2/src/ftpd.c Sun Jun 23 20:04:57 2002
--------------------------------------------------------------------

첫줄을 보시면 patch 를 만들었을 때 정보를 확인할 수 있죠.
즉 어떻게 패치를 적용해야 할 지도 알수도 있는 셈이죠.
diff [옵션] <원본> <수정본>
눈여겨 봐야 할 곳은 <원본>과 <수정본> 디렉토리의 차이점이죠.
적용시킬 때는 <수정본>을 주목합니다.


확인이 끝났으면 원본이 있는 곳으로 갑니다.

# cd wu-ftpd-2.6.2

patch 를 실행시킬 때는 diff 파일의 내용과, 현재 커서가 있는 디렉토리와의
관계를 잘 따져야 합니다.

지금 있는 곳의 디렉토리가 wu-ftpd-2.6.2/ 입니다.
여기서 ls src/ftpd.c 명령을 내린다면 그 파일이 있겠죠?

위의 파일에서 첫번째 줄을 다시 보면, <수정본> 이 wu-ftpd-2.6.2/src/ftpd.c 라고
되어 있습니다. 즉 현재 작업위치가 wu-ftpd-2.6.2/ 디렉토리이니, 이 부분은 건너 띌 수 있는 겁니다.

그래서 여기서 패치 명령을 내린다면,

# zcat ../wu-ftpd-2.6.2-test.diff.gz | patch -p1

-p1 에서 '1' 의 의미는 <수정본>에 관한 정보 " wu-ftpd-2.6.2/src/ftpd.c " 에서
'/' 하나(디렉토리 하나)를 건너띄고 비교해서 패치를 적용시키라는 의미가 됩니다.

이제 감을 잡았나요? patch -p1 의 의미를...


하지만, wu-ftpd-2.6.2 디렉토리로 들어가지 않았았고, 패치 파일이 위와 같은 경우라면
-p0 을 사용하면 된다.

즉 <수정본> 정보에서 wu-ftpd-2.6.2/ 이고, 적용시킬 소스가 있는 디렉토리가 wu-ftpd-2.6.2/ 로
동일하기 때문이다.


-p1 을 먼저 예로 든 이유는 디렉토리명이 틀릴 경우가 많기 때문이다.


(참고) - patch 를 적용시키는데 있어서 여러 방법.
# zcat *****.diff.gz | patch -p1
# gzip -dc *****.diff.gz | patch -p1

# patch -p1 < *****.diff
# cat *****.diff | patch -p1

위의 두 경우는 압축되어 있는 것을 풀어서, 화면상에 표준출력되는
내용을 파이프를 통해 patch 프로세스에 diff 정보를 전달하는 경우이고,

아래 두 경우는 압축되지 않은 것을 redirection 과 파이프를 통해
patch 프로세스에 diff 정보를 전달하여 적용하는 방법입니다.

반응형

'Server > Apache' 카테고리의 다른 글

ssl 설정.  (2) 2015.08.16
[설치] DocumentRoot must be a directory  (0) 2015.06.16
에러 : libexpat.so.0: 열기 실패  (0) 2014.03.24
Apache MPM  (0) 2014.03.24
디렉토리 인덱싱 비활성화.  (1) 2011.12.14

+ Recent posts