OS/🐧 Linux

🐧 Ubuntu * wsgiλ₯Ό μ΄μš©ν•œ Apache httpd μ—°λ™ν•˜κΈ° (Flask)

___l_i_ * 2020. 3. 9. 19:44

μ•„νŒŒμΉ˜λ₯Ό μœ„ν•œ νŒ¨ν‚€μ§€λ„ μ„€μΉ˜ν•˜κ³  μ•„νŒŒμΉ˜λ„ μ„€μΉ˜ν–ˆλ‹€λ©΄,

μ΄μ œλŠ” wsgiλ₯Ό μ΄μš©ν•΄μ„œ μ•„νŒŒμΉ˜ httpd μ›Ή μ„œλ²„κ°€ flask app을 μ„œλΉ„μŠ€ν•  수 μžˆλ„λ‘ μ„€μΉ˜ ν›„ μ—°κ²°μ‹œμΌœλ³΄μž!

 

 


 

 

 

WSGIλŠ” λ¬΄μ—‡μΌκΉŒ?

μ›Ή μ„œλ²„ κ²Œμ΄νŠΈμ›¨μ΄ μΈν„°νŽ˜μ΄μŠ€(WSGI, Web Server Gateway Interface)λŠ” μ›Ήμ„œλ²„μ™€ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μœ„ν•œ 파이썬 ν”„λ ˆμž„μ›Œν¬λΌκ³  μ •μ˜λ˜μ–΄μžˆλ‹€.

즉, μ›Ή μ„œλ²„(Apache)와 Flask μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 연동해주기 μœ„ν•œ ν”„λ ˆμž„μ›Œν¬μ΄λ‹€.

 

 

 

μ„€μΉ˜ν•΄λ³΄μž

일단 WSGI νŽ˜μ΄μ§€μ—μ„œ λ‹€μš΄λ‘œλ“œ 뢀뢄을 ν΄λ¦­ν•˜μ—¬ μ„€μΉ˜ν•  버전을 μ„ νƒν•˜κ³  λ‹€μš΄λ°›μž.

ν•΄λ‹Ή ν¬μŠ€νŠΈμ—μ„œλŠ” λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ λ‹€μš΄ν•  것이며 / μ•„λž˜ src 폴더λ₯Ό μƒμ„±ν•˜μ—¬ κ·Έκ³³μ—μ„œ μž‘μ—…μ„ μ§„ν–‰ν•  것 이닀.

 

$ cd /src
$ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.6.5.tar.gz
$ tar xvfz 4.6.5.tar.gz
$ cd mod_wsgi-4.6.5
$ ./configure --with-apxs=/usr/local/apache2.4/bin/apxs --with-python=/usr/bin/python3.6
   --with-apxsμ—λŠ” λ‚΄κ°€ μ„€μΉ˜ν•œ μ•„νŒŒμΉ˜μ— apxs 경둜λ₯Ό 적어주면 λœλ‹€. μ“°λ‹ˆλŠ” /usr/local μ•„λž˜μ— μ„€μΉ˜ν–ˆκΈ°λ•Œλ¬Έμ— κ²½λ‘œκ°€ μœ„μ™€ 같은 것이닀.
   --with-python뢀뢄은 λ‚΄κ°€ 기본으둜 μ§€μ •λ˜μ–΄μžˆλŠ” python을 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이라면 μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.
   λ³΄ν†΅ λ¦¬λˆ…μŠ€μ—λŠ” 2.7이 기본으둜 μ„€μΉ˜λ˜μ–΄μžˆκ³  κΈ°λ³Έ κ°’μœΌλ‘œ κΉ”λ €μžˆκΈ° λ•Œλ¬Έμ— μ§€μ •ν•΄μ£Όμ—ˆλ‹€.
$ make
$ make install

 

μ΄λ ‡κ²Œ λͺ¨λ“  과정이 λλ‚˜κ³  λ‚˜λ©΄ μ•„νŒŒμΉ˜ μ•„λž˜ modules 디렉토리 μ•ˆμ— mod_wsgi.so 파일이 생긴닀.

κ·Έ κ²½λ‘œκ°€ μ–΄λ”˜λ°μš”? 라고 λ¬ΌμœΌμ‹ λ‹€λ©΄ μ•„λž˜ λΉ¨κ°„ λ°•μŠ€ λΆ€λΆ„μž…λ‹ˆλ‹€!!!

 

 

 

 

μ‹œμž‘ μ „! 파일 ꡬ성 μ•Œμ•„λ³΄κΈ°

이제 μ„€μΉ˜κ°€ λλ‚¬μœΌλ‹ˆ μ„€μ • ν›„ 연동을 ν•΄ λ³Ό 것이닀.

μ•„λž˜ μ„€λͺ…μ—μ„œ μ΄ˆλ‘μƒ‰μœΌλ‘œ 적은 것은 μ‚¬μš©μž μž„μ˜λ‘œ 변경될 수 μžˆλŠ” 이름듀이며, μ •ν™•ν•œ λͺ…칭이 없기에 적어놓은 것이 이해가 잘 λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€κ³  μƒκ°ν•œλ‹€.

ν•΄μ„œ, λ‚΄κ°€ μ–΄λ–»κ²Œ μ„€μ •ν–ˆλŠ”μ§€λ„ κΈ°μž¬ν•΄λ†“μ•˜μœΌλ©° λ™μ‹œμ— κ·Έ νŒŒμΌλ“€μ˜ μœ„μΉ˜κ°€ 어디에 μžˆλŠ”μ§€ μ΄λ―Έμ§€λ‘œ λ³΄μ—¬μ£Όκ³ μž ν•œλ‹€.

 

 

 

 

Apache httpd.conf μ„€μ •ν•˜κΈ°

μ•„νŒŒμΉ˜μ— mod_wsgi λͺ¨λ“ˆμ„ μƒμ„±ν•˜κ³  λ‚œ λ’€ 이λ₯Ό μ μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„νŒŒμΉ˜ κΈ°λ³Έ μ„€μ • 파일( httpd.conf )을 μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.

μˆ˜μ • 방법에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ κ³΅μ‹λ¬Έμ„œ 뢀뢄을 ν™•μΈν•˜μž.

 

$ vi /usr/local/apache2.4/conf/httpd.conf
# λͺ¨λ“ˆ μ‚¬μš©μ„ μ •μ˜
LoadModule wsgi_module modules/mod_wsgi.so

<IFModule wsgi_module>
# μ›Ήμ„œλΉ„μŠ€ "/" κ²½λ‘œμ— wsgi μΈν„°νŽ˜μ΄μŠ€ 경둜 μ§€μ •
WSGIScriptAlias / wsgi_ν™•μž₯자_파일_경둜
# Python μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ ν™˜κ²½ μ„€μ •
WSGIDaemonProcess μ• ν”Œλ¦¬μΌ€μ΄μ…˜_이름 user=계정λͺ… group=κ·Έλ£Ήλͺ… threads=μ“°λ ˆλ“œκ°―μˆ˜_intν˜• python-path=python_site-packages_path:APP_디렉토리_경둜
WSGIProcessGroup μ• ν”Œλ¦¬μΌ€μ΄μ…˜_이름
WSGIScriptAlias / μ• ν”Œλ¦¬μΌ€μ΄μ…˜_파이썬_파일_경둜
</IFModule>


<Directory APP_디렉토리_경둜>
# ν•΄λ‹Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ—μ„œ 첫번째둜 μƒμ„±λœ 파이썬 인터프리터λ₯Ό μ‚¬μš©
Options FollowSymLinks
AllowOverride none
Require all granted
</Directory>
더보기
LoadModule wsgi_module modules/mod_wsgi.so

<IFModule wsgi_module>
WSGIScriptAlias / /home/leni/Coding/Pythoneer/FlaskAPP/httpd.wsgi
WSGIDaemonProcess web_service user=leni group=leni threads=1 python-path=/home/leni/.local/lib/python3.6/site-packages:/home/leni/Coding/Pythoneer/FlaskAPP
WSGIProcessGroup web_service
WSGIScriptAlias / /home/leni/Coding/Pythoneer/FlaskAPP/web_service.py
</IFModule>

<Directory /home/leni/Coding/Pythoneer/FlaskAPP>
Options FollowSymLinks
AllowOverride none
Require all granted
</Directory>

 

μ„€μ •ν›„μ—λŠ” 문법에 λ¬Έμ œκ°€ μ—†λŠ”μ§€ 확인을 ν•΄λ΄μ•Όκ²Ÿμ£ ?

$ httpd -t

