삽질 방지를 위해 따로 저장했습니다!
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/
이 사이트 이용하면 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
##파일 수정시 apache restart해주기
##apache 설정 완료시 default페이지가 뜨는 이유는 아마 default.conf로 연결되어서 그럴 수도 있음 dissite설정 했는지 확인하거나 디폴트 페이지 안내에 따라 수정!