CentOS 7에서 mod_proxy와 함께 Apache를 리버스 프록시로 사용하는 방법
소개
역방향 프록시는 HTTP(S) 요청을 받아 이를 하나 이상의 백엔드 서버에 투명하게 배포하는 일종의 프록시 서버입니다. 리버스 프록시는 많은 최신 웹 애플리케이션이 사용자가 직접 액세스할 수 없는 백엔드 애플리케이션 서버를 사용하여 들어오는 HTTP 요청을 처리하고 종종 기본적인 HTTP 기능만 지원하기 때문에 유용합니다.
리버스 프록시를 사용하여 이러한 기본 애플리케이션 서버에 직접 액세스하지 못하도록 할 수 있습니다. 또한 들어오는 요청의 로드를 여러 다른 애플리케이션 서버로 분산하여 규모에 맞게 성능을 높이고 안전 장치를 제공하는 데 사용할 수 있습니다. 캐싱, 압축 또는 SSL 암호화와 같이 애플리케이션 서버가 제공하지 않는 기능으로 격차를 메울 수 있습니다.
이 자습서에서는 mod_proxy
확장을 사용하여 Apache를 기본 리버스 프록시로 설정하여 들어오는 연결을 동일한 네트워크에서 실행되는 하나 이상의 백엔드 서버로 리디렉션합니다. 이 자습서에서는 Flask 웹 프레임워크로 작성된 간단한 백엔드를 사용하지만 원하는 백엔드 서버를 사용할 수 있습니다.
전제 조건
이 자습서를 따르려면 다음이 필요합니다.
- 루트가 아닌 sudo 사용자를 포함하여 이 초기 서버 설정 자습서로 설정된 CentOS 7 서버 1대.
- CentOS 7에 Linux, Apache, MySQL, PHP(LAMP) 스택을 설치하는 방법의 1단계에 따라 서버에 Apache 2를 설치했습니다.
- 선택적으로
yum install nano
와 함께 설치된nano
텍스트 편집기. CentOS는 기본적으로vi
텍스트 편집기와 함께 제공되지만nano
가 더 사용자 친화적일 수 있습니다.
1단계 — 필요한 Apache 모듈 소개
Apache를 리버스 프록시로 사용하는 데 필요한 모듈에는 mod_proxy
자체와 다양한 네트워크 프로토콜을 지원하도록 기능을 확장하는 몇 가지 애드온 모듈이 포함됩니다. 특히 다음을 사용합니다.
mod_proxy
, 연결 리디렉션을 위한 기본 프록시 모듈 Apache 모듈. 이를 통해 Apache는 기본 애플리케이션 서버에 대한 게이트웨이 역할을 할 수 있습니다.mod_proxy_http
, HTTP 연결 프록시 지원을 추가합니다.mod_proxy_balancer
및mod_lbmethod_byrequests
는 여러 백엔드 서버에 로드 밸런싱 기능을 추가합니다.
새로운 CentOS 7 설치에서는 기본적으로 네 가지 모듈이 모두 활성화됩니다. 다음을 실행하여 활성화되었는지 확인할 수 있습니다.
- httpd -M
명령 출력에는 활성화된 모든 Apache 모듈이 나열됩니다. 찾고 있는 네 줄은 앞서 언급한 모듈 이름입니다.
Output. . .
proxy_module (shared)
. . .
lbmethod_byrequests_module (shared)
. . .
proxy_balancer_module (shared)
. . .
proxy_http_module (shared)
. . .
모듈이 활성화되지 않은 경우 nano
로 /etc/httpd/conf.modules.d/00-proxy.conf
를 열어 모듈을 활성화할 수 있습니다.
- sudo nano /etc/httpd/conf.modules.d/00-proxy.conf
파일이 다음과 같이 보이도록 줄 시작 부분에서 #
기호를 제거하여 필요한 모듈이 있는 줄의 주석 처리를 제거합니다.
. . .
LoadModule proxy_module modules/mod_proxy.so
. . .
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
. . .
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
. . .
LoadModule proxy_http_module modules/mod_proxy_http.so
. . .
변경 사항을 적용하려면 파일을 저장하고 Apache를 다시 시작하십시오.
- sudo systemctl restart httpd
Apache는 이제 HTTP 요청에 대한 리버스 프록시 역할을 할 준비가 되었습니다. 다음 단계에서는 두 개의 매우 기본적인 백엔드 서버를 생성합니다. 이는 구성이 제대로 작동하는지 확인하는 데 도움이 되지만 이미 자체 백엔드 애플리케이션이 있는 경우 3단계로 건너뛸 수 있습니다.
2단계 - 백엔드 테스트 서버 생성
몇 가지 간단한 백엔드 서버를 실행하면 Apache 구성이 제대로 작동하는지 쉽게 테스트할 수 있습니다. 여기에서는 한 줄의 텍스트를 인쇄하여 HTTP 요청에 응답하는 두 개의 테스트 서버를 만들 것입니다. 한 서버는 Hello world!라고 말할 것입니다. 다른 하나는 Howdy world!라고 말할 것입니다.
참고: 비테스트 설정에서 백엔드 서버는 일반적으로 모두 같은 종류의 콘텐츠를 반환합니다. 그러나 특히 이 테스트의 경우 두 서버가 서로 다른 메시지를 반환하도록 하면 부하 분산 메커니즘이 두 서버를 모두 사용하는지 쉽게 확인할 수 있습니다.
Flask는 웹 애플리케이션 구축을 위한 Python 마이크로프레임워크입니다. 기본 앱에는 몇 줄의 코드만 필요하기 때문에 Flask를 사용하여 테스트 서버를 만들고 있습니다. 이를 설정하기 위해 Python을 알 필요는 없지만 배우고 싶다면 이 Python 자습서를 볼 수 있습니다.
먼저 IUS 패키지 리포지토리 파일을 설치하겠습니다. IUS(Inline with Upstream Stable)는 Python 3을 포함하여 최신 버전의 엄선된 소프트웨어를 CentOS에 제공하는 커뮤니티 프로젝트입니다.
- sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
그런 다음 권장되는 Python 패키지 관리자인 Python 3 및 Pip를 설치합니다.
- sudo yum -y install python35u python35u-pip
Pip을 사용하여 Flask를 설치합니다.
- sudo pip3.5 install flask
이제 모든 필수 구성 요소가 설치되었으므로 현재 사용자의 홈 디렉터리에 첫 번째 백엔드 서버에 대한 코드를 포함할 새 파일을 생성하여 시작합니다.
- nano ~/backend1.py
다음 코드를 파일에 복사한 다음 저장하고 닫습니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello world!'
처음 두 줄은 Flask 프레임워크를 초기화합니다. 한 줄의 텍스트(Hello world!
)를 반환하는 함수 home()
이 있습니다. home()
함수 정의 위의 @app.route(/)
줄은 Flask에게 home()
의 반환 값을 응답으로 사용하도록 지시합니다. 애플리케이션의 /
루트 URL로 향하는 HTTP 요청에.
두 번째 백엔드 서버는 다른 텍스트 행으로 돌아가는 것을 제외하면 첫 번째와 정확히 동일하므로 첫 번째 파일을 복제하여 시작합니다.
- cp ~/backend1.py ~/backend2.py
새로 복사한 파일을 엽니다.
- nano ~/backend2.py
Hello world!에서 반환할 메시지를 변경합니다. Howdy world!로 이동한 다음 파일을 저장하고 닫습니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Howdy world!'
다음 명령을 사용하여 포트 8080
에서 첫 번째 백그라운드 서버를 시작합니다. 이렇게 하면 콘솔 출력이 더 흐려지기 때문에 Flask의 출력이 /dev/null
로 리디렉션됩니다.
- FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
여기서 FLASK_APP
환경 변수를 같은 줄에 설정하여 flask
명령 앞에 있습니다. 환경 변수는 셸에서 생성된 프로세스에 정보를 전달하는 편리한 방법입니다. Linux VPS에서 환경 및 셸 변수를 읽고 설정하는 방법에서 환경 변수에 대해 자세히 알아볼 수 있습니다.
이 경우 환경 변수를 사용하면 설정이 실행 중인 명령에만 적용되고 나중에 사용할 수 없게 됩니다. 동일한 방식으로 다른 파일 이름을 전달하여 flask
명령에 두 번째 서버
마찬가지로 이 명령을 사용하여 포트 8081
에서 두 번째 서버를 시작합니다. FLASK_APP
환경 변수의 다른 값에 유의하십시오.
- FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
curl
을 사용하여 두 서버가 실행 중인지 테스트할 수 있습니다. 첫 번째 서버 테스트:
- curl http://127.0.0.1:8080/
그러면 Hello world!가 출력됩니다. 터미널에서. 두 번째 서버를 테스트합니다.
- curl http://127.0.0.1:8081/
이것은 Howdy world를 출력할 것입니다! 대신에.
참고: 더 이상 필요하지 않은 후 두 테스트 서버를 모두 닫으려면 이 튜토리얼을 완료한 후 killall flask
를 실행하면 됩니다.
다음 단계에서는 리버스 프록시로 사용할 수 있도록 Apache의 구성 파일을 수정합니다.
3단계 - 역방향 프록시를 활성화하도록 기본 구성 수정
이 섹션에서는 기본 Apache 가상 호스트를 설정하여 단일 백엔드 서버 또는 부하 분산된 백엔드 서버 배열에 대한 역방향 프록시 역할을 합니다.
참고: 이 자습서에서는 가상 호스트 수준에서 구성을 적용합니다. Apache의 기본 설치에는 구성된 가상 호스트가 없습니다. 우리는 모든 트래픽을 포착할 하나의 기본 가상 호스트를 생성할 것입니다. 그러나 다른 가상 호스트에서도 이러한 모든 구성 조각을 사용할 수 있습니다. Apache의 가상 호스트에 대해 자세히 알아보려면 CentOS 7에서 Apache 가상 호스트를 설정하는 방법 자습서를 참조하십시오.
Apache 서버가 HTTP 및 HTTPS 서버로 작동하는 경우 리버스 프록시 구성을 HTTP 및 HTTPS 가상 호스트 모두에 배치해야 합니다. Apache를 사용한 SSL에 대한 자세한 내용은 CentOS 7용 Apache에서 SSL 인증서를 만드는 방법 자습서를 참조하십시오.
nano
또는 즐겨 사용하는 텍스트 편집기를 사용하여 /etc/httpd/conf.d
디렉토리에 빈 Apache 구성 파일을 새로 만들어 새 기본 가상 호스트를 만듭니다.
- sudo nano /etc/httpd/conf.d/default-site.conf
아래의 첫 번째 예는 단일 백엔드 서버에 대한 역방향 프록시로 기본 가상 호스트를 구성하는 방법을 설명하고 두 번째 예는 여러 백엔드 서버에 대해 부하 분산된 역방향 프록시를 설정하는 방법을 설명합니다.
예 1 - 단일 백엔드 서버의 리버스 프록싱
다음 콘텐츠를 default-site.conf
파일에 붙여넣으면 구성 파일이 다음과 같이 표시됩니다.
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
2단계의 예제 서버를 따른 경우 위 블록에 기록된 대로 127.0.0.1:8080
을 사용합니다. 자체 애플리케이션 서버가 있는 경우 해당 주소를 대신 사용하십시오.
여기에는 세 가지 지시문이 있습니다.
ProxyPreserveHost
는 Apache가 원래Host
헤더를 백엔드 서버에 전달하도록 합니다. 이것은 백엔드 서버가 애플리케이션에 액세스하는 데 사용되는 주소를 인식하게 하므로 유용합니다.ProxyPass
는 기본 프록시 구성 지시문입니다. 이 경우 루트 URL(/
) 아래의 모든 것이 지정된 주소의 백엔드 서버에 매핑되어야 함을 지정합니다. 예를 들어 Apache가/example
에 대한 요청을 받으면http://your_backend_server/example
에 연결하고 원래 클라이언트.ProxyPassReverse
는ProxyPass
와 동일한 구성을 가져야 합니다. 백엔드 서버에서 응답 헤더를 수정하도록 Apache에 지시합니다. 이렇게 하면 백엔드 서버가 위치 리디렉션 헤더를 반환하는 경우 클라이언트의 브라우저가 의도한 대로 작동하지 않는 백엔드 서버 주소가 아닌 프록시 주소로 리디렉션됩니다.
이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.
- sudo systemctl restart httpd
이제 웹 브라우저에서 http://your_server_ip
에 액세스하면 표준 Apache 시작 페이지 대신 백엔드 서버 응답이 표시됩니다. 2단계를 따랐다면 Hellow world!가 표시됩니다.
예 2 - 여러 백엔드 서버 간 로드 밸런싱
백엔드 서버가 여러 개인 경우 프록시를 사용할 때 서버 간에 트래픽을 분산하는 좋은 방법은 mod_proxy
의 로드 밸런싱 기능을 사용하는 것입니다.
VirtualHost
블록 내의 모든 콘텐츠를 다음으로 교체하여 구성 파일이 다음과 같이 보이도록 합니다.
<VirtualHost *:80>
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080
BalancerMember http://127.0.0.1:8081
</Proxy>
ProxyPreserveHost On
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
구성은 이전과 비슷하지만 단일 백엔드 서버를 직접 지정하는 대신 추가 Proxy
블록을 사용하여 여러 서버를 정의했습니다. 블록의 이름은 balancer://mycluster
(이름은 자유롭게 변경할 수 있음)이며 하나 이상의 BalancerMember
로 구성됩니다. 기본 백엔드 서버 주소. ProxyPass
및 ProxyPassReverse
지시문은 특정 서버 대신 mycluster
라는 로드 밸런서 풀을 사용합니다.
2단계의 예제 서버를 따른 경우 BalancerMember
지시문에 127.0.0.1:8080
및 127.0.0.1:8081
을 사용합니다. 위의 블록에 쓰여진 대로. 자체 애플리케이션 서버가 있는 경우 해당 주소를 대신 사용하십시오.
이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.
- sudo systemctl restart httpd
웹 브라우저에서 http://your_server_ip
에 액세스하면 표준 Apache 페이지 대신 백엔드 서버의 응답이 표시됩니다. 2단계를 따른 경우 페이지를 여러 번 새로 고치면 Hello world!가 표시되어야 합니다. 및 Howdy world!는 리버스 프록시가 작동하고 두 서버 간에 로드 밸런싱되고 있음을 의미합니다.
이제 Apache를 하나 이상의 기본 애플리케이션 서버에 대한 리버스 프록시로 설정하는 방법을 알았습니다. mod_proxy
는 Python 및 Django 또는 Ruby 및 Ruby on Rails와 같은 다양한 언어 및 기술로 작성된 애플리케이션 서버에 역방향 프록시를 구성하는 데 효과적으로 사용할 수 있습니다. 또한 트래픽이 많은 사이트의 여러 백엔드 서버 간에 트래픽 균형을 조정하거나 여러 서버를 통해 고가용성을 제공하거나 기본적으로 SSL을 지원하지 않는 백엔드 서버에 보안 SSL 지원을 제공하는 데 사용할 수 있습니다.
mod_proxy
와 mod_proxy_http
가 가장 일반적으로 사용되는 모듈 조합이지만 다른 네트워크 프로토콜을 지원하는 몇 가지 다른 모듈이 있습니다. 여기서는 사용하지 않았지만 다른 인기 있는 모듈은 다음과 같습니다.
- FTP용
mod_proxy_ftp
. - SSL 터널링용
mod_proxy_connect
. mod_proxy_ajp
는 Tomcat 기반 백엔드와 같은 AJP(Apache JServ Protocol)용입니다.- 웹 소켓용
mod_proxy_wstunnel
.
mod_proxy
에 대해 자세히 알아보려면 공식 Apache mod_proxy
문서를 참조하세요.