웹 서버

Nginx

설치

Nginx는 다음의 공식 문서를 참고하여 설치합니다.

https://www.nginx.com/resources/wiki/start/topics/tutorials/install/

데이터 수집을 위한 추가 작업

Nginx 설치 후 Nginx의 데이터를 수집하기 위해 추가 작업이 필요합니다.

OpenTelemetry Module 설치

OpenTelemetry을 설치합니다.

  1. OpenTelemetry 공식 문서에서는 OpenTelemetry WebServer SDK를 /opt 경로에 설치하고 실행할 것을 권장합니다.

  2. 사용 중인 Nginx 버전을 지원하는 OpenTelemetry를 설치합니다.

    https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases

OpenTelemetry 설치 파일을 다운로드하고, /opt 디렉터리에 설치 파일의 압축을 해제합니다.

$ cd /opt
$ wget https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/ download/webserver%2Fv$(version)/opentelemetry-webserver-sdk-x64-linux.tgz.zip
$ unzip opentelemetry-webserver-sdk-x64-linux.tgz.zip
$ tar -xvzf opentelemetry-webserver-sdk-x64-linux.tgz
$ cd opentelemetry-webserver-sdk
$ ./install.sh
항목 설명

$(version)

설치할 OpenTelemetry의 버전입니다. (예: 1.0.2)

OpenTelemetry 설치 파일 압축 해제 후 생성되는 디렉터리 구조는 다음과 같습니다.

/agent-home/opentelemetry-webserver-sdk
|-- VERSION.txt
|-- WebServerModule
|   |-- Apache
|   |   |-- libmod_apache_otel.so
|   |   |-- libmod_apache_otel22.so
|   |   |-- libopentelemetry_webserver_sdk.so
|   |-- Nginx
|   |   |-- 1.22.0
|   |   |   |-- ngx_http_opentelemetry_module.so
|   |   |-- 1.23.0
|   |   |   |-- ngx_http_opentelemetry_module.so
|   |   |-- 1.23.1
|   |   |   |-- ngx_http_opentelemetry_module.so
|-- conf
|   |-- appdynamics_sdk_log4cxx.xml
|   |-- appdynamics_sdk_log4cxx.xml.template
|-- install.sh
|-- logs
|-- sdk_lib
|   |-- lib
|   |   |-- libopentelemetry_common.so
|   |   |-- libopentelemetry_exporter_ostream_span.so
|   |   |-- libopentelemetry_exporter_otlp_grpc.so
|   |   |-- libopentelemetry_otlp_recordable.so
|   |   |-- libopentelemetry_resources.so
|   |   |-- libopentelemetry_trace.so
|   |   |-- libopentelemetry_webserver_sdk.so

LD_LIBRARY_PATH 설정

LD_LIBRARY_PATH를 설정합니다. 이때 아래 두 가지 방법 중 하나를 선택하여 설정이 가능합니다.

  • [방법 1]

    환경 변수를 설정합니다.

    $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/opentelemetry-webserver-sdk/sdk_lib/lib

    만약 'cannot open shared object file: No such file or directory' 에러가 발생 시 [방법 2]로 진행합니다.

  • [방법 2]

    conf 파일을 직접 추가합니다.

    1. /etc/ld.so.conf.d 디렉터리 하위에 opentelemetry-webserver-sdk.conf 파일을 생성합니다.

    2. /opt/opentelemetry-webserver-sdk/sdk_lib/lib를 복사한 후 붙여넣고 저장합니다.

    3. ldconfig 명령을 수행하여 설정을 적용합니다.

Nginx에 OpenTelemetry Module 추가

