로그는 모든 웹 서버에 비종속적으로 사용하기 위해서 Common Log Format(CLF)라는 포맷을 사용하고 있다.
이 포맷은 클라이언트의 요청에 대한 로그를 각각의 줄로 기록을 하게 되며, 한 중에서는 스페이스로 구별을 하여 로그 정보를 적고 있다. 이 파일 포맷은 거의 모든 웹 서버에서 지원을 하고 있으나 때에 따라서 웹 서버를 만든 제작사의 포맷 또는 DB에 바로 저장할 수 있는 기능을 가지고 있는 웹 서버도 있다.
로그를 기록하기 위한 지시자는 TransferLog, LogFormat, CustomLog 세 개의 지시자이다.


1. TransferLog

Syntax : TransferLog file-pipe

TransferLog는 로그를 적을 파일 또는 프로그램을 지정할 수 있다. 로그는 파일에 적을 수도 있지만 특정 파이프 라인을 통해서 프로그램으로 바로 전달할 수도 있다.
TransferLog 지시자에는 특정 로그 포맷을 지정할 수 없기 때문에 가장 나중에 정의한 LogFormat을 사용한다. 특정 로그 포맷이 정의되지 않았다면 CLF 로그 파일 포맷을 따르게 된다.

예를 들어서 간략하게 A,B,C 세 개의 로그 포맷을 지정했다면 TransferLog가 사용하는 로그 포맷은 LogFormat C를 사용하게 된다.

 

LogFormat "포맷형식" A
LogFormat "포맷형식" B
LogFormat "포맷형식" C
TransferLog logs/access.log

위의 예제는 C 포맷을 사용한다. 로그가 쌓일 대상 파일은 logs/access.log 파일이다. 이 매개 변수가 "/"로 시작하지 않았기 때문에 ServerRoot 밑에 있는 logs 디렉토리에서 access.log 파일에 로그를 적게 되는 것이다. 만약에 "/"로 경로가 시작되었다면 이 경로는 절대 경로가 된다.

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

TransferLog logs/access.log 


2. CustomLog

Syntax : CustomLog file-pipe format-or-nickname

CustomLog는 TransferLog와 똑 같은 기능을 지니고 있는 지시자이지만 매개 변수에 포맷을 따로 지정하거나 가칭을 적을 수 있다.

LogFormat "포맷형식" A
LogFormat "포맷형식" B
LogFormat "포맷형식" C
CustomLog logs/access.log A

 

위와 같이 로그 파일을 정의했다면, LogFormat에서 A 라고 별명을 달아논 포맷을 가지고 logs/access.log 파일에 로그를 적게 된다. 물론 이 별칭 대신에 포맷을 직접 적어도 상관이 없다.

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

CustomLog logs/access.log agent


3. LogFormat

Syntax : LogFormat format [nickname]
               Default: LogFormat "%h %l %u %t \"%r\" %s %b"

LogFormat은 CLF 로그 포맷과 별도로 관리자가 정의한 로그 파일 형식을 만들기 위해서 사용이 되어진다.

다음 표는 로그 포맷에서 사용이 되어지는 변수들이다.(포맷에 대한 조금 더 자세한 내용은 Apache HTTP Server Project 를 참조)

 

변수   설명
%% : 퍼센트 기호
%...a : 요청한 클라이언트의 IP주소(원격 IP주소)
%...A : 로컬 IP 주소(서버 IP주소)
%...B : HTTP 헤더를 제외한 전송 바이트의 수
%...b : HTTP 헤더를 제외한 전송 바이트의 수. 전송 바이트가 없는 경우에 CLF에서 0으로
   표기하지 않고 '-'로 표기한다.
%...{Foobar}C : 서버가 수신한 요청에서 Foobar 쿠키의 내용
%...D : 요청을 처리하는데 걸린 시간(마이크로초 단위)
%...{Foobar}e : Foobar라는 환경 변수
%...f : 파일명
%...h : 요청한 원격 호스트(예:210.210.210.10)
%...H : 요청 프로토콜(예:HTTP/1.1)
%...{Foobar}i : Foobar의 내용-서버에 요청을 할 때의 헤더에 있는 내용
%...l : 리모트 로그인 이름(identd 데몬으로 부터 얻어 올 수 있을 때, 없을 경우 - 표시)
%...m : 요청 메소드(예:GET 또는 POST)
%...{Foobar}n : 다른 모듈에서 "Foobar"의 내용
%...{Foobar}o : Foobar의 내용 - 응답에서 헤더에 있다
%...p : 응답을 처리해준 서버의 포트(예:80)
%...P : 응답을 처리해준 차일드 프로세스의 프로세스 번호(예:14633)
%...{format}P : 요청을 서비스하는 자식의 프로세스 ID 혹은 쓰레드 ID. format에는 pid와 tid가
   가능하다
