카테고리 Archives: Server engineering

powershell 을 이용한 프로그램 삭제

Hyper-v Server 2019 또는 2016을 사용 하게 되면 GUI 환경이 제공되지 않아서 프로그램 설치 및 삭제에 에로사항이 있다.

이때 아래와 같이 작업관리자로 cmd 혹은 powershell 을 실행해서 사용할 수 있다.

 

먼저 cmd 창을 열어야 하는데 RDP 원격 접속중에 Ctrl + Alt + END 를 누르면 일반 Windows PC 에서 Ctrl + Alt + Del 키를 누른것과 비슷한 선택 창이 열린다.

2025-02-21_095021

작업 관리자를 열어서 “파일” > “새 작업 실행(N)” 창에서 powershell 을 실행 한다.

2025-02-21_095055 2025-02-21_095155 2025-02-21_095322

 

설치된 프로그램 리스트를 확인 한다.

나오는 리스트에서 삭제할 프로그램 명을 입력해 선택적으로 출력되는지 확인 한다. [Zabbix Agent (64-bit)]

 

삭제 하고 잠시 기다린 뒤에 리스트를 다시 출력해서 확인해 본다.

 

삭제가 되었다면 새 프로그램 [Zabbix Agent 2 (64-bit)] 다운 받아 설치를 진행 한다.

 

zabbix-agent2 추가 템플릿 적용

감시대상에 zabbix-agent2 를 설치 했다면 아래와 같이 추가 플러그인을 통해서 좀더 상세한 감사를 할 수 있다.
Centos는 6 이상 부터 zabbix-agent2 를 사용할 수 있고, Ubuntu는 18.04 이상 부터 zabbix-agent2 를 사용할 수 있다.

 


 

1. docker

docker.sock 파일 권한을 주어야(usermod) 하기 때문에 zabbix 계정의 서브 그룹으로 docker 를 추가 해야 작동 한다.

2025-02-17_161342

 


 

2. smartctl 을 이용한 디스크 장애 사전 탐지

  • 리눅스

물리적인 HDD 가연결된 서버의 경우 smartctl 을 설치 해서 디스크의 장애를 사전에 탐지할 수 있다.(가상 서버는 불필요 하겠지 ‘ㅅ’a)
smartctl v7.1 이상을 요구 하기 때문에 Ubuntu 18.04 이상 // Rockylinux/Almalinux 8 이상에서 사용이 가능 하며 아래의 명령어로 설치 할 수 있다.

zabbix 계정에 smartctl 명령어 위치를 확인하고 password 없이 smartctl 사용 권한을 부여 한다.

smartctl 명령어 및 zabbix_agent2 명령어를 실행해서 테스트를 하고 정상적 이라면 zabbix-agent2 서비스를 재시작 한다.

 

  • 윈도우

https://sourceforge.net/projects/smartmontools/files/ 에서 smartmontools-7.4-1.win32-setup.exe 설치 파일을 받아 설치 한다.

워드패드를 관리자 권한으로 실행 한뒤에 C:\Program Files\Zabbix Agent 2\zabbix_agent2.d\plugins.d\smart.conf 파일을 불러와서 Plugins.Smart.Path을 다음과 같이 수정 한다.

설치 파일(exe)을 설치 할때 %PATH%를 유져로 잡아주기 때문에 그냥 cmd 나 smartctl 에서의 명령어 사용은 문제가 없지만 zabbix agent 2 서비스에서 호출을 해야 하기 때문에 다음 그림과 같이 시스템 변수로 %PATH% 를 잡아준다.

2025-02-27_173546   2025-02-27_1736062025-02-27_1736492025-02-27_173755

powershell 을 관리자 모드로 실행 해서 테스트를 하고 정상적 이라면 zabbix-agent2 서비스를 재시작 한다.

 

  • zabbix-server 콘테이너 안에서 zabbix_get 으로 클라이언트에 호출을 할 수 있다. (포트 10051)

