Make Be BackEnd

13. Nginx, Proxy 본문

스프링/개인포트폴리오

13. Nginx, Proxy

Initsave 2024. 6. 8. 19:45

nginx는 무엇이고 왜 쓰는 걸까? nginx는 고성능의 HTTP 및 리버스 프록시 웹 서버 소프트웨어이다.

Nginx의 주요 기능

  1. HTTP 서버:
    • 정적 파일 제공: HTML, CSS, JavaScript, 이미지 파일 등을 효율적으로 제공.
    • 동적 콘텐츠 지원: PHP와 같은 스크립트 언어와의 연동 가능 (FastCGI, uWSGI, SCGI, Apache의 mod_proxy 등을 사용).
    • HTTP/2 및 HTTP/3 지원.
  2. 리버스 프록시 서버:
    • 클라이언트 요청을 백엔드 서버로 전달하고, 응답을 클라이언트로 반환.
    • 로드 밸런싱: 여러 백엔드 서버로 트래픽을 분산하여 서버 부하를 줄임.
    • 캐싱: 백엔드 서버의 응답을 캐시하여 성능 향상.
  3. 메일 프록시 서버:
    • SMTP, POP3, IMAP 프록시 서버로 작동 가능.
  4. 로드 밸런서:
    • HTTP, TCP, UDP 트래픽을 다양한 방식으로 분산 (라운드 로빈, IP 해시 등).

Nginx의 장점

  1. 고성능:
    • 비동기 이벤트 기반 아키텍처를 사용하여 높은 동시성을 제공.
    • 낮은 메모리 사용량과 빠른 처리 속도.
  2. 확장성:
    • 모듈형 구조로 다양한 기능을 플러그인 형태로 추가 가능.
    • 큰 규모의 트래픽을 처리할 수 있도록 쉽게 확장 가능.
  3. 안정성:
    • 트래픽 스파이크에도 안정적인 성능 제공.
    • 서버 오류 발생 시에도 지속적인 서비스 제공을 위한 다양한 기능 (예: 자동 페일오버).
  4. 유연성:
    • 다양한 설정 옵션과 강력한 구성 파일 시스템.
    • 다양한 용도로 사용할 수 있는 다목적 서버.

Nginx의 사용 사례

  • 웹 서버: 정적 콘텐츠 제공, 웹 애플리케이션 호스팅.
  • 리버스 프록시: API 게이트웨이, 애플리케이션 프록시.
  • 로드 밸런서: 트래픽 분산, 서버 부하 분산.
  • 콘텐츠 캐싱: 캐시 서버로 사용하여 응답 시간 단축.

현재 포트폴리오 프로젝트에서는 어떤 동작을 위해 사용 할까? 포트 80에서 들어오는 요청을 포트 8080에서 동작하는 백엔드 서버로 프록시를 설정 할 것이다. 만약 프록시를 설정 안하면 Nginx만 나오게 된다. ( localhost:80 or localhost → localhost:8080)

설정 전에 간단하게 포트에 대해서 정리 !

  • 포트 80
    • http (기본 포트 : 80 생략가능)
    • 암호화 되지 않은 통신을 위한 포트
    • 모든 웹 브라우저와 네트워크 장비가 기본적으로 지원
    • http://example.com (=) http://example.com:80
  • 포트 443
    • https (기본 포트 : 443 생략가능)
    • SSL/TLS 암호화된 통신을 위한 포트
    • 보안이 필요한 웹 트래픽, 온라인 쇼핑, 금융 거래 등
    • 데이터의 기밀성과 무경설을 보장, 사용자의 신뢰도 항상
    • https://example.com:443
  • 포트 8080
    • http 트래픽을 위한 비표준 포트, 주로 개발/테스트 환경에서 사용(Tomcat)
    • 개발 중인 웹 애플리케이션, 프록시 서버, 관리용 인터페이스
    • 포트 80이 이미 사용중인 경우 대체 포트로 사용되기도하고 여러 서버를 동일한 ip에서 운영할 때 유용하다
    • http://example.com:8080

1. Mobaxterm 통해 EC2 서버 Nginx 설치/시작

$ yum search nginx << 사용 가능한 nginx패키지 검색
$ sudo yum install nginx << nginx 설치 (superuser do권한(sudo=root))
$ Is this ok [y/N]: y

>>> 만약 
 Run the following command to upgrade to 2023.4.20240528:

      dnf upgrade --releasever=2023.4.20240528

    Release notes:
     https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.4.20240528.html
>>> 위의 메세지가 보인다면 업데이트 해주자!! (새로운 버전이 나왔다는 뜻)
$ sudo dnf upgrade --releasever=2023.4.20240528
$ Is this ok [y/N]: y

>>>서비스, 설정을 바꿀때는 무조건 sudo 권한으로 하기
$ sudo service nginx << 명령어 보기
$ sudo service nginx status << nginx 상태 확인
$ sudo service nginx start << 상태가 dead ~> 스타트
$ sudo service nginx status << nginx 상태 확인 (active(running))