λ‹€μŒκ³Ό 같이 Syntax OKκ°€ 뜨면 μ •μƒμ μœΌλ‘œ 잘 μ„€μ •λœ κ²ƒμž…λ‹ˆλ‹€!

 

 Tip . 경둜λ₯Ό PATH에 μΆ”κ°€ 해놓지 μ•Šμ•˜λ‹€λ©΄ μ•„νŒŒμΉ˜ μ„€μΉ˜ν•œ 경둜 λ‹€ λΆ™μ—¬μ£Όμ…”μ•Όν•΄μš”!

μ•„λž˜ ν¬μŠ€νŒ…μ˜ 맨 λ§ˆμ§€λ§‰ 뢀뢄을 ν™•μΈν•΄μ£Όμ„Έμš”!

β—‡ 2020/03/09 - [OS/🐧 Linux] - 🐧 Ubuntu * Apache μ„€μΉ˜ 및 μ‹€ν–‰ν•˜κΈ°

 

 

 

wsgi 파일 μž‘μ„±

μœ„ μ„€μ •μ—μ„œ wsgi_ν™•μž₯자_파일_κ²½λ‘œμ— μœ„μΉ˜ν•œ wsgi νŒŒμΌμ€ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•΄μ€€λ‹€.

 

sys.path.insert ꡬ문의 λ‘λ²ˆμ§Έ μΈμžλŠ” μ‹€μ œ μ‹€ν–‰ 될 Flask μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžˆλŠ” 경둜λ₯Ό 적어주면 되고,

python_νŒŒμ΄λ¦„μ€ Flask μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 파일의 ν™•μž₯자λ₯Ό μ œμ™Έν•œ 이름을 적어주면 λœλ‹€.

 

$ cd ~/Coding/Pythoneer/Flask
$ vi httpd.wsgi
import sys
sys.path.insert(0, APP_디렉토리_경둜)
# μ‹€μ œ μ‹€ν–‰μ‹œν‚€κ³ μž ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ•„λž˜ python_νŒŒμΌμ΄λ¦„ μ†ŒμŠ€μ— λ“€μ–΄μž‡κ³  ν˜„μž¬ httpd.wsgi νŒŒμΌμ€ κ·Έμ € κ²Œμ΄νŠΈμ›¨μ΄ 역할을 ν•  뿐이닀.
from python_νŒŒμΌμ΄λ¦„ import ν”ŒλΌμŠ€ν¬_λ³€μˆ˜_이름 as application

 

μœ„μ—μ„œ as application 뢀뢄은 μˆ˜μ •ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ°˜λ“œμ‹œ μ¨μ•Όν•˜λŠ” 뢀뢄이닀!

WSGI κ·œμ•½μ— 따라 application이라고 μ§€μ •ν•΄μ£Όμ–΄μ•Ό λ™μž‘μ„ ν•  수 μžˆλ‹€!

더보기
import sys

sys.path.insert(0, '/home/leni/Coding/Pythoneer/FlaskAPP')
from web_service import app as application

 

 

 

APP μž‘μ„± 및 μ‹€ν–‰

"/" 및 "/test" 경둜 μš”μ²­μ— λŒ€ν•œ 응닡을 μ£ΌλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μž‘μ„±ν•˜κ³  μ‹€ν–‰μ‹œμΌœλ΄…μ‹œλ‹€!

 

$ vi ~/Coding/Pythoneer/FlaskAPP/web_service.py
import flask

app = flask.Flask(__name__)
app.config["DEBUG"] = True

@app.route('/', methods=['GET',])
def index():
    return "<html><body><h1>Thansk to read my post !</h1></body></html>"

@app.route('/test', methods=['GET',])
def test():
    return "<html><body><h1>Hello World!</h1></body></html>"

httpd μ‹€ν–‰

$ httpd -k start

 

 

 

μ œλŒ€λ‘œ λŒμ•„κ°€λŠ”μ§€ ν™•μΈν•˜κΈ°
$ curl http://127.0.0.1
$ curl http://127.0.0.1/test

 

λͺ…λ Ήμ–΄ μ‹€ν–‰μ‹œ 터미널 창에 λ‚˜νƒ€λ‚˜λŠ” 것을 λ³Ό 수 있으며, λ‚΄λΆ€ipλ₯Ό μ‚¬μš©ν•œ λ‹€λ₯Έ PCμ—μ„œ 접속 κ°€λŠ₯ ν•œ 것을 λ³Ό 수 μžˆλ‹€.

터미널 창은 ubuntu 18.04 LTS에 가상머신이며, 인터넷 창은 Windows10μ—μ„œ μ‹€ν–‰ν•œ 결과이닀.

 



 


Thanks for πŸ™ˆ