%...q : 쿼리 스트링(예:http://www.webnkorea.com/server-status?refresh=5라고 하면
   '?refresh=5' 가 기록된다. 쿼리 스트링이 없으면 빈 공백이 들어간다)
%...r : 요청을 할때의 첫 라인(index.html을 요청을 했다면 다음과 같이 기록 된다.
   (GET/HTTP/1.1)
%...s : 요청에 대한 서버의 상태
%...t : 요청을 받은 시간, CLF에서 시간과 같다(영어로 표기됨)
%...{format}t : 주어진 형식의 시간. strtime(3) 포맷으로 주어져야 한다.
%...T : 서버가 요청을 처리하는 데 걸리는 시간(초)(예:1초 미만일 경우 '0'으로 표기)
%...u : 원격 사용자 이름
%...U : 요청한 URL
%...v : 요청에 대해서 처리를 한 서버 이름(예:www.webnkorea.com)
%...V : UseCanonicalName 설정에 따른 요청에 대해서 처리한 서버 이름
%...I : 요청과 헤더를 포함한 수신 바이트수로 0일 수 없다.(영문자 아이임)
   (사용하려면 mod_logio가 필요하다)
%...O : 헤더를 포함한 송신 바이트수로 0일 수 없다.(사용하려면 mod_logio가 필요하다)

 

LogForamt 지시자에서 위의 변수들을 사용해서 마음대로 로그 포맷을 바꿀 수 있다. 자신이 모니터링하고 싶은 정보만을 로그에 기록함으로써 가독성을 늘리고 데이터의 크기를 줄일 수 있다.


4. 다중 로그 파일
현재의 아파치 버전에서는 하나의 요청에 대해서 여러 개의 로그 파일을 만들 수 있다. 만약 두 개의 로그 파일을 만든다고 가장할 때 하나는 디폴트인 CLF 포맷을 사용할 수 있고 다른 하나는 자신이 정의한 포맷을 지정해서 사용할 수도 있다.

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

TransferLog logs/access.log

LogFormat "%u %U %p" my

CustomLog logs/access.log my


TransferLog 앞에는 어떠한 LogFormat도 지정하지 않으면 기본적으로 CLF 포맷으로 로그를 만들게 된다. 다음에 LogFormat 지시자를 사용해서 포맷을 지정하고 별칭을 my로 지정한 후 CustomLog 지시자를 사용해서 자신이 원하는 로그 포맷을 사용할 수 있다.

이 로그 형식은 가상 사이트 컨테이너인 <Virtual></Virtual>에서 따로 로그에 대한 설정을 하지 않는다면 메인 프로세스의 로그 파일에 로그자 저장된다.


5. TIP(가상 호스트에 대한 효율적인 로그 관리)
일반적으로 가상 호스트에 대해서 따로 로그를 관리하지는 않지만, 웹호스팅을 하는 업체라면 고객으로 부터 자신의 사이트에 대한 통계를 요청받는 경우가 있다. 이러한 경우, 효율적으로 로그를 관리하기 위해서 가상 호스트에 대해서 따로 로그를 만들어 줄 필요가 있다. 물론 한 파일에서 관리한 다음 각각의 가상 호스트에 대한 로그로 필터링을 하면 되겠지만, 아무래도 개별 파일에서 관리하는 것 보다 깔끔하지 않다.

 

그래서 log 디렉토리 밑에 logs/vhost 라는 디렉토리를 만든 다음 도메인 이름명을 따서 로그 파일을 만드는 방법이 유용하다. 따라서 webnkorea.com 이라는 가상 호스트가 있다면, <Virtual></Virtual> 컨테이너 안에 로그 파일에 대한 설정을 다음과 같이 해 준다.


CustomLog logs/vhost/diverman.com-access_log "Format"

이렇게 하면 각각의 가상 호스트에 대해서 로그 파일을 관리해 줄 수 있다. 좀 더 신경을 쓴다면 rotatelog 데몬을 이용해서 로그가 일정 크기 이상 증가하지 않도록 해 주는 것도 좋을 것이다.

출처: https://berry2.tistory.com/entry/Apache-Access-Log-Format [베리베리 지식창고:티스토리]

1. 마이그레이션

1-1. 접근 제어 선언 방식 변경

  • 2.2에서 Order, Allow , Deny 등의 지시자로 하던 접근 제어 설정은 Require 를 이용한 방식으로 변경되어야한다.

1) 모든 요청 거부

