Web

웹이란 World Wide Web의 약자로 인터넷이라는 네트워크 체계 위에서 동작하는 통신 규약 중의 하나다. 아래의 그림은 인터넷과 웹의 관계를 보여준다. 웹이 인터넷과 같은 의미처럼 사용된 이유는 웹이 가장 성공한 인터넷 서비스이기 때문이다. 위키피디아 참고

 

서버와 클라이언트

클 라이언트는 정보를 요청하는 쪽이고 서버는 정보를 제공하는 쪽이다. 이것은 상대적인 개념으로 클라이언트를 위한 전용 머신이 따로 있는 것은 아니고, 클라이언트 소프트웨어인 웹브라우저가 설치되어 있다면 클라이언트가 되는 것이고, 서버 소프트웨어인 웹서버가 설치되어 있다면 서버가 되는 것이다.

HTTP

http란 웹서버와 웹클라이언트가 서로 정보를 주고 받기 위한 약속(protocol)이다. 즉 요청은 어떻게 해야하고, 응답은 어떻게 해야하는지에 대한 규칙을 미리 정해둔 것이다. 위키피디아 참고

 

Web Server

웹서버는 다른 말로 HTTP Server라고도 부른다. 웹브라우저의 카운터 파트너로서 서버 쪽에서 정보를 제공하는 소프트웨어를 의미한다. 대표적인 웹서버는 Apache가 있다. 아래 그림은 웹서버의 시장 점유율을 보여준다. (참고 netcraft.com)

 

NGINX

NGINX는 차세대 웹서버로 불린다. 위의 그래프를 통해서 알 수 있듯이 Apache의 독주에 제동을 걸고 있다. NGINX의 특징은 한마디로 정의하면 아래와 같다.

더 적은 자원으로 더 빠르게 데이터를 서비스 할 수 있다.

 

NGINX와 Apache의 관계

Apache 는 웹의 산증인이라고 해도 과언이 아니다. 위의 그래프에 따르면 1996년 이래로 한번도 1등의 자리를 놓친적이 없다. 오픈소스이고, 무료로 사용할 수 있는 소프트웨어인 아파치가 웹을 지탱하고 있다고해도 과언이 아니다. 하지만, 아파치는 오래전에 만들어진 소프트웨어다. 아파치가 만들어진 시대의 요구사항이 이제는 유효하지 않은 것도 있고, 새로운 요구사항과 충돌하는 것도 있을 것이다. 그렇다고 과거의 유산을 청산하고 마냥 새로운 시대의 요구사항만 쫏아갈수는 없는 것이다. 자신이 만들어낸 의존성을 안고 서서히 잊혀지는 것이야 말로 인프라의 운명이면서 미덕이 아닐까.

엔진엑스는 새로운 시대의 요청에 부응해서 만들어진 웹서버이다. 개발의 모든 목적이 높은 성능에 맞춰져 있다. 그리고 잘 사용하지 않는 기능은 과감하게 제외했다. 덕분에 폭발적인 증가세에 있는 인터넷 서비스를 지탱하는데 적합하다. 다음은 필자가 찾아본 Apache와 NGINX의 속도 테스트 결과들이다. 직접 읽어보고 또 평가해보자.

 

Nginx install


 

 

 

Nginx install
yum -y install pcre*.x86_64
 
cd /root/src/
wget http://nginx.org/download/nginx-1.7.1.tar.gz
tar xfz nginx-1.7.1.tar.gz
  
cd nginx-1.7.1/
./configure --prefix=/home/nginx --user=nobody --group=nobody \
--with-http_realip_module --with-http_image_filter_module --with-http_gzip_static_module \
--with-http_perl_module --with-pcre --with-openssl=/usr --with-http_stub_status_module
make && make install
 
chown -R nobody: /home/nginx/
chmod 700 /home/nginx/
 
mod_rpaf 설치

 

1. mod_rpaf 의 역할

   1) nginx 의 기본 프로토콜이 http1.0 인데 http 1.1 로 바꾸어 아파치에 전달

   2) source ip 를 nginx 에 받기전의 원래 ip 로 아파치에 전달

1번을 하는 이유는 사용자 측에서 보안상 http1.0 을 막아 놓는 경우 문제가 될수 있기 때문임.

2번을 하는 이유는 nginx 를 거치면 source ip 가 nginx 가 설치된 서버의 ip 즉, local ip 로 바뀌기 때문에 원래 source ip 를 주기 위함임

httpd.conf 에서 다음과 같이 바꾼다. RPAFproxy_ips 127.0.0.1 10.0.0.1 설치할 서버IP 를 꼭 적어준다.

Port 81

Listen 81

MaxRequestsPerChild 2000

Timeout 180 이상으로 셋팅필요

MaxClient 는 기본 200으로 하되, nginx설치 후 아파치 프로세스가 200에 근접할경우 200이상으로 조정이 필요합니다.

/*아래 4줄 추가후 ip추가 */

RPAFenable On

RPAFProtocol On

RPAFsethostname On

RPAFproxy_ips 127.0.0.1 10.0.0.1 서버ip [프락시ip]

RPAFheader X-SIMPLEXI0 X-SIMPLEXI X-Forwarded-For From  <-- nignx.conf  항목에 proxy_set_header    설정 부분이 X-SIMPLEXI 되어있어 동일하게 설정

mod_rpaf-0.6p10.tar.gz  <-- 다운로드

 

/etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /home/nginx/conf/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/home/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/home/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

+ Recent posts