Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

02장: 운영 서버 환경의 구성 #2

Open
ksy90101 opened this issue Mar 1, 2021 · 8 comments
Open

02장: 운영 서버 환경의 구성 #2

ksy90101 opened this issue Mar 1, 2021 · 8 comments
Labels

Comments

@ksy90101
Copy link
Contributor

ksy90101 commented Mar 1, 2021

No description provided.

@mintjordy
Copy link
Contributor

mintjordy commented Mar 3, 2021

서버 구성 환경

  • AMI: amazon-linux-2
  • Java11, nginx 추가 설치
  • AWS 콘솔에서 보안 그룹 및 인스턴스 생성시 설정은 책과 동일하게 구성

특이사항

  • 책에서 사용하는 예시랑 기술스택이 달라서 실습 환경이 책이랑 많이 달라짐
# /etc/nginx/nginx.conf 에서 server 블록 안에 "/" 경로 이하 요청에 대한 리버스 프록시 설정 추가 
location / {
    proxy_pass http://localhost:8080;
    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;
}
  • 특히, nginx는 실습한 AMI의 기본 패키지 yum repository에서 지원x
    • 아래같이 aws에서 지원해주는 amazon-linux-extras repository에서 아래 커맨드로 nginx설치
    • Java11도 같은 Repository에서 설치함
# java, nginx  설치 커맨드
sudo amazon-linux-extras install nginx1
sudo amazon-linux-extras install java-openjdk11

기타 (알게된것)

  • ec2 인스턴스의 기본 사용자 이름은 ec2-user이다.
  • nginx 설정 파일 변경후에는 sudo service nginx restart를 통해 변경된 설정으로 nginx를 재시작 하자..!
  • service nginx XXX 시리즈 명령은 systemctl XXX nginx 명령으로 리다이렉트 된다 ...
  • chown [-R] ${유저이름[:그룹]} ${디렉토리 || 파일} 명령으로 디렉토리 || 파일의 소유권을 변경할 수 있다.
    • -R옵션: 하위 파일/디렉토리 포함
  • mv ${원본파일} ${새파일명 || 디렉토리}명령으로 지정한 디렉토리로 이동 혹은, 새파일명으로 이름 변경.
# 친숙해지자 
sudo service nginx restart 
sudo service nginx start
sudo service nginx stop

Java11로 설치한 이유는 JordyApplication을 Java11로 만들어서 ..

@ksy90101
Copy link
Contributor Author

ksy90101 commented Mar 6, 2021

[질문]

  1. p10. 웹 애플리케이션은 특성상 다양한 IP 주소와 포트 번호에 대해 요청을 받을 수 있어야 한다.라는 말이 이해가 안되는데, 혹시 예제가 있을까요?
  2. p11 그러나 로드 밸런서가 장애가 나면 전체 서비스에 장애가 나기 때문에 나머지 서버들이 전체 서비스 장애로 이어지기 떄문에 주의해야 한다. 이 문제를 해결하기 위한 방법이 뭐가 있을까요?

[해보고 싶은거]

  • 단순히 프로세스의 실행뿐만 아니라 서버 자원을 최적으로 사용하기 위해 프로세스의 수나 프로세스의 메모리를 조절하기도 한다.

@KS-KIM
Copy link

KS-KIM commented Mar 6, 2021

@ksy90101

  1. 데이터베이스는 연결되어 있는 특정 서버와의 통신만 하면 되는 반면에, 웹 어플리케이션은 모든 사용자의 IP를 허용해줘야 한다는 이야기같네요. 포트번호 또한 같은 맥락으로 생각하면 될 것 같아요. 웹 애플리케이션은 기본적으로 서비스를 제공하기 위한 80, 443포트 외에도 이메일 서비스를 위한 포트 등 여러가지 포트를 개방할 수 있지 않을까요? 반면에 데이터베이스를 운영하는 서버에서는 해당 포트들은 열어둘 필요가 없겠죠.

  2. 로드밸런서를 이중화하고 서로 Health Check를 하면서 Primary 로드밸런서가 죽었을 때만 Secondary가 작동하도록 만들 수 있을 것 같아요. (링크 참고 또는 loadbalancer failover 키워드 검색) Redis 캐시 사용할 때에도 장애 발생상황을 고려하여 이런 전략을 세우더라구요.

@hongbin-dev
Copy link
Member

hongbin-dev commented Mar 6, 2021