# 2.2 설정
Order deny,allow
Deny from all

# 2.4 설정
Require all denied

 

2) 모든 요청 허용

# 2.2 설정
Order allow,deny
Allow from all

# 2.4 설정
Require all granted

 

3) example.org 허용 나머지 거부

# 2.2 설정
Order Deny,Allow
Deny from all
Allow from example.org

# 2.4 설정
Require all denied
Require host example.org

 

4) 127.0.0.1 허용 나머지 거부

# 2.2 설정
Order Deny,Allow
Deny from all
Allow from 127.0.0.1

# 2.4 설정
Require all denied
Require ip 127.0.0.1

 

1-2. 속성/모듈 변경

  • 속성/모듈 변경
    • Httpd의 기존 설정에서 아래 속성/모듈과 관련된 선언이 있다면, 이름을 바꾸어준다.
    • 속성명
      • MaxClients -> MaxRequestWorkers
      • MaxRequestsPerChild -> MaxConnectionsPerChild
    • 모듈명
      • mod_disk_cache -> mod_cache_disk
    • KeepAlive 
      • 속성은 On 이나 Off 중 하나의 값을 가질수 있다. 0,1과 같이 숫자로 선언되어 있는 경우가 있었다면 수정해야 한다.
<IfModule mpm_prefork_module>
    StartServers          30
    MinSpareServers       30
    MaxSpareServers      128
    ServerLimit         1024
    MaxClients          1024 # MaxClients -> MaxRequestWorkers
    MaxRequestsPerChild  100000 # MaxRequestsPerChild -> MaxConnectionsPerChild
</IfModule>

...

KeepAlive Off # 속성은 On 이나 Off 중 하나의 값을 가질수 있다.

 

  • 속성 디폴트 값 변경 확인
    • 아래 속성들은 디폴트값이 바뀌었다.
    • 기존에 암묵적으로 디폴트값에 의존을 했었다면 명시적으로 선언한다.
  • Options 내 -,+ 모두 표시
    • Either all Options must start with + or -, or no Option may.
    • 오류가 발생시 모든 Options 내  +, -  표시를 해주어야 합니다.
<Directory "/home1/irteam/deploy/doc_base">
        Options -Indexes FollowSymLinks MultiViews # Options -Indexes +IncludesNoExec +FollowSymLinks +MultiViews
        AllowOverride None # 명시적으로 선언
        Order allow,deny
        Allow from all
        FileETag None # 명시적으로 선언
</Directory>

 

2. 오류로그 및 해결책

오류 1

# 오류 로그
httpd: Syntax error on line 59 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf: 
Cannot load modules/mod_authz_default.so into server: /home1/irteam/apps/apache/modules/mod_authz_default.so: cannot open shared object file: No such file or directory

# 해결 방법
mod_authz_default 삭제

 

오류 2

# 오류 로그
httpd: Syntax error on line 73 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Cannot load modules/mod_ident.so into server: /home1/irteam/apps/apache/modules/mod_ident.so: cannot open shared object file: No such file or directory

# 해결 방법
mod_ident 삭제

 

오류 3

# 오류 로그
AH00534: httpd: Configuration error: No MPM loaded.

# 해결 방법
추가 LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

 

오류 4

# 오류 로그
AH00526: Syntax error on line 106 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'User', perhaps misspelled or defined by a module not included in the server configuration


# 해결 방법
추가 LoadModule unixd_module modules/mod_unixd.so

 

오류 5

# 오류 로그
AH00526: Syntax error on line 214 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration

# 해결 방법
추가 LoadModule access_compat_module modules/mod_access_compat.so

 

오류 6

# 오류 로그
[Thu Aug 01 16:16:15.768125 2019] [core:warn] [pid 29604] AH00117: Ignoring deprecated use of DefaultType in line 281 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf.
AH00526: Syntax error on line 325 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'Require', perhaps misspelled or defined by a module not included in the server configuration

# 해결 방법
추가 LoadModule authz_core_module modules/mod_authz_core.so

 

오류 7

