<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Flask on</title><link>https://taetaetae.github.io/tags/flask/</link><description>Recent content in Flask on</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 05 Aug 2018 10:27:21 +0000</lastBuildDate><atom:link href="https://taetaetae.github.io/tags/flask/index.xml" rel="self" type="application/rss+xml"/><item><title>기술블로그 구독서비스 개발 후기 - 1부</title><link>https://taetaetae.github.io/2018/08/05/daily-dev-blog-1/</link><pubDate>Sun, 05 Aug 2018 10:27:21 +0000</pubDate><guid>https://taetaetae.github.io/2018/08/05/daily-dev-blog-1/</guid><description>&lt;p>이번 포스팅은 약간의 자투리 시간을 활용하여 이것저것 만져보다 만들게 된 &lt;code>Daily DevBlog&lt;/code>(기술블로그 구독서비스)에 대해 이야기 하려고 한다. &lt;!-- more -->
하나의 글에 관련 내용을 모두 담기에는 양이 많아서 읽는사람도 지루하고, 글을 쓰는 필자 또한 &lt;code>어불성설&lt;/code> 할것같아 크게 3개의 시리즈로 나눠서 최대한 자세하고 현장감(?)있게 글을 써보려고 노력했다.&lt;/p>
&lt;ul>
&lt;li>1부 : &lt;a href="https://taetaetae.github.io/2018/08/05/daily-dev-blog-1/" target="_blank" rel="noopener noreffer ">왜 만들게 되었는가 그리고 어떤 구조로 만들었는가&lt;/a>&lt;/li>
&lt;li>2부 : &lt;a href="https://taetaetae.github.io/2018/08/09/daily-dev-blog-2/" target="_blank" rel="noopener noreffer ">문제발생 및 Trouble Shooting&lt;/a>&lt;/li>
&lt;li>3부 : &lt;a href="https://taetaetae.github.io/2019/02/17/daily-dev-blog-3/" target="_blank" rel="noopener noreffer ">앞으로의 계획과 방향성&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>글에 들어가기 앞서 최종 결과는 &lt;a href="http://daily-devblog.com" target="_blank" rel="noopener noreffer ">http://daily-devblog.com&lt;/a> 에서 확인할수 있다.&lt;/p>
&lt;hr>
&lt;h2 id="무엇이-나를-움직이게-했는가">무엇이 나를 움직이게 했는가&lt;/h2>
&lt;p>얼마전까지 오픈소스는 정말 실력있는 개발자나 유명한 사람들 말고는 금기의 영역(?)이라고 생각했었지만 최근 &lt;a href="https://taetaetae.github.io/2018/07/01/open-source-software-develpoer-story-review/" target="_blank" rel="noopener noreffer ">오픈소스 개발자 이야기 세미나&lt;/a>를 다녀온뒤 마음속에 있었던 벽이 사라지는듯 했다. 세미나를 들으면서 &amp;lsquo;나도 무언가를 만들어 볼수는 없을까?&amp;rsquo;, &amp;lsquo;회사라는 명찰을 떼면 난 어느 수준에서 개발을 하고 있는 것일까?&amp;rsquo; 등 여러 생각들이 머리를 멤돌다 &lt;a href="https://www.slideshare.net/zzsza/intro-102870757" target="_blank" rel="noopener noreffer ">개발자를 위한 글쓰기&lt;/a>라는 글에서 기술블로그들을 모아놓은 &lt;a href="https://awesome-devblog.herokuapp.com" target="_blank" rel="noopener noreffer ">awesome-devblog&lt;/a>를 소개하는 글을 보게 되었고 내 머릿속에 정리안되던 그 생각들은 &amp;ldquo;이 데이터를 활용해서 무언가를 만들어보자!&amp;ldquo;로 귀결되었다.&lt;/p>
&lt;blockquote>
&lt;p>다른 이야기 이지만, awesome-devblog 을 보고 당장 내 블로그도 등록해야지 했었는데 이미 등록이 되어 있었다;; 등록해주신 분께 감사하다는 생각이 들기전에 내 블로그가 누군가에게 보여지고 있구나 하며 새삼 놀라움이 더 컸다.&lt;/p>&lt;/blockquote>
&lt;h2 id="요구사항과-도구-그리고-설계">요구사항과 도구 그리고 설계&lt;/h2>
&lt;p>만들려고 생각해봤던 요구사항은 다음과 같다. 마치 회사에서 개발전 스펙을 정리하듯&amp;hellip;&lt;/p>
&lt;ol>
&lt;li>웹페이지를 활용해서 구독하고자 하는 사람들의 이메일을 수집할수 있어야 한다.&lt;/li>
&lt;li>매일 전날 작성된 글을 수집하고 조합하여 구독하고자 하는 사람들에게 메일을 보낼수 있어야 한다.&lt;/li>
&lt;/ol>
&lt;p>위 두가지만 보면 너무 간단했다. 또한 기존에 사용하지 않았던 기술들을 사용해보면서 &lt;code>최대한 심플하게&lt;/code> 개발하는것을 첫 개인 프로젝트의 목표로 하고 싶었다. 하여 생각한 아키텍처는 다음과 같다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/daily-dev-blog-1/architecture.png" title="/images/daily-dev-blog-1/architecture.png" data-thumbnail="/images/daily-dev-blog-1/architecture.png" data-sub-html="&lt;h2>최대한 심플하게 설계해보자.&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/daily-dev-blog-1/architecture.png"
 data-srcset="https://taetaetae.github.io/images/daily-dev-blog-1/architecture.png, https://taetaetae.github.io/images/daily-dev-blog-1/architecture.png 1.5x, https://taetaetae.github.io/images/daily-dev-blog-1/architecture.png 2x"
 data-sizes="auto"
 alt="/images/daily-dev-blog-1/architecture.png" />
 &lt;/a>&lt;figcaption class="image-caption">최대한 심플하게 설계해보자.&lt;/figcaption>
 &lt;/figure>
