AWS EC2(nginx)를 활용한 Reverse-Proxy 구현
※프록시
인터넷(클라이언트입장에서) 웹 서버에 접속을 하기 위해 http80포트를 이용 연결하나에 세션이 감당해야함.
그를 방지하기 위해 프록시라고하는 서버를 두어 클라이언트는 프록시와 통신.
프록시와 서버가 통신을 함.
프록시같은경우는 직접 서버에게 응답은 받은 후 클라이언트에게 응답처리함
리버스 프록시의 경우 클라이언트가 서버에게 직접 응답을 받음
즉, 프록시는 대리인이라고 할 수 있다.
※순서를 따라서 실습
구성요소(3개의 인스턴스 생성)
- nginx Reverse-Proxy(nginx) : 3.35.21.27 port80
- web1(apache) : 54.180.105.44 port80
- web2(tomcat) : 13.209.50.246 port 8080
※IP는 변동됨
클라이언트로부터 웹 접속을 받으면 nginx가 이를 먼저 받아서 PHP처리는 web1에게 JSP처리는 web2에게 전달하여 처리
Nginx
- nginx EC2에 nginx설치
sudo yum date -y(인스턴스 업데이트 )
sudo vi /etc/yum.repos.d/nginx.repo nginx(nginx저장소 등록)
====================================================
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
====================================================
esc :wq
sudo yum install nginx -y(nginx설치)
sudo systemctl start nginx(nginx시작)
sudo systemctl enable nginx(인스턴스 재시작시 자동으로 nginx 동작 설정)
가상호스트사용
sites-available 디렉토리 생성 및 virtual.conf 파일 생성
cd /etc/nginx
sudo mkdir sites-available
sudo vi sites-available/virtual.conf
====================================================
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/virtual/access_log;
error_log /var/log/nginx/virtual/error_log;
location / {
root /var/www/virtual/;
index index.php index.html;
}
}
====================================================
esc :wq - 로그 파일이 위치할 디렉터리 생성
sudo mkdir /var/log/nginx/virtual/ - HTML 파일이 위치할 디렉터리 생성(DocumentRoot)
sudo mkdir -p /var/www/virtual
※
sudo mkdir /var/www
sudo mkdir /var/www/virtual/을 해주어야하는데
-p 를 사용함으로써 sudo mkdir -p /var/www/virtual - nginx.conf 편집
sudo vi /etc/nginx/nginx.conf
====================================================
32번 라인주석처리 #include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-available/*.conf;
====================================================
esc :wq
sudo nginx -t(설정 파일이 올바른지 확인)
sudo systemctl restart nginx(nginx 재시작)
php설치
sudo amazon-linux-extras enable php8.1(php 8.1 활성화)
sudo yum -y install php php-fpm php-cli php-common php-devel php-pear php-mbstring php-mysqlnd php-pdo php-gd (php 설치)
ls /etc/nginx/conf.d/ 위치해있음 이를 etc/nginx/sites-available/ 위치로 이동해줘야함
sudo cp /etc/nginx/conf.d/php-fpm.conf /etc/nginx/sites-available/(php.fpm.conf을 복사)
sudo systemctl start php-fpm(php-fpm 시작)
sudo systemctl enable php-fpm(php-fpm 자동 실행)
web1
- sudo yum update -y
- sudo yum install httpd -y(아파치 설치)
- sudo amazon-linux-extras install php7.4 -y (※버젼이 달라도 가능함)
- sudo systemctl start httpd(아파치 시작)
- sudo systemctl enable httpd(아파치 자동시작)
- sudo vi /var/www/html/index.html
====================================================
web1 test page
====================================================
esc :wq
sudo vi /var/www/html/phpinfo.php
====================================================
<?php
phpinfo();
?>
====================================================
esc :wq
nginx
web1에 대한 리버스 프록시 가 동작하도록 nginx설정
sudo cp /etc/nginx/sites-available/virtual.conf /etc/nginx/site-available/virtual.conf_bk
기존에 존재하던 virual.conf 파일 백업
sudo vi /etc/nginx/sites-available/virtual.conf (virtual.conf 파일 수정)
====================================================
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/virtual/access_log;
error_log /var/log/nginx/virtual/error_log;
location / {
index index.php index.html;
proxy_pass http://54.180.105.44:80;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
}
}
====================================================
클라이언트 nginx server
실제 클라이언트 ip로 보내기 위해서 설정함
그렇게 해야 목적지 까지 보내줄 수 있다.
sudo systemctl restart nginx(nginx 재시작)
윈도우 웹 브라우저에서 nginx IP주소를 입력하면 web1의 index.html이 보임(그림 1)
IP주소/phpinfo.php도 호출(그림 2)
클라이언트 -> nginx -> server
클라이언트가 nginx에게 :80 요청(web1) :8080요청(web2)
80이냐 8080이냐 nginx가 분류해서 80이면 web1에게, 8080 web2에게 각각 전달
단순히 nginx는 전달역할만한다. 이것이 리버스 프록시이다.
web2
JSP 처리를 위해 web2에 tomcat 설치
apache-tomcat가 html,php, jsp 처리 혼자서 해결하기에 부하가 많이 걸린다.
이를 리버스프록시로 부하를 분산함.
sudo yum update -y
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gz(링크를 를 통해 tomcat 다운로드)
tar xvfz apache-tomcat-9.0.84(압축해제)
sudo mv apache-tomcat-9.0.84 /usr/local/tomcat(디렉터리 이름을 tomcat으로 변경하면서 /usr/local로 이동)
sudo amazon-linux-extras install java-openjdk11 -y(jdk 설치)
sudo yum install java-11-openjdk-devel -y (jdk 설치)
cd /usr/local/tomcat/bin
sh startup.sh(시작, ※종료 sh shutdown.sh)
nginx
nginx 서버에 jdk 설치
sudo amazon-linux-extras install java-openjdk11 -y(jdk 설치)
sudo yum install java-11-openjdk-devel -y (jdk 설치)
nginx의 sites-available/ 아래의 tomcat_proxy.conf파일 생성 및 수정
sudo vi /etc/nginx/sites-available/tomcat_proxy.conf
====================================================
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/virtual/access_log;
error_log /var/log/nginx/virtual/error_log;
location / {
index index.php index.html;
proxy_pass http://13.209.50.246:8080;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
}
}
====================================================
esc :wq
sudo systemctl restart nginx
윈도우\에서 주소창에 nginx EC2 IP 주소 입력하면 web1의 index.html(그림1),
nginx EC2 IP 주소/phpinfo.php를 입력하면 web1 phpinfo(그림2),
nginx EC2 IP 주소/index.jsp를 입력하면 그림3과 같이 나와야하는데.
설정이 잘못되어있어 오류페이지로 나온다. 다음시간에..
'KDT > Cloud' 카테고리의 다른 글
240119 Cloud (0) | 2024.01.19 |
---|---|
240112 Cloud (0) | 2024.01.12 |
231229 Cloud (0) | 2023.12.29 |
231222 Cloud (0) | 2023.12.22 |
231215 Cloud (0) | 2023.12.15 |