# 오류 로그
[Thu Aug 01 16:17:14.560832 2019] [core:warn] [pid 29690] AH00117: Ignoring deprecated use of DefaultType in line 282 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf.
AH00526: Syntax error on line 353 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'LockFile', perhaps misspel

# 해결 방법
DefaultType text/plain -> ForceType text/plain(모든 응답을 text/plain으로 처리함.) 옵션 제거 할 것

 

오류 8

# 오류 로그
AH00526: Syntax error on line 353 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'LockFile', perhaps misspelled or defined by a module not included in the server configuration

[Mon Aug 05 15:47:04.456821 2019] [core:warn] [pid 26228] AH00117: Ignoring deprecated use of DefaultType in line 280 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf.
AH00526: Syntax error on line 396 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'Allow', perhaps misspelled or defined by a module not included in the server configuration

# 해결 방법
LockFile "logs/accept.lock" -> Mutex file:/home1/irteam/logs default

 

오류 9

# 오류 로그
AH00526: Syntax error on line 521 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
JkWorkersFile: Can't find the workers file specified

# 해결 방법
/home1/irteam/apps/apache/conf/workers.properties 추가

 

오류 10

# 오류 로그
AH00526: Syntax error on line 600 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Either all Options must start with + or -, or no Option may.

# 해결 방법
Options -Indexes FollowSymLinks MultiViews
>> Options -Indexes +FollowSymLinks +MultiViews

 

오류 11

# 오류 로그
AH00548: NameVirtualHost has no effect and will be removed in the next release /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:626
AH00112: Warning: DocumentRoot [/data/images/deploy/doc_base] does not exist
AH00526: Syntax error on line 23 of /home1/irteam/apps/apache/conf/vhost-avatar-static.conf:
Require not allowed in <VirtualHost> context

# 해결 방법
NameVirtualHost 삭제

 

오류 12

# 오류 로그
[Thu Aug 01 16:30:33.693824 2019] [proxy_balancer:emerg] [pid 31012] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
[Thu Aug 01 16:30:33.693839 2019] [:emerg] [pid 31012] AH00020: Configuration Failed, exiting

# 해결 방법
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so 추가.

 

오류 13

# 오류 로그
[Thu Aug 01 16:32:06.814692 2019] [jk:warn] [pid 31220] No JkShmFile defined in httpd.conf. Using default /home1/irteam/apps/apache/logs/jk-runtime-status
[Thu Aug 01 16:32:06.833689 2019] [jk:warn] [pid 31224] No JkShmFile defined in httpd.conf. Using default /home1/irteam/apps/apache/logs/jk-runtime-status

# 해결 방법
JkShmFile /usr/local/apache2/logs/mod_jk.shm

 

출처 : https://ssackssly.tistory.com/14


 

Apache에서 아래와 같이, Deny from all설정으로 모든 디렉토리가 막혀있다.

이는 다른 설정없이 호출시, Fobbiden 오류가 발생하게 된다.

==============================

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

</Directory>

==============================

 

Options

: 지정한 디렉토리이하에 모든 파일과 디렉토리들에 적용할 접근제어를 설정함. 즉 디렉토리를 보여줄 것인가? CGI를 허용할 것인가? SSI를 허용할 것인가? 등의 설정을 여기서 하게 된다. 


None

모든 허용을 하지 않음. 즉, None설정으로 이외의 다른 설정들은 모두 무시


All

MultiViews 를 제외한 모든 옵션설정을 허용


Indexes

디렉토리 접근시에 DirectoryIndex에서 지정한 파일(index.html 또는 index.htm 등)이 존재할 경우에 디렉토리내의 파일목록리스트를 웹브라우저로 보여준다. 웹서버 보안을 위해 사용하지 않는 것이 좋다. 


Includes

SSI 사용을 허용하는 설정. 단, mod_include.c 모듈이 아파치웹서버에 로딩되어 있어야 함. 거의 대부분이 기본 설정으로 되어 있음. 확인법은 "httpd -l"


IncludesNOEXEC

SSI사용은 허용되지만 #exec 사용과 #include는 허용되지 않는다. 즉, SSI를 사용하면서 시스템에 위험한 SSI의 실행태그는 허용하지 않겠다는 설정


FollowSymlinks

심볼의 링크를 허용한다. 이 옵션을 지정하면 웹브라우저에서 링크파일의 경로까지도 확인할 수 있게 된다. 보안상 이 값은 설정하지 않는 것이 좋다.


ExecCGI

