목표. NAT뒤의 OpenWRT 웹 서버에 접속하기 지난 3월부터 끌어온 이슈를 5월 중순이 되어 해결했다. 원했던 기능은 NAT(공유기) 뒤에 호스트에서 실행되는 서버에 접속하는 것이다. 호스트는 우리가 OpenWRT를 기반으로 펌웨어를 다시 올린 공유기이며, OpenWRT에서 동작하는 웹서버인 Luci에 접속하는 것이 목표이다. 방법 1. 포트포워딩 이를 달성하는 가장 간단한 방법으로는 포트 포워딩이 있다. 공유기에서 제공하는 기능인 포트포워딩은 외부에서 접속하는 포트와 내부 포트를 연결해주는 기능이다. 그러나, 중첩된 NAT(공유기에 공유기를, 다시 또 공유기를 물리는 중첩된 상태)에서 포트 포워딩을 해줘야 하는 경우를 고려해야 했다. 또한, 설치하는 사람이 이러한 설정 방법을 알고 적용해야 하는 ..
-
스트리밍 서비스가 궁금하다
스트리밍 서비스가 궁금하다. 최근 트위치가 한국에서 철수했다. 관련 담화들을 보면서 몇 가지 키워드들을 발견했다. 망 사용료, 그리드 네트워크, 스트리밍 서비스 등등... 가벼운 주제가 하나도 없다. 기억을 더듬어보니 개인적으로 스트리밍과 관련된 뭔가를 다룬 적이 한 번도 없었다. 그래서 한 번 알아봤다. 실시간 중계 서비스 분석 스트리밍 서비스도 클라이언트가 서버에 비디오 파일을 요청하고 서버가 파일을 응답하는 구조일 것이다. 서버는 나중에 보기로 하고 보통의 클라이언트인 브라우저에선 어떻게 처리할까? 브라우저에선 HTML5의 video 태그를 이용하여 브라우저에서 비디오를 보여줄 수 있다. 평소에 보던 스포티비에서 실시간 중계를 하길래 보다가 캡처한 것의 일부이다. html을 보니 video 태그를 ..
-
Amazon Lightsail에 배포
서론모두의 토론 백엔드를 아마존 라이트세일에 배포하는 과정을 정리했다.배포 과정모두의 토론 백엔드는 도커 위에 개발 환경을 구축했다. php-apache 이미지를 기반으로 라라벨 웹 서버를 구동시키고, redis 이미지를 활용하여 job을 처리하고, mysql 이미지를 활용하여 데이터베이스를 사용했다. 세 컨테이너를 관리하기 위하여 도커 컴포즈를 활용했다. 따라서 배포 역시 도커를 기반으로 하면 좋을 것이라고 생각하고 진행했다.0. 배포 방법 고민어떻게 배포를 할까 생각했다. AWS, Azure 사이에서 고민했다. Azure를 사용하면 새로운 경험을 할 수 있지만, 결제 정보 관리 포인트가 늘어나므로 AWS로 결정했다. AWS를 만지작 거리다 보니 Lightsail이란 게 눈에 띄었다. AWS의 여러 서..
-
Postman CLI기반 API 테스트 자동화
개요 Postman을 사용하여 개별 API 테스트를 하는 것은 널리 알려진 개발 방법이다. 그러나, 개별 API뿐만 아니라 여러 API를 CLI에서 일괄적으로 테스트할 수 있다는 사실은 그렇지 않다. 프로그래머가 버튼을 매번 누르는 것보다, Postman CLI을 기반으로 테스트를 자동화하여 효율적으로 개발을 할 수 있을 것이다. 이에 그 방법을 제시하고자 한다. Postman CLI Postman은 GUI기반으로 API를 테스트할 수 있다. 하지만, 자동화를 하기에 GUI는 부족한 점이 있다. 이에, Newman이라는 이름의 node.js 패키지가 나왔고, CLI 기반으로 테스트를 할 수 있었다. 현재, Postman CLI이라는 이름으로 공식적으로 CLI툴을 지원한다. Postman CLI를 이용하여..
-
OverlappedIO에서 소켓 버퍼 사이즈를 바꾸는 것은 대부분 성능에 영향이 없다.
윈도우즈 소켓 함수인 send()는 데이터의 전송을 보장하지 않는다. 정확히는 유저 버퍼에 있는 데이터를 소켓의 송신 버퍼에 복사를 해줄 뿐이다. 데이터 전송은 운영체제에서 알아서 해준다. 그럴 수밖에 없는 것이, TCP 같은 경우는 congestion control, flow control 같은 전송량 제어 프로토콜을 따라야 하기 때문이다. OverlappedIO을 이용하여 콜백 함수(OverlappedIO Completion Routine)나 IOCP 큐로 통지를 받은 것은 유저 버퍼의 데이터가 소켓의 송신 버퍼에 복사된 것을 의미한다. 이 경우엔 All or Nothing으로 요청한 데이터 사이즈만큼 복사가 완료될 때까지 성공 이벤트가 뜨지 않는다. 그런데, 예외적인 동작이 하나 있다. 그것은 바로..
-
소켓의 수신 버퍼 크기를 0으로 할 때 주의할 점.
IOCP 및 overlapped IO를 다루는 글에서 소켓의 수신 버퍼 사이즈를 0으로 만들어서, zero copy의 이점을 살리라고 되어 있다. setsockopt 함수와 SO_RCVBUF를 이용하여 소켓의 수신 버퍼 사이즈를 0으로 만들 수 있다. zero copy는 도착한 패킷이 커널의 소켓 수신 버퍼를 거치지 않고, 유저가 제공한 버퍼에 바로 복사되는 것을 의미한다. 그러나, SO_RCVBUF의 사이즈를 0으로 만든다고 zero copy가 되는 것은 아니며, 수신 버퍼 사이즈를 0으로 만드는 것은 주의해야할 점이 있다. zero copy와 SO_RCVBUF의 관계는 이 링크에 있다. https://crmerry.tistory.com/29?category=1031711 아래 인용글에 커널 소켓의 수..
-
Laravel, 리퀘스트에서 불필요한 필드가 있으면 자동으로 반려하기
서버의 요청 처리 과정 서버가 받은 요청을 처리하는 과정은 다음과 같다. 검증 -> 추출 -> 정제 -> 로직 -> 응답 집중해서 보고 싶은 부분은 검증과 추출의 일부분이다. 검증은 서버에 들어오는 요청에 API 스펙으로 정한 필드의 유무와 필드가 있다면 타입 등의 제약 사항을 제대로 지키는지 확인하는 데 사용된다. 추출은 검증 후에 로직에 맞게 필요한 데이터를 가져오는 과정이다. 라라벨은 검증에 필요한 도구를 제공한다. 밸리데이터, 폼리퀘스트 등이 있을 것이다. 그러나, 일반적인 상황에서 벗어난 것들은 직접 만들어줘야 한다. 이 글에서 다룰 내용은 요청 안에 스펙에 없는 필드가 왔을 때 자동으로 반려하는 것이다. 검증할 요소들 요청에서 검증할 요소들은 다음과 같다. 반드시 존재해야 하는 필드. 라라벨에..
-
도커를 이용하여 PHP 개발 환경 설정하기
도커를 이용한 PHP 개발 환경 구축의 이점 도커를 이용한 개발, 배포 환경 구성의 이점은 무엇일까. 재사용하기 좋다는 것이 가장 크지 않나 싶다. 재사용하기 좋다는 것은 다음과 같다. 한 명의 프로그래머가 도커 기반으로 개발환경을 꾸미면 나머지 사람들은 그대로 사용하면 된다. 나머지 사람들은 같은 팀원일 수도 있고 미래의 내가 될 수도 있다. 그리고 이렇게 올려놓은 개발환경에 설정파일을 바꿔 서비스에도 올릴 수 있고. 개발환경을 꾸민다는 것은 단순히 IDE만을 설치하는 것이 아니라 프로그램을 실행하기 위한 라이브러리나 시스템 도구, 런타임 등 필요한 것들을 구성하는 것을 의미한다. 따로 세팅을 한다면, 똑같은 일을 여러 번 반복하게 되어 시간이 낭비된다. 그리고, 시스템에 기본적으로 적용된 버전 차이에..
-
TOC 만들기
TOC 만들기 TOC는 Table of contents로 목차를 가리킨다. 티스토리 블로그에서는 자체 목차는 없지만, Tocbot같은 라이브러리가 존재한다. tocbot을 그대로 적용하려고 했다가 직접 만들어보는 것도 해볼 만한 것 같아서 시작하였다. 목적 현재 블로그에 TOC를 적용할 수 있도록, TOC를 처음부터 만든다. 목표 블로그에 TOC를 라이브러리 없이 제작한다. 대상은 사용 중인 티스토리 블로그와 현재 선택한 블로그 스킨이다. TOC를 선택하면 해당 문단으로 이동하는 등의 기본적인 기능을 추가한다. 과정 티스토리 블로그는 관리자 메뉴에서 스킨 편집을 할 수 있다. 편집을 누르면, HTML과 CSS를 수정할 수 있고, 필요한 파일을 업로드할 수 있도록 되어 있다. 이에 HTML 탭 하단에 자바..
-
2. express 타입 이해...2
express 예제의 타입 확인. 이번 글의 목표는 npm에 올라온 express 예제의 타입을 확인하는 것이다. 다음은 express 예제에 번호를 추가한 것이다. const express = require('express') // (1) const app = express() // (2) app.get('/', function (req, res) { // (3) res.send('Hello World') // (4) }) app.listen(3000) // (5) 이 예제에 타입이 추가된 코드는 다음과 같다. (1)부터 (5)까지 코드를 보며 타입을 알아볼 것이다. (1) ~ (5)번으로 넘버링된 줄을 하나씩 살펴보자. (1) : "export = "로 모듈을 내보내는 파일을 받을 때 쓰는 방식이다...
-
1. express 타입 이해...1
express의 타입 npm express에 있는 모듈에서 가리키는 express 사용법은 다음과 같다. const express = require('express') // (1) const app = express() // (2) app.get('/', function (req, res) { // (3) res.send('Hello World') // (4) }) app.listen(3000) // (5) 위 코드 (1) ~ (5)에서 타입은 어떻게 되는가? express 자체는 자바스크립트로 먼저 작성되었다. 그리고, 타입이 따로 추가된 형태이다. NPM을 가보면 다음과 같이 되어 있다. express 라이브러리를 타입스크립트에서 사용하려면 타입 정보가 필요한 것이다. 이를 위하여 @types/exp..
Recent
-
PHP의 Fiber분석과탐구 2024.04.11 04:14
개요 PHP는 멀티스레딩 지원이 빈약하다. pthread 같은 extension을 잠시 지원했으나 더 이상 지원을 하지 않는다. 한편, parallel란 익스텐션이 나와 멀티스레딩을 지원하려는 시도가 있었다. 그리고 활발하게 개발되다가 중단되었다. 멀티스레딩 지원이 빈약하고 또 개발 중단이 일어나는 이유를 추측해 본다면, 프로그래머가 그것을 필요로 하는 경우가 적기 때문이다. 즉, 수요가 없는 것이다. PHP는 C++, Java같은 일반적인 언어가 아니라 웹 페이지 전달을 목적으로 하기 때문이다. 일반적인 언어에선 처리 속도의 향상, 처리량의 향상을 이유로 멀티스레딩이 요구된다. PHP에선 그렇진 않다. 그런데도, PHP를 하다 보면 멀티스레드가 있으면 좋겠다 싶은 경우가 있다. 파일 입출력, 다른 서버..
-
Postman CLI기반 API 테스트 자동화분석과탐구 2024.04.09 16:25
개요 Postman을 사용하여 개별 API 테스트를 하는 것은 널리 알려진 개발 방법이다. 그러나, 개별 API뿐만 아니라 여러 API를 CLI에서 일괄적으로 테스트할 수 있다는 사실은 그렇지 않다. 프로그래머가 버튼을 매번 누르는 것보다, Postman CLI을 기반으로 테스트를 자동화하여 효율적으로 개발을 할 수 있을 것이다. 이에 그 방법을 제시하고자 한다. Postman CLI Postman은 GUI기반으로 API를 테스트할 수 있다. 하지만, 자동화를 하기에 GUI는 부족한 점이 있다. 이에, Newman이라는 이름의 node.js 패키지가 나왔고, CLI 기반으로 테스트를 할 수 있었다. 현재, Postman CLI이라는 이름으로 공식적으로 CLI툴을 지원한다. Postman CLI를 이용하여..
-
cron, logrotate 그리고 docker짧은경험기 2024.02.06 21:19
서론 docker위에 cron, logrotate를 아파치 웹 서버에 적용하면서 발생한 문제와 해결 방법을 다룬다. 관련링크 용어정리 cron: 잡 스케줄링 시스템이다. 커맨드, 스크립트, 프로그램 실행 등을 할 수 있다. cron job: cron으로 실행할 로직을 가리킨다. crontab으로 등록할 수도 있고, /etc/cron.d에 로직을 담은 파일을 위치시키면 자동으로 실행된다. crontab: cron table의 줄임말로, cron에서 실행할 잡을 관리하기 위한 커맨드이다. logrotate: 로그 파일을 관리하기 위한 유틸리티이다. 'mylog.log'에 rotate가 적용되면 'mylog.log.1', 'mylog.log.2'... 와 같이 분리 저장되고, 새로운 로그는 'mylog.log..
-
스트리밍 서비스가 궁금하다분석과탐구 2023.12.16 00:10
스트리밍 서비스가 궁금하다. 최근 트위치가 한국에서 철수했다. 관련 담화들을 보면서 몇 가지 키워드들을 발견했다. 망 사용료, 그리드 네트워크, 스트리밍 서비스 등등... 가벼운 주제가 하나도 없다. 기억을 더듬어보니 개인적으로 스트리밍과 관련된 뭔가를 다룬 적이 한 번도 없었다. 그래서 한 번 알아봤다. 실시간 중계 서비스 분석 스트리밍 서비스도 클라이언트가 서버에 비디오 파일을 요청하고 서버가 파일을 응답하는 구조일 것이다. 서버는 나중에 보기로 하고 보통의 클라이언트인 브라우저에선 어떻게 처리할까? 브라우저에선 HTML5의 video 태그를 이용하여 브라우저에서 비디오를 보여줄 수 있다. 평소에 보던 스포티비에서 실시간 중계를 하길래 보다가 캡처한 것의 일부이다. html을 보니 video 태그를 ..
-
Amazon Lightsail에 배포문제해결 2023.12.04 21:49
서론모두의 토론 백엔드를 아마존 라이트세일에 배포하는 과정을 정리했다.배포 과정모두의 토론 백엔드는 도커 위에 개발 환경을 구축했다. php-apache 이미지를 기반으로 라라벨 웹 서버를 구동시키고, redis 이미지를 활용하여 job을 처리하고, mysql 이미지를 활용하여 데이터베이스를 사용했다. 세 컨테이너를 관리하기 위하여 도커 컴포즈를 활용했다. 따라서 배포 역시 도커를 기반으로 하면 좋을 것이라고 생각하고 진행했다.0. 배포 방법 고민어떻게 배포를 할까 생각했다. AWS, Azure 사이에서 고민했다. Azure를 사용하면 새로운 경험을 할 수 있지만, 결제 정보 관리 포인트가 늘어나므로 AWS로 결정했다. AWS를 만지작 거리다 보니 Lightsail이란 게 눈에 띄었다. AWS의 여러 서..