[3] Nginx 서버 셋업 - C++ 웹 프레임워크 연결
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
C++ 서버로 만들어 보는게 목표이기에 프레임워크 서치를 우선 진행
0. C++ 웹 프레임워크 조사
| 프레임워크 | 장점 | 단점 | |------------|------|------| | Drogon | - 최신 C++14/17 지원
- 비동기 프로그래밍 및 다중 스레드 지원
- HTTP2, WebSocket 지원
- 높은 성능 및 사용자 친화적 API
- 활발한 커뮤니티 및 지원 | - 초기 설정이 복잡할 수 있음 | | Pistache | - 경량 설계로 빠른 웹 서버 구현
- RESTful API 개발에 적합
- 간단한 코드와 쉬운 학습 | - 개발 및 업데이트 속도가 느림
- 제한된 기능성 | | Crow | - Flask와 유사한 직관적인 사용법
- JSON 지원 및 라우팅 기능 포함
- 경량 설계 | - 기능이 제한적이며 대규모 애플리케이션에는 부적합
- 유지보수가 부족할 수 있음 | | CppCMS | - 고성능 웹 애플리케이션 구축 가능
- 세션 관리 및 국제화 지원 | - 설정이 복잡하고 높은 학습 곡선
- 문서가 부족하고 사용법이 어렵다 | | Restbed | - RESTful API 개발에 적합
- 비동기 및 확장 가능한 설계 | - 제한된 기능으로 대규모 프로젝트에는 부적합
- 커뮤니티 지원이 활발하지 않음 |
- GPT 피셜 인기 좋은 Drogon으로 우선 진행해보기로한다.
1. 프레임워크 의존성 설치
``` sudo yum install -y git cmake gcc-c++ libuuid-devel openssl-devel zlib-devel brotli-devel jsoncpp-devel libuuid libuuid-devel
```
jsoncpp-devel 없다면 별개 설치필요
jsoncpp는 별개 설치
``` # jsoncpp 소스 코드 다운로드 git clone https://github.com/open-source-parsers/jsoncpp.git cd jsoncpp
# 빌드 디렉터리 생성 mkdir build cd build
# CMake로 설정 및 빌드 cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc)
# 설치 sudo make install
# 설치 경로 링킹 (설치된 경로 입력, 본인은 /usr/local/lib64에 설치함) echo "/usr/local/lib64" | sudo tee /etc/ld.so.conf.d/jsoncpp.conf sudo ldconfig
# 확인 ldconfig -p | grep jsoncpp
[root@vbox build] (master) $ ldconfig -p | grep jsoncpp libjsoncpp.so.27 (libc6,x86-64) => /usr/local/lib64/libjsoncpp.so.27 libjsoncpp.so (libc6,x86-64) => /usr/local/lib64/libjsoncpp.so
```
2. 프레임워크 빌드
``` git clone https://github.com/drogonframework/drogon.git cd drogon
mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) sudo make install
```
설치시 에러
``` CMake Error at CMakeLists.txt:137 (add_subdirectory): The source directory
/root/drogon/trantor
does not contain a CMakeLists.txt file. ```
- 아래 명령어 진행 git submodule update --init --recursive
- 명령어 수행후 build 경로에서 ``` cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) sudo make install 수행 후 재 빌드 ```
3. 프레임워크 동작 확인
- 버전 확인 ``` [root@vbox drogon_ctl] (master) $ pwd /root/drogon/build/drogon_ctl [root@vbox drogon_ctl] (master) $ ./drogon_ctl version _ __| |_ __ ___ __ _ ___ _ __ / _` | '__/ _ \ / _` |/ _ \| '_ \ | (_| | | | (_) | (_| | (_) | | | | \__,_|_| \___/ \__, |\___/|_| |_| |___/
A utility for drogon Version: 1.9.8 Git commit: 8541e671430f9605a62f1afbd786c1dbd54197d6 Compilation: Compiler: c++ Compiler ID: GNU Compilation flags: -O3 -DNDEBUG -std=c++17 -I/usr/local/include Libraries: postgresql: no (pipeline mode: no) mariadb: no sqlite3: no ssl/tls backend: OpenSSL brotli: no hiredis: no c-ares: no yaml-cpp: no
```
아래 경로에서 빌드 된 테스트 서버 실행
/root/drogon/build/examples
``` [root@vbox examples] (master) $ ./helloworld 20241103 16:23:09.594785 UTC 52417 INFO Server running on 127.0.0.1:8848 - main.cc:95 20241103 16:23:09.596557 UTC 52418 INFO setBeforeListenSockOptCallback:10 - main.cc:76
```
내부 curl 테스트
``` [root@vbox ~] $ curl -v 127.0.0.1:8848 * Trying 127.0.0.1:8848... * Connected to 127.0.0.1 (127.0.0.1) port 8848 (#0) > GET / HTTP/1.1 > Host: 127.0.0.1:8848 > User-Agent: curl/7.76.1 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < content-length: 13 < content-type: text/html; charset=utf-8 < server: drogon/1.9.8 < date: Sun, 03 Nov 2024 16:22:09 GMT < * Connection #0 to host 127.0.0.1 left intact
```
web 테스트
웹 테스트 전에 nginx reload가 필요하다
``` worker_processes 10;
events { worker_connections 1024; use epoll; }
http { include mime.types; default_type application/octet-stream;
sendfile on; keepalive_timeout 65; large_client_header_buffers 4 16k;
server { listen 10099; server_name localhost;
location / { proxy_pass http://localhost:8848; # 프록시할 대상 서버 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
} }
설정 수정 이후 ./nginx -s reload 혹은
./nginx -s stop ./nginx
로 재시작 ```
동작 확인
Web(10099) -> VM -> Nginx(10099) -> drogon(8848) 위 구조로 서버 동작
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기