호출을 했을때 마지막에
exit status 2 는 zabbix-agent2 가 smartctl 을 실행 할 수 없는 경우이다. 리눅스의 경우 sudo 권한 윈도우의 경우 path 가 문제일 가능성이 높다.
exit status 4 코드가 발생할 경우 디스크의 S.M.A.R.T 가 꺼져 있어서 확인할 수 없는 경우 이다. (레이드카드<->smartctl  호환성 문제)

 

  • 웹 UI 에서 세팅

zabbix 관리자 화면에서 생성된 호스트 템플릿에 SMART by zabbix agent 2를 추가 한다.

2025-02-18_132009

 

2025-02-28_091214

위 표를 보면 알겠지만 Linux에서는 대부분 지원 하지만 Windows 일 경우 지원하는 하드웨어가 좀 한정적이다.

 

  • 문제점1

smartmontools 버전이 7.0 이하 일때는….

지원되지 않는 OS 일경우 smartctl 명령어를 최신버전을 컴파일 해서 설치 한다. (gcc-c++, make 가 설치되어 있어야 한다.)
(Rockylinux 8.5 에서는 smartctl 버전이 7.1 이지만 정상 동작 하지 않았고 7.4를 깔면 동작이 가능했다.)

메뉴얼: https://www.smartmontools.org/wiki/Download#Installfromthesourcetarball
다운로드: https://sourceforge.net/projects/smartmontools/files/

make install 을 하면 centos 7 기준 으로 /usr/local/sbin/smartctl 위치에 설치 된다.

sudo 권한 부여 및 /etc/zabbix/zabbix_agent2.d/plugins.d/smart.conf 파일을 수정한다.

 

  • 문제점2

레이드 카드가 달린 HP 서버 linux 에서는 cciss 으로 명령어를 수집을 하긴 하는데 문제가 발생 하였다.
명령어 호출을 어찌하는지 아래 명령어로 확인 하는데만 26초가 소요가 되었다.

서버에 존재하지도 않는 3ware, areca 등을 호출하면서 에러메세지 리턴을 json 으로 파싱하면서 많은 시간을 쓴다는걸 확인 하였고 다음과 같이 해결 하였다.
먼저 위 명령어를 참조 해서 정상적인 동작을 하는 명령어를 찾는다. (SMART 가 Enabled 으로 나오는 명령어를 찾는다)

zabbix agent 가 실행하는 명령어를 보면 nvme0, nvme1 호출은 정상적이다.
하지만 sdb 는 cciss,1 이 아닌 cciss,0 으로만 호출했기 때문에 정상 호출이 안되어서 인식하지 못한다.
그래서 그에 대응할 수 있도록 sd[x] -d scsi에 반응 하도록 하고 스 이외 명령어 실행은 빠르게 종료 되도록 exit 2로 반환 하도록 스크립트를 만들어 적용 한다.

sudo 권한에 생성한 스크립트의 실행 권한을 추가 한다.

/etc/zabbix/zabbix_agent2.d/plugins.d/smart.conf 에서 만든 스크립트을 실행하도록 한다.

zabbix agent 2 를 재시작 한다.

 

  • 문제점3

Dell 서버에서는 또 다른 문제가 확인이 되었다.
디스크가 12개 정도 주렁주렁 달린 서버의 경우 위와 같은 방법으로 스크립트만 별도 작성해서 적용 하였을때에도 반환 속도가 4 ~ 7초 정도로 확인이 되었다.

smartctl 호출했을때 시간이 3초를 넘어가는 경우 Timeout occurred while gathering data 라는 메세지를 log 에서 확인이 가능하다.
/etc/zabbix/zabbix_agent2.conf/etc/zabbix/zabbix_agent2.d/plugins.d/smart.confTimeout=, PluginTimeout=, Plugins.Smart.Timeout= 옵션이 있으나
설정해도 3초가 넘어가면 시간 초과로 데이터 수집이 되지 않는다. (유명무실한 옵션….)

 


 

3. mysql