이슈

  1. 빌드하는데 메모리가 터짐
  1. nginx상에서 url prefix를 달아보고 싶었다.

    server {
        listen       80;
        listen       [::]:80;
        server_name  3.36.116.92;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location /v1 {
                proxy_pass http://localhost:8080;

        }
        location /v2 {
                proxy_pass http://localhost:8081;
        }

        location /v3 {
                default_type text/html;
                return 200 'gangnam style!';
        }

        location /v4 {
                rewrite /v4(.*) /$1 break;
                proxy_pass http://localhost:8080;
                proxy_redirect off;
        }
    }
  • v1, v2 같은경우는 애플리케이션에서 /v1/hello라는 url을 찾을 수 없어서 404가 뜨더라.
  • 그래서 v4같이 url을 한번 정재해서 proxy path에 넘기도록 할 수 있다고 한다.
  • https://serverfault.com/questions/379675/nginx-reverse-proxy-url-rewrite
  • 일반적으로 이런방법보다 서브도메인을 많이사용하는 것 같다. v1.domain.com/health

생각

  • 설치부터 배포하니까 생각보다 많이 귀찮았다. 도커의 장점을 세삼 깨닮음

@KS-KIM
Copy link

KS-KIM commented Mar 7, 2021

알게된 것

  • 하나의 인스턴스에 여러개의 보안 규칙을 적용할 수 있다.
  • 인스턴스를 중지시켜도 스토리지 비용을 지불해야 한다.

devel 패키지가 무엇일까?

nginx에 설정하는 헤더

nginx에서 제공하는 변수

@ksy90101
Copy link
Contributor Author

ksy90101 commented Mar 7, 2021

https://jojoldu.tistory.com/261

@KS-KIM KS-KIM closed this as completed Mar 7, 2021
@KS-KIM KS-KIM reopened this Mar 7, 2021
@KS-KIM
Copy link

KS-KIM commented Mar 7, 2021

Amazon Linux의 기반인 Redhat에서는 nginx 기본 설치시 sites-available이나 sites-enabled 디렉토리를 가지지 않는다고 합니다.
사용하고 싶다면 이 링크를 참고하세요.
우분투 AMI로 인스턴스 생성 시 기본적으로 제공됩니다.

@aegis1920
Copy link

Nginx header 알아보기

nginx에서 사용하는 변수와 속성들을 알고 사용하고 싶어서 좀 더 찾아봤습니다 :)

찾다보니 좀 깊게 팠네요ㅎㅎ

location / {
    proxy_pass http://localhost:8080;
    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;
}

변수들

  • $remote_addr, $http_host는 nginx의 Core 모듈(ngx_http_core_module)에 있는 변수입니다
    • $remote_addr 는 클라이언트의 IP를 가리킵니다
      • 서버(스프링부트)에서도 request.getRemoteAddress(); 를 사용해 클라이언트의 IP를 얻을 수 있습니다
    • $http_host$host 와 같은 값입니다
  • $proxy_add_x_forwarded_for는 nginx의 Proxy 모듈(ngx_http_proxy_module)에 있는 변수입니다
    • X-Forwarded-For 헤더에 $remote_addr을 자동으로 추가하는 역할을 합니다
    • 즉, 거치는 클라이언트마다 클라이언트의 IP를 X-Forwarded-For 헤더에 계속해서 추가해줍니다

proxy_set_header 속성

  • 말 그대로 해석하시면 됩니다 :)
  • 프록시 서버(nginx)에 전달된 요청 헤더에 필드를 재정의하거나 추가할 수 있습니다
  • 헤더 필드의 value가 빈 문자열이면 전달되지 않습니다.
    • proxy_set_header Accept-Encoding "";

헤더에 왜 X- 를 붙이나?

  • 일반적으로 비표준 헤더면 X-를 붙입니다

X-Real-IP

  • 말 그대로 요청의 클라이언트의 IP를 가져오기 위한 헤더입니다
  • $remote_addr (요청의 클라이언트의 IP)를 넣어줍니다.

X-Forwarded-For

  • 서버에 요청한 클라이언트의 IP를 식별하기 위한 헤더(사실상 표준)
  • 클라이언트의 IP와 거쳐온 프록시 서버들의 IP들을 담아서 가지고 옵니다
  • 서버(스프링부트)에서 request.getHeader("x-forwarded-for"); 를 사용해 들어온 클라이언트의 IP들을 알 수 있습니다
  • 클라이언트의 IP 주소와 같이 민감한 개인 정보를 노출시키기 때문에 사용자의 프라이버시를 주의해야 합니다.
  • X-Forwarded-For를 쓰는 이유는?
    • 디버깅, 통계, 로깅할 때 사용됩니다

Host

  • HTTP Request의 Host 헤더 속성을 표현하는 헤더

즉, 위에 있는 3개의 헤더를 추가해준 이유는
로깅 및 통계를 위해
요청의 Host
요청의 클라이언트의 IP
지금까지 거쳐온 프록시 서버들의 IP와 클라이언트 IP
를 서버가 알 수 있도록 하기 위함입니다.

출처

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants