이상을 꿈꾸는 몽상가.. 프로그래밍을 좋아함..


Python SimpleHTTPServer

Python
( 이미지 출처 : Wikipedia )

Python 명령어 한줄로 간단한 HTTP 서버를 띄우는 방법을 알아봅니다.

너무나도 단순한 방법인데 의외로 모르시는 분들이 많아서 공유합니다.
( 그리고 Python2 와 Python3가 방법이 다르다보니 저도 매번 검색하게되서 외우기 위해 기록합니다. )

다른 것을 테스트하다가 간단하게 연결해볼 HTTP 서버가 필요하다 싶을 때 사용하면 좋습니다.
Linux의 경우 Python이 기본적으로 설치되어있기 때문에 다른 준비작업이 필요 없습니다.

Python 2.x

$ python2 -m SimpleHTTPServer 8000

8000 포트로 간단한 HTTP 서버가 띄워집니다.
http://localhost:8000에 접속해보면 명령을 실행한 디렉토리의 파일내역이 출력됩니다.

Python 3.x

$ python3 -m http.server 8000

Python 2.x 와 동일한 결과를 출력합니다.

멀티 유저 접속

SimpleHTTPServer 는 단일 쓰레드로 돌아가기 때문에 동시 접속이 한명 밖에 되지 않습니다.
앞에서도 이야기 드렸지만 간단하게 테스트 하는 목적으로만 사용해야지 여러명이 접속해야 하는 환경에는 부적합합니다.

멀티 쓰레드를 처리하도록 Python 코드를 간단하게 작성할 수도 있지만
그 보다는 Nginx, Apache HTTPD 와 같은 제대로 된 웹서버를 사용하는 것을 권장 드립니다.
만약 docker 가 설정되어있고 인터넷이 되는 환경이라면 아래처럼 간단하게 띄울 수 있습니다.

$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -p 8000:80 -d nginx

SSL 적용

위에서 띄운 Simple HTTP Server을 이용해서 SSL 서버를 띄우는 방법 입니다.

key.pem, cert.pem 파일 생성

SSL이 필요로하는 key.pem, cert.pem 파일을 만들기 위해 아래 명령어를 수행하빈다.

$ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365

아래와 같이 적당히 긴 pass phrase를 2회 입력해주셔야 합니다. pass phrase는 추후에 사용되니 반드시 기억해두셔야 합니다.

Generating a 2048 bit RSA private key
....................+++
.................................+++
writing new private key to 'key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

그 뒤에 인증서 정보 입력 과정이 있는데 엔터만 치시면 기본값으로 설정됩니다.

-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Python 2.x

ssl_simple_http_server.py 라는 파일을 만들고 아래와 같이 작성 합니다.

import BaseHTTPServer, SimpleHTTPServer
import ssl


httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)

httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               keyfile='path/to/key.pem',
                               certfile='path/to/cert.pem',
                               ssl_version=ssl.PROTOCOL_TLS)

httpd.serve_forever()

keyfile, certifile 에는 위에서 생성했던 key.pem, cert.pem 파일의 위치를 적어주시면 됩니다.

$ python ssl_simple_http_server.py --host=0.0.0.0

4443 포트로 간단한 HTTPS 서버가 띄워집니다.
http://localhost:4443에 접속해보면 명령을 실행한 디렉토리의 파일내역 SSL이 적용된 채로 출력됩니다.

Python 3.x

Python 2.X 와 모든 과정, 결과가 동일하고 ssl_simple_http_server.py 파일만 아래 내용으로 교체해주시면 됩니다.

import http.server, ssl

httpd = http.server.HTTPServer(('localhost', 4443), http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               keyfile='path/to/key.pem',
                               certfile='path/to/cert.pem',
                               ssl_version=ssl.PROTOCOL_TLS)
httpd.serve_forever()

References


Associated Posts

관련된 주제를 살펴볼 수 있도록 동일한 Tag를 가진 글들을 모아뒀습니다. 제목을 눌러주세요.

  • Zappa를 이용해 AWS Lambda에 Flask 올리기


    Flask AWS Lambda
    ( 이미지 출처 : Wikipedia, https://aws.amazon.com/ko/lambda/features/ )

    Zappa라는 툴을 공유합니다.

    AWS Lambda 위에서 Flask 프레임워크를 사용할 수 있게 해주며 귀찮던 AWS APIGateway path 추가 작업이 필요 없어집니다.

    게다가 복잡한 배포 스크립트 작업 없이도 명령어 한줄만으로 배포 가능해집니다.


  • Python3.6 설치


    Python
    ( 이미지 출처 : Wikipedia )

    Ubuntu 14.04 LTS에서 Python3.6 을 컴파일 설치하는 법을 알아봅니다.


  • Python WAS 구축하기 ( Django, Nginx, Gunicorn )


    WSGI Middleware

    Python으로 REST API 서비스를 위한 WAS(Web Application Server) 구축을 진행합니다.

    Django만으로도 REST API를 오픈할 수 있지만
    Django의 runserver는 단순히 테스트만을 위한 기능으로
    운영환경에서 사용하면 성능상 문제를 겪게 됩니다.

    운영모드에서 Gunicorn 같은 WSGI(Web Server Gateway Interface) 미들웨어와 연동이 필요합니다.


  • Resizing Images On AWS Lambda



  • Deploying Python Zip To AWS Lambda



  • [Hackerank Challenges] Xor-sequence



  • Python 학습내용 기록



i