PHP로 HTTP 서버 구현하기 - 01 - 계획

연재글 전체 보기


HTTP 완벽가이드 5장을 가볍게 읽다가, Perl로 만든 간단한 서버 구현을 보고 이걸 PHP로 구현해보면 좋겠다는 생각을 했다.

그 예제는 (대충 봤는데) HTTP 서버라기 보다 소켓 연결해서 응답해주는 수준의 간단한 구현이었던 것 같고, HTTP 서버가 되려면 뭘 해야하는지는 설명으로만 보여준다.

이응준님은 “웹 프로그래머를 위한 HTTP 완벽 가이드 읽는 법“에서

5장 “웹 서버”는 웹 서버가 어떻게 동작하는지 설명한다. 웹 프로그래머라면 반드시 이해해야 할 것이다.

라고 하셨지만, 사실 책에는 뭐 그리 많은 내용이 있는 건 아니다.

HTTP 완벽가이드 5장의 내용을 더 알고 싶다면, 남이 정리한 HTTP 완벽가이드 5장 자료를 찾아봐도 좋겠다.

구현 목표

몇부작이 될 지는 모르겠으나 시간날 때마나 기능을 하나씩 추가해볼까 한다.

단일 쓰레드로 하나의 요청만 처리하는 것부터 시작하기 때문에,

나중에 ReactPHP나 멀티쓰레딩 처리(PHP 7.2이상 + CLI 모드에선 가능한 듯) 혹은 멀티쓰레딩 흉내를 내는 것까지 갈 것 같다.

물론 올 해 안을 목표로 하는 프로젝트도 있기 때문에…한두번 하고 그만둘 수도 있다!
(중요/강조/미리죄송)

지금은 뭔가 신났지만…시작이나 하면 다행.

1차로 구현하고자 하는 기능은 ‘이미지가 하나 포함된 HTML 파일을 서비스한다’.

즉, HTML 파일 하나와 이미지 하나 정도 서비스 할 수 있는 능력이면 됐다.

예를 들어 이런 식.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>PHTTP</title>
</head>
<body>
<img src="https://www.engadget.com/media/2006/02/beer_server.jpg" alt="beer_server">
</body>
</html>

가장 간단하게 시작하기

php.net의 예제

  • 클래식한 소켓 연결 예제 프로그램
  • 5년 전 기억을 더듬어 보면 이런 식으로 짰던 것 같기도 하다

PHP Socket Programming, done the Right Way

  • 여기서는 PHP5.0 부터 사용할 수 있는 stream_socket_* 친구들을 소개한다
  • 존 레식 닯은 청년이 아주 친절하게 설명해주기 때문에, 누구든 국경을 초월한 지식 습득이 가능하다
  • 안 쓸 이유가 없다

찾아보니 OOP 방식의 간단한 구현체도 보임

  • A simple HTTP server
  • 아마도 위의 저 간단한 서버로 운영을 하다보면 겪을 수많은 고민이 담겨 있다(간단하게 구현 했음에도!)
  • 하지만 내 수준에서 보면 너무 많이 구현해놓았으니, 간간히 안 풀릴 때 참고만 해보자

기본 기능

socket create/bind/listen까지는 가장 간단하게 구현된 놈을 쓰자.

최신 스타일로 하자면 stream_socket_server/stream_socket_accept.

이제 main 스크립트 하나 돌리면서, 들어오는 스트림을 앞으로 만들 클래스 인스턴스로 넘겨주는 작업부터 본격 개발 시작이다.

구현할 기능

  • 요청 메시지 읽어들이기
  • 메시지 파싱
  • 리소스 접근
    • config파일 활용
      • document root, virtual host
  • 응답 만들기
    • 응답 코드 / 헤더 / 본문을 어떻게 구성할 지 정한다
  • 응답/로그

예상되는 변화

앞에서 언급한 대로 다중커넥션 처리

400/500번 대 일부 구현

  • 400, 404, 500 정도 구현할까 싶은데
  • 에러 페이지는 사치

경로 조회 공격 방어 [?]

directory index

저장소

GitHub : https://github.com/youngiggy/phttp