[3] Nginx 서버 셋업 - C++ 웹 프레임워크 연결


C++ 서버로 만들어 보는게 목표이기에 프레임워크 서치를 우선 진행

## 0. C++ 웹 프레임워크 조사
| 프레임워크 | 장점 | 단점 |
|------------|------|------|
| **Drogon** | - 최신 C++14/17 지원<br>- 비동기 프로그래밍 및 다중 스레드 지원<br>- HTTP2, WebSocket 지원<br>- 높은 성능 및 사용자 친화적 API<br>- 활발한 커뮤니티 및 지원 | - 초기 설정이 복잡할 수 있음 |
| **Pistache** | - 경량 설계로 빠른 웹 서버 구현<br>- RESTful API 개발에 적합<br>- 간단한 코드와 쉬운 학습 | - 개발 및 업데이트 속도가 느림<br>- 제한된 기능성 |
| **Crow** | - Flask와 유사한 직관적인 사용법<br>- JSON 지원 및 라우팅 기능 포함<br>- 경량 설계 | - 기능이 제한적이며 대규모 애플리케이션에는 부적합<br>- 유지보수가 부족할 수 있음 |
| **CppCMS** | - 고성능 웹 애플리케이션 구축 가능<br>- 세션 관리 및 국제화 지원 | - 설정이 복잡하고 높은 학습 곡선<br>- 문서가 부족하고 사용법이 어렵다 |
| **Restbed** | - RESTful API 개발에 적합<br>- 비동기 및 확장 가능한 설계 | - 제한된 기능으로 대규모 프로젝트에는 부적합<br>- 커뮤니티 지원이 활발하지 않음 |

- 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 

로 재시작
```

---
동작 확인
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnd8B1aa2ngpsrxkCV6GnS3l_1PuJJsOYLAJi27B6KH8jFs93z9RfQ2ukUUADZmqgulYpD4U8EmLB4isOb5d8NCawmIrPa5kXKWOugXSio9opl9cuGIpsruyh4TNTbNiJ-_Es2RkvVqjAs9fv0gipSPKazUTVfyxYOwnNim0jA0ouf33vS_fP0zXR/s360/nginx-3.PNG" style="display: block; padding: 1em 0; text-align: center; "><img alt="nginx" border="0" data-original-height="180" data-original-width="360" loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnd8B1aa2ngpsrxkCV6GnS3l_1PuJJsOYLAJi27B6KH8jFs93z9RfQ2ukUUADZmqgulYpD4U8EmLB4isOb5d8NCawmIrPa5kXKWOugXSio9opl9cuGIpsruyh4TNTbNiJ-_Es2RkvVqjAs9fv0gipSPKazUTVfyxYOwnNim0jA0ouf33vS_fP0zXR/s320-rw/nginx-3.PNG" width="320"/></a></div>


Web(10099) -> VM -> Nginx(10099) -> drogon(8848)
위 구조로 서버 동작

---


추가로 읽으면 좋을 것

댓글

이 블로그의 인기 게시물

윤석열 계엄령 선포! 방산주 대폭발? 관련주 투자 전략 완벽 분석

대통령 퇴진운동 관련주: 방송·통신·촛불수혜주 완벽 분석

키움 OPEN API MFC 개발 (1)