목록Backend (32)
만족
const normalDoc = await MyModel.findOne(); mongoose를 이용하여 쿼리할 때 위와 같은 형태로 쿼리한다. https://mongoosejs.com/docs/index.html mongoose 의 quick start에서도 위와 같이 소개하고 있어 계속 이렇게 사용해왔지만, 클러스터링까지 사용하게 되면서 cpu, memory 사용량이 증가하여 조치를 취해야만 한다. 쿼리 시 어떤 데이터를 반환하는가? const normalDoc = await MyModel.findOne(); 이 코드를 사용했을 때 normalDoc에는 어떤 데이터가 할당될까? util.inspect와 console.log를 이용해 normalDoc을 찍어보면 { _id: 659bc8cc415b117a..
웹 서버를 구성할 때 가장 간단하면서 흔한 LAMP Stack(Linux, Apache, Mysql, Php)를 사용하고 별다른 설정을 하지 않았다면 이 포스트가 도움이 될 것이다. 기본적으로 prefork기반의 mpm을 사용하게 되는데, prefork방식은 요청 1개가 프로세스 1개에 대응되기 때문에 사용자가 늘어날 수록 메모리 사용량이 급증한다. (30~40%정도의 메모리를 사용하고 프로세스의 갯수도 매우 많다) 나 역시 이 문제를 해결하기 위해 event기반 mpm으로 변경했다. mpm은 어떤 종류가 있을까? 종류별로 어떤 장단점이 있을까? 어떻게 변경할 수 있을까? 한번 알아보자 Apache mpm prefork (기본값) 프리포크 방식은 한 개의 프로세스가 한 개의 연결을 처리한다. 아파치 설치..
apache mpm을 prefork에서 event로 변경하면서 php 모듈도 변경했는데 해당 작업 이후 발생한 문제이다. Uncaught Error: Call to undefined function apache_request_headers() ... 원인 기존의 apache php 모듈을 제거하고 php-fpm을 대신 활성화해서 apache_request_headers() 함수가 지원되지 않는다. apache-php 연결 모듈에 따라 지원 여부가 갈린다. + 이것도 좀 웃긴게 php 공식 문서에서도 어떤 페이지는 모듈 연결 방식에 상관없이 모두 된다고 하고 또다른 페이지에서는 안된다고 나온다. + 정확한 것은 php_info()를 호출해서 지원되는 환경 변수들을 체크해보면 알 수 있다. 당연하게도 apa..
결론만 보고싶다면 스크롤 맨밑으로 ㅎㅎ.. 현재 apache+express 조합으로 서비스를 운영중이다. client가 request를 보냈을 때 express project까지 도달하는 과정은 위와 같다. 그런데 express에서 req.ip 값을 확인하니, 전부 127.0.0.1로 찍혀 있었다. 왜 그럴까? 사실 express의 관점에서는 앞단에서 아파치가 프록시를 해주고 뭐고 그런건 관심없고 apache가 express에게 request를 보내는 것으로 인식된다. 따라서 자기 자신에게 포트 번호만 바꿔서 보내는 것으로 작동하므로, 요청 ip가 127.0.0.1로 찍히는 것이다. req.ip express의 req.ip는 어떻게 구현되어 있을까? expressjs https://github.com/e..
http 프로토콜을 강제로 https로 변경하여 사용하도록 설정해보자. https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Strict-Transport-Security Strict-Transport-Security - HTTP | MDN HTTP Strict-Transport-Security response header (종종 HSTS (en-US) 로 약칭) 는 HTTP 대신 HTTPS만을 사용하여 통신해야한다고 웹사이트가 브라우저에 알리는 보안 기능. developer.mozilla.org MDN에 의하면, Strict-Transport-Securty 헤더를 통해 클라이언트(브라우저)에게 https를 사용해야 한다고 알려줄 수 있다고 한다. Strict..
현재 운영중인 서비스에서 VPN으로 아이피를 해외로 돌려 악성 댓글을 작성하는 경우가 포착되었다. 따라서 요청 아이피를 확인해 해외 아이피인 경우 일부 기능을 사용할 수 없도록 할 것이다. 클라이언트 아이피 가져오기 function getClientIP() { $ipaddress = ''; if ($_SERVER['HTTP_CLIENT_IP']) { $ipaddress = $_SERVER['HTTP_CLIENT_IP']; } else if ($_SERVER['HTTP_X_FORWARDED_FOR']) { $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; } else if ($_SERVER['HTTP_X_FORWARDED']) { $ipaddress = $_SERVER['..
Attempting to renew cert (secret.kr) from /etc/letsencrypt/renewal/secret.kr.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration. The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping. sudo certbot renew 인증서 유효 기간이 30일도 남지 않아..
가령 새로운 문의사항이 있다거나, 서버의 컴퓨팅 자원 소모량이 갑자기 늘어날 때 항상 모니터링을 하고 있는 것이 아니기 때문에 즉시 인지하기 어렵다. 그렇다고 별도의 알림 서버를 구축하자니 시간과 비용이 만만치 않은데, 텔레그램에서 지원하는 봇 API 를 사용하면 간단히 구현할 수 있다. https://telegram.org/ 텔레그램 – 새로운 메시징의 시대 빠르고. 안전하며. 강력함 telegram.org 먼저 텔레그램 계정을 생성하고, 앱을 다운로드받는다. Bot 생성 BotFather를 검색하고 우측에 파란색 체크 아이콘이 이있는 봇(맨 위)을 선택한다. start또는 시작 버튼을 누르면 다음과 같은 채팅이 표시된다. /newbot을 입력하면 두 종류의 봇 이름을 결정하게 된다. 첫 번째 봇 이름..