성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] systemd for Developers I ; https:/...
[정성태] 엄밀히 object 타입의 인스턴스가 다른 타입으로 형변환 가능...
[정성태] 아래의 글에서 나오는 "Windows Application Pa...
[정성태] The history of calling conventions,...
[정성태] Secure and Deploy .NET Windows Form...
[정성태] Get Started with Milvus Vector DB i...
[정성태] cyberark/PipeViewer - A tool that...
[정성태] WinForms in a 64-Bit world – our st...
[정성태] 예제에서 SELECT_SQL도 내부적으로는 SqlCommand/...
[victor] SELECT_LINQ SELECT_SQL 같은 쿼리인...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>파이썬 - 윈도우 환경에서 개발한 Django 앱을 WSL 환경의 uwsgi를 이용해 실행</h1> <p> 사실 uwsgi를 사용한다는 것은 서비스하겠다는 것이므로 WSL 환경에서 굳이 사용할 필요는 없습니다. 따라서 그냥 할 수 있다는 정도만 알고 (게다가 요즘은 gunicorn이 유명하다고 하니 더더욱) 넘어가셔도 무방한데요, 그래도 리눅스 서버에 올리기 전 확인을 해보고 싶은 분들이라면 간단하게 WSL을 이용해 볼 수도 있을 것입니다.<br /> <br /> 예를 들어, 다음과 같은 구조의 간단한 Django app을 만들었다고 가정하겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ./myapp ├───bbs │ ├───migrations │ ├───static │ │ └───bbs │ ├───templates │ │ └───bbs ├───myapp │ └───__pycache__ ├───static │ ├───admin └───templates └───registration </pre> <br /> (wsgi 파일은 ./myapp/myapp/wsgi.py에 있습니다.)<br /> <br /> 자, 그럼 우선 wsl 환경에 python을 위한 모듈을 먼저 설치하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>sudo apt install python3</span> // ubuntu 20.04 + python 3.11 // <a target='tab' href='https://ubuntuhandbook.org/index.php/2022/10/python-3-11-released-how-install-ubuntu/'>https://ubuntuhandbook.org/index.php/2022/10/python-3-11-released-how-install-ubuntu/</a> $ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python3.11 // 또는, $ sudo apt install python3.11-full $ python3.11 --version </pre> <br /> 이후의 다양한 환경 설정을 분리하기 위해 virtualenv도 설치 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>sudo pip3 install virtualenv</span> </pre> <br /> 가상 환경을 적당한 디렉터리(pyenv 하위의 myapp)에 활성화합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>cd ~</span> ~$ <span style='color: blue; font-weight: bold'>mkdir pyenv</span> ~$ <span style='color: blue; font-weight: bold'>cd pyenv</span> ~/pyenv$ <span style='color: blue; font-weight: bold'>virtualenv myapp</span> ~/pyenv$ <span style='color: blue; font-weight: bold'>source myapp/bin/activate</span> (myapp) testusr@TESTPC:~/pyenv$ </pre> <br /> 마지막으로 (우여곡절 끝에 - <a target='tab' href='https://www.sysnet.pe.kr/2/0/12767'>문제 1</a>, <a target='tab' href='https://www.sysnet.pe.kr/2/0/12769'>문제 2</a>) Django와 uwsgi를 설치합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > (myapp) testusr@TESTPC:~/pyenv$ <span style='color: blue; font-weight: bold'>python3 -m pip install --upgrade pip</span> (myapp) testusr@TESTPC:~/pyenv$ <span style='color: blue; font-weight: bold'>pip3 install Django</span> (myapp) testusr@TESTPC:~/pyenv$ <span style='color: blue; font-weight: bold'>pip3 install uwsgi</span> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 이제 uwsgi에서 호스팅하기 위한 Django App의 사전 준비를 합니다. 이 작업은 윈도우 개발 환경에서 해주시면 됩니다.<br /> <br /> 우선 settings.py에 정적 리소스를 위한 루트 디렉터리를 지정하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # settings.py STATIC_ROOT = os.path.join(BASE_DIR, 'static/') </pre> <br /> 마이그레이션 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 예를 들어 D:\pycharm\work\myapp에 Django 앱이 위치한 경우 c:\temp> <span style='color: blue; font-weight: bold'>cd D:\pycharm\work\myapp</span> // 개발하는 동안 수행한 적이 있으면 무시 d:\pycharm\work\myapp> <span style='color: blue; font-weight: bold'>python manage.py makemigrations</span> d:\pycharm\work\myapp> <span style='color: blue; font-weight: bold'>python manage.py migrate</span> d:\pycharm\work\myapp> <span style='color: blue; font-weight: bold'>python manage.py createsuperuser</span> </pre> <br /> 정적 콘텐츠들을 모아줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\pycharm\work\myapp> <span style='color: blue; font-weight: bold'>python ./manage.py collectstatic</span> You have requested to collect static files at the destination location as specified in your settings: D:\pycharm\work\myapp\static This will overwrite existing files! Are you sure you want to do this? Type 'yes' to continue, or 'no' to cancel: yes 128 static files copied to 'D:\pycharm\work\myapp\static', 1 unmodified. </pre> <br /> <hr style='width: 50%' /><br /> <br /> 끝입니다. 이제 WSL에서 다음과 같은 옵션을 이용해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > -H|--home set PYTHONHOME/virtualenv -H|--pyhome set PYTHONHOME/virtualenv --http add an http router/server on the specified address --chdir chdir to specified directory before apps loading --chdir2 chdir to specified directory after apps loading --wsgi-file load .wsgi file --file load .wsgi file -w|--module load a WSGI module -w|--wsgi load a WSGI module </pre> <br /> 호스팅을 시작합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > uwsgi --http :[포트] --home [virtualenv_path] --chdir [webapp_path] --wsgi-file [chdir 기준 wsgi.py 경로] 예1) 18080 포트로, 윈도우의 d:\pycharm\work\myapp에 Django 앱을 개발한 경우 uwsgi --http :18080 --home $HOME/pyenv/myapp --chdir /mnt/d/pycharm/work/myapp --wsgi-file ./myapp/wsgi.py 예2) virtualenv를 사용하지 않겠다면, uwsgi --http :18080 --chdir /mnt/d/pycharm/work/myapp --wsgi-file ./myapp/wsgi.py 예3) 이미 current directory가 Django App의 경로라면, /mnt/d/pycharm/work/myapp$ uwsgi --http :18080 --wsgi-file ./myapp/wsgi.py </pre> <br /> 그래서 이렇게 실행하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>uwsgi --http :18080 --home $HOME/pyenv/myapp --chdir /mnt/d/pycharm/work/myapp --wsgi-file ./myapp/wsgi.py</span> *** Starting uWSGI 2.0.19.1 (64bit) on [Wed Aug 11 17:40:05 2021] *** compiled with version: 9.3.0 on 10 August 2021 10:28:41 os: Linux-5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 nodename: TESTPC machine: x86_64 clock source: unix detected number of CPU cores: 4 <span style='color: blue; font-weight: bold'>current working directory: /mnt/d/pycharm/work/myapp</span> <span style='color: blue; font-weight: bold'>detected binary path: /home/testusr/pyenv/myapp/bin/uwsgi</span> !!! no internal routing support, rebuild with pcre support !!! chdir() to /mnt/d/pycharm/work/myapp *** WARNING: you are running uWSGI without its master process manager *** your processes number limit is 102268 your memory page size is 4096 bytes detected max file descriptor number: 1024 lock engine: pthread robust mutexes thunder lock: disabled (you can enable it with --thunder-lock) uWSGI http bound on :18080 fd 4 spawned uWSGI http 1 (pid: 20543) uwsgi socket 0 bound to TCP address 127.0.0.1:40761 (port auto-assigned) fd 3 Python version: 3.8.10 (default, Jun 2 2021, 10:49:15) [GCC 9.4.0] <span style='color: blue; font-weight: bold'>PEP 405 virtualenv detected: /home/testusr/pyenv/myapp</span> <span style='color: blue; font-weight: bold'>Set PythonHome to /home/testusr/pyenv/myapp</span> *** Python threads support is disabled. You can enable it with --enable-threads *** Python main interpreter initialized at 0x563d77ee7080 your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 72904 bytes (71 KB) for 1 cores *** Operational MODE: single process *** WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x563d77ee7080 pid: 20542 (default app) *** uWSGI is running in multiple interpreter mode *** spawned uWSGI worker 1 (and the only) (pid: 20542, cores: 1) /mnt/d/pycharm/work/myapp /* uwsgi 이름을 가진 모든 프로세스를 종료하고 싶다면? sudo pkill -f uwsgi -9 */ </pre> <br /> "http://localhost:18080/bbs"로 요청을 보내면 정상적으로 ./bbs/views.py가 요청을 처리하는 것을 확인할 수 있습니다.<br /> <br /> 참고로, wsgi.py의 의미는 다음의 문서를 읽어보시면 이해가 되실 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Quickstart for Python/WSGI applications ; <a target='tab' href='https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html'>https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 만약 uwsgi로 실행했는데 페이지 요청 시 "Internal Server Error"가 발생한다면? 아마 거의 대부분 uwsgi 출력 화면에 다음과 같은 메시지가 있을 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ...[생략]... <span style='color: blue; font-weight: bold'>failed to open python file wsgi.py</span> unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI worker 1 (and the only) (pid: 20588, cores: 1) --- <span style='color: blue; font-weight: bold'>no python application found, check your startup logs for errors</span> --- [pid: 20588|app: -1|req: -1/1] 127.0.0.1 () {52 vars in 1114 bytes} [Wed Aug 11 15:09:37 2021] GET /bbs/ => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0) </pre> <br /> 이런 경우 uwsgi 실행 시 넘겨 준 "--wsgi-file" 옵션의 경로가 올바른지 확인해 보세요. 또는, "-w" 옵션으로 모듈 경로를 넘겨주는 것도 볼 수 있는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ uwsgi --http :18080 --home $HOME/pyenv/myapp --chdir /mnt/d/pycharm/work/myapp <span style='color: blue; font-weight: bold'>-w test.wsgi</span> </pre> <br /> 이럴 때는 로그에 ModuleNotFoundError 메시지가 남습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ...[생략]... <span style='color: blue; font-weight: bold'>ModuleNotFoundError: No module named 'test.wsgi'</span> unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode *** ...[생략]... </pre> <br /> 이번 예제와 같은 경우에는 (wsgi.py가 current directory 기준으로 myapp 디렉터리 하위에 있으므로) "-w myapp.wsgi"라고 설정해야 합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1590
(왼쪽의 숫자를 입력해야 합니다.)