&lt;p>데이터는 해당 github에 있길래 그냥 가져다 쓰려고 했으나 그래도 데이터를 관리하시는 분께 허락을 받고 사용하는게 상도덕(?)인것 같아 수소문끝에 연락을 해서 허락받는데 성공하였다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/daily-dev-blog-1/message.png" title="/images/daily-dev-blog-1/message.png" data-thumbnail="/images/daily-dev-blog-1/message.png" data-sub-html="&lt;h2>데이터 사용을 허락해주신 천사같으신분&amp;hellip;&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/daily-dev-blog-1/message.png"
 data-srcset="https://taetaetae.github.io/images/daily-dev-blog-1/message.png, https://taetaetae.github.io/images/daily-dev-blog-1/message.png 1.5x, https://taetaetae.github.io/images/daily-dev-blog-1/message.png 2x"
 data-sizes="auto"
 alt="/images/daily-dev-blog-1/message.png" />
 &lt;/a>&lt;figcaption class="image-caption">데이터 사용을 허락해주신 천사같으신분&amp;hellip;&lt;/figcaption>
 &lt;/figure>
&lt;blockquote>
&lt;p>이 자리를 빌어 데이터를 사용할수 있도록 &lt;a href="https://www.facebook.com/sarojaba" target="_blank" rel="noopener noreffer ">허락해주신분&lt;/a> 께 감사인사를 표합니다.&lt;/p>&lt;/blockquote>
&lt;p>홈페이지를 만들기 위해서는 이제껏 삼겹살에 소주처럼(응?) Java에 Spring을 사용해 왔었지만 이번엔 좀 다른 방식을 사용하고 싶었다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/daily-dev-blog-1/language_framework.png" title="/images/daily-dev-blog-1/language_framework.png" data-thumbnail="/images/daily-dev-blog-1/language_framework.png" data-sub-html="&lt;h2>물론 삼겹살에 맥주, 치킨에 소주를 먹어도 되긴 하지만&amp;hellip;&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/daily-dev-blog-1/language_framework.png"
 data-srcset="https://taetaetae.github.io/images/daily-dev-blog-1/language_framework.png, https://taetaetae.github.io/images/daily-dev-blog-1/language_framework.png 1.5x, https://taetaetae.github.io/images/daily-dev-blog-1/language_framework.png 2x"
 data-sizes="auto"
 alt="/images/daily-dev-blog-1/language_framework.png" />
 &lt;/a>&lt;figcaption class="image-caption">물론 삼겹살에 맥주, 치킨에 소주를 먹어도 되긴 하지만&amp;hellip;&lt;/figcaption>
 &lt;/figure>
