본문 바로가기
SSR

아파치 지시어

by oncerun 2022. 11. 13.
반응형

 

정적 파일 소스를 가지고 있다면 이를 웹 서버에 배포해야 한다. 

 

리버스 프락시를 통해 요청을 톰캣으로 밀어 넣긴 하는데 정적 파일에 대한 설정을 아파치에 별도로 해주어야 하는데 

이 과정에서 설정에 대한 지식이 없어 잠깐 막혔다. 그래서 오늘은 아파치 설정에 대한 정리를 해보려고 한다. 

 

필요한 지시어만 좀 찾아보려고 한다.

 

ServerRoot 

- 서버 설치 디렉터리 경로로 구성 설정, 오류 정보, 로그 기록 파일이 위치하는 디렉터리이다.

 

-KeepAlive 

 

HTTP 지속 연결을 활성화한다. 이는 http 프로토콜이 stateless 방식으로 동작함에 따라 지속적인 요청에 성능적인 개선을 하기 위한 방법으로 이는 수명이 긴 http 세션을 제공하는 것이다. 

 

이를 사용할 수 있는 장소는 http.conf, apache2.conf가 있고 혹은 가상 호스트 virtualhost 섹션 안에 기술할 수 있다.

 

다만 keepalive 지시어는 늘 활성화하는 것은 별로 좋지 못하다. 왜냐하면 서버가 가용할 수 있는 메모리의 용량에 따라 연결을 맺을 수 있는 소켓을 생성하는데 한계가 있기 때문인데 이는 소켓을 선점한 클라이언트와 장기간 데이터를 주고받게 되면 다른 클라이언트는 연결 기회가 막힐 수 있다. 

 

그래서 적절한 제한이 필요한데 이때 사용할 수 있는 지시어는 다음과 같다.

 

MaxKeepAliveRequests : 지속적인 연결 중에 연결 당 허용할 최대 요청 수

KeepAliveTimeout : 서버가 지속적 연결에 대한 후속 요청을 기다리는 시간 -> 이 시간을 적절히 선택해야 할 것 같다.

설정 값이 낮을수록 동시 접속수를 늘릴 수 있다.

 

MaxRequestWorkers : 동시 처리 최대 연결 수

MaxConnectionsPerChild : 개별 자식 서버 프로세스가 처리할 연결 수에 대한 제한

MaxKeepAliveRequest : 지속적 연결 중에 연결 당 허용할 최대 요청수 설정 (무제한으로 설정하려면 0으로 설정)

 

 

HTTP/1.0 규격을 사용하는 경우 요청에 Connection:Keep-Alive 요청 헤더를 포함시켜 서버 측에 보낸다. 이 요청 헤더가 없으면 서버에서 keepalive를 사용하지 않는다. 

 

HTTP/1.0 클라이언트와 Keep-Alive 연결은 콘텐츠의 길이를 미리 알 수 있을 때만 사용할 수 있다.

즉 이는 정적인 파일에만 적용된다.  동적인 콘텐츠에 대해선 keep-alive 연결을 사용하지 않음을 의미

 

HTTP/1.1 이후인 경우 별도의 설정이 없는 한 지속 연결이 기본값이다.  요청 시 알 수 없는 길이의 콘텐츠를 지속 연결로 전달하기 위해 청크 처리된 인코딩이 사용됨.

 

 

-IncludeOptional

 

서버 구성 파일 외에 추가 서버 구성파일 포함

 

IncludeOptional file-path|derectory-path|wildcard

 

주 서버 설정, 가상 호스트, 디렉터리에서 사용 가능 2.3.6 이상 가능 만약 존재하지 않는 경우 자동 무시할 수 있으며 이 기능은 2.4.30 이후부터 적용

-Include

 

서버 구성 파일 외에 추가 서버 구성 파일 포함

 

- Options FollowSymLinks 

 

심볼릭 링크 허용- 웹 브라우저에서 심볼릭 링크를 통해 링크된 실제 파일에도 접근할 수 있도록 허용

 

- AllowOverride None

 

액세스 인증 파일 무시 - 지시어 AccessFileName에 지정된 파일을 액세스 인증 파일로 인증하지 않아 해당 파일을 새로운 접근 인증 방식으로 재정의하지 않는다. 즉 요청 경로에 있는 구성 파일을 찾은 뒤 하위 경로의. htaccess 파일을 찾지 않는다. 

 

- Require all denied

해당 디렉터리에 대한 모든 접근을 거부한다.

 

- Require all granted

해당 디렉터리에 대한 모든 접근을 허용한다.

 

- AccessFileName 

서버가 어떤 문서에 대한 요청을 처리할 때 해당 문서 경로의 디렉터리마다 AccessFileName 지시어에 지정된 환경설정 파일을 찾아 가장 가까운 첫 번째 파일을 적용한다.

 

-ServerName 

 

아파치 서버가 자신의 도메인명을 나타내는 이름을 지정한다. 

 

