osam

apache2, wsgi이용해서 flask vm으로 배포하기

@Eeap 2021. 10. 7. 19:36
반응형

삽질 방지를 위해 따로 저장했습니다!
azure vmware이용했고
제가 서버 설정한 방법은
domain은 freenom이용해서 할당받고
vultr로 dns설정한 뒤
cloudflare로 ssl 설정까지 하면 해당 ip에 대한 https연결 완료!!
다음은 vm에 apache 웹서버 이용해서 코드 자동 배포하기!!
이 아래부터는 vm에서 쓴코드입니다 ubuntu이용했어요!


sudo apt-get install libapache2-mod-wsgi-py3

sudo apt-get install libapache2-mod-wsgi-py3
sudo a2enmod wsgi


그 다음 실행 파일에 run.wsgi파일 만들기

import sys 
sys.path.append("/var/www/python_flask")
from config import app as application

경로는 다음과 같이 /var/www/project_name

이 경로에 python 가상환경 venv도 설치해주기!!(필요한 모듈들 여기에 설치 pip로)
설치 방법은 https://docs.python.org/ko/3/tutorial/venv.html 간단하니 참고


/etc/apache2/apache.conf에 다음과 같이 디렉토리 권한 모두 allow 수정(외부에서 접속시 막히는 문제가 있어서 이렇게 처리, 아래 소켓도 에러가 발생해서 다음과 같이 처리)

<Directory />
	Options FollowSymLinks 
	Order allow,deny 
	Allow from all 
</Directory>
<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory> 
<Directory /var/www/> 
	Options Indexes FollowSymLinks
	Order allow,deny
	Allow from all 
</Directory>
WSGISocketPrefix /var/run/wsgi

sudo vim(nano 둘중 하나 택) /etc/apache2/sites-available/www.projeclib.tk.conf
www.project_name.conf로 생성하면됨
process 이름은 app으로 해도 되고 편한걸로 설정!
WSGIDaemonProcess는 실행 프로세스로 python 라이브러리를 venv 가상환경을 통해 설치하고 경로를 넣어주기
WSGIScriptAlias 는 wsgi파일 경로 참조
DocumentRoot 는 파일 경로

<VirtualHost *:80>
	ServerName www.projectlib.tk 
	WSGIScriptAlias / /var/www/python_flask/run.wsgi 
    <IFModule mod_alias.c>
    </IFModule>
	<IfModule mod_rewrite.c> 
	RewriteEngine on
	RewriteRule ^ - [E=protossl]
	RewriteCond %{HTTPS} on
	RewriteRule ^ - [E=protossl:s]
	RewriteCond %{HTTPS} !=on 
	RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
	</IfModule>
    Header set Access-Control-Allow-Origin "*"
</VirtualHost>
# Specify the SSL cache directory. If possible, use shmcb, otherwise use the provided path.
SSLStaplingCache shmcb:/var/run/ocsp(128000)
LoadModule wsgi_module modules/mod_wsgi.so 
WSGISocketPrefix /var/run/wsgi 
<VirtualHost *:443> 
	ServerName www.projectlib.tk
	DocumentRoot /var/www/python_flask 
	WSGIScriptAlias / /var/www/python_flask/run.wsgi 
	#python 가상환경 venv이용해서 app프로세스 불러올때 필요한 라이브러리도 같이 연결 
	WSGIDaemonProcess app python-path=/var/www/python_flask python-home=/var/www/python_flask/venv user=www-data group=www-data threads=5 
	<Directory /var/www/python_flask>
		WSGIProcessGroup app 
        WSGIApplicationGroup %{GLOBAL} 
		WSGIScriptReloading on 
		Options FollowSymLinks MultiViews
		AllowOverride All
		Order Allow,deny 
		Allow from all 
		php_value upload_max_filesize 10M 
		php_value post_max_size 10M 
		php_value session.cookie_httponly 1
		php_value session.use_strict_mode 1 
        Header set Access-Control-Allow-Origin "*"
# php_value memory_limit 128M 
#php_value max_execution_time 30
# php_value max_input_time 60 
	</Directory>
    <IFModule mod_alias.c>
    </IFModule>
    Alias /image /var/www/python_flask/main/static/img
    <Directory /var/www/python_flask/main/static/img>
         Order allow,deny
         Allow from all
     <Directory>
	AssignUserID osam27 osam27 
#에러로그 남기는곳 
	ErrorLog ${APACHE_LOG_DIR}/www.projectlib.tk-error.log 
	CustomLog ${APACHE_LOG_DIR}/www.projectlib.tk-access.log combined 
#SSL설정 cloud flare 이용법 따로 참고!
	SSLEngine on 
	SSLCertificateFile /etc/ssl/certs/cloudflare_projectlib.tk.pem 
	SSLCertificateKeyFile /etc/ssl/private/cloudflare_projectlib.tk.pem 
	SSLCACertificateFile /etc/ssl/certs/origin-pull-ca.pem 
	SSLVerifyClient require SSLVerifyDepth 1 
    # SSLProtocol all -SSLv2 -SSLv3 
#SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA 
#SSLHonorCipherOrder on 
#SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem 
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key 
#stapling off 안하면 오류남 
# Turn on OCSP stapling 
	SSLUseStapling off 
	SSLStaplingResponderTimeout 5
	SSLStaplingReturnResponderErrors off 
    Header set Access-Control-Allow-Origin "*"
</VirtualHost>


https://webmaster.cafe/tools/apache-conf-generator/

Apache2 환경설정 생성기 | 웹마스터카페

webmaster cafe

webmaster.cafe

이 사이트 이용하면 https conf 코드 쉽게 설정할 수 있음.

다 설정한다음 내가 작성한 conf파일 enable 해주기

sudo a2ensite www.example.com.conf 
sudo a2dissite 000-default.conf

apache 재시작후 active 상태인지 확인
에러시 tail을 이용해서 error log 확인

sudo systemctl restart apache2
sudo systemctl status apache2
#error log 살펴보기
sudo tail -f /var/log/apache2/www.projectlib.tk-error.log
## 웹 사이트 에러 로그 살펴보기
sudo vi /var/log/apache2/www(프로젝트 이름).error.log

참고로 socket을 /var/run으로 prefix했는데 소켓의 권한을 777로 설정해주지 않으면 permission denied 에러가 뜸
(재시작 할때마다 socket의 재생성을 off하는 방법이 있는 것 같은데 자세히는 모르겠음..)

cd /var/run ls -la # 권한이 777이 아니면 설정해주기 sudo chmod 777 wsgi.****.socoket


##참고문서
https://flask-docs-kr.readthedocs.io/ko/latest/deploying/mod_wsgi.html

mod_wsgi (아파치) — Flask 0.11-dev documentation

만약 Apache 웹서브를 사용하고 있다면, mod_wsgi 를 사용할 것을 고려하라. 주의 어플리케이션 파일에서 있을 수 있는 app.run() 호출이 if __name__ == '__main__': 블럭안에 있는지 아니면 다른 파일로 분리

flask-docs-kr.readthedocs.io

##파일 수정시 apache restart해주기
##apache 설정 완료시 default페이지가 뜨는 이유는 아마 default.conf로 연결되어서 그럴 수도 있음 dissite설정 했는지 확인하거나 디폴트 페이지 안내에 따라 수정!

반응형