&lt;p>최근에 Flask라는 python기반 웹 프레임워크를 만져본 &lt;a href="https://taetaetae.github.io/2018/06/29/simple-web-server-flask-apache/" target="_blank" rel="noopener noreffer ">경험&lt;/a>이 있어서 이렇다할 고민없이 빠른 결정을 할수 있었다. 또한 DB는 mysql 이나 기타 memory DB를 사용할까 했지만 이또한 심플하게 파일을 활용하는 sqlite3 을 사용하고자 하였다.&lt;/p>
&lt;h2 id="웹서버_최종_수정_파이널_진짜_확정">웹서버_최종_수정_파이널_진짜_확정&lt;/h2>
&lt;p>Flask를 활용하기 위해서는 당연히 웹서버가 필요했다. 처음엔 &lt;code>awesome-devblog&lt;/code>에서도 사용하고 있던 &lt;a href="https://www.heroku.com/" target="_blank" rel="noopener noreffer ">https://www.heroku.com/&lt;/a> 를 이용해서 해보려 했으나 매일 구독자들에게 메일을 보내는 등 스케쥴러 기능같은건 구현하기 힘들었고 인스턴트 어플리케이션을 등록하는 형태라 사용자의 메일을 입력받고 저장하는 로직을 만들기는 어려워 보였다. (필자가 heroku를 너무 수박 겉핥기식으로 봐서 일수도 있다&amp;hellip;)
좀더 찾아보니 &lt;a href="https://www.pythonanywhere.com/" target="_blank" rel="noopener noreffer ">https://www.pythonanywhere.com/&lt;/a> 라는 제한적이지만 무료 서비스가 있었는데 웹콘솔도 지원하고 상당히 매력있어 보여서 &lt;code>이거다!&lt;/code> 하며 개발을 시작을 했으나 (나름 도메인까지 그럴싸하게 만들었지만&amp;hellip; &lt;a href="http://dailydevblog.pythonanywhere.com/" target="_blank" rel="noopener noreffer ">http://dailydevblog.pythonanywhere.com/&lt;/a> ) 세상에 공짜는 없다는 말을 실감하며 앞서 말했던 요구사항을 완벽하게 구현할 수 없는 상황이였다.(request 제한, 스케쥴러 등록 개수 제한 등 보다 여러기능을 사용하기 위해서는 돈을 내고 써야&amp;hellip;)
마지막 희망으로 언제샀는지 서랍속 깊이 자고있던 라즈베리 파이를 꺼내서 공유기 DDNS설정을 하고 라즈베리안을 설치하며 웹서버를 위한 셋팅을 시도해보았으나 언제나 그렇듯 (시험공부 하기전에 책상 정리하고 괜히 방청소까지 하다가 피곤해서 자버리는듯한 느낌) 배보다 배꼽이 클것같아 이또한 진행하다가 중단하게 된다.
결국 AWS에서 1년동안은 무료로 사용할수 있는 &lt;a href="https://aws.amazon.com/ko/free/" target="_blank" rel="noopener noreffer ">Free Tier&lt;/a> 라는걸 발견하고 이참에 나도한번 사용해보자라는 마음을 가지고 과금되지 않게 조심조심 셋팅을 할수 있었다. 물론 뒤에서 이야기 하겠지만 약간의 과금은 필요했다ㅠ (나름 심도깊었던 고민을 한방에 해결해버리는 AWS 짱;; 이래서 AWS~ AWS~ 하는가 싶었다.)&lt;/p></description></item><item><title>초간단 API서버 만들기 - 2부 (Python + Flask + Nginx)</title><link>https://taetaetae.github.io/2018/07/01/simple-web-server-flask-nginx/</link><pubDate>Sun, 01 Jul 2018 02:00:00 +0000</pubDate><guid>https://taetaetae.github.io/2018/07/01/simple-web-server-flask-nginx/</guid><description>&lt;p>&lt;a href="https://taetaetae.github.io/2018/07/01/simple-web-server-flask-apache/" target="_blank" rel="noopener noreffer ">지난포스팅&lt;/a>에 이어 이번엔 Flask와 Nginx를 연동하는 방법을 정리해보고자 한다. Apache로 연동했는데 왜 또 Nginx로 연동하는걸 정리하지(?)하며 의문이 들수 있는데 다른 포스팅을 봐도 &lt;!-- more --> Apache + Flask 조합보다 Nginx + Flask 조합이 더 많고 지난 포스팅에서도 알수있었듯이 (&lt;a href="https://taetaetae.github.io/2018/06/27/apache-vs-nginx/" target="_blank" rel="noopener noreffer ">Apache VS Nginx&lt;/a>) 둘중 어느것이 좋다고 할수도 없고 각 상황에서 연동하는 방법을 알고 있다면 이 또한 나만의 무기가 될것같아 Nginx를 연동하는 방법을 정리해보려 한다.&lt;/p>
&lt;p>1부에서 왜 Flask인가, Flask의 장점에 대해 정리를 했으니 이번 포스팅에서는 별도로 작성하진 않는다.&lt;/p>
&lt;h2 id="nginx-설치---">Nginx 설치 ( &lt;a href="https://nginx.org/en/" target="_blank" rel="noopener noreffer ">https://nginx.org/en/&lt;/a> )&lt;/h2>
&lt;p>역시 소스설치를 한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 다운을 받고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ https://nginx.org/download/nginx-1.14.0.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 압축을 푼 다음
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ tar -zxvf nginx-1.14.0.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 폴더로 이동해서 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cd nginx-1.14.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 설치할 디렉토리를 설정하고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ ./configure --prefix=/~~~/apps/nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> make 파일을 만들고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 설치를 진행한다.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이렇게 하면 일단 Nginx는 설치가 되었다.&lt;/p>
&lt;h2 id="uwsgi-설치---">uWSGI 설치 ( &lt;a href="https://uwsgi-docs.readthedocs.io/" target="_blank" rel="noopener noreffer ">https://uwsgi-docs.readthedocs.io/&lt;/a> )&lt;/h2>
&lt;p>앞서 Apache와 연동할때는 별도의 모듈을 Apache에게 등록하는 형태였다면 Nginx는 WSGI프로토콜을 활용하는 WSGI 어플리케이션을 실행하는 어플리케이션 서버를 활용해야 한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 다운을 받고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 압축을 풀고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ tar zxvf uwsgi-latest.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 폴더로 이동하여
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cd uwsgi-2.0.17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> make 명령어를 호출하면 &amp;#39;uwsgi&amp;#39;이라는 실행파일이 생성된다.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="nginx-설정">Nginx 설정&lt;/h2>
&lt;p>Apache와 비슷하게 uWSGI 관련 설정을 해준다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">server {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> listen 80;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> server_name localhost;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> location / { # ( / ) 경로로 들어올 경우
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> include uwsgi_params; # GET/POST 등 기본적으로 필요한 환경변수를 include 해준다.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uwsgi_pass 127.0.0.1:3031; # 요청을 IP:PORT로 전달한다.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>별도의 모듈을 사용하지 않기때문에 전달해주는 (proxy느낌) 설정을 해준다.&lt;/p>
&lt;h2 id="uwsgi-실행-및-nginx-재시작">uWSGI 실행 및 Nginx 재시작&lt;/h2>
&lt;p>앞서 설치한 &lt;code>uwsgi&lt;/code>를 아래처럼 IP:port 를 명시적으로 적어주고 (위에서 전달받은 IP:PORT와 동일하게) Apache 연동시 활용했던 wsgi파일을 이번에도 동일하게 사용하도록 해서 실행한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">$ ./uwsgi -s 127.0.0.1:3031 --wsgi-file /~~~/python_app/hello_world.wsgi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이렇게 하면 background로 실행되는게 아닌 foreground로 실행되기 때문에 &lt;code>&amp;amp;&lt;/code>을 사용한다던지 해서 background로 실행되도록 해준다. 그후 Nginx를 재시작 해주면 원하는 그토록 원했던 &lt;code>Hello World!&lt;/code>를 만날수가 있게 된다.&lt;/p>
&lt;p>Apache연동과 조금 다른점은 모듈을 사용하지않고 별도의 전달 어플리케이션(?)이 필요하다는점이다. 간단히 Apache처럼 모듈만 넣으면 되는게 아니라서 불편할수도 있을것 같지만 한편으로는 관리할수있는 포인트가 더 늘어난 셈이라 어떤 측면에서는 활용할수 있는 방법이 하나 늘어난것으로 볼수도 있다.&lt;/p>
&lt;h2 id="마치며">마치며&lt;/h2>
&lt;p>막상 정리하고 나면 아무것도 아닌데 알기 위해서 몸부림을 쳐가며 책이며 구글링을 하는 과정을 통해 점점 성장을 하는것 같다. (성장통이라고나 할까) 이렇게 단순히 Flask를 할수있다 가 아닌 웹서버를 연동할수있다. 그것도 Apache와 Nginx 두개나. 이것도 언젠간 나만의 무기가 되지 않을까?&lt;/p></description></item><item><title>초간단 API서버 만들기 - 1부 (Python + Flask + Apache)</title><link>https://taetaetae.github.io/2018/06/29/simple-web-server-flask-apache/</link><pubDate>Fri, 29 Jun 2018 23:00:00 +0000</pubDate><guid>https://taetaetae.github.io/2018/06/29/simple-web-server-flask-apache/</guid><description>&lt;p>Static한 HTML이 아닌 로직이 필요한 API서버를 구성한다고 가정해보자. (이제까지 지식으로)처음 머릿속에 떠오르는건 Java를 사용하고 스프링으로 어플리케이션을 만들고 apache에 tomcat을 연동한 다음 &amp;hellip;&lt;!-- more --> 이러한 방법으로 API서버를 구성할수 있겠지만 프로토타이핑 또는 테스트 목적으로 만들기 위해서는 설정하는 시간이 은근 많이 소요된다. (물론 Java Config, Spring Boot 등 간소해졌지만&amp;hellip;)
얼마전부터 Python에 대한 매력을 뼈저리게 느끼고 있다보니 Python으로 API서버를 구성할순 없을까 알아봤고 (모바일 게임 듀랑고 서버가 python이라고 하기도 하고&amp;hellip;) &lt;code>Flask&lt;/code>와 &lt;code>Django&lt;/code>가 있어서 둘다 써본 결과 필자는 &lt;code>Flask&lt;/code>가 맞겠다고 생각해서 정리를 해볼까 한다.&lt;/p>
&lt;blockquote>
&lt;p>&amp;lsquo;장고&amp;rsquo;라고도 불리는 Django에는 모든것들이 다 들어가 있어서 사용하기 너무 편리하다. (DB, 어드민 등 ) 하지만 Flask는 내가 사용할 것들만 import해서 사용하는 방식이라 어떤 측면에서는 아무것도 없다 할수 있겠으나 커스터마이징에 용이하다고 볼수 있었기에 Flask를 선택하게 되었다. (Django가 Flask보다 안좋다는 말은 아니니 오해는 하지 마시길&amp;hellip;)&lt;/p>&lt;/blockquote>
&lt;p>글쓰기에 앞서 본 포스팅은 2개의 포스팅에 걸쳐 시리즈(?)형식으로 작성할 예정이다. 1부에서는 Flask가 무엇이고 이를 어떻게 사용하며 Apache와 연동하는 방법을 소개하고, 2부에서는 Nginx와 연동하는 방법을 소개한다.
환경은 다음과 같다.&lt;/p>
&lt;ul>
&lt;li>CentOS 7.4&lt;/li>
&lt;li>Python 3.6 (기본은 2.7이였으나 추가로 설치)&lt;/li>
&lt;/ul>
&lt;h2 id="flask---">Flask ( &lt;a href="http://flask.pocoo.org/" target="_blank" rel="noopener noreffer ">http://flask.pocoo.org/&lt;/a> )&lt;/h2>
&lt;p>공식 홈페이지에서도 보면 알수 있듯이 너~무 간단하다. 단지 아래 코드 몇줄만 작성하면 우리가 모든 프로그램 초기 작성시 항상 만나는 &amp;ldquo;Hello World&amp;quot;를 볼수 있다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#hello_world.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">flask&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Flask&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Flask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vm">__name__&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.route&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">hello&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;Hello World!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>위와같이 작성하고 &lt;code>python hello.py&lt;/code>로 실행해두고 브라우저에서 &lt;code>http://127.0.0.1:5000&lt;/code> 을 요청하면 반가운 Hello World를 만날수 있다. (너무 간단;;) 자세한 문법은 &lt;a href="http://flask.pocoo.org/docs" target="_blank" rel="noopener noreffer ">도큐먼트&lt;/a>를 참조하면 될듯하고 이 Flask를 잘만 활용한다면 보다 빠르고 간단하게 API서버를 구성할수 있을거라 생각한다.&lt;/p>
&lt;p>Hello World를 찍었으면 된거 아닌가 라고 질문할수도 있겠으나 실제 서비스에서 사용하기 위해서는 앞단에 웹서버를 두는게 여러 측면에서 효율적이다. 주로 사용하는 웹서버는 Apache 와 Nginx가 있는데 여기서는 Apache와 연동하는 방법을 정리 해보고자 한다.&lt;/p>
&lt;h2 id="apache-설치---">Apache 설치 ( &lt;a href="http://archive.apache.org/" target="_blank" rel="noopener noreffer ">http://archive.apache.org/&lt;/a> )&lt;/h2>
&lt;p>우선 필자는 &lt;code>yum&lt;/code> 이나 &lt;code>apt-get&lt;/code>처럼 패키지 관리자로 설치하는것을 그렇게 좋아하지 않는다. 이유는 커스터마이징을 할 경우 시스템 어느곳에 설치되어있는지를 한눈에 파악하기 어렵고 윈도우경우 &lt;code>Program Files&lt;/code>처럼 내가 추가로 설치하고 관리하는 프로그램들을 한곳에서 관리하고 싶기에 왠만하면 소스를 직접 컴파일하여 설치하곤 한다. 이번 역시 아파치도 소스로 설치하려고 한다.
현재 아파치는 2.4버전이 Stable버전으로 되어있지만 보다 레퍼런스가 많은 2.2버전으로 설치하기 위해 어렵게 아카이빙된 경로를 통해 다운을 받고 설치를 한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 다운을 받고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ wget http://archive.apache.org/dist/httpd/httpd-2.2.29.tar.gz 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 압축을 푼 다음
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ tar xvzf httpd-2.2.29.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 해당 폴더로 들어가
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cd httpd-2.2.29
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 컴파일 후 설치 경로를 정해주고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ ./configure --prefix=/~~~/apps/apache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> make 파일을 만든다음
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 설치를 해준다.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이렇게 되면 /~~~/apps/apache/ 하위에 필요한 파일들이 설치가 되는데 root계정이 아닌 일반계정으로 실행하기 위해서는 /bin하위에 있는 httpd에 대한 실행/소유권한을 변경해줘야 한다. (아니면 그냥 root권한으로 시작/종료. 왜? Apache는 80port를 사용하는데 일반적으로 리눅스에서는 1024 아래 port를 컨트롤 하기 위해서는 root권한이 있어야 사용이 가능, 그게 아니라면 이처럼 별도의 설정이 필요하다.)&lt;/p>
&lt;pre tabindex="0">&lt;code>$ sudo chown root:계정명 httpd
$ sudo chmod +s httpd
&lt;/code>&lt;/pre>&lt;h2 id="mod_wsgi-설치---">mod_wsgi 설치 ( &lt;a href="https://code.google.com/archive/p/modwsgi/" target="_blank" rel="noopener noreffer ">https://code.google.com/archive/p/modwsgi/&lt;/a> )&lt;/h2>
&lt;p>웹 서버 게이트웨이 인터페이스(WSGI, Web Server Gateway Interface)는 웹서버와 웹 애플리케이션의 인터페이스를 위한 파이선 프레임워크다. 라고 정의되어있다. 즉, 웹서버(Apache)와 위에서 만든 Flask 어플리케이션을 연동해주기 위한 프레임워크이다. 이또한 소스로 설치해보자. (위와 같은 이유로~)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 다운을 받고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/3.5.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 압축을 푼 다음
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ tar -zxvf 3.5.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 폴더에 들어가서
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cd mod_wsgi-3.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 아파치의 빌드툴인 apxs의 경로를 설정해주고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 필자와 같이 기본 python 버전을 사용하지 않을꺼라면 꼭 python경로를 설정해줘야 한다! (중요)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ ./configure --with-apxs=/~~~/apps/apache/bin/apxs --with-python=/usr/bin/python3.6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> make 파일을 만들고
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 설치~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ make install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이렇게 설치를 하면 자동으로 아파치 하위 /modules 폴더안에 mod_wsgi.so 파일이 생긴다. (필자는 이것도 모르고 mod_wsgi.so파일을 다운 받으려고 구글링을 몇일째 했던 기억이 ㅠ)&lt;/p></description></item></channel></rss>