기본 동시접속자수는 최대 256명. 이를 더 많은 숫자로 변경하기 위해서는 아래 파일 수정 후 재펌파일이 필요하다.
/apache/../server/mpm/prefork/prefork.c 파일에서
#define DEFAULT_SERVER_LIMIT 256
위에서 숫자 부분을 적당하게 늘려주고
/apache/../server/mpm/worker/worker.c 파일에서
#define DEFAULT_SERVER_LIMIT 16
위에서 숫자 부분을 적당하게 늘려준다.
예를 들어 prefork.c 파일에서 1280으로 늘려주었다면, worker.c 파일은 20으로 늘려주는데, 그 이유는 아래와 같다.
worker 방식은 기본적으로 16개의 child process와 그 안에 64개의 thread를 생성가능하므로, 16*64 = 1024가 된다. 따라서 prefork.c 파일에서 1280으로 늘려주게 되면, worker.c는
1280/64 = 20이 되므로 20으로 수정해 줘야 똑같이 1280명의 동시접속자가 가능하게 된다.
컴파일은 아래와 같이 수행한다.
기존에 /usr/local/apache 로 웹서비스를 사용중이라면
/usr/local/apache 가 아닌 다른 이름으로 컴파일 설치 하면 충돌없이 컴파일이 됩니다.
configure 는 컴파일 환경을 설정 해주는 것입니다.
./configure --prefix=/usr/local/apache2/
make
make install
하면 컴파일이 되겠습니다.
컴파일 후 /usr/local/apache 에 있는 설정 파일들을 /usr/local/apache2 에 복사한 후
웹사이트를 잠시 중지 할 수 있는 시간을 이용하여 apache 를 중지하고 apache2 를 가동하여
오류 여부등을 확인한 한다음 정상적으로 웹사이트가 운영이 된다면 apache 를
삭제(백업필수) 한 뒤 디렉토리명을 apache2 에서 apache 로 변경하여 정상 운영 하면 되겠습니다.
(물론 환경설정 부분이 수정될 수 있습니다. 꼼꼼히 체크 하는 것 잊지 마세요.)
2. 아파치 1.3.xx 버전
기본 동시접속자수는 최대 256명인데, 이는 MaxClients에 입력가능한 최대치를 말합니다.
256명 이상의 동시접속을 허용하고자 할 경우에는 아파치를 다시 재 컴파일해야 합니다.
아파치 디렉토리로 이동하여 ../src/include 안의 httpd.h 에서 다음과 같은 부분을 찾아
값을 높여 주시면 됩니다.
#define HARD_SERVER_LIMIT 512
위와같이 설정 한 후 http.h 파일을 재컴파일해야 정상적으로 적용이 됩니다.
만약 클라이언트가 512명 이상의 접속을 넘어서 이루어질 경우에는 다음과 같은 메시지가
로그파일에 남게 되며, 클라이언 트는 다른 요청의 접속이 끝날 때 까지 대기하거나
또는 특정시간이 지난 후 접속이 이루어질 수 없다는 메시지를 보여주게 된답니다 .
[error] server reached MaxClients setting, consider raising the MaxClients setting.
만약, 동시접속자 수를 기본 동시접속자 최대 수인 256명 미만으로 조정하고자 한다면,
재컴파일이 필요없이 아래 파일만 수정합니다.
TCP(Transmission Control Protocol)가 SYN-ACKS의 재전송을 조정하도록 합니다. 이 값을 구성하면 SYN 공격(서비스 거부 공격의 한 종류) 동안 연결 응답이 더 빨리 시간 초과됩니다.
TcpMaxHalfOpen
100
HalfOpen 의 최대치(?)
TcpMaxHalfOpenRetried
100
재시도된 HalfOpen 의 최대치(?)
TcpMaxPortsExhausted
5
SYN-ATTACK 보호가 작동하기 시작하는 시점을 결정합니다. 사용 가능한 연결 백로그가 0으로 설정되었기 때문에 시스템에서 TCPMaxPortsExhausted 연결 요청을 거부하면 SYN-ATTACK 보호가 작동하기 시작합니다. 이 경우 합법적인 방법으로 이를 사용하려는 서버나 시스템에는 거의 영향을 주지 않습니다.
TcpMaxConnectResponseRetransmissions
2
SYN이 확인되지 않은 경우 연결 요청에 대한 응답으로 SYN-ACK가 재전송되는 횟수를 결정합니다.
이 값이 2 이상인 경우 스택은 내부적으로 SYN-ATTACK 보호를 사용합니다. 이 값이 2 미만인 경우, 스택은 SYN-ATTACK 보호를 위한 레지스트리 값을 전혀 읽지 않습니다. 이 매개 변수는 부분 공개 TCP 연결을 정리하는 데 걸리는 기본 시간을 줄입니다. 심한 공격을 받는 사이트의 경우 이 값을 1처럼 매우 낮은 값으로 설정할 수도 있습니다. 0 값도 유효합니다. 그러나 이 매개 변수를 0으로 설정하면 SYN-ACK는 전혀 재전송되지 않으며 3초 이내에 시간 초과됩니다. 이 값을 이처럼 낮게 설정하면 멀리 떨어진 클라이언트에서 합법적으로 연결을 시도해도 연결되지 않습니다
EnableDeadGWDetect
0
무반응 게이트웨이 검색이 사용 가능한 경우 TCP는 연결 수에 문제가 있을 때 백업 게이트웨이로 변경하도록 IP에 요구합니다. 이 설정을 0으로 구성하면 Windows에서는 무반응 게이트웨이를 더 이상 검색하지 못하고 자동으로 다른 게이트웨이로 전환합니다.
EnablePMTUDiscovery
0
EnablePMTUDiscovery를 1로 설정하면, TCP는 MTU(maximum transmission unit) 또는 원격 호스트 경로에서 가장 큰 패킷 크기를 찾으려고 시도합니다. TCP는 경로 MTU를 찾고 TCP 세그먼트를 이 크기로 제한하여 다른 MTU와 연결되는 경로를 따라 라우터의 조각화를 제거합니다.
조각화로 인해 TCP 처리량이 줄어들 수 있습니다. 이 값을 0으로 설정하면, 로컬 서브넷의 호스트가 아닌 모든 연결에 MTU 576바이트가 사용됩니다.
KeepAliveTime
300000
TCP가 활성 상태 패킷을 보내 유휴 연결이 그대로 있음을 확인하는 빈도를 결정합니다. 원격 컴퓨터에 여전히 연결 가능한 경우 TCP는 활성 상태 패킷을 확인합니다.
기본적으로 활성 상태 패킷은 보내지지 않습니다. 프로그램을 통해 연결 시 이 값을 구성할 수 있습니다. 이 값을 기본값인 2시간에서 5분으로 낮추면 비활성 세션의 연결이 더 빨리 끊어집니다.
NoNameReleaseOnDemand
1
컴퓨터가 이름 해제 요청을 받을 때 NetBIOS 이름을 해제할지 여부를 결정합니다. 이 값은 관리자가 악의적인 이름 해제 공격으로부터 컴퓨터를 보호할 수 있도록 추가되었습니다. NoNameReleaseOnDemand 값은 1로 설정하는 것이 좋습니다.
EnableICMPRedirects
0
RRAS(라우팅 및 원격 액세스 서비스)가 ASBR(Autonomous System Boundary Router)로 구성된 경우 연결된 인터페이스 서브넷 경로를 올바로 가져올 수 없습니다. 대신 이 라우터는 OSPF(Open Shortest Path First) 경로에 호스트 경로를 삽입합니다. OSPF 라우터를 ASBR 라우터로 사용할 수 없기 때문에 연결된 인터페이스 서브넷 경로를 OSPF로 가져오면 라우팅 테이블이 이상한 라우팅 경로와 혼동됩니다.
interfacesPerformRouterDiscovery
0
네트워크 인터페이스의 라우터 찾기 수행(?)
EnableSecurityFilters
0
1로 설정하면 TCP/IP 스택이 TcpAllowedPorts와 UdpAllowedPorts에서 지정된 포트에 따라 외부로부터의 접속 요구를 걸러 줍니다.
DisableIPSourceRouting
2
IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다. 이 값을 2로 설정하면 원본에서 라우팅한 모든 들어오는 패킷이 삭제됩니다.
TcpMaxDataRetransmissions
3
TCP는 각 아웃바운드 세그먼트가 IP로 전달될 때 재전송 타이머를 시작합니다. 타이머가 만료되기 전에 해당 세그먼트에서 데이터에 대한 확인이 수신되지 않은 경우 세그먼트는 세 번까지 재전송됩니다.
TcpTimedWaitDelay
100
TcpTimedWaitDelay 값은 TCP/IP가 닫힌 연결을 해제하여 자원을 다시 사용하기 전에 경과되어야 하는 시간을 결정합니다. 닫기와 해제 사이의 이 간격은 TIME_WAIT 상태 또는 최대 세그먼트 지속 시간의 두배(2MSL) 상태로 알려져 있습니다. 이 시간 동안 클라이언트 및 서버로의 연결을 다시 여는 것이 새 연결을 설정하는 것보다 비용이 적게 듭니다. 이 항목의 값을 줄이면 TCP/IP는 닫힌 연결을 더욱 빨리 해제할 수 있으며 새 연결에 더 많은 자원을 제공합니다. TIME_WAIT 상태에 있는 여러 연결로 인해 발생한 낮은 처리량 때문에 실행 중인 응용프로그램에 빠른 해제, 새 연결 작성 또는 조정이 필요할 경우 이 매개변수를 조정하십시오.
PerformRouterDiscovery
0
IRDP(Internet Router Discovery Protocol)를 지원하는 Windows 2000이 컴퓨터에서 기본 게이트웨이 주소를 자동으로 검색 및 구성하지 못하도록 하기 위해 설정됩니다.
FTP 서버 및 웹 서버와 같은 Windows 소켓 응용 프로그램의 연결 시도는 Afd.sys에 의해 처리됩니다. Afd.sys는 합법적 클라이언트에 대한 액세스를 거부하지 않고 부분 공개 상태에서 여러 번의 연결을 지원하도록 수정되었습니다.
관리자가 동적 백로그를 구성할 수 있도록 함으로써 이러한 지원이 가능해졌습니다.
DynamicBacklogGrowthDelta는 연결이 더 필요할 때 만들 사용 가능 연결 수를 결정합니다. 값이 크면 free 연결 할당이 폭주할 수 있으므로 이 값을 주의하여 설정하십시오.
시스템이 TCP 연결 유지를 위해 생성하는 TCP Control Blocks(TCBs)의 숫자를 결정한다. 하나의 연결은 하나의 블록을 요구하기 때문에, 이 값은 TCP가 동시에 몇 개의 연결을 처리할 수 있느냐를 결정하게 된다. 모든 블록이 사용 중인 상황에서 새로운 연결이 들어오게 되면, TCP는 TIME_WAIT 상태인 연결 중에 하나를 강제로 끊어버리고, 블록을 해제한 후, 그 블록을 새로운 연결에 사용하게 된다. 보통 TCP는 TcpTimedWaitDelay에 지정되어 있는 시간이 지나지 않은 경우, 연결을 해제하지도 않고, 그 연결에 사용된 자원을 재사용하지도 않는다. 이 시간은 보통 TIME_WAIT 또는 2MSL (2 x maximum segment lifetime) 상태라고 불린다. 하지만 시스템이 매우 많은 연결을 받아들여 자원이 바닥날 상황에 이르면, TcpTimedWaitDelay에 지정된 시간이 아직 남아있는 경우에도 연결에 할당되어 있는 자원을 해제하게 된다.
netstat를 통해서 얻을 수 있는 가장 중요한 정보는 1번이 될 것이다. netstat를 사용하면 현재 네트워크에 연결이 되어있는 상태뿐만 아니라, TIME_WAIT와 SYN_RECV 상태까지도 얻어올 수 있다.
TIME_WAIT를 이해하기 위해서는 소켓의 종료 상태에 대해서 알고 있어야 한다. TIME_WAIT 상태는 소켓이 연결을 종료하는 과정에서 거치는 과정인데 마지막 ACK 신호를 보내지 못하는 경우가 있다. 이 경우 ACK를 재전송하기 위해서 기다리는데, 이를 TIME_WAIT 상태라고 한다.
이것은 2MSL(maximum segment life time)이라고 불리운다. 서버에서 데이터를 모두 다 보내면 연결을 닫기 위해서 close() 함수를 호출하게 된다. 그리고 서버는 ACK신호를 보내고 TIME_WAIT 상태에 들어간다. 클라이언트로 부터 ACK에 대한 응답이 있어야지만 연결이 완전히 종료가 된다. 만약 상대편 클라이언트가 ACK에 대한 응답을 보내지 않고 종료되어 버렸다면, 서버는 2MSL 시간만큼을 기다리게 된다.
TIME_WAIT는 하는 일은 없지만, 클라이언트로 부터의 종료메시지를 기다리는 상태가 되므로 다른 연결을 받아들이지 못하게 된다. 이는 TIME_WAIT 상태가 지나치게 많아지게 될 경우, 그만큼의 연결을 유지해야 하므로 서버프로그램에 문제가 생길 수 있다.
만약 다수의 SYN_RECV 가 있다면, DOS 공격을 의심할 수 있을 것이다. SYN_RECV는 클라이언트가 마지막 3번째 패킷을 서버에게 보내지 않음으로써, 불완전한 연결이 유지되게 된다. 반쪽자리 연결이라고 볼 수 있는데, 이러한 연결을 다수 생성해서 서비스가 거부되도록 공격하는 경우가 종종 발생한다.
# ----------------------- Network Related Options -------------------------
#
# workgroup = Workgroup
#
# server string is the equivalent of the NT Description field
#
# netbios name can be used to specify a server name not tied to the hostname
#
# Interfaces lets you configure Samba to use multiple interfaces
# If you have multiple network interfaces then you can list the ones
# you want to listen on (never omit localhost)
#
# Hosts Allow/Hosts Deny lets you restrict who can connect, and you can
# specifiy it as a per share option as well
#
(위의 경우 192.168.1.5 IP와 123.45.6. IP 대역에 대해 접속을 허용)
# ----------------------- Standalone Server Options ------------------------
#
# Security can be set to user, share(deprecated) or server(deprecated)
#
# Backend to store user information in. New installations should
# use either tdbsam or ldapsam. smbpasswd is available for backwards
# compatibility. tdbsam requires no further configuration.
security = user
passdb backend = tdbsam
security = share (삼바서버에 사용자명/패스워드 인증없이 접속 가능)
security = user (리눅스 계정 아이디로 접속 가능)
user로 설정했을 경우, 환경설정 저장 후 리눅스 계정 패스워드와는 별도로 삼바서버에 패스워드를 등록해야 한다.