웹마스터 팁
[리눅스] 속도향상 팁. nginx를 리버스프록시로 써봅시다.
2013.07.11 17:36
안녕하세요.
되게 오랫만에 와서 글 작성하고 갑니다.
현재 서버 올리면서 (홍보 시급 ㄷㄷ)
홈페이지를 준비하다가 웹 데몬을 nginx로 쓸까, httpd로 쓸까 고민하고 있었죠.
그런데 어떻게하다가 리버스프록시라는걸 알게되었습니다.
서로의 장점을 뽑아보자면
아파치 -> 동적처리가 좋다.
nginx -> 정적처리가 좋다.
이런식 입니다.
처리효율성을 높여주려면, 각 각의 장점만 뽑아쓰는게 제일 좋겠죠.
다들 nginx가 무조건 아파치보다 뛰어나다고 하시던데,
php on apache 보다 php-fpm on nginx가 성능이 더 안좋음.
여기서 쓰인 환경은 아래와 같습니다.
OS: CentOS 6.4 64Bit
Apache, NGiNX, PHP 모두 yum으로 설치됨.
소스설치 하셨다면 설치환경에 맞게 조정하시길 바랍니다.
Step 1. Apache 준비
프록시로 받아둘 모듈을 준비합니다.
저는 yum 으로 설치했기에 환경설정 파일은 아래에 위치하여있었습니다.
/etc/httpd/conf/httpd.conf
vi나 mc로 여시기 바랍니다.
그런데 그전에, nginx가 apache로 처리를 넘겨줄때 포트가 80으로 서로 중복됩니다.
따라서 Listen 80 이라고 된 부분 8080 이나 다른 포트로 변경하시기 바랍니다.
이제 아래와 같이 따라하면 프록시 모듈이 설정됩니다.
LoadModule 부분에
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
이 부분이 주석이 있으시다면 해제하시기 바랍니다.
mod_proxy_ftp, mod_proxy_ajp는 필요에 따라 올리도록 합니다.
모듈사용이 확인되었으면 아래 해당 내용과 동일한 부분 주석을 해제하세요.
<IfModule mod_proxy.c>
ProxyRequests On
<Proxy *>
Order deny,allow
Deny from all
Allow from 서버IP입력하세요
</Proxy>
ProxyVia On
</IfModule>
이제 Apache는 프록시를 받아줄 준비가 되어있는것입니다.
Step 2. NGiNX 준비
nginx가 설치되어있다고 가장합니다.
(설치법 여기에 안씁니다. 글이 너무 길어지니 구글 등에서 "centos nginx 설치" 등으로 검색)
저의 nginx역시 yum으로 설치된것이라 환경설정 파일은 아래에 위치했습니다.
/etc/nginx/conf.d
이제 php로 넘겨줄 conf 파일 하나를 열어주세요.
php-fpm 쓰고 있다면
# service php-fpm stop
하시고, 기존 php 관련 설정을 지우시기 바랍니다.
그런 뒤, server {} 안쪽에 아무곳에나 아래내용을 복붙하세요.
# 리스닝 준비된 아파치로 프록시를 타 넘겨줍시다.
#
location ~ \.php$
{
proxy_pass http://서버IP:세팅된포트;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X_FORWARDED_PROTO http;
proxy_set_header X-Url-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
이제 저장하시기 바랍니다.
Step 3. Step 1&2 까지했다면, 서버가 클라이언트의 리얼ip를 모른다.
네, php에서 클라이언트 ip를 뽑을때 보통
<? $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; echo $REMOTE_ADDR; ?>
이런식으로들 씁니다.
Step 1~2 까지 하시고 아파치와 nginx를 재시작 하셨다면 출력되는 값은 접속한 ip가 아닌 프록시서버 ip가 됩니다.
이 부분 수정하려면
$_SERVER['REMOTE_ADDR']; 말고 $_SERVER['HTTP_X_FORWARDED_FOR'];로 쓰면 정상적으로 출력됩니다.
+ 아파치에서 mod_rpaf 를 설치해줍니다.
(여기서 설명해드리면 글이 너무 길어지기 때문에, http://me2.do/IMw1GWeX 이거 참고바랍니다.)
만약 위의 mod_rpaf 를 설치했음에도 불구하고 정상적인 ip를 모른다? 방법 있습니다.
xe 폴더에서 config 폴더안 'config.inc.php'를 찾아서 열어주세요.
그런다음 아래 코드를 넣어주세요.
function getIPAddress() {
if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_NS_CLIENT_IP") && strcasecmp(getenv("HTTP_NS_CLIENT_IPP"), "unknown"))
$ip = getenv("HTTP_NS_CLIENT_IP");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else {
$ip = "unknown";
return $ip;
}
return $ip;
}
$_SERVER['REMOTE_ADDR'] = getIPAddress();
넣으셨다면 아이피가 정상적으로 출력됩니다.
수고하셨습니다.
nginx를 리버스프록시로 구성하였습니다.
틀린 부분 지적부탁드리겠습니다.
p.s. 규모가 작다면, 이런 복잡한 구성보단 아파치 2.4버전이 더 좋습니다.
어차피 소규모에서는 기능발휘를 잘 못합니다.
댓글 6
-
KTK
2013.07.11 19:23
-
리크스
2013.07.11 22:45
php-fpm 보다는 아파치를 따로 설치하여 프록시 구성을 하는 것이 나은가요?
-
choco@_@
2013.07.11 23:03
규모가 작으시거나 현재 서버가 그럭저럭 돌아가면 아파치를 쓰십시요.
성능상 nginx + php-fpm 보다 아파치 + php가 더 좋긴합니다.
(프록시 구성도 괜찮은데 규모가 작으면 별 효과가 없어요.)
-
리크스
2013.07.11 23:09
아 현재 nginx + php-fpm 조합으로 사용중에 있거든요.
규모도 그럭저럭 커가는 중이라 프록시 설정할까 생각중인
-
choco@_@
2013.07.11 23:12
더 빠른 스피드와 부하분산을 원하면 프록시 구성도 좋습니다~
참고: 일베저장소와 네이버도 이 방식 채택
-
화랑529
2017.02.21 16:03
step 3 같은 경우 .. 모든 php 파일을 찾아서 $_SERVER['HTTP_X_FORWARDED_FOR'];으로 변환해줘야하나요 ?
제목 | 글쓴이 | 날짜 |
---|---|---|
[리눅스] 속도향상 팁. nginx를 리버스프록시로 써봅시다. [6] | choco@_@ | 2013.07.11 |
jquery swiper | Ansi™ | 2017.02.16 |
인스타그램 해시태그 회원가입 없이 끌어오기 | 외인 | 2017.02.08 |
CKEditor 글꼴란에 한글 폰트 추가하는 방법 (수정함) [4] | 기븐 | 2015.09.19 |
폰갭과 웹앱 그리고 XE... [6] | onTrust | 2015.04.23 |
jQuery 플러그인 모음 | Ansi™ | 2017.01.25 |
DOS 공격에 대한 방어 프로그램입니다. | 마루디자인 | 2017.01.23 |
관리자 로그인시 원하는걸 보여주자 [5] | 빽짱구 | 2008.04.15 |
SSL의 정석 (아파치 & nginx) [13] | 기진곰 | 2015.06.16 |
방명록 형태 사용시 제목이 길게 저장되게 하려면 | sejin7940 | 2016.12.23 |
로그인풀림방지 - 주소 고정하기 [27] | ezi | 2011.05.28 |
숫자 아이디 허용 방법 | 410contents | 2016.12.13 |
(설문조사) 회원만 설문 조사 하도록 [8] | Simulz | 2007.09.04 |
클라우드플레어 사용시 서버 IP 노출방지 체크리스트 | gnbstory | 2016.12.09 |
간단한 xe 관련 자바스크립트 질문 [1] | 마든남 | 2016.12.01 |
스크롤 맨아래로 내리면 자동으로 글 목록 더보이기 구현(게시판어어느 스킨이든 사용가능) [19] | 장포크 | 2013.08.10 |
메뉴에 새 글 표시 모듈 사용 시 new 아이콘이 보이지 않는 버그 수정 [8] | 퍼니엑스이 | 2014.08.12 |
가상서버 고르실때 참고하시면 좋겠네요. | 로니 | 2016.11.24 |
CloudFlare 사용시 방문자 IP와 SSL 접속여부가 정확하게 파악되지 않는 문제 해결법 [4] | 기진곰 | 2015.07.12 |
네이버 웹마스터도구 최적화검증과 GZIP | 영흥도우럭1 | 2016.11.18 |
상당히 어렵습니다 ㅠㅠ 한번 따라해 보겠습니다 좋은 팁 감사합니다.