์ํ์น๋ฅผ ์ํ ํจํค์ง๋ ์ค์นํ๊ณ ์ํ์น๋ ์ค์นํ๋ค๋ฉด,
์ด์ ๋ 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 ๐
'OS > ๐ง Linux' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ง Ubuntu * SCP โ SSH ํ์ผ ์ ์ก (0) | 2020.03.09 |
---|---|
๐ง Ubuntu * ํ๋ผ์คํฌ(Flask) ์ค์นํ๊ธฐ (0) | 2020.03.09 |
๐ง Ubuntu * Apache ์ค์น๋ฅผ ์ํ ์์ฑ ํจํค์ง ์ค์นํ๊ธฐ (0) | 2020.03.09 |
๐ง Ubuntu * Apache ์ค์น ๋ฐ ์คํํ๊ธฐ (0) | 2020.03.09 |
๐ง Ubuntu * nohup, ๋ฐ๋ชฌ ํ๋ก๊ทธ๋จ ์คํ (0) | 2020.03.09 |