공부/apache

[flask와 apache연동] +[apache 경로 한 부분에 넣기]

유찬수 2022. 10. 20. 12:09

Flask는 Python web framewark 중 하나다.

 

사용이 간편해, 가벼운 api 서버로 사용하기에 안성 맞춤이다.

 

Multi Thread 의 약점 때문에, 이를 활용해 프로젝트를 수행하는 경우, 이슈로 제기 된다.

 

이러한 약점을 보안하기 위해, 많은 Flask 개발자들은 Apache 서비스와 함께 사용한다.

 

 Flask와 Apache web 서비스를 연동하는 방법에 대해 알아 보겠다.  

 

또한 apache 기본 폴더 속의 한 부분에 넣는 방법을 알아보겠다.

예) http://192.168.59.133/lunch을 치면 flask가 실행되는 형식

 

환경은 ubuntu 20 버전이다.

 

1. 먼저 필요한 패키지를 설치한다.

$ sudo add-apt-repository universe

$ sudo apt-get update

$ sudo apt-get install python3-pip

$ sudo apt install apache2

$ sudo apt install libapache2-mod-wsgi-py3

 

2. Flask를 설치한다.

$ pip3 install flask

 

3. Flask 실행 경로를 만들어 준다

$ mkdir /flask

 

4. Flask의 권한을 부여한다.

(user_name:user_group 순이다.)

(확인법 groups [사용자 이름])

$ cd /flask

$ sudo chown -fR user_name:user_group flask

 

5. ubuntu에 해당 경로가 있는지 확인한다.

$ cd /etc/apache2/sites-available

$ cd /var/www

 

6. Flask 에 링크를 걸어준다.

$ sudo ln -s /flask

 

7. Flask 로 이동하고, 디렉토리를 구성해준다.

$ cd flask

$ mkdir app

$ mkdir wsgi

 

8. Flask conf 파일을 만들어 준다.

$ cd /etc/apache2/sites-available/

$ sudo nano flask.conf

(WSGIDaemonProcess에서 user과 group은 위에서 4번에서 쓴 user name과 user group으로 바꾼다. )

<VirtualHost *:80>
       ServerName localhost
       WSGIDaemonProcess flaskApp user=user_name group=user_group threads=5 maximum-requests=10
       WSGIScriptAlias / /var/www/flask/wsgi/mod.wsgi
       DocumentRoot /var/www/flask
       <Directory /var/www/flask>
                WSGIProcessGroup flaskApp
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
       </Directory>
</VirtualHost>

 

9. wsgi를 작성해준다.

$ cd /flask/wsgi

$ nano mod.wsgi

import sys
sys.path.insert(0, '/var/www/flask/app')
from flaskApp import app as application

 

10. app를 작성해 준다. ( 실질적으로 실행되는 파일 )

$ cd ..

$ cd app

$ nano flaskApp.py

from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
     return "hello World!"

 

11. Flask conf 파일을 우리가 작성한 conf로 바꿔준다.

$ sudo a2dissite 000-default

$ sudo a2ensite flask

$ sudo service apache2 restart

 

12. 방화벽을 풀어준다.

$ sudo ufw allow 80

 

13. 접속을 해본다.

http://123.456.789.123

 

14. apache 기본 폴더 속의 한 부분에 넣기

$ cd /etc/apache2/sites-available/

$ sudo nano flask.conf

(WSGIDaemonProcess에서 user과 group은 위에서 4번에서 쓴 user name과 user group으로 바꾼다. )

<VirtualHost *:80>
     ServerName localhost
     WSGIDaemonProcess flaskApp user=user_name group=user_group threads=5 maximum-requests=10
     WSGIScriptAlias /hi /var/www/flask/wsgi/mod.wsgi
     DocumentRoot /var/www/html
     <Directory /var/www/flask>
              WSGIProcessGroup flaskApp
              WSGIApplicationGroup %{GLOBAL}
              Order deny,allow
              Allow from all
     </Directory>
</VirtualHost>

WSGIScriptAlias / 에서 WSGIScriptAlias /[실행 할 경로]
DocumentRoot /var/www/flask 에서 DocumentRoot /var/www/html

 

15. 접속을 해보기

sudo service apache2 restart

http://123.456.789.123 

http://123.456.789.123/hi

성공!!

 

※추가※

여러 프라스크 를 80번에 쓸려면

$ cd /etc/apache2/sites-available/

$ sudo nano flask.conf

에 밑에 식으로 바꾸면 더 잘된다.

<VirtualHost *:80>
       ServerName localhost
       WSGIDaemonProcess {프로세스 그룹} user={유저이름} group={그룹} processes=1 threads=5
       WSGIDaemonProcess {프로세스 그룹1} user={유저이름} group={그룹} processes=1 threads=5
       WSGIScriptAlias /lunch /var/www/flask/lunch/wsgi/mod.wsgi process-group={프로세스 그룹} application-group=%{GLOBAL}
       WSGIScriptAlias /lunch1 /var/www/flask/lunch1/wsgi/mod.wsgi process-group={프로세스 그룹1} application-group=%{GLOBAL}
       DocumentRoot /var/www/html
       ErrorLog /flask/log/error.log
       CustomLog /flask/log/access.log combined
</VirtualHost>