perl 등과 같은 CGI실행을 허용하기 위한 설정이다. 원래 아파치에서 CGI사용은 ScriptAlias로 지정된 위치에서 사용하는 것이 기본이다. 하지만 ScriptAlias가 지정되지 않은 디렉토리에 이 옵션이 지정되어 있다면 지정된 디렉토리내에서는 CGI 사용이 허용된다. 물론 이 경우에도 "AddHandler cgi-script" 지시자에서 정의한 확장자만 유효하다. 참고로 perl 등의 CGI실행이 안될 경우에는 ExecCGI값이 설정 되어 있나를 확인해 봐야 한다. 이 설정이 않되어 있다면 해당 디렉토리내에서는 CGI의 실행이 허용되지 않기 때문이다.


MultiViews

웹브라우저의 요청에 따라 적절한 페이지로 보여준다. 웹브라우저의 종류나 웹문서의 종류에 따라서 가장 적합한 페이지를 보여줄 수 있도록 하는 설정이다.

 


AllowOverride

: 어떻게 접근을 허락할 것인가에 대한 설정.


None

AccessFileName에 지정된 파일을 엑세스 인증파일로 인식하지 않는다. 즉, AccessFileName 의 값이 대부분 .htaccess 이므로 이를 무시하게 된다는 의미가 된다. 즉 이 파일을 무시하기 때문에 새로운 접근 인증박싱을 Override하지 않는다. 대부분ㅇ 보아이나 중요한 디렉토리에서 사용할 수 있는 것으로 아주 제한적인 접근만을 허용하고자 할 때에 사용하는 값이다.


All

이전의 인증방식에 대하여 새로운 접근인증방식을 우선적용하도록 Override를 허용한다.


AuthConfig

AccessFileName 지시자에 명시한 파일(거의 대부분은 .htaccess)에 대하여 AuthDBMgroupFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등과 같은 클라이언트 인증지시자의 사용을 허용한다. 즉 htpasswd 유틸리티를 이용하여 특정 디렉토리의 접근은 AccessFileName에 명시한 파일(대부분은 .htaceess)로 제어하고자 할 때에 (이를 "디렉토리 인증설정"이라고 함) 해당 디렉토리내에 이 값을 주로 사용한다.


FileInfo

AccessFileName지시자에 명시한 파일(거의 대부분은 .htaccess)에 대하여 AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등과 같은 문서유형을 제어하는 지시자 사용을 허용한다.


Indexes

AccessFileName 지시자에 명시한 파일(대부분 .htaccess파일)에 대하여 AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName 등과 같은 디렉토리 Indexing을 제어하는 지시자 사용을 허용한다.


Limit

AccessFileName 지시자에 명시한 파일(대부분 .htaccess파일)에 대하여 allow, deny, 그리고 order 등과 같은 호스트 접근을 제어하는 지시자 사용을 허용한다.


Options

AccessFileName 지시자에 명시한 파일(대부분 .htaccess파일)에 대하여 Options 그리고 XBitHack등과 같은 특정 디렉토리 옵션을 제어하는 지시자 사용을 허용한다.

 

 

 

 

     

     

쓰고자 하는 디렉토리는 아래와 같이,

설정을 해야 정상적으로 호출을 할 수 있다.

     

     

<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs">

    #

    # Possible values for the Options directive are "None", "All",

    # or any combination of:

    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

    #

    # Note that "MultiViews" must be named *explicitly* --- "Options All"

    # doesn't give it to you.

    #

    # The Options directive is both complicated and important.  Please see

# http://httpd.apache.org/docs/2.2/mod/core.html#options

# for more information.

#

Options Indexes FollowSymLinks

#

# AllowOverride controls what directives may be placed in .htaccess files.

# It can be "All", "None", or any combination of the keywords:

# Options FileInfo AuthConfig Limit

#

AllowOverride None

#

# Controls who can get stuff from this server.

#

Order allow,deny

Allow from all

</Directory>

 

<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">

AllowOverride None

Options None

Order allow,deny

Allow from all

</Directory>

 

<Directory "C:/webapps/app1">

AllowOverride None

Options None

Order allow,deny

Allow from all

</Directory>

 

<Directory "C:/webapps/app2">

AllowOverride None

Options None

Order allow,deny

Allow from all

</Directory>



출처: http://mcpaint.tistory.com/133 [MC빼인트와 함께]


 

apache 를 재시작하는 방법으로는 크게  restart 와 graceful 이 있습니다.

재시작하는건 동일하지만 약간의 차이가 있습니다.