$ netstat << port 확인 명령어
$ netstat -tnl | grep 80
<< -tnl : 옵션은 tcp 연결을 보고 연결 상태 및 주소를 숫자로 표시, 리스님 상태인 소켓만 보여줌
<< grep 80 : 포트 번호가 80인 항목만 필터링

 

EC2 설정 → 보안그룹 → 인바운드규칙 변경 (8080→ 80)

주의 : port 22를 설정 하지 않으면 SSH(원격으로 인스턴스에 접속하고 관리)를 사용하여 인스턴스에 접근 할 수 없다.

 

퍼블릭 주소 띄우기

 

2. 프록시 설정 ( 80→8080)
웹서버는 사용자 요청을 다 받고 백엔드 서버(tomcat)는 사용자가 몰라도 된다. ( 웹→tomcat)
80 포트에 여러개 서버(톰캣) 가능, 로드밸런싱은 Nginx가 하지 않는다.
L4 - 로드 밸런싱(서버부하분산처리), L2- 상위 밸런싱(layer2경로지정)

>> path : /etc/nginx/

$ cd /etc/nginx/
$ pwd
$ ll -al

$ cd conf.d
$ pwd
$ ll -al

>>  error.log 위치 확인
$ vi /etc/nginx/nginx.conf
 /var/login/nginx/error.log
>> access_log 에 맨 뒤 main 은 log_format main

include /etc/nginx/conf.d/*.conf; << conf.d 폴더에 (*).conf 파일을 모두 읽겠다
>> 빠져나가기

>> (프록시설정).conf 설정파일 생성하기
>> conf.d 폴더는 root 권한이기 때문에 (ll로 확인 가능)
>> sudo로 pf.conf 설정 파일을 만들어야 한다.

$ sudo vi /etc/nginx/conf.d/pf.conf

>>>

server {
    listen       80;
    server_name  (ipv4_public_dns); 

    charset UTF-8;
    access_log  /var/log/nginx/pf/pf.access.log;
    error_log   /var/log/nginx/pf/pf.error.log;

    location /pf {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://127.0.0.1:8080/pf; 
    }

    location ~ /\.ht {
        deny  all;
    }
}

>>> pf.conf 저장
 >> (ipv4_public_dns) -> ec2 서버주소 변경
 >> location /pf -> context-root를 location 뒤에 입력
 >> proxy_pass -> 지정된 로컬ip에서 프록시 서버로 나가는 연결 시작 (context-root)

$ sudo service nginx reload << 설정 파일 적용시키기 위해 리로드

error (1)
>> [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
>> 에러가 날것이다. 이유는 Permission denied 

$ sudo su
$ chown nginx:nginx -R /var/log/nginx
$ chmod 645 /var/log/nginx -R
>> chown : 파일 또는 디렉토리의 소유자와 그룹을 변경하는 명령어
>> -R : recursive (하위폴더 모두 다~)

>> 주의 할점, root 권한으로 무언가 실행시키면 안된다. 
>> 실제 서비스를 루트 권한으로 띄우는것은 보안상의 위험을 초래할 수 있기 때문에 위험하다
>> 루트는 확인할때만 들어온 것이지 실행해선 안된다


error (2) 
$ nginx -t << nginx 
>> [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64

$ vi /etc/nginx/nginx.conf
>> 
http {
.....
   access_log ~~~~;
   server_names_hash_bucket_size 128;
.....
}
>> 추가

$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok


error (3)
$nginx -t 
>> [emerg] open() "/var/log/nginx/pf/pf.access.log" failed (2: No such file or directory)
>> 폴더 없음

$ cd /var/log/nginx/
$ ll -al
>> 폴더 없음을 확인하고 생성
$ mkdir pf
$ ll -al >> 폴더 생성 확인

$ nginx -t
$ exit << root 권한 빠져나가기 (root-> ec2-user)

$ sudo service nginx reload
>> Redirecting to /bin/systemctl reload nginx.service

 

참고 홈페이지

 

https://docs.nginx.com/nginx/admin-guide/web-server/web-server/

 

Configuring NGINX and NGINX Plus as a Web Server | NGINX Documentation

Configuring NGINX and NGINX Plus as a Web Server Configure NGINX and NGINX Plus as a web server, with support for virtual server multi-tenancy, URI and response rewriting, variables, and error handling. This article explains how to configure NGINX Open Sou

docs.nginx.com

Configuring HTTPS servers

 

Configuring HTTPS servers

Configuring HTTPS servers To configure an HTTPS server, the ssl parameter must be enabled on listening sockets in the server block, and the locations of the server certificate and private key files should be specified: server { listen 443 ssl; server_name

nginx.org

 

설정 후 퍼블릭주소 :80/pf 로 주소창에 검색