감시 대상 DB에 zbx_monitor 용 어카운트를 생성해야 한다.

이후 웹 UI – 호스트 설정 에서 다음과 같이 템플릿 Mysql by Zabbix agent 2을 추가 한다.

2025-02-17_173105

메크로 메뉴로 이동해서 다음과 같이 {$MYSQL.DSN}, {$MYSQL.USER}, {$MYSQL.PASSWORD}을  입력 한다. (관리 > 매크로 로는 설정이 되지 않는 부분이다.)
DSN 에는 tcp://localhost:3306을 입력하고, 패스워드는 텍스트 => 비밀 문자 형식으로 하여 보이지 않도록 한다.

2025-03-07_113701

Docker 으로 생성된 DB 일경우 아래와 같이 {$MYSQL.DSN} 부분을 tcp://[ContainerIP]:3306으로 지정 해야 한다.

2025-03-07_113758

 


 

4. postgres

마찬가지로 감시 대상 DB에 zbx_monitor 용 어카운트를 생성해야 한다.

pg_hba.conf 파일에 하단에 아래 내용을 추가 한다. (경로: /etc/postgresql/[버전]/main/pg_hba.conf)

설정한 이후 postgra 서비스를 재시작 해야 한다.

 

이후 웹UI 에서의 설정은 다음과 같이 PostgreSQL by Zabbix agent 2를 템플릿에 선언하고 매크로에 {$PG.PASSWORD}를 설정하면 된다.
2025-03-07_165623
2025-03-07_165752

Docker를 이용한 Zabbix 7.2 설치 및 구성

2025-02-17_135350

서버 감시를 위한 오픈소스 툴인 Zabbix 7.2 을 Docker 를 이용해  구성 한다.

공식 메뉴얼 : https://www.zabbix.com/documentation/current/en/manual/installation/containers

 

메뉴얼이 영어긴 하지만 설명이 잘 되어 있는 편이다.

Docker 가 설치된 서버를 준비 하고 메뉴얼을 따라 진행 하되, 몇가지 주의 할 점이 있어서 작업 메뉴얼을 작성 한다.

 


1. zabbix 서버 구축

먼저 도커에 zabbix-net 이라는 네트워크를 생성 한다.

 

mysql 컨테이너를 실행한다.

추가된 옵션:
-v /docker/mysql/conf:/etc/mysql/conf.d : mysql 설정을 변경해야 하는 경우를 위해서 호스트와 연결한다.
-v /docker/mysql/mysql_data:/var/lib/mysql : mysql 버전 업그레이드를 위해 데이터 폴더를 호스트와 연결한다.

 

zabbix 게이트웨이 컨테이너를 실행한다.

JMX 를 이용한 java 프로세스 감시용도로 쓴다.

 

zabbix 서버 컨테이너를 실행 한다.

추가된 옵션:
-e ZBX_CACHESIZE=256M,-e ZBX_VALUECACHESIZE=256M : 감시할 대상이 많아서 증설하였다.

 

zabbix 웹 UI 컨테이너를 실행한다. (nginx, php)

PHP_FPM_PM_MAX_REQUESTS 을 사용해 php-fpm 프로세스가 종료 될 수 있도록 하였다.

 

zabbix-agent2 는 docker 방식도 존재 하지만  호스트OS에 직접 설치해 Docker 를 실행하는 호스트 역시 감시 대상에 넣도록 한다. (호스트OS: CentOS 7)

 


 

2. 기본 설정

설치된 서버의 IP로 접속을 해서 로그인 한다.

URL: (예제) http://192.168.0.240/
ID: admin
PW: zabbix

 

언어 설정은 관리 메뉴에서 변경할 수 있다. (각 유져별로 프로파일에서 설정 할 수도 있다.)
2025-02-17_130816

 

기본적으로 zabbix server 설정이 한개가 되어 있다.
템플릿에 Linux by Zabbix agent, Docker by Zabbix agent 2 를 추가 하고 호스트 OS의 hostnameIP 를 각 칸에 맞게 입력 한다.