Nginx 설정 파일에 module 위치와 conf 설정을 추가합니다.

  • nginx.conf 파일

    ${NGINX_HOME}/conf/nginx.conf
    worker_processes 1;
    
    # module 위치
    load_module /opt/opentelemetry-webserver-sdk/WebServerModule/Nginx/${nginx_version}/ngx_http_opentelemetry_module.so;
    
    events {
        worker_connections 1024;
    }
    
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
    
        server {
            listen 80;
            server_name localhost;
    
            location / {
                root html;
                index index.html index.htm;
            }
    
            # exporter 연동을 위한 stub_status 오픈
            location /metrics {
              stub_status;
              allow all;
            }
    
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
        }
    
    # conf 설정
    include /opt/opentelemetry_module.conf;
    
    }
  • opentelemetry_module.conf 파일

    /opt에 opentelemetry_module.conf를 생성합니다.

    NginxModuleEnabled ON;
    #NginxModule Otel Exporter details
    NginxModuleOtelSpanExporter otlp;
    NginxModuleOtelExporterEndpoint ${MASTER_IP}:4317;
    # SSL Certificates
    #NginxModuleOtelSslEnabled ON
    #NginxModuleOtelSslCertificatePath
    #NginxModuleOtelSpanProcessor Batch
    NginxModuleOtelSampler AlwaysOn;
    #NginxModuleOtelMaxQueueSize 1024
    #NginxModuleOtelScheduledDelayMillis 3000
    #NginxModuleOtelExportTimeoutMillis 30000
    #NginxModuleOtelMaxExportBatchSize 1024
    NginxModuleServiceName nginx;
    NginxModuleServiceNamespace nginx;
    NginxModuleServiceInstanceId  ${HOSTNAME};
    NginxModuleResolveBackends ON;
    NginxModuleTraceAsError ON;
    #NginxModuleSegmentType LAST;
    #NginxModuleSegmentParameter 1;
    항목 설명

    ${MASTER_IP}

    otel-collector가 설치된 서버의 IP 주소입니다.

    ${HOSTNAME}

    모니터링할 인스턴스의 ID입니다.

Nginx Exporter 설치

Nginx Exporter를 설치합니다.

  1. Nginx Exporter 설치 파일을 사용 환경에 맞는 버전으로 다운로드한 후 압축을 해제합니다.

    $ wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/
      download/v0.11.0/nginx-prometheus-exporter_0.11.0_linux_$(system).tar.gz
    $ tar xvfz nginx-prometheus-exporter_0.11.0_linux*.tar.gz
    항목 설명

    $(system)

    서버의 아키텍처입니다.

    • AMD64: amd64

    • ARM64: arm64

    • i386: 386

  2. Nginx Exporter를 실행합니다.

    $ nohup ./nginx-prometheus-exporter -nginx.scrape-uri="http://${NGINX_SERVER_IP}:${NGINX_PORT}/metrics"
    항목 설명

    ${NGINX_EXPORTER_SERVER_IP}

    Nginx Exporter 서버의 IP 주소입니다.

    ${NGINX_EXPORTER_PORT}

    Nginx Exporter 서버의 포트 번호입니다.

Nginx Exporter와 Nginx가 정상적으로 연동 및 실행된 경우 ${NGINX_EXPORTER_SERVER_IP}:${NGINX_EXPORTER_PORT}/metrics로 요청을 보냈을 때 수집된 메트릭 정보를 확인할 수 있습니다.

WAS 연동

