-
7. 최종) Apache2 + wsgi + flask 연동해서 동작 확인하기 (AWS + Flask + 계산기 서버 구축해보기) + 트러블 슈팅 해보기프로젝트 회고/(개인)AWS + Flask + 계산기 서버 구축해보기 2022. 10. 2. 14:56
최종적으로 Apache와 Flask를 WSGI를 통해 연동해보자. WSGI로 나는 uWSGI를 사용했다.
1.uWSGI 설치 및 설정
uwsgi 설치 Apache2를 운영중이니, a2enmod 명령으로 wsgi 모듈을 Apache2에 추가해준다. 이렇게 WSGI 설치가 완료되었으니 WSGI를 설정해줘야 한다. Flask application의 위치에 test_wsgi.wsgi를 생성해준다.
그리고 아래 내용을 입력해준다.
/home/ubuntu/cal_test/test_wsgi.wsgi
import sys sys.path.insert(0, "/home/ubuntu/cal_test") # application의 위치를 가르킵니다. # app.py를 import합니다. 이름은 application으로 지정해줘야하고, # from 파일명 import 파일의 Flask 객체 변수 명 as application 형식으로 지정합니다. from app import app as application
2. uWSGI 연동을 위한 Apache2 설정
/ect/apache2/sites-available/000-default.conf
아파치의 기본 설정 파일이다. 여기서 WSGI 연동 설정을 해줘야 한다. 운영체제나 버전 따라 기본 설정 파일 위치나 이름이 다를 수 있으니 주의하자. 000-default.conf을 아래와 같이 입력을 해준다.
<VirtualHost *:80> ServerAdmin webmaster@localhost WSGIScriptAlias / /home/ubuntu/cal_test/test_wsgi.wsgi WSGIDaemonProcess app2 user=www-data group=www-data threads=1 <Directory /home/ubuntu/cal_test> Options Indexes FollowSymLinks AllowOverride None Require all granted WSGIApplicationGroup app2 Order deny,allow Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
설정 파일 코드들을 하나씩 하나씩 살펴보자.
ㆍ <VirtualHost *: 80>
Apache2에서 80 포트로 들어오는 요청에 한해 처리하겠다는 코드이다.
<VirtualHost *:80> . . . </VirtualHost>
ㆍ ServerAdmin webmaster@localhost
Apache2가 에러가 발생하면 표시되는 질의를 실행하는 연락처 이메일 주소를 표시할 때 사용된다.
<VirtualHost *:80> ServerAdmin webmaster@localhost . . . </VirtualHost>
ㆍ WSGIScriptAlias, WSGIDaemonProcess
WSGIScriptAlias : / 경로로 들어오면 /home/ubuntu/cal_test/test_wsgi.wsgi를 가리키게 하겠다는 것이다.
WSGIDaemonProcess : Flask 프로세스, user, group, thread 설정이다. 권한 문제가 발생할 수 있기 때문에 www-data로 설정해준다. ( askubuntu.com 참고 )
<VirtualHost *:80> . . WSGIScriptAlias / /home/ubuntu/cal_test/test_wsgi.wsgi WSGIDaemonProcess app2 user=www-data group=www-data threads=1 . . </VirtualHost>
www-data vs <username>
I am really confused about ownership www-data vs [username] (ex: admin, mike). www folder owned by [username] same as any folder or file created, great. So why do I need to change owner to www-data...
askubuntu.com
ㆍ <Directory> 태그와 그 내부
해당 Directory 경로의 권한을 설정하는 부분이라고 생각하면 된다.
<VirtualHost *:80> . . . <Directory /home/ubuntu/cal_test> Options Indexes FollowSymLinks AllowOverride None Require all granted WSGIApplicationGroup app2 Order deny,allow Allow from all </Directory> . . . </VirtualHost>
4. Apache2 + uWSGI + FLASK 연동 완료 및 동작 확인
Flask가 작동 중이면 끄고, 위 명령어로 apache2를 재시작(시작)한다. 만약 아래와 같은 에러가 발생하면 설정 파일에 오타가 있거나 할 확률이 있으니 다시 한번 확인해보자.
이후 아파치가 잘 실행되면 아래와 같이 페이지가 동작하는 것을 확인할 수 있다.
Apache2 + uWSGI + FLASK 연동이 완료된 것이다.
5. 트러블 슈팅
우리가 접속했을 때 에러가 발생하면 어떤 에러가 발생했는지 확인하고 고쳐줘야 한다. Apache에서 Flask를 관리하게 되었으므로 관련된 로그는 Apache로그에 남게 된다.
ㆍ 에러 확인 ( /var/log/apache2/error.log )
tail 명령어를 활용해 실시간으로 에러를 확인해보자. app.py로직은 들어온 값은 int형으로 바꾸는 로직이 포함되어 있다. 고로 '-' 문자를 넣으면 int형으로 변환할 수 없어 에러가 발생할 것이다.
에러를 발생시켜보기 위해 - 를 입력, 브라우저는 Internal Server Errer( 내부 서버 오류 메시지를 띄운다. ) 아래와 같이 로그 기록으로 ValueError: invalid literal for int() with base 10: '-' 이 발생한 것을 볼 수 있다. 이는 문자를 숫자로 바꾸려 해서 생긴 오류이며 이렇게 에러를 확인해볼 수 있다.
errer.log 하지만 요청은 들어왔기 때문에 access.log에도 기록이 남는다
ㆍ 요청 성공 확인 ( /var/log/apache2/access.log )
클라이언트의 요청 내용과 브라우저의 정보들이 보여진다. 값을 제대로 넣는다면 어떻게 될까? 똑같이 클라이언트의 요청 내용과 요청이 성공했으므로 200 코드를 보여준다.
ㆍ 404 NOT FOUND 확인해보기
이번엔 404 NOT FOUND 에러를 일으켜보자, 경로를 찾을 수 없는 에러이니 경로에 아무거나 입력해서 Enter 해본다.
존재하지 않는 경로 입력 마지막 줄을 보면 404에러가 발생했음을 알 수 있다. 브라우저도 역시 Not Found를 보여준다. 참고로 access.log 나 error.log 파일을 비우고 싶다면 아래 명령어를 입력해주면 된다.
'프로젝트 회고 > (개인)AWS + Flask + 계산기 서버 구축해보기' 카테고리의 다른 글
6. Flask로 웹 애플리케이션 만들기 (AWS + Flask + 계산기 서버 구축해보기) (0) 2022.10.02 5. (개념) 해당 프로젝트를 하며 궁금한 것들 (AWS + Flask + 계산기 서버 구축해보기) (0) 2022.10.02 4. AWS 접속 후, Flask 설치 및 동작 확인 (AWS + Flask + 계산기 서버 구축해보기) (0) 2022.10.02 3. AWS 접속 후, 웹 서버 설치 및 동작 확인 (AWS + Flask + 계산기 서버 구축해보기) (0) 2022.10.02 2. AWS 빌린 서버 접속하기 (AWS + Flask + 계산기 서버 구축해보기) (0) 2022.10.02