본문 바로가기
IT

nginx에 신규 subdomain과 flask app 추가하기

by geddy 2024. 1. 23.

이 글에서는 nginx에 신규 subdomain과 flask app 추가하는 방법에 대해서 설명합니다. 

nginx에 신규 subdomain과 flask app 추가하기 썸네일

  • nginx에 flask 추가앱 설정하기
  • 인증서 신규 발급하기

nginx에 flask 추가앱 설정하기


nginx에 신규 flask 서비스를 추가하려고 합니다. 신규 서비스는 별건 아닌데, 이미지 변환해서 만화화하거나 얼굴 인식해서 만화 캐릭터처럼 그려주는 서비스입니다. 

그 외에는 이미지 필터들을 간단하게 씌울수 있도록 하고 있습니다. 위의 이미지가 해당 flask 웹앱으로 돌린 결과입니다. 단순하게 opencv와 몇 가지 필터들 적용한 결과입니다.

포트를 다르게 하여 gunicorn을 하나 더 띄울 계획입니다. 기존 서비스 포트가 8000번이니 8090으로 띄우도록 하겠습니다. 

이제 nginx에 아래와 같이 설정을 추가해 줍니다. 추가는 ai.2story.org 관련 내용만 추가된 것입니다. 

server {

    server_name yt.2story.org;


    location / {
        proxy_set_header Host $http_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_pass http://localhost:8000/;
    }

    location ^~/another_dl {
        alias xxxxx;
        autoindex on;
        index index.html;
        try_files $uri $uri/ $uri/index.html; 
        # PHP 처리 설정
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }
    }

    location = /another_dl {
        return 301 $scheme://$host$uri/;
    }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/yt.2story.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/yt.2story.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = yt.2story.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;

    server_name yt.2story.org;
    return 404; # managed by Certbot


}

server{
    server_name 2story.org;
    location / {
        root /home/eeddyit/flask/www/;
        index index.html;
  }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/2story.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/2story.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    listen 80;
    server_name ai.2story.org;

    location / {
        proxy_set_header Host $http_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_pass http://localhost:8090;
    }
}

server {
    listen 443 ssl;
    server_name ai.2story.org;

    ssl_certificate /etc/letsencrypt/live/2story.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/2story.org/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_set_header Host $http_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_pass http://localhost:8090;
    }
}


server{
    if ($host = 2story.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name 2story.org;
    listen 80;
    return 404; # managed by Certbot


}

 

인증서 신규 발급하기


인증서를 신규로 발급하지 않았더니 https 연결이 안 됩니다. 신규 발급을 위해서 다음의 명령을 수행합니다. 

Let's Encrypt를 사용하여 ai.2story.org에 대한 인증서를 설치해야 합니다.

 

아래 단계를 따라 인증서를 설치하세요:

  1. certbot을 사용하여 ai.2story.org에 대한 인증서를 생성합니다. 다음 명령어를 사용해 퍼블릭/프라이빗 키를 생성하세요: 👉nginx를 실행 중에 키를 생성하면 에러가 발생할 수 있습니다. 그러면, sudo service nginx stop 하여 잠시 꺼둔 후 아래 명령 수행 후 다시 시작합니다.
  2.  
  3. sudo certbot certonly --standalone --preferred-challenges http -d ai.2story.org
    
  4. 위 명령어가 완료되면, 인증서의 경로를 확인합니다. 아래와 같은 경로가 출력됩니다(예시):
  5.  
  6. IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/ai.2story.org/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/ai.2story.org/privkey.pem
    
  7. nginx 설정을 업데이트하여 새로 생성된 인증서 파일 경로를 사용하도록 ai.2story.org에 해당하는 server 블록을 수정합니다:
  8.  
  9. server {
        listen 443 ssl;
        server_name ai.2story.org;
    
        ssl_certificate /etc/letsencrypt/live/ai.2story.org/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ai.2story.org/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
        location / {
            proxy_set_header Host $http_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_pass http://localhost:8090;
        }
    }
    
  10. 추가로, listen 80을 포함하는 ai.2story.org에 해당하는 server 블록도 업데이트하여, http 요청을 https로 리다이렉트 하도록 합니다: 이 단계는 선택에 따라서 해도 됩니다. 만약 http에 대한 설정이 되어있다면 굳이 리디렉션 하지 않아도 됩니다.
  11.  
  12. server{
        if ($host = ai.2story.org) {
            return 301 https://$host$request_uri;
        }
    
        server_name ai.2story.org;
        listen 80;
        return 404;
    }
    
  13. 마지막으로, nginx 설정 변경 사항을 적용하기 위해 nginx 서비스를 재시작합니다:
  14.  
  15. sudo nginx -t && sudo service nginx reload
    

 

이제 nginx 설정이 업데이트되었으며, ai.2story.org는 올바른 SSL 인증서가 적용되어 https를 사용하여 접근할 수 있습니다.

 

413 Request Entity Too Large에러 처리하기


이렇게 서비스를 실행시키고 테스트해보니, 사진 파일 업로드 시 파일 크기가 커서 에러가 발생합니다. 

413 Request Entity Too Large 오류는 클라이언트가 요청한 데이터가 너무 큰 경우에 발생합니다. 이 문제를 해결하려면, Nginx에서 크기 제한을 늘려야 합니다.

  1. Nginx 설정에서 client_max_body_size를 업데이트합니다. Nginx 설정 파일(/etc/nginx/nginx.conf 또는 /etc/nginx/sites-available의 사이트 설정 파일)을 찾아 엽니다. 저의 경우 /etc/nginx/sites-available/myflaskapp 파일을 수정했습니다. 이 파일은
  2. http 또는 server 블록에 client_max_body_size 설정을 추가하거나 업데이트합니다.
  3.  
  4. client_max_body_size 100M;
    

위 예제에서는 요청의 최대 크기를 100 메가바이트로 설정했습니다. 이를 원하는 값으로 조정할 수 있습니다.

  1. 변경 사항을 저장한 다음 Nginx 서비스를 다시 시작하십시오.
  2.  
  3. sudo service nginx restart
    

이제 gunicorn과 Nginx의 파일 업로드 제한이 증가하여 413 Request Entity Too Large 오류가 해결됩니다.

facebook twitter kakaoTalk kakaostory naver band shareLink