형식은 ServerName [스키마://] 도메인명|Ip 주소 [: 포트번호]

 

포트번호는 생략할 수 있지만 이럴 경우 https 포트 번호를 사용한다.

 

- Listen

 

요청을 받을 포트 번호 지정 

 

Listen [IP 주소:] 포트 번호 [프로토콜]

 

여러 개를 지정할 수 있으며 여러 요청을 받는다. 내부망에 특정 요청만 받기 원하면 

Listen 192.123.2.3:80 등으로 그 인터페이스 ip 주소를 지정한다 프로토콜은 443인 경우 https, 그 외 포트 번호에는 http가 기본적으로 설정된다. 이외 번호로 https를 받으려면 다음과 같이 지정한다

 

Listen 8443 https

 

섹션 컨테이너

 

<Directory />
    AllowOverride none
    Require all denied
</Directory>
<Directory "${SRVROOT}/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

 

디렉터리 단위로 지정

 

디렉터리를 나타내는 경로는 전체 경로를 지정한다. 와일드카드를 사용한 지정도 가능하다.

보통 디렉터리로 지정되면 지정된 디렉터리와 그 디렉터리에 포함된 모든 하위 디렉터리 전체가 포함된다. 

 

경로 이름이 "/"인 경우는 특별한데, 이는 루트 디렉터리를 나타낸다. 따라서 개별로 설정이 되지 않은 모든 디렉터리의 기본 설정이 된다.

 

디렉터리로 여러 개를 지정한 경우 루트에서 길이가 가장 짧은 순으로 적용되어 같은 설정 항목에 대한 설정은 덮어 쓰인다.

 

- DocumentRoot

 

웹 서버는 콘텐츠의 요청에 대응하는 정적 콘텐츠를 반환해주어야 한다. 그 내용을 배치해 두는 위치는 DocumentRoot에 지정한다.

 

절대 경로 또는 ServerRoot에 상대 경로로 지정한다. 마지막에 슬래시는 작성하지 않는다.

 

 

IP 기반 가상 호스트

 

하나의 서버에 여러 개의 LAN 카드가 장착되어 여러 IP 주소를 이어주는 경우  각각의 IP 주소에 대한 가상 호스트를 지정

 

<VirutalHost IP주소1:포트번호>
 ServerName shop.naver.com
 ServerAdmin shop@naver.com
 DocumentRoot "${SRVROOT}/htdocs/shop"
 ...
</VirutalHost>
<VirutalHost IP주소2:포트번호>
 ServerName sports.naver.com
 ServerAdmin sports@naver.com
 DocumentRoot "${SRVROOT}/htdocs/sports"
...
</VirutalHost>

 

이때 공통 로그를 사용해도 되지만 관리적인 측면에서 분리해도 된다 이때 CustomLog, ErrorLog를 더하자

 

그 외에도 각 도큐먼트 루트 액세스 권한 설정이 필요하다 httpd.conf파일에서 권한 설정을 해준다.

<Directory "${SRVROOT}/htdocs/shop">
    AllowOverride none
    Require all granted
</Directory>

<Directory "${SRVROOT}/htdocs/sports">
    AllowOverride none
    Require all granted
</Directory>

 

ip 기반이 아니라 이름 기반인 경우에는 클라이언트 요청에 포함된 Hosts 헤더를 보고 어떤 호스트에 접근할 것인지를 결정한다.

 

이 경우 ServerName에 일치하는 블록을 찾는다. 

 

virtual hosts를 작성할 때 해당 주석을 풀고 httpd-vhosts.conf 파일에 작성하는 걸 권장한다.

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

이는 /extra 디렉터리에 존재

 

- Location 

 

<Location URL 경로>

 

URL 경로 단위로 범위를 지정하는 경우에는 섹션 컨테이너로 <Location>을 사용한다.

 

/api/v1으로 호출된다면 <Location /api/v1>으로 작성한다.

 

3개의 섹션 컨테이너 작성되었다면 디렉터리, 파일명, url 경로 순서로 설정 적용되어 가고 이후 설정은 덮어쓰기를 하게 된다.

 

- ProxyRequests

 프락시 서비스의 활성화 여부를 지정한다. ProxyRequests가 off로 설정되어도 ProxyPass는 유효하다.

 

- ProxyPass

 

실제 proxy에 연결할 URL 특정 경로 및 그 하위 경로에 대한 요청을 프락시 서버로 중계한다. 

 

- ProxyPassReverse

 

 WAS가 redirect http 요청을 보냈을 경우 Location. Content-Location HTTP 헤더를 수정하여 클라이언트에게 전달한다.

 

redirect 시 클라이언트는 다시 시도할 주소를 헤더에 넣고 보내주는데 이 헤더에는 웹 서버가 아닌 was의 주소가 들어가서 문제가 발생한다. 

 

해당 지시자는 응답 헤더의 Location을 Apache가 임의의 URL로 변경할 수 있게 한다.

 

 

- 인코딩

 

아파치 웹에서 한글이 깨질 경우 해당 지시어를 httpd.conf에 추가한다.

AddDefaultCharset EUC-KR
AddCharset UTF-8 .utf8

 

 

- Redirect 

 URL을 다른 URL로 리다이렉트 시킨다. 클라이언트는 새로운 URL을 돌려받고 그 주소로 다시 접속 시도

Redirect [status] url-path new-url

 

status

  • permanent : 영구적 리소스 이동
  • temp : 임시 이동
  • seeother : 교체되어 다른 것으로 변경
  • gone : 삭제

 

- Rewrite

 

재작성 패턴을 통해 URL을 생성한다. 이는 정규표현식을 통해 정의된다. 

#LoadModule rewrite_module modules/mod_rewrite.so

해당 모듈 활성화한다. 

 

- RewriteEngine 

 

재작성 엔진의 사용 여부를 결정한다.  이 지시자를 사용하면 간단하게 재작성 패턴 적용 여부를 설정할 수 있다.

 

- RewriteCond

 

 재작성 패턴을 정의하기 위해 한 개 이상의 RewriteCond 조건을 지정할 수 있다. 

RewriteCond Teststring Condition [Flags]

 

 

- RewriteRule

 

 RewriteRul pattern substitution

 

  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

 

반응형

'SSR' 카테고리의 다른 글

Redis 활용하여 동시성 문제해결  (0) 2022.12.31
제한된 리소스에서 살아남기  (1) 2022.12.31
데이터베이스를 이용한 동시성 이슈 해결하기  (0) 2022.12.25
Https 적용  (0) 2022.11.12

댓글