Open ksy90101 opened 3 years ago
웹 애플리케이션은 특성상 다양한 IP 주소와 포트 번호에 대해 요청을 받을 수 있어야 한다.
라는 말이 이해가 안되는데, 혹시 예제가 있을까요?그러나 로드 밸런서가 장애가 나면 전체 서비스에 장애가 나기 때문에 나머지 서버들이 전체 서비스 장애로 이어지기 떄문에 주의해야 한다.
이 문제를 해결하기 위한 방법이 뭐가 있을까요?
@ksy90101
데이터베이스는 연결되어 있는 특정 서버와의 통신만 하면 되는 반면에, 웹 어플리케이션은 모든 사용자의 IP를 허용해줘야 한다는 이야기같네요. 포트번호 또한 같은 맥락으로 생각하면 될 것 같아요. 웹 애플리케이션은 기본적으로 서비스를 제공하기 위한 80, 443포트 외에도 이메일 서비스를 위한 포트 등 여러가지 포트를 개방할 수 있지 않을까요? 반면에 데이터베이스를 운영하는 서버에서는 해당 포트들은 열어둘 필요가 없겠죠.
로드밸런서를 이중화하고 서로 Health Check를 하면서 Primary 로드밸런서가 죽었을 때만 Secondary가 작동하도록 만들 수 있을 것 같아요. (링크 참고 또는 loadbalancer failover 키워드 검색) Redis 캐시 사용할 때에도 장애 발생상황을 고려하여 이런 전략을 세우더라구요.
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.domain.com/health
devel 패키지가 무엇일까?
nginx에 설정하는 헤더
nginx에서 제공하는 변수
Amazon Linux의 기반인 Redhat에서는 nginx 기본 설치시 sites-available이나 sites-enabled 디렉토리를 가지지 않는다고 합니다. 사용하고 싶다면 이 링크를 참고하세요. 우분투 AMI로 인스턴스 생성 시 기본적으로 제공됩니다.
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
와 같은 값입니다
$host
는 요청 헤더에서 'Host' 필드를 가져오거나 서버이름 또는 호스트 이름을 가져옵니다$http_host
는 $host
와 같은 역할을 하나 보안상? $http_host
를 쓰는 것 같습니다. 정확히 모르겠네요ㅠ 해석 가능하신 분 해석점 부탁드립니당 (https://github.com/nginx-proxy/nginx-proxy/issues/763)$proxy_add_x_forwarded_for
는 nginx의 Proxy 모듈(ngx_http_proxy_module)에 있는 변수입니다
X-Forwarded-For
헤더에 $remote_addr
을 자동으로 추가하는 역할을 합니다X-Forwarded-For
헤더에 계속해서 추가해줍니다proxy_set_header Accept-Encoding "";
X-
를 붙이나?X-
를 붙입니다$remote_addr
(요청의 클라이언트의 IP)를 넣어줍니다.request.getHeader("x-forwarded-for");
를 사용해 들어온 클라이언트의 IP들을 알 수 있습니다즉, 위에 있는 3개의 헤더를 추가해준 이유는 로깅 및 통계를 위해 요청의 Host 요청의 클라이언트의 IP 지금까지 거쳐온 프록시 서버들의 IP와 클라이언트 IP 를 서버가 알 수 있도록 하기 위함입니다.
서버 구성 환경
특이사항
책에서 사용하는 예시랑 기술스택이 달라서 실습 환경이 책이랑 많이 달라짐
특히, nginx는 실습한 AMI의 기본 패키지 yum repository에서 지원x
amazon-linux-extras repository
에서 아래 커맨드로 nginx설치기타 (알게된것)
ec2-user
이다.sudo service nginx restart
를 통해 변경된 설정으로 nginx를 재시작 하자..!service nginx XXX
시리즈 명령은systemctl XXX nginx
명령으로 리다이렉트 된다 ...~chown [-R] ${유저이름[:그룹]} ${디렉토리 || 파일}
명령으로 디렉토리 || 파일의 소유권을 변경할 수 있다.mv ${원본파일} ${새파일명 || 디렉토리}
명령으로 지정한 디렉토리로 이동 혹은, 새파일명으로 이름 변경.~Java11로 설치한 이유는 JordyApplication을 Java11로 만들어서 ..~