squid http가속 모드와 프락시 캐싱 모드 이 두가지 모드로 동작할 수 있는데 http가속 모드는 특정 몇몇 사이트의 웹페이지를 자신의 캐시 디렉토리에 저장해두고 요청하는 클라이언트에 자신의 캐시 정보를 빠르게 보여주는 역활을 하는것이다.
즉 실제 웹서버는 81번 포트로 서비스를 하고 http가속 모드로 동작하는 squid는 80포트로 서비를 하게 된다. 이는 웹서버와 프락시를 하나의 서버에 설치할 경우 이다. 나는 이 경우에 대한 설정만 다루도록 한다.
별도의 http 가속 모드로 서버를 하나 마련할경우는 아마도 사원들만 사용할 수 있는 빠르게 접근해야 할 페이지가 있을경우에 하면 적당할 듯하다.
사실 프락시 캐싱 서버라는 개념은 아는 사람은 알것이지만 잘 사용을 안하는것 같다. 그러나 http 가속 모드는 꽤나 유용할 수도 있을거 같다. 실무에서는 프락시 서버와 방화벽기능을 상용 소프트웨어를 사용하고 리눅스 말고 freebsd를 사용하더라. 그러나 그렇다하더라도 개념은 리눅스의 iptable과 squid를 이용한 프락시와 같다. 그러므로 나중에 상용 프락시나 방화벽을 이용할시에 분명히 개념을 이해하는데 많은 도움이 된다. 그래서 공부겸 해서 한번 설치해보고 실제 웹서버에 http 가속 모드로 설치하니 상황에 따라 나은 성능을 발휘하기도 했다.
그렇지만 솔직히 실제 서비스시에는 사용을 안하는게 더 나을지도 모르겠다.
squid를 이용하여 http가속 모드와 프락시 캐싱 모드 설치시
둘다 설치는 똑같으나 설정파일을 설정하는것만 다르다.
squid서버를 설치하기 전에 malloc이라는 소스를 먼저 설치를 하는데.이놈을 설치하는 이유는 squid를 돌릴때 조금더 성능이 낫다고 한다. 정확히는 나도 잘모르지만 메모리가 부족할 경우등에 gnu malloc을 설치하면 해결된다고 한다.
먼저 각 소스를 다운 받는다.
gnu malloc을 아래 사이트에서 다운 받는다.
ftp://ftp.linux.sarang.net/mirror/gnu/gnu/malloc.tar.gz
squid를 아래 사이트에서 다운 받는다.
http://www.squid-cache.org/Versions/v2/2.5/
echo "########################"
echo "### malloc install ###"
echo "########################"
소스 파일의 압축을 해제
tar xpzf malloc.tar.gz -C /var/tmp
압축해제 경로로 이동
cd /var/tmp/malloc
컴파일 옵션 설정
export CC=gcc;export CFLAGS="-O2 -march=i686 -funroll-loops -fomit-frame-pointer"
컴파일
make
컴파일한 파일 내 시스템 라이브러리로 복사
cp -f libmalloc.a /usr/lib/libgnumalloc.a
cp -f malloc.h /usr/include/gnumalloc.h
echo "### squid 서버 설치 ###"
받은 소스의 압축을 해제 한다.
tar xpzf squid-2.5.STABLE1.tar.gz -C /var/tmp
소스 경로로 이동
cd /var/tmp/squid-2.5.STABLE1
이제 소스의 설정파일들을 수정해서 프리픽스를 레드햇 기준으로 고치겠다.
src/Makefile.in 파일을 수정 (로그 경로 /var/log/squid로 변경)
DEFAULT_LOG_PREFIX = $(localstatedir)/logs 라인을
DEFAULT_LOG_PREFIX = $(localstatedir)/log/squid 로 수정
src/Makefile.in 파일을 수정 (캐쉬 저장 경로 /var/log/squid로 변경)
DEFAULT_SWAP_DIR = $(localstatedir)/cache
DEFAULT_SWAP_DIR = $(localstatedir)/spool/squid
squid 데몬 유저 추가
useradd -r -d /var/spool/squid -s /bin/false -c "squid Server" -u 23 squid
컴피그 하기
CFLAGS="-O2 -march=i686 -funroll-loops"
./configure
--prefix=/usr
--bindir=/usr/sbin
--libexecdir=/usr/lib/squid
--localstatedir=/var
--sysconfdir=/etc/squid
--mandir=/usr/share/man
--enable-dlmalloc
--enable-gnuregex
--enable-xmalloc-statistics
--with-pthreads
--enable-removal-policies="heap"
--enable-cachemgr-hostname=`hostname`
--enable-storeio=diskd,ufs
--enable-delay-pools
--enable-cache-digests
--enable-default-err-language=Korean
--enable-err-language=Korean
--enable-poll
--enable-linux-netfilter
--enable-truncate
위에서 --enable-cachemgr-hostname=`hostname` 이 옵션은
자신의 캐시 매니저로 접속할 호스트를 지정할 수 있는것인데…. 위처럼
`hostname`이라고 되어있는건 기본적으로 자신의 localhost를 이야기하는것이다.
다른 웹서버에서 cachemgr.cgi를 사용해서 내 squid서버의 캐싱 상태를
보고자 한다면 다른 웹서버의 호스트명을 적어주면 된다.
컴파일
make
find /* > /root/"$PACKAGE"1
실제 설치
make install
로그와 캐쉬 디렉토리 생성 및 퍼미션 조정
mkdir -p /var/spool/squid
mkdir -p /var/log/squid
chown squid.squid /var/spool/squid/
chown squid.squid /var/log/squid/
chmod 750 /var/spool/squid/
chmod 750 /var/log/squid/
설치시 만들어지는 로그 경로 삭제
rm -rf /var/logs/
실행 바이너리(실행파일) 링크 제거
strip /usr/sbin/RunCache
strip /usr/sbin/squid
strip /usr/sbin/squidclient
strip /usr/lib/squid/*
라이브러리 경로 재설정
ldconfig
첨부파일을 다운 받아서 팸과 시작스크립로 복사
cp -f sysconfig/squid /etc/sysconfig/
cp -f pam.d/squid /etc/pam.d/
cp -f logrotate.d/squid /etc/logrotate.d/
cp -f init.d/squid /etc/rc.d/init.d/
find /* > /root/"$PACKAGE"2
시작 스크립트 등록
chmod 700 /etc/rc.d/init.d/squid
chown 0.0 /etc/rc.d/init.d/squid
chkconfig --add squid
chkconfig --level 345 squid on
squid서버의 캐싱 상태를 볼수 있는 cgi스크립트가 소스에 포함되어있는데.
cachemgr.cgi라는 파일이다.(만약 다른곳에 있는 웹서버를 이용시는 그 웹서버로 아래 파일
을 복사)
캐시 매니저를 자신의 웹서버의 cgi를 실행할수 있는 곳에 복사한다.
install -m755 -owww -gwww /usr/lib/squid/cachemgr.cgi /home/httpd/cgi-bin/
나의 경우는 아파치의 cgi루트가 /home/httpd/cgi-bin이므로 위처럼 복사했다.
------------ httpd accelerator mode 로 사용시 설정 시작 -----------------------------
아래처럼 squid설정 파일 생성
echo "http_port 80
icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY
cache_mem 128 MB
#redirect_rewrites_host_header off
cache_replacement_policy heap GDSF
memory_replacement_policy heap GDSF
cache_dir diskd /var/spool/squid 1000 16 256
cache_store_log none
emulate_httpd_log on
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_mgr vitro at vitro.pe.kr
cache_effective_user squid
cache_effective_group squid
httpd_accel_uses_host_header on
httpd_accel_host $HOSTNAME
httpd_accel_host mail.$HOSTNAME
httpd_accel_host www.$HOSTNAME
httpd_accel_host jsp.$HOSTNAME
httpd_accel_host smtp.$HOSTNAME
httpd_accel_port 81
logfile_rotate 0
log_icp_queries off
cachemgr_passwd 9192 all
buffered_logs on
#httpd_accel_with_proxy on" > /etc/squid/squid.conf
위의 설정에서
http_port 80는 squid가 서비스할 포트고
httpd_accel_port 81 는 아파치의 포트다.
virtual hostname = $HOSTNAME
virtual hostname = www.$HOSTNAME
virtual hostname = jsp.$HOSTNAME
virtual hostname = mail.$HOSTNAME
virtual hostname = smtp.$HOSTNAME 의 $HOSTNAME을 자신이 사용하고
있는 버추얼 호스팅 서버명으로 고치면 된다.
그리고 아파치가 80번으로 돌아가고 있는것을 아파치설정파일(httpd.conf)를 열어서
80포트로 된것을 81번 포트로 다 고쳐준다.
------------ httpd accelerator mode 로 사용시 설정 끝 -----------------------------
------------ Proxy mode 로 사용시 설정 시작 -----------------------------
echo "icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY
cache_mem 128 MB
cache_replacement_policy heap GDSF
memory_replacement_policy heap GDSF
cache_dir diskd /var/spool/squid 2000 16 256
cache_store_log none
#acl localnet src 192.168.1.0/255.255.255.0
acl localhost src 127.0.0.1/255.255.255.255
acl Safe_ports port 80 443 210 70 21 1025-65535
acl CONNECT method CONNECT
acl all src 0.0.0.0/0.0.0.0
#http_access allow localnet
http_access allow localhost
http_access allow all
http_access deny !Safe_ports
http_access deny CONNECT
#http_access deny all
cache_mgr vitro at vitro.pe.kr
cache_effective_user squid
cache_effective_group squid
logfile_rotate 0
log_icp_queries off
cachemgr_passwd 9192 all
buffered_logs on
#httpd_accel_with_proxy on" > /etc/squid/squid.conf
위의 설정에서 squid가 서비스할 포트를 지정하지 않았는데
지정하지 않을경우 기본으로 3128포트를 사용한다.
이제 웹브라우저의 도구 -> 인터넷 옵션 -> 연결 -> 랜설정 -> 사용자랜에 프록시 사용을 체크
한뒤
자신의 리눅스 프락시로 ip주소를 적고 포트를 3128로 지정해주고 인터넷을 하면
이제부터 보이는 웹 사이트 화면은 먼저 프락시에서 페이지를 읽어온뒤에 윈도우 웹브라우저로
보여지는것이다.
이와 같은 브라우저에서의 프락시 설정을 하지 않고 사용하고 싶을때 패킷필터 방화벽설정을
하여서 80포트로 가는 패킷을 3128번 포트로 리다이렉트하는 방법이 있다.
이것을 Transparent Proxy(투명 프락시)라고 하는데 이것을 설정하는 것은 쉬우며
젤 아래에 설정을 추가할 부분을 추가한다.
------------ Proxy mode 로 사용시 설정 끝 -----------------------------
squid데몬 스타트
/etc/rc.d/init.d/squid start
--------------------- 투명 프락시 사용할시 ---------------------------
투명 프락시를 사용할 경우에는 내부 네트워크(192.168.0.0)가 필요하고 공인 아피를 가진 리눅스가 한대 있다고 가정하고 이 리눅스에는 랜카드가 두개 있어야한다. 즉 리눅스 gateway서버로 돌아가는 리눅스가 한대 필요하다.gateway설정은 kldp를 참조하라.gateway설정은 잘 되어있다고 보고 아래와 같은 설정을 게이트웨이의 iptables룰에 추가한다.
혹시 모르므로 아래같은 마스크레이드 룰이 적용 안되었다면 적용해라
iptables -t nat -A POSTROUTING -p TCP -s 0/0 --dport 21 -j MASQUERADE
iptables -t nat -A POSTROUTING -p TCP -d 0/0 --dport 20 -j MASQUERADE
iptables -t nat -A POSTROUTING -p TCP --dport 25 -j MASQUERADE
iptables -t nat -A POSTROUTING -p TCP --dport 110 -j MASQUERADE
iptables -t nat -A POSTROUTING -p TCP --dport 22 -j MASQUERADE
iptables -t nat -A POSTROUTING -p TCP --dport 23 -j MASQUERADE
echo "###############################################################################
####"
echo "### Transparent Proxy with Squid ###"
echo "### iptables -t nat -A PREROUTING -p TCP --dport 80 -j REDIRECT --to-port 3128
###"
echo "###############################################################################
####"
그리고 squid.conf에 다음의 설정을 추가한다.
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
이제 squid를 데몬을 재시작하면 이 리눅스 gateway을 통하여 인터넷을 사용하는 컴터는 모두 웹캐싱을 하여 인터넷을 하게 된다.
squid설치(투명 프락시와 웹가속모드)