2025-02-18_161129

 


 

연결할 서버들은 zabbix-agent2 또는 zabbix-agent 를 설치해서 연결 하거나 SNMP(네트워크 스위치, UPS, NAS) 으로 연결 한다.

zabbix 7.2 의 경우 연결해보니 CentOS 7(agent2) 이상 Ubuntu 16.04 부터 연결이 가능했다. (16.04 의 경우 agent2 가 아닌 agent 로 설치해야 한다.)

CentOS6 또는 Ubuntu 14.04 이하 버전의 경우 낮은 버전의 agent 를 설치해 연결해도 동작은 한다.

다만 몇가지 트리거가 동작하지 않았다. (크리티컬 하지 않다.)

 


 

3. 감시 대상 추가

zabbix-agent2 또는 zabbix-agent 를 이용한 연결 (Linux or Windows)

https://www.zabbix.com/download_agents

2025-02-17_111744
위와 같이 버전 > OS > OS Version > 패키지를 선택하고 화면 아래로 스크롤해보면 설치 메뉴얼을 제공한다.
윈도우는 원형으로 표시된 부분을 눌러 다운받아(.msi) 설치 한다

리눅스는 설치 후 설정 파일/etc/zabbix/zabbix_agent2.conf을 자신에게 맞게 수정해야 한다.

설정 후에는 agent 를 재시작 한다.
주의할점으로 conf에 선언된 “Hostname” 과 zabbix 관리자 내에 설정된 각 “호스트명” 은 꼭 일치해야 하며 유일한(uniq) 값을 사용해야 한다.

윈도우는 아래와 같이 설치 화면에서 zabbix server 의 아이피를 입력 한다.
2025-02-17_112350
윈도우역시 여기서 입력되는 “host name” 과 관리자내의 “호스트명”이 일치해야 한다.
실제 부여된 컴퓨터이름과 관계 없이 바꾸어서 일치시켜 사용할 수도 있다.

2025-02-18_135126
감시 대상 추가의 연결 개념은 위 그림과 같다.

host-setting: 감시할 대상의 IP 또는 호스트명으로 연결 시도
agent.conf: 선언된 IP에서의 접근을 허용 & 템플릿 정보 획득 -> 데이터 생성
zabbix-server: 감시대상의 정보 수집

 

snmp를 이용한 연결

일반적으로 네트워크 스위치와 같은 경우 별도의 Agent 설치가 지원 될리가 없다. 그래서 SNMP(Simple Network Management Protocol) 을 이용해서 감시 한다.
2025-02-17_104837
SNMP 일반적으로 161포트를 이용해서 polling / trpping 방식으로 작동 한다.

SNMP 연결을 위한 커뮤니티는 관리 > 매크로 에서 지정 한다.
값 오른쪽 [T] 버튼을 눌러서 암호 형식으로 저장 하면 가려지기도 한다.2025-02-14_154638
보안이름, 인증패스, 프라이버시 패스는 감시 대상 장치에 동일하게 설정이 되어야 하겠다.

아래는 SNMP v3를 이용한 Synology 연결시 사용하는 방법 이다.
synology > 제어판 > 터미널 및 SNMP 설정

2025-02-17_110200

Zabbix Server > 데이터 수집 > 호스트 > synology-NAS > 인터페이스
2025-02-17_095818

각 UTM 또는 네트워크 스위치 등은 제공 되는 메뉴얼을 참조해서 snmp를 활성화 해서 연결 할 수 있다.

아래는 추가적인 예제로.. UPS(Uninterruptible Power Supply system) 장치의 SNMP 설정 화면 이다.
2025-02-17_113330
EATON 이란 브랜드 이고 zabbix 서버에 템플릿이 없어서 별도로 템플릿(yaml) 파일을 임포트 하였다.
https://github.com/zabbix/community-templates/tree/main/Power_(UPS)

 


 

4. 알림 설정

