이 글에서는 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에 대한 인증서를 설치해야 합니다.
아래 단계를 따라 인증서를 설치하세요:
- certbot을 사용하여 ai.2story.org에 대한 인증서를 생성합니다. 다음 명령어를 사용해 퍼블릭/프라이빗 키를 생성하세요: 👉nginx를 실행 중에 키를 생성하면 에러가 발생할 수 있습니다. 그러면, sudo service nginx stop 하여 잠시 꺼둔 후 아래 명령 수행 후 다시 시작합니다.
-
-
sudo certbot certonly --standalone --preferred-challenges http -d ai.2story.org
- 위 명령어가 완료되면, 인증서의 경로를 확인합니다. 아래와 같은 경로가 출력됩니다(예시):
-
-
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
- nginx 설정을 업데이트하여 새로 생성된 인증서 파일 경로를 사용하도록
ai.2story.org
에 해당하는 server 블록을 수정합니다: -
-
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; } }
- 추가로,
listen 80
을 포함하는ai.2story.org
에 해당하는 server 블록도 업데이트하여, http 요청을 https로 리다이렉트 하도록 합니다: 이 단계는 선택에 따라서 해도 됩니다. 만약 http에 대한 설정이 되어있다면 굳이 리디렉션 하지 않아도 됩니다. -
-
server{ if ($host = ai.2story.org) { return 301 https://$host$request_uri; } server_name ai.2story.org; listen 80; return 404; }
- 마지막으로, nginx 설정 변경 사항을 적용하기 위해 nginx 서비스를 재시작합니다:
-
-
sudo nginx -t && sudo service nginx reload
이제 nginx 설정이 업데이트되었으며, ai.2story.org는 올바른 SSL 인증서가 적용되어 https를 사용하여 접근할 수 있습니다.
413 Request Entity Too Large에러 처리하기
이렇게 서비스를 실행시키고 테스트해보니, 사진 파일 업로드 시 파일 크기가 커서 에러가 발생합니다.
413 Request Entity Too Large
오류는 클라이언트가 요청한 데이터가 너무 큰 경우에 발생합니다. 이 문제를 해결하려면, Nginx에서 크기 제한을 늘려야 합니다.
- Nginx 설정에서 client_max_body_size를 업데이트합니다. Nginx 설정 파일(
/etc/nginx/nginx.conf
또는/etc/nginx/sites-available
의 사이트 설정 파일)을 찾아 엽니다. 저의 경우 /etc/nginx/sites-available/myflaskapp 파일을 수정했습니다. 이 파일은 http
또는server
블록에client_max_body_size
설정을 추가하거나 업데이트합니다.-
-
client_max_body_size 100M;
위 예제에서는 요청의 최대 크기를 100 메가바이트로 설정했습니다. 이를 원하는 값으로 조정할 수 있습니다.
- 변경 사항을 저장한 다음 Nginx 서비스를 다시 시작하십시오.
-
-
sudo service nginx restart
이제 gunicorn과 Nginx의 파일 업로드 제한이 증가하여 413 Request Entity Too Large
오류가 해결됩니다.
'IT' 카테고리의 다른 글
리눅스 IO 상태 모니터링 하기 - iostat 명령어 알아보기 (0) | 2024.01.24 |
---|---|
티스토리 블로그를 구글 애널리틱스와 연결하는 방법 (0) | 2024.01.23 |
GCP(Google Cloud Platform) VM인스턴스에 ssh로 간단하게 접속하는 방법 (1) | 2024.01.23 |
docker hub에 무료 가입하여 docker 이미지를 올리는 방법 따라하기 (0) | 2024.01.23 |
우분투 nginx 서버 Docker 설치 및 이미지 만들기 (0) | 2024.01.23 |