ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nginx 무중단 배포 따라하고, 에러 해결 하기
    Linux 2021. 8. 1. 23:02
    반응형

    서론

    이 글은 스프링부트 + AWS로 유명한 이동욱 개발자님의 글을 바탕으로 작성합니다. 전체적인 흐름은 해당 블로그를 보시면 됩니다.

    https://jojoldu.tistory.com/267


    그렇다면 이 글은 왜 작성할까요?

    이동욱 개발자님의 글은 아주 완벽하지만, 정작 제가 사용하는 환경과 달랐습니다. 아마도 해당글을 작성한 시기, 버전, OS가 달랐기 때문에 중간중간 에러가 발생했습니다. 그래서 해당 블로그의 글 중에서 저와 맞지 않던 설정 부분과 어떻게 해결했는지 작성합니다.

    아래의 스펙을 따릅니다.

    • 오라클 클라우드
    • Ubuntu 20.04
    • Nginx 1.18.0

    Nginx 설치

    이동욱 개발자님 블로그에서는 yum을 사용했지만, 저는 ubuntu의 기본 패키지 설치 명령어인 apt를 사용하도록 하겠습니다.

    sudo apt update sudo apt install nginx

     

    apt vs apt-get?

    리눅스 공식 패키지 관리 문서들에서도 apt, apt-get 둘 다 사용되고 있습니다.

    둘 다 동작에는 차이가 없습니다. 다만 apt-get, apt-cache 등 다양한 명령어들이 나오면서, apt는 자주 사용하는 명령어들을 모아서 조금 더 예쁘게 출력을 해줍니다.

    apt-get은 더 많은 옵션이 있고, 좀 더 안정적이라고 알려져 있습니다. 하지만 공식 패키지 문서에서 apt를 사용하는 경우도 많기 때문에, 본인이 편한 대로 사용하면 되지 않을까 생각합니다.


    Nginx 설정

    이동욱 개발자님 블로그에서는 기본으로 생성되는 nginx.conf에 설정 합니다.

    하지만 Nginx 공식 문서에서는 추가적인 nginx 설정 파일을 만든 후 nginx.conf에서 include 하는 것으로 나와있습니다. 실제로 기본 nginx.conf 파일을 보게 되면 뭔가 많이 허전한 것을 볼 수 있습니다.

    https://ubuntu.com/tutorials/install-and-configure-nginx#4-setting-up-virtual-host


    추가적인 설정 파일을 생성합니다.

    sudo vim /etc/nginx/sites-available/reverse-proxy.conf
    // 새로 만든 설정 파일에 넣어주세요. // 80포트가 8080포트로 이동시켜줍니다. 
    server { 
    	listen 80; listen [::]:80; 
        server_name localhost; 
        access_log /var/log/nginx/reverse-access.log; 
        error_log /var/log/nginx/reverse-error.log; 
        include /etc/nginx/conf.d/service-url.inc; 
        
        location / { 
        	proxy_pass http://127.0.0:8080/ 
        } 
    }
    sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
    • available --> enabled 디렉토리로 심볼릭 링크
    • Nginx가 사용하는 기본 nginx.conf는 enabled 디렉토리의 파일을 include
    • 즉 실질적인 설정은 enabled 디렉토리에 있어야 합니다.

     

    cd /etc/nginx/sites-enabled sudo unlink default
    • Nginx가 기본으로 사용하는 default 설정 파일 unlink
    • 파일 삭제보다는 위와 같이 심볼릭 링크만 끊기
    • 그렇지 않으면 추가한 설정 파일과 충돌 발생

    동적 프록시 설정

    이동욱 개발자님 블로그의 동적 프록시 부분입니다.

    이때 반드시 포트 두 개를 모두 실행 후 switch 부분을 실행해야 합니다. switch shell script는 기존에 Nginx가 바라보고 있는 포트를 다른 포트로 돌려줍니다. 하지만 애초에 포트가 1개만 실행되고 있다면, 바꿔줄 포트가 없습니다. 즉 계속해서 1개의 포트만 실행이 돼버립니다.

    각각 포트 두 개 모두 실행 후 switch script를 실행해야 합니다.


    최종 결과

    아래는 제가 실제로 구축한 클라우드 환경입니다. Nginx가 8081, 8082 포트를 바라보고 있습니다.


    추가 에러 가능성

    1. 80 포트로 요청 후 8081, 8082 등 다른 포트로 포워딩되지 않을 때

    가상 서버의 네트워크 개방합니다. 80, 8081, 8082 등 사용하고자 하는 포트를 개방해야 합니다. 직접 클라우드 홈페이지에서 개방하셔도 되고, 아래의 방법을 따라도 됩니다.

    $ sudo apt-get install iptables-persistent 
    
    // 80포트 개방 
    $ sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 
    
    // 설정 저장 
    $ netfilter-persistent save 
    
    // 설정 다시 로드 
    $ netfilter-persistent start

     

    2. Swagger 사용 시 CORS 에러

    API 문서화 라이브러리인 Swagger를 통해서 request 하면, CORS 에러가 발생합니다. 개인적으로는 배포 버전에서 Swagger API 문서가 포함되는 것 자체가 잘 못 됐다고 생각합니다.

    이때 해결 방법은 두 가지 입니다.

    Spring Security configuration

    @Override protected void configure(HttpSecurity http) throws Exception { http ... .cors().configurationSource(corsSource()) .and() .csrf().disable() ... } @Bean public CorsConfigurationSource corsSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(false); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return urlBasedCorsConfigurationSource; }
    • CORS 에러를 해결하기 위해 Origin을 모두 허용합니다.
    • 모두 허용하게 되면, 보안에 취약하여 Credentials를 아예 사용하지 못하게 막습니다. 즉 false 해야 합니다.
    • 보안을 생각한다면, 하나의 허용 포트 설정 후 Credentials(true) 합니다.


    Swagger configuration

     @Bean public Docket swaggerApi() { return new Docket(DocumentationType.SWAGGER_2) .host("public IP") ... }
    • host(localhost) --> public IP 변경해야 합니다.
    • 그렇지 않으면 localhost를 찾을 수 없거나 CORS 에러가 발생합니다.

     

    반응형

    'Linux' 카테고리의 다른 글

    클라우드가 제공하는 1GB램, 알차게 써보기  (1) 2021.07.27
    Git commit 삭제 후 복구 경험담  (0) 2021.04.16

    댓글

Designed by Tistory.