restart (kill -HUP)

restart 의 경우 apache 의 모든 프로세스를 종료 시키고 재시작합니다.  stop 한후 start와 동일합니다.

완전한 종료는 되지만 서비스 끊김이 발생합니다.

graceful (kill -USR1) 

graceful 의 경우 접속된 컨넥션은 유지하고 그외 apache  모든 프로세스를 종료하고 재시작합니다.

이때 세션의 종료 없이 설정파일을 불러서 재실행합니다.

운영중인 서버에 작업을 하고 재시작할때는 restart 보다는 graceful 옵션을 사용하는걸 추천합니다.

 

출처 : https://idchowto.com/?p=38239

 

대부분의 많은 사용자들이 apache 설정 변경 후 restart를 진행 합니다.

 

가상호스트가 추가 되어도 restart

apache의 ServerName이 변경되어도 restart

 

restart를 진행하면 프로세스가 모두 종료하고 재시작 되기때문에 세션이 끊어지는 문제가 있습니다.

 

 

apache의 재시작 방법은 restart/graceful 이렇게 두가지가 존재 합니다.

 

restart (kill -HUP)
- httpd 모든 프로세스를 찾아 종료시키고 재시작 시그널 주는것이다.

graceful (kill -USR1)
- 현재 접속된 컨넥션은 그대로 유지하고 그외 httpd 모든 프로세스를
찾아 종료시키고 재시작 시그널 주는것이다.

예1) /usr/local/apache2/bin/apachectl restart

이 경우 완벽한 재시작은 이루어지지만, 서비스가 끊김 발생

예2) /usr/local/apache2/bin/apachectl graceful

서비스의  세션 및 연결 종료 없이 conf 설정 파일 불러서 재실행

 

서비스 운영 중에 추가되는 작업들은 restart 보다는 graceful 옵션을 통해 재시작 해주시는 것이 좋습니다.

 

단, 모듈 추가 등의 apache 내에 삽입되어야 하는 작업들은 반드시 restart를 해주셔야 합니다.

 

출처 : http://faq.hostway.co.kr/Linux_WEB/3665


html 문서 내에 php 코드를 입력하여 결과를 보려는데 해당 결과가 화면에 출력이 안될 때

이경우는 웹서버의 설정(httpd.conf)  에 AddType application/x-httpd-php .html .htm

를 추가해 주면 인식이 된다.

* 계정별로 별도로 적용하고 싶다면 .htaccess 파일내에 위의 구문을 넣고 유저 디렉토리에 넣어주면
  적용된다.


Apache 2.4.x 버전대에서 아파치를 실행하려고 할 때 아래와 같은 메시지가 나온다.

AH00548: NameVirtualHost has no effect and will be removed in the next release

2.4버전 이상에서는 NameVirtualHost 설정이 더 이상 필요없다고 하니

해당 라인을 찾아서 주석처리 하거나 라인을 삭제하자.

 

Description : 아파치가 접근할 수 있는 각 디렉토리에 대하여 어떤 서비스와 기능을 허용할 것인지 
거부할 것인지 여부를 설정할 수 있다. 디렉토리에 대한 설정 내용은 그 하부 디렉토리에도 영향을 
미친다.

 Syntax : <Directory directory-path> ... </Directory>


< Directory> tag에 의하여 각 directory마다 적절하게 permission을 걸수가 있다.

<Directory />
Options FollowSymLinks
AllowOverride None
< /Directory>

DocumentRoot 값으로 변경

<Directory "/home/httpd/html">

지정할수 있는  옵션의 예이다.
None
어떤 옵션도 이용할 수 없다.
All 지정한 directory에서 모든 명령을 이용할 수 있다.
Indexes URL에 지정된 디렉토리에 (index.html 같은) 지정된 파일이 없을 경우 디렉토리의 파일 목록을 보여주는 옵션.
Includes 서버측의 추가적인 정보를 제공할 수 있게 한다.
IncludesNoExec 서버측의 추가적인 정보를 제공할 수 있게 하지만, 어떠한 실행 파일을 실행하는 것을 방지한다. 
FollowSymLinks  디렉토리상의 심볼릭 링크를 사용가능하게 한다.
ExecCGI CGI 스크립트를 실행할 수 있게 한다.
MultiViews  All 옵션이 설정되었을 때만 지정된 목록의 multiviews를 허용한다.