왼만한 장애요소는 이미 트리거로 등록 되어 있다.  (cpu/mem/disk 사용량 초과, 네트워크 이상 등등)
smartmontools 버전이 7.1 이상일때 디스크 배터 섹터 등의 감시도 된다.
때문에 알림 설정을 해서 서버관리자가 알수 있도록만 하면 된다.

알림 설정은 미디어 타입 활성화(연락 수단), 관리자 계정의 연락처 갱신, 트리거 액션 활성화 를 해서 받아볼 수 있다.
2025-02-17_133633 2025-02-17_133103
텔레그램 수신처는 botfather 를 이용해 봇용 채팅방을 생성하고 [chatid] 를 확인해서 넣어주면 된다.
2025-02-17_133339

 

역인글:

zabbix-agent2 추가 템플릿 적용
Zabbix 서버의 데이터베이스 테이블 파티셔닝
zabbix 서비스 발견 (GoogleUpdater) 제외
powershell 을 이용한 프로그램 삭제

Hyper-v 서버에 연결(원격)

Hyper-V Server 2016 / 2019 free 의 경우 서버 생성 및 관리를 위해서 서버에 접속하여 사용이 되지 않고

자신의 PC 에 Hyper-V를 활성화 한뒤에 “서버에 연결…” 기능을 통해서 관리가 가능 하다. (Hyper-V – 나무위키 (namu.wiki))

즉 자신의 PC 에서 설정을 한뒤 아래와 같이 화면이 나오면 이를 통해서 관리 할 수 있다.

20240710_164937

다만 그냥 연결을 시도 해봐야 연결이 될리가 없고 꽤 번거로운 설정이 필요 하다.

기존 메뉴얼의 경우 찾아 보았으나 IP를 근거로 활용해서 접속하는 방법과 2개 이상 Hyper-V Server 를 접속하는 방법을 찾아서 포스팅을 한다 ‘ㅅ’a

 


 

일단 Hyper-V Server 에 원격으로 접속된 화면 에서 다음과 같이 “7) 원격 데스크톱”이 사용(보안 수준이 높은 클라이언트만) 으로 설정 되어 있어야 한다.
20240710_161201

 


 

자신의 PC 에 Hyper-V를 설치 하고 PowerShell 창을 열어서 다음과 같은 명령어를 실행 한다.

Hyper-v 의 두개 일 경우에 대한 설명이기 때문에 자신에 맞게 하나만 쓴다던가 하자 ‘ㅅ’a

cmdkey 의 경우 자격 증명 관리자에 아래 그림과 같이 windows 자격 증명을 생성하게 된다.

20240710_163851

 


 

로컬 컴퓨터 정책(gpedit.msc) 을 실행해서 컴퓨터 구성 >> 관리 템플릿 >> 시스템 >> 자격 증명 위임 >> 서버 인증이 NTLM 전용일 경우 새로운 자격 증명 허용 으로 이동하고 아래 그림과 같이 진행한다.

20240710_16214420240710_16225620240710_162618

마지막 그림과 같이 WSman/192.168.0.10WSman/192.168.0.20을 추가 해야 한다.

 


 

마지막으로 접속할 PC의 Hyper-V 에서 “서버에 연결…” 버튼으로 연결을 한다.

20240710_163450

 

연결이 된다면 첫번째 스크린샷과 같이 자신의 PC 의 Hyper-V 와 원격 Hyper-V Server 가 목록에 나타나고 관리를 할 수 있다. 🙂

 

OCI arm 인스턴스에서 docker로 web, was 사용

OCI 에서 제공되는 무료 서버를 이용하여 nginx(x86) – was(arm64) – DB(arm64) 으로 잘 사용하고 있었다. (물론 앞으로도 잘 사용할 예정…)

