Altruistic Programmer's Blog (KR)

이타주의 프로그래머의 블로그

Archive for the ‘Apache’ tag

가상서버에서 클라이언트 IP 확인하기

without comments

문제상황

가상서버에서 블로그를 돌리고 있는데, 클라이언트 IP가 제대로 나오지 않는다. 물리적 서버의 Apache를 거치기 때문에 동일한 IP만 잔뜩 찍히고 있다. 그러다보니 IP 기준으로 댓글을 차단할 수도 없고, 통계 기능도 먹통이다.

X-Forwarded-For

이런 상황을 해결하기 위해  X-Forwarded-For라는 HTTP 헤더가 존재하는데, RFC 표준은 아니지만 거의 표준처럼 쓰이고 있다고 한다. (de facto standard)

X-Forwarded-For: client1, proxy1, proxy2

위와 같은 포멧으로, 클라이언트부터 각 프록시의 IP가 기록되기 때문에 최종 서버가 클라이언트 IP를 확인하는 것이 가능하다는 얘기. 대부분의 프록시 서버와 웹서버에서 지원하고 있다고 한다.

해결 방법

웹 어플리케이션에서 이 헤더를 해석하는 것도 방법이겠지만 이미 아파치 플러그인이 존재하므로 가볍게 설치하면 상황 종료다. 플러그인을 설치하면 아파치 로그에도 실제 클라이언트의 IP가 남기 때문에 유용하다.

아직 버전은 0.6이지만 내 블로그에서는 문제없이 잘 동작하는 것 같다. 페도라에서의 설치 방법을 요약하면.

# 플러그인 소스코드 받고
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz

# 압축풀었다고 가정하고
# 플러그인 빌드에 필요한 패키지를 설치하고
yum install httpd-devel

# 빌드하고 설치하고
apxs -i -c -n mod_rpaf-2.0.so mod-rpaf-2.0.c

# /etc/httpd/conf/httpd.conf에 아래 설정을 추가하면 끝.
# 10.0.0.128은 자신의 프록시 서버 IP에 맞게 수정
LoadModule rpaf_module /etc/httpd/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 10.0.0.128
RPAFheader X-Forwarded-For

Written by muscly

December 29th, 2009 at 2:00 pm

블로그 OS 재설치

with 2 comments

[옛날 블로그 글입니다. 2009.06.07]

블로그 계약기간 다되서 재갱신 하면서 CentOS 5.3으로 바꿔서 설치해봤습니다. Redhat Enterprise 기반이라서 안정성이 있다고 하더라구요. 그게 기본 패키지들이 좀 옛날 것인 면도 있는 것 같네요.

RPM 삽질

첨에는 Fedora8이라서 Fedora10으로 업그레이드해보자고 시작했다가, RPM Hell을 겪게 되었습니다. 몰랐었는데 RPM은 같은 패키지의 여러 버전을 설치할 수가 없더군요. 그래서 디펜던시 트리의 모든 패키지를 한 번에 업데이트 하지 않으면 안되는 문제가 있었습니다. 하루 종일 삽질을 하다가 결국은 OS 재설치로 -_-

Ruby와 Rails 설치

ruby와 rails를 설치하는데도 한참 헤맸습니다. 헤매면서 배운점은 잠시 후로 미루고 결국 선택한 방법을 정리하면,

  • ruby는 1.8대의 안정버전으로 소스코드를 가져다가 빌드한다 (1.9는 아직 실험적인)
  • 주의: 빌드는 단순히 configure, make, make install 외에 해줄 것이 있으니 아래 링크를 참조
  • http://www.catapult-creative.com/2009/02/04/installing-rails-on-centos-5/
  • rubygems는 그냥 최신(1.3.3)으로 소스코드를 가져다가 빌드한다.
  • rails 등의 rubygem들은 gem install로 설치
  • 주의: 예전에 만든 rails 어플을 돌리려면 맞는 버젼을 설치하는 것이 편리
  • (gem install rails -v 2.1.1 과 같이)

가능한 yum을 사용해서 빌드된 패키지만으로 해결하고 싶었는데요, 기본 레포지토리에는 ruby밖에 패키지가 없었구요. RubyWorks는 rubygems와 주요 rubygem들을 패키지로 제공하고 있는데요, 버전 의존성등이 안맞는 문제등이 있었습니다.

또 ruby 1.9 소스를 받아서 해봤더니, 제 어플리케이션이 쓰는 rubygem 중에 아직 1.9를 지원하지 않는 것이 있어서 낭패. 그래서 yum으로 준비된 ruby 패키지를 설치하고, rubygems는 소스코드를 받아서 설치했더니, rubygems가 ruby가 설치된 곳에 설치되는 바람에 기분이 안좋더라구요.

다시 말해서, 소스 받아서 설치한 녀석들은 /usr/local 안쪽에 있어야 yum으로 설치한 녀석들이랑 헷갈리지 않고 관리하기 좋은데요, 소스를 받아서 설치한 rubygems가 /bin, /lib, /lib64 등에 들어가 버려서 참 찝찝하더라구요. 따로 uninstall 지원도 없어서 수작업으로 싹 지우고, 위에 설명한 방법으로 완료했습니다~

Rails 어플리케이션 배포

Rails 어플리케이션을 배포하는 방법이 이렇게 많은 줄은 몰랐습니다. 저는 mongrel_cluster로 rails 어플리케이션을 여러개 돌리고, apache에서 로드밸런서를 써서 연결하는 식으로 돌리고 있었는데요, 이번에 사용해본 Passenger라는 녀석은 설정이 완전 간단하네요.

apache 설정에서 DocumentRoot를 rails 어플리케이션의 public 디렉토리로 맞춰주기만 하면, Passenger가 알아서 rails 어플리케이션인지 알아채고 돌려주는 식입니다. 그냥  php 설정하듯이 간단합니다.

아, 제가 좀 헤맨 부분이 있는데요, Passenger의 apache 모듈을 설치하면 LoadModule, PassengerRoot, PassengerRuby를 apache 설정에 넣으라고 나오는데요, 저는 이 설정을 <VirtualHost *:80> 안쪽에서 넣어줬다가 무척 헤맸습니다. <VirtualHost *:80> 설정 바깥쪽에 넣어주세요.

마무리

리눅스를 막 배웠더니 기초가 부족해서 많이 해맸는데요, 여러 문제 상황에 봉착하면서 해결책을 검색하고, 조금씩 해결하면서, 배워나가는 과정이 무척 재밌었습니다. 아마도 개발자들이 보통 하는 일들과 비슷해서 그런게 아닌가하는 생각이 듭니다. 그리고, 서버가 깔끔하게 정리된 상태이고, 내 제어 범위 안에 들어와 있다는 느낌도 참 기분 좋은 것이네요.

Written by muscly

July 7th, 2009 at 2:19 pm