AllowOverride None
.htaccess파일은 서버의 각 디렉토리에 만들어서 각 디렉토리에 대한 접근을 제어하기 위한 것으로 디렉토리에 .htaccess파일이 있으면, 서버 전체에 작용하는 access.conf 보다 우선권을 가진다.

.htaccess파일에 대한 Override에 대한 옵션이다.
None .htaccess파일을 읽을 수 없게 한다.
All 모든 지정에 대해 가능하게 한다.
Options 규정된 디렉토리 형식을 콘트롤하는 지정의 사용을 허락한다.
FileInfo 문서형식을 콘트롤하는 지정의 사용을 허용한다.
AuthConfig  사용자 인증 지정의 사용을 허용한다. 사용자 인증 변수를 사용한다.
Limit 호스트 접근을 콘트롤하는 지정을 허용한다.

서버로부터 자료를 얻어갈 수 있는 위치를 제어한다.
Order allow,deny
Allow from all
Deny from env=no_access

Limit에 관련된 부분을 설정을 한다.

order : 서버가 access control을 수행하는 순서를 나타낸다. 여기서는 allow기능을 먼저 수행하고, deny기능을 수행하라는 것이다.

deny, allow - deny 지시자 부터 검사하고 allow 지시자를 검사
allow, deny - allow 지시자 부터 검사하고 deny 지시자를 검사
mutual-failure - allow목록에 없는 모든 host에게 접속을 거부

allow from : 나열되는 주소들에 대한 access control을 가능하게 한다. 
사용 가능한 주소는 도메인 네임, 호스트 이름 주소, 호스트 ip 주소, ip 주소의 앞부분 3바이트, 모든 주소에 해당하는 all이 있다.
deny from : allow from과 반대되는 개념이다.
< /Directory>

ex1)

<Directory "/www/n">
   Options FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
< /Directory>



ex2)

<Directory /a/service/html/>
    Options FollowSymLinks MultiViews Includes
    AllowOverride None

    Order allow,deny
    Allow from all
< /Directory>

<Directory />
    Options FollowSymLinks
    AllowOverride None
< /Directory>



출처 : http://0thinktank.tistory.com/91


 

검색엔진을 제어해야 하는 이유는 불필요한 검색 트래픽 낭비를 줄여 불필요한 네트워크 사용을 제한

 

노출을 원하지 않는 검색엔진에 자신의 홈페이지 정보를 제어할수 있다.

robot.txt

 

로봇이 임의의 SITE/ 에 방문하면 먼저 SITE/robots.txt 파일 호출함 (정상적인 정보 수집 BOT일때)
로봇의 접근 권한 및 접근가능한 경로에 대한 정보를 분석하여 자신이 수집해도 되는 콘텐트만을 수집한다

웹 사이트의 최상위 루트에 robots.txt 파일이 있어야함
robots.txt 화일에는 최소한 한개의 “disallow” 필드(field)가 존재해야 함

robot.txt 파일이름은 소문자로 작성 (공백 허용되지 않음) 

 

ex) 예제들

 

홈페이지 전체가 모든 검색엔진에 노출되기를 원치 않음
User-agent: *

 

Disallow: /

 

홈페이지 전체가 모든 검색엔진에 노출되기를 원함
User-agent: *

Disallow:

 

홈페이지 디렉토리중 일부만 검색엔진에 노출하고 싶음

User-agent: *
Disallow: /my_photo/
Disallow: /my_diary/

 

홈페이지 전체를 노출시키지만 특정 검색엔진 (EvilRobot)만 거부
User-agent: EvilRobot
Disallow: /

 

홈페이지 전체가 노출되지만 특정검색엔진에서만 노출되기를 원함
User-agent: NaverBot
Disallow:
User-agent: *
Disallow: /

 

/help.html과 /help/index.html 둘 다 허용 안함
disallow: /help

/help/index.html는 허용 안하나, /help.html은 허용 됨. 
disallow: /help/ 