모니터링 대상인 Nginx와 WAS를 연결하여 하나의 트레이스로 볼 수 있습니다.

  1. Nginx가 설치된 경로에서 nginx.conf 파일의 location 항목에 코드를 추가합니다.

    location / {
        root   html;
        index  index.html index.htm;
        # 아래 코드 추가
        proxy_pass http://${WAS-IP}:${WAS-PORT};
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    항목 설명

    ${WAS-IP}

    연결할 WAS의 IP 주소입니다.

    ${WAS-PORT}

    연결할 WAS의 포트 번호입니다.

  2. Nginx를 재기동합니다.

Apache

설치

Apache는 다음의 공식 문서를 참고하여 설치합니다.

https://httpd.apache.org/

HyperFrame 21은 Apache 2.4 버전 이상만 지원합니다.

데이터 수집을 위한 추가 작업

Apache 설치 후 Apache의 데이터를 수집하기 위해 추가 작업이 필요합니다.

Apache 설치 방법에 따라 파일 이름과 위치가 달라질 수 있습니다.

본 내용은 데비안 계열 운영체제를 기준으로 설명합니다.

OpenTelemetry Module 설치

OpenTelemetry을 설치합니다.

  1. OpenTelemetry 공식 문서에서는 OpenTelemetry WebServer SDK를 /opt 경로에 설치하고 실행할 것을 권장합니다.

  2. 사용 중인 Apache 버전을 지원하는 OpenTelemetry를 설치합니다.

    https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases

OpenTelemetry 설치 파일을 다운로드하고, /opt 디렉터리에 설치 파일의 압축을 해제합니다.

$ cd /opt
$ wget https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/ download/webserver%2Fv$(version)/opentelemetry-webserver-sdk-x64-linux.tgz.zip
$ unzip opentelemetry-webserver-sdk-x64-linux.tgz.zip
$ tar -xvzf opentelemetry-webserver-sdk-x64-linux.tgz
$ cd opentelemetry-webserver-sdk
$ ./install.sh
항목 설명

$(version)

설치할 OpenTelemetry의 버전 (예: 1.0.2)

OpenTelemetry 설치 파일 압축 해제 후 생성되는 디렉터리 구조는 다음과 같습니다.

/agent-home/opentelemetry-webserver-sdk
|-- VERSION.txt
|-- WebServerModule
|   |-- Apache
|   |   |-- libmod_apache_otel.so
|   |   |-- libmod_apache_otel22.so
|   |   |-- libopentelemetry_webserver_sdk.so
|   |-- Nginx
|   |   |-- 1.22.0
|   |   |   |-- ngx_http_opentelemetry_module.so
|   |   |-- 1.23.0
|   |   |   |-- ngx_http_opentelemetry_module.so
|   |   |-- 1.23.1
|   |   |   |-- ngx_http_opentelemetry_module.so
|-- conf
|   |-- appdynamics_sdk_log4cxx.xml
|   |-- appdynamics_sdk_log4cxx.xml.template
|-- install.sh
|-- logs
|-- sdk_lib
|   |-- lib
|   |   |-- libopentelemetry_common.so
|   |   |-- libopentelemetry_exporter_ostream_span.so
|   |   |-- libopentelemetry_exporter_otlp_grpc.so
|   |   |-- libopentelemetry_otlp_recordable.so
|   |   |-- libopentelemetry_resources.so
|   |   |-- libopentelemetry_trace.so
|   |   |-- libopentelemetry_webserver_sdk.so

LD_LIBRARY_PATH 설정

LD_LIBRARY_PATH를 설정합니다. 이때 아래 두 가지 방법 중 하나를 선택하여 설정이 가능합니다.

  • [방법 1]

    환경 변수를 설정합니다.

    $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/opentelemetry-webserver-sdk/sdk_lib/lib

    만약 'cannot open shared object file: No such file or directory' 에러가 발생 시 [방법 2]로 진행합니다.

  • [방법 2]

    conf 파일을 직접 추가합니다.

    1. /etc/ld.so.conf.d 디렉터리 하위에 opentelemetry-webserver-sdk.conf 파일을 생성합니다.

    2. /opt/opentelemetry-webserver-sdk/sdk_lib/lib를 복사한 후 붙여넣고 저장합니다.

    3. ldconfig 명령을 수행하여 설정을 적용합니다.

apache2.conf 파일 설정

${APACHE_HOME}/apache2.conf 파일에 아래의 내용을 추가합니다.

  • 'status_module' 모듈을 'modules/mod_status.so’에서 로드

  • 'opentelemetry_module.conf' 설정 파일을 포함

  • 'httpd-info.conf' 설정 파일을 포함

다음은 apache2.conf 파일의 설정 예시입니다.

... 생략

LoadModule status_module modules/mod_status.so
Include opentelemetry_module.conf
Include httpd-info.conf

Apache에 OpenTelemetry Module 추가

${APACHE_HOME}/opentelemetry_module.conf 파일을 생성합니다.

다음은 opentelemetry_module.conf 파일의 설정 예시입니다.

LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_common.so
LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_resources.so
LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_trace.so
LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_otlp_recordable.so
LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_exporter_ostream_span.so
LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_exporter_otlp_grpc.so

#Load the ApacheModule SDK
LoadFile /opt/opentelemetry-webserver-sdk/sdk_lib/lib/libopentelemetry_webserver_sdk.so
#Load the Apache Module. In this example for Apache 2.4
LoadModule otel_apache_module /opt/opentelemetry-webserver-sdk/WebServerModule/Apache/libmod_apache_otel.so

ApacheModuleEnabled ON

#ApacheModule Otel Exporter details
ApacheModuleOtelSpanExporter otlp
ApacheModuleOtelExporterEndpoint ${MASTER_IP}:4317;

# SSL Certificates
#ApacheModuleOtelSslEnabled ON
#ApacheModuleOtelSslCertificatePath

#ApacheModuleOtelSpanProcessor Batch
#ApacheModuleOtelSampler AlwaysOn
#ApacheModuleOtelMaxQueueSize 1024
#ApacheModuleOtelScheduledDelayMillis 3000
#ApacheModuleOtelExportTimeoutMillis 30000
#ApacheModuleOtelMaxExportBatchSize 1024

ApacheModuleServiceName apache
ApacheModuleServiceNamespace apache
ApacheModuleServiceInstanceId ${HOSTNAME};

ApacheModuleResolveBackends ON
ApacheModuleTraceAsError ON
#ApacheModuleWebserverContext DemoService DemoServiceNamespace DemoInstanceId

#ApacheModuleSegmentType custom
#ApacheModuleSegmentParameter 15,1,6,7
항목 설명

${MASTER_IP}

otel-collector가 설치된 서버의 IP 주소입니다.

${HOSTNAME}

모니터링할 인스턴스의 ID입니다.

httpd-info.conf 파일 설정

${APACHE_HOME}/httpd-info.conf 파일을 생성합니다.

다음은 httpd-info.conf 파일의 설정 예시입니다.

# Change the ".example.com" to match your domain to enable.

<Location /server-status>
    SetHandler server-status
#    Require host .example.com
#    Require ip 127
    Require all granted
</Location>

#
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
ExtendedStatus On

Apache Exporter 설치

Apache Exporter를 설치합니다.

  1. Apache Exporter 설치 파일을 사용 환경에 맞는 버전으로 다운로드한 후 압축을 해제합니다.

    $ wget https://github.com/Lusitaniae/apache_exporter/releases/download/v0.11.0/apache_exporter-0.11.0.linux-$(system).tar.gz
    $ tar xvfz apache_exporter-0.11.0.linux*.tar.gz
    항목 설명

    $(system)

    서버의 아키텍처입니다.

    • AMD64: amd64

    • ARM64: arm64

    • i386: 386

  2. Apache Exporter를 실행합니다.

    $ ./apache_exporter --scrape_uri="http://${APACHE_SERVER_IP}:${APACHE_PORT}/server-status/?auto"
    항목 설명

    ${APACHE_EXPORTER_SERVER_IP}

    Apache Exporter 서버의 IP 주소입니다.

    ${APACHE_EXPORTER_PORT}

    Apache Exporter 서버의 포트 번호입니다.

Apache Exporter가 정상적으로 실행된 경우 ${APACHE_EXPORTER_SERVER_IP}:${APACHE_EXPORTER_PORT}/metrics로 요청을 보냈을 때 수집된 메트릭 정보를 확인할 수 있습니다.

WAS 연동

모니터링 대상인 Apache와 WAS를 연결하여 하나의 트레이스로 볼 수 있습니다.

Apache 설치 방법에 따라 파일 이름과 위치가 달라질 수 있습니다.

본 내용은 데비안 계열 운영체제를 기준으로 설명합니다.

mod_jk.so 설치

Apache와 WAS의 연동을 위해 mod_jk.so 모듈을 설치합니다.

  1. gcc, gawk, libaprutil1-dev, perl 패키지를 설치합니다.

  2. Tomcat Connectors(mod_jk)를 다운로드하고 /opt 디렉터리에 압축 해제합니다.

    $ cd /opt
    $ wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.49-src.tar.gz
    $ tar -xvzf tomcat-connectors-1.2.49-src.tar.gz
  3. 압축 해제가 완료되면 native 디렉터리로 이동한 후 configure 명령어를 통해 apxs 경로를 포함한 make 파일을 생성합니다. 만약 apxs가 없을 경우 따로 설치합니다.

    $ cd /opt/tomcat-connectors-1.2.49-src/native
    $ ./configure --with-apxs=${APACHE_HOME}/bin/apxs
  4. make 명령 실행 후 make install 명령을 실행합니다.

    $ make && make install
  5. /usr/lib/apache2/modules에 mod_jk.so가 설치되었는지 확인합니다. 만약 해당 경로에 없으면 find 명령어로 검색한 후 설치되지 않았다면 아래 코드를 통해 설치합니다.

    $ apt-get install libapache2-mod-jk

연동 설정

Apache와 WAS를 연동하기 위한 설정을 적용합니다.

  1. ${APACHE_HOME}/mod_jk.conf 파일을 생성하고, 아래 코드를 추가합니다.

    JkWorkersFile conf/workers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel info
    JkLogStampFormat "[%y %m %d %H:%M:%S]"
    JkMount /* worker1
  2. ${APACHE_HOME}/workers.properties 파일을 생성하고, 아래 코드를 추가합니다.

    worker.list=worker1
    worker.worker1.port=8009
    worker.worker1.host={Tomcat의 호스트 IP}
    worker.worker1.type=ajp13
  3. ${APACHE_HOME}/apache2.conf 파일에 아래 코드를 추가합니다.

    LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
    Include httpd-jk.conf

    단, 코드의 순서에 따라 트레이스가 정상적으로 수집되지 않을 수도 있으니 아래와 같이 순서를 지키는 것을 권장합니다.

    LoadModule status_module modules/mod_status.so
    LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
    Include opentelemetry_module.conf
    Include httpd-info.conf
    Include httpd-jk.conf
  4. ${APACHE_HOME}/sites-enabled/000-default.conf 파일에 아래 코드를 추가합니다.

    <VirtualHost *:80>
        ....
        # 추가
        JkMount /* tomcat1
        ....
    </VirtualHost>
  5. Apache 서버를 재기동합니다.