기존엔 snapd(certbot) 도 arm64에서 정상 동작지 않았고 http3를 구현한 nginx도 베타 였으나 현재는 mainline-quic 으로 되었기 때문에
native-arm64 환경으로 이행을 통해 메모리가 적어서 상대적으로 속도가 느렸던 x86서버를 버리기 위해서 아래와 같은 목표를 구현하는 것을 목표로 잡았다.

  • Docker – Was(http,php-fpm) 의 OS를 amazonlinux2 -> rockylinux9 으로 변경 및 php-8.3 사용
  • Docker – rockylinux9 – nginx-quic(http3) 구축
  • Docker x86_64(amd64), arm64(aarch64) 을 지원

2024-09-24_102141

 


 

 

  • Docker 설치

베이스 OS는 rockylinux 9 (aarch64)이며, 서버에 docker 를 설치하고 활성화 한다. (Install Docker Desktop on RHEL)

 

Was 컨테이너 안에서 웹서비스가 apache:apache 권한 으로 동작 되기 때문에 아래와 같이 베이스 os에 같은 유져를 생성 한다.
(바깥에서 단순 UID 48으로 지정해 운영 해도 된다.)

 


 

  • 배포된 Docker 이미지를 이용한 apache, php 사용

https://hub.docker.com/r/san0123/rocky9-http-php

웹서버 또는 개발자 PC (windows)에서 공통으로 사용할 수 있도록 생성한 Docker 이미지 이다.

 

도커는 pull 을 별도로 하지 않더라도 정확한 주소를 사용할 경우 자동으로 pull 하는 기능이 있으므로 바로 run 을 실행 한다.
nginx 가 80,443 을 사용할 예정이기 때문에 9000번 포트를 이용해 run 한다.

 

웹소스를 호스트os의 /free/home/project/html 에 넣으면 호출을 할수 있다.
파일을 복사해 넣거나 압축을 해제한 후에는 chown -R apache:apache /free/home/project/html 을 잊지 말자…

 

배포된 rocky8-httpd-php, rocky9-httpd-php 에서 CI4(code igniter 4) 사용법

 

일반적인 CMS테스트를 위할 경우 여기 까지만 진행 하고 웹서버를 서비스 하고자 할때 아래 부분까지 진행 한다.

 


 

  • 배포된 Docker 이미지를 이용한 Nginx 사용

https://hub.docker.com/r/san0123/rocky9-nginx

웹서버에서 http3 를 구현하기 위해서 apache 앞에 nginx를 사용하고 Let’s encrypt(certbot) 을 사용하기 위한 Docker 이미지 이다.

 

Nginx 도커를 이용한 http2를 위해 80/tcp, 443/tcp 그리고 http3를 위해 443/udp 을 파이어월에서 허용 한다.

 

웹용 도커는 베이스OS에서 virtualhost 설정 파일 을 저장해서 버전 업데이트시 설정 파일을 새로 설정 하지 않기 위해 mount 하기 때문에 먼저 생성을 한뒤 docker run 을 해야 한다.

 

Nginx용 도커를 실행 한다. 컨테이너를 재 생성 할때마다 인증서나 가상호스트 파일을 수정하지 않도록 두개의 마운트 포인트를 추가해서 실행한다.

 

도메인을 서버에 연결 한 뒤에 Let‘s encrypt 를 생성하는 명령어는 다음과 같다. (email, domain 은 자신에 맞게 수정해서 사용한다.)

 

베이스OS 에서 /var/www/conf/virtual.conf 를 자신의 url에 맞게 수정하고 발급된 인증서가 동작할 수 있도록 수정을 한다.

 

nginx를 재시작 하기 위해서 컨테이너를 재시작 한다.

 

http3가 잘 활성화 되어있는지 확인 한다. ( https://http3check.net/)

2024-04-27 17 14 57

 

인증서가 약 2-3개월 마다 갱신해야 하기 때문에 cronatb에 아래와 같이 등록해서 주기적인(주1회) 인증서 업데이트 및 적용을 위한 재시작을 한다. (매주 월요일 오전 8시)

 


 

데이터베이스 사용법 까지 필요 하면 아래 포스트를 확인 하자 ‘ㅅ’a

Docker 를 이용한 데이터베이스 사용법