루트 하위에 있는 xml 확장자를 가진 모든 파일의 색인을 거부
Disallow: /*.xml$ 

루트에 test.html 과 ?가 포함된 파일의 색인을 거부한다
Disallow: /test.html? 

 

구글의 이미지를 검색하는 로봇에게 gif와 jpg로 된 이미지를 모두 검색하지 않도록 함

User-agent: Googlebot-Image
Disallow: /*.gif$
Disallow: /*.jpg$ 

예외적인 상황들

HTML (HEAD) 와 (/HEAD) 사이에 (META NAME=”ROBOTS” CONTENT=”NOINDEX, NOFOLLOW”)
라는 메타태크그를 추가함으로써 문서 하나하나에 대해 정확하게 명시를 해주므로 가장 확실하게 로봇 접근을 차단할수 있음

 

검색엔진에 Robot를 차단하더라도 자신의 페이지중 일부가 나타날수 있음
기타 문서나 사이트들이 자신의 웹 문서를 링크할 경우 자동적으로 생성되어 나타날수 있음
이 경우 Robot 과 무관함 (robots.txt 를 무시하는 로봇들도 있을수 있음)
Robot 들의 IP들을 알 경우 IP를 통해 정책수립해도 상관없음

주석문을 작성하기 위해서는 앞에 #를 적어주시면 됩니다. 

로봇의 이름은 개별 검색사이트를 방문해야함

 

로봇들 Agent 이름명

 

구글: Googlebot
구글 이미지 : googlebot-image
네이버 : cowbot

 

네이버 : User-Agent: Yeti/1.0 (NHN Corp.; http://help.naver.com/robots/)
야후 : Slurp
야후 이미지 : Yahoo-MMCrawler
엠파스봇 : empas
MSN : MSNBot
첫눈: 1Noonbot 1.0

다음 : daumoa

 

실제 Apache Log (구글봇 접근)

 

61.xx.xx.84 – – [22/Aug/2010:06:10:03 +0900] “GET /robots.txt HTTP/1.1” 404 –
61.xx.xx.84 – – [22/Aug/2010:06:10:03 +0900] “GET /152 HTTP/1.1” 200 54216

 

61.xx.xx.84 로봇이 접근해서 robot.txt 파일을 읽었는데 404에러 robot.txt 파일이 없다.???
없으니깐 /152번 글을 GET 해가지고 갔다? 200 정상 메세지니깐??

 

 봇 아이피를 이용한 제어

 

IP 기반으로 차단하기 위해서는 해당 봇들에 대한 아이피 정보들을 가지고 있어야 함

 

아래 사이트에서는 각 검색엔진들의 아이피 정보를 제공한다.

 

http://iplists.com

사이트 접근하면 각종 봇들에 대한 아이피 대역 리스트를 받아 볼수 있음.

해당 사이트의 정보들을 가지고 방화벽 운영해본 결과 그럭저럭 맞는거 같음

 

참조 URL : http://idchowto.com/?p=591


[Wed May 01 23:28:43 2013] [warn] Invalid command 'CBandLimit', undefined virtualhost name
[Wed May 01 23:28:43 2013] [warn] Invalid command 'CBandPeriod', undefined virtualhost name
 
위의 로그가 아파치 재시작 또는 문법 검증시 나타난다면

아파치 가상 호스트 설정파일에 ServerName 지시자가 주석처리되어 있거나 정의되지 않는 항목이 있는지

전체적으로 점검해 보아야 한다. 특히 Warning 로그에 해당 라인번호가 명시되지 않으니

수동으로 다 확인해야 한다.



## 설치 환경

- OS : CentOS 6
- 아파치 : httpd 2.4.25
- mod_url : 1.6.2.7 (최신버전인 1.8 버전은 컴파일 과정에서 에러남)

# 아파치 설치과정 : 본 블로그의 다른 게시물 참조

mod_url 설치를 위해서 최신 버전을 설치하려고 했으나 컴파일 에러 발생.
따라서 약간 버전이 낮은 것으로 컴파일 하여 설치 성공

[ Download & 소스 설치 ]  2186-mod_url-apache2-1.6.2.7.tar.bz2


# wget http://kldp.net/modurl/release/2186-mod_url-apache2-1.6.2.7.tar.bz2
# bzip2 -d 2186-mod_url-apache2-1.6.2.7.tar.bz2
# tar -xvf mod_url-apache2-1.6.27.tar

[ 컴파일 ]

# /usr/local/apache/bin/apxs -i -a -c mod_url.c

그러면 아파치 모듈 디렉토리 (/usr/local/apache/modules) 에 설치된다. (755 권한인지 확인)

-rwxr-xr-x 1 root root 13775  6월  5 18:24 mod_url.so

[ 환경 설정 ]

아파치 설정파일 httpd.conf 에 아래 부분이 이미 추가 되어 있다.

LoadModule redurl_module      modules/mod_url.so

그 하단에

<IfModule mod_url.c>
        CheckURL On
</IfModule>

부분만 추가시키고 아파치 웹 서버를 재구동 시킨다.