카테고리 Archives: linux

Oracle Linux 8 (x86_64) 서버에서 dnf(yum)을 이용한 nginx 설치 및 http3 구현

아래 글은 오래 되어 도커 이미지 등이 삭제 되었으니 공부 차원이 아니라 이용을 하려면 아래 확인 하세요 ‘ㅅ’a

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


OCI 에서 제공 되는 “항상 무료 적격” 서비스에 ARM64 서버로 Apache, Php, MariaDB 를 운영 하고자 하였으나

aarch64 커널에서는 snapd 설치가 가능하지만 lets encrypt 사용이 불가능 하여 불가피 하게 x86_64 서버를 앞에 하나 두어

reverse proxy 할 계획을 세우다 보니 HTTP/3 를 적용하는 부분도 포함해 진행 한다.

알고 가야 하는 부분은 http3 를 구현 하는 nginx-quic 의 경우 아직 테스트 레벨이라는 점이다.


tier 1 = x86_64 – oracle linux 8 – nginx

tier 2 = arm64 – oracle linux 8 – memcache, docker – amazon linux – httpd, php-fpm

tier 3 = arm64 – oracle linux 8 – mariadb


아래 두 글에 이어서 익숙하겠지만 그것을 한다.

 

편리한 dnf(yum) 설치를 위해 codeit.guru 레포지토리를 추가 한뒤에 nginx:codeit-quic 설치를 한다.

 

snapd 를 활용하여 Let’s encrypt 를 설치 한다.


웹서버의 보안 향상을 위해 Diffie-Hellman param 파일을 생성한다.

 

서버 내부의 파이어월에 사용할 서비스 및 포트를 등록 하고 확인 한다.

 

nginx.pid 생성, /var/www/html  엑세스(Let’s encrypt 인증서 http 인증) 및 리버스 프록시 구현을 위한 selinux 를 설정 한다.

 

OCI 클라우드 내에서의 보안 목록(Security List) 에서 아래와 같이 UDP :443 을 허용해 준다.

2022-05-12_121444


/etc/nginx/nginx.conf 파일을 수정 한다.

 

Let’s encrypt 인증서 발급을 위한 http 가상호스트를 수정 한다. vi /etc/nginx/conf.d/default.conf

conf 파일을 설정한 뒤 nginx 를 활성화 및 시작 한다.

 

Let’s encrypt 인증서를 발급 한다. (성공시 Successfully received certificate 메세지 가 확인 된다.)

 

https 가상호스트 설정 파일을 추가 생성 한다. vi /etc/nginx/conf.d/default-ssl.conf

default.conf 파일과 default-ssl.conf 파일은 하나로 병합해서 사용 해도 관계는 없다.

 

가상 호스트를 생성 한 뒤 nginx 를 reload 한다.


위까지 진행 한 경우 http3 를 지원 하는 웹서버의 설정이 모두 끝난다.

다만 구성상 외부서비스 제공은 https 내부에서의 통신은 http 프로토콜을 사용하기 때문에 기본 상태의 wordpress 의 에러메세지를 볼 수 있다.

was 서버에서 운영되는 워드프레스의 wp-config.php 파일에 /* That's all, stop editing! Happy blogging. */ 위 부분에 아래 소스를 삽입 해야 한다.


브라우져 접속 및 체크 사이트(https://http3check.net/) 접속을 통해 HTTP/3 이 활성화 되었는지 확인 한다.
2022-05-11_1117222022-05-12_121827

 

Oracle Linux 8 (arm64) 서버에 httpd, php 설치

아래 글은 오래 되어 도커 이미지 등이 삭제 되었으니 공부 차원이 아니라 이용을 하려면 아래 확인 하세요 ‘ㅅ’a

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

 


오라클 클라우드의 무료 서버중 x86 서버인 VM.Standard.E2.1.Micro 의 경우 1/8 OCPU 및 1GB 메모리를 제공 한다.

2022-05-04_150958

1/8 OCPU 이는 cpu중 12% 점유율 사용량을 허용 한다는 말이다.

서버 내부에서는 2 논리 core 으로 확인 되기 때문에 각각의 cpu당 25% 의 점유율을 사용할 수 있다고 본다.

초과해서 사용할경우 과금 이 되거나 사용이 제한될 수 있는 요소이다.

 

메모리의 경우에는 dmesg 명령어로 아래와 같이 확인이 되었다.

즉 전체 용량 1018MB 에서 커널 보호를 위해 280MB 를 제외한 678MB를 쓸수 있다.

linux 커널에서 일반적으로 약 500MB정도를 사용한다고 보면 가용 메모리가 278MB 정도 밖에 되지 않는다.

쓰다보면 메모리가 swap 처리 되어서 WEB/WAS 사용가능한 메모리는 약 270~500MB 사이 정도가 될 것이다.

현재 블로그와 같이 구글 애드센스가 도입된 wordpress 사이트는 약 1.2초 대의 로딩 속도가 나오는 정도의 성능으로 확인되었다.

 

다만 방문객이 일정량 이상 늘어날 경우 급격히 느려지고, php-fpm이 메모리 과점으로 php-fpm 장애가 발생하는등의 문제가 발생 하였다.

그래서 ARM cpu 를 사용하는 VM.Standard.A1.Flex 를 이용해 was 서버를 운영하는 방법으로 구성을 해보았다.

아래는 OCI의 oracle linux 를 설치 했을때 기본적으로 진행해야 하는 명령어 모음 이다.

 

aarch64(ARM64) CPU를 사용 하는 경우 다음과 같은 문제가 있다.

  1. ARM64용 서드 파티 레포지토리는 거의 없는 편이다. (최신 php 버전을 제공 하는 remi 레포 또는 webtatic 등등)
  2. OS공식 레포지토리에서 제공 되는 httpd 버전은 2.4.37 버전 php 버전은 7.4.19 버전 이다.
  3. Let’s encrypt 에서 제공 되는 snapd(certbot) 이 동작을 하지 않는다. (x86_64 에서는 동작한다.)

 

위와 같은 사유로 3 티어 방식으로 운영이 되도록 구성 한다.

WAS 서버에 docker 에 amazon linux 2 (aarch64)를 이용 해서 apache + php-fpm 구성을 할 경우 최신 버전의 php 를 사용할 수 있고,

.htaccess 를 apache 문법으로 사용이 가능 하다는 장점이 있고, was 의 빠른 처리를 위한 갯수를 늘리거나 php 버전 교체도 쉬울 예정이기 때문에 채택 하였다.

 

3tier_20220511

tier 1 = x86_64 – oracle linux 8 – nginx (Let’s encrypt SSL 구성 및 리버스프록시 설정)

tier 2 = arm64 – oracle linux 8 – memcache (session 적재 용도), docker – amazon linux – httpd, phpfpm(amazon linux 가 arm64 에서 최신 php 버전을 지원한다.)

tier 3 = arm64 – oracle linux 8 – mariadb

 


 

티어2 의 구성을 위해 ARM 인스턴스에 docker 레포지토리를 추가 하고, docker 와 memcache 를 설치 하고 활성화 한다.

 

위에서 언급 했지만 ARM64 cpu는 지원 하는 서드 파티 레포지토리가 없다.

AWS 에서 사용하는 Amazon Linux 2 의경우 내장된 명령어(repo) amazon-linux-extras 를 이용하여 최신 버전의 php 7.4 및 8.0 을 사용할 수 있다.

Amazon Linux 2 는 RHEL 또는 Fedora 와 같은 계열 이라고 볼 수 있다.

 

ARM64 서버에서 http 및 php를 구동하는 도커 이미지는 기존과 같은 방법으로 생성 하였다.

 

docker 내부에서 apache 및 php-fpm 은 apache:apache 권한으로 작동을 하게 되어 있다.

아래와 같이 docker 호스트 서버에 apache 그룹 및 apache 유져를 생성 해두면 권한 문제가 맞추어 지기 때문에 퍼미션 지정이 필요 없어 진다.

 

도커 프록시로 처리되어 http 포트를 firewall-cmd 명령어로 방화벽에 열 필요는 없지만 컨테이너 안에서 ARM 호스트 서버쪽으로 session 적재를 위해 접근 하기 때문에 방화벽을 허용 처리 한다.

 

도커 명령어를 이용해 컨테이너를 생성 한다.

 

포트 매칭(:80) 및 볼륨 매칭(/var/www/html)을 해서 컨테이너는 생성 했기 때문에

docker 내부가 아닌 Oracle Linux 상의 /var/www/html 폴더로 이동 하여 아래의 내용과 같이 index.php 를 만들고 http(:80) 포트로 접속하여 확인 한다.

2022-05-04_144251

 

다음은 x86_64 인스턴스에 nginx 으로 Lets’encrypt 으로 보안서버 SSL 을 구현 하고

reverse proxy 를 해서 현재 was 서버 쪽으로 접속 시키는 부분이 남았다. (Tier 1)

하지만 was 서버도 apache를 가지고 있기 때문에 사이트를 단순히 구동 시키는건 가능 하다 ‘ㅅ’a

 

docker 를 만들때 httpd 가 생성 하는 로그는 stdout/stderr 으로 연결 해두었다.

이는 json 형태로 저장 되며 /var/lib/docker/containers/컨테이너풀아이디/컨테이너풀아이디-json.log 경로에 json 형태로 존재 한다.

명령어로 확인 하는 방법은 아래 방법으로 확인할 수 있다. [apache(httpd), php-fpm]


아래는 위에서 pull 받은 도커이미지를 구축할때 사용된 Dockerfile  이다.

 

Oracle Linux 8 (arm64) 서버에 mariadb 10.7 설치

Oracle Cloud Infrastructure (https://www.oracle.com/kr/cloud/free/)

에서 무료로 제공 되고 있는 서버중 Ampere 를 이용한 인스턴스(VM.Standard.A1.Flex)를 확보 하게 되었다 ‘ㅅ’a (평생 무료)

2코어 12GB 램을 가지고 있어서 활용 방법을 구상 하다가 개인의 DB 서버를 구축을 해서 운용 하면 좋을것으로 판단되어서 mariadb 10.7을 설치 하고

현재 웹사이트인 www.enteroa.com 의 데이터베이스 서버로 활용을 하기로 하였다.

 

서버 확보가 쉽지 않았지만… (무료 인스턴스 제공 갯수 제한이 있어 Out of host capacity 오류로 생성이 잘 되지 않는다.)

 

먼저 서버의 시간을 지정 하고 OS 업데이트를 진행 한뒤 재부팅 및 기본 적인 설정을 한다.

 

이후 mariadb.org 에서 현재 상황에 맞게 설치를 진행 한다. (https://mariadb.org/download/?t=repo-config&d=Red+Hat+EL+8+%28ARM64%29&v=10.7&r_m=yongbok)

2022-04-27_101422

오라클 리눅스는 기본적으로 RHEL 8 의 복제판 이기 때문에 RHEL 8(ARM64)을 선택하고 RC 가 아닌 최신 10.7 버전을 선택 하였다.

 

이후 안내 되는 내용에 따라 /etc/yum.repos.d/MariaDB.repo 파일을 생성 하여 아래와 같이 입력 한다.

 

dnf 명령어를 이용하여 설치를 하고 서비스 활성화 및 데몬을 실행 시킨다.

 

AWS 의 경우 방화벽이 서버 밖에 테이블 형태로 제어 되지만 오라클 클라우드 의 경우 서버내의 firewalld 으로 제어 되기 때문에 방화벽에서 mysql 서비스를 외부 접근을 허용 한다.

 

데이터베이스 서버에 불필요한 일부 데몬(atd, gssproxy, rpcbind)을 정지 한다. (메모리 절감)

 

기본 인코딩을 설정하고 및 로깅을 위해 /etc/my.cnf.d/mysql-clients.cnf 파일을 수정 한다. (mariadb 10.7 은 기본 캐릭터셋이 utf8mb3 이다.)

지정한 error 및 slow 로그 생성을 위해서 로그 저장 위치에 폴더를 생성해 준다.

수정한 설정 파일을 적용 하기 위해 mariadb 를 재시작 한다.

 

mysql 로그인을 한뒤  변경된 내용을 확인 한다.

 

불피요한 데이터 베이스인 test 를 삭제 하고 필요한 database 및 로그인 권한을 생성 한다.

 

이제 이용하면 된다 ‘ ㅅ’a

git 명령어 사용법

git 은 가능하면 일반 유져 권한으로 하자 ‘ㅅ’a (apache  에서 엑세스가 잘 되려면.)

 

기본적으로 git 은 암호 를 저장하는 store 방식으로 설정을 할 경우 ~/.git-credentials 파일에

https://[아이디]:[패스워드]@깃호스트주소 형태로 평문 저장을 한다. 때문에 보안상 좋지 않다.

 

다만 별도의 config 없이 git 명령어 를 사용할 때 마다 아이디, 패스워드를 입력을 요구 하기 때문에

아래와 같은 명령어로 cache 를 1시간 설정 값을 지정해서 일정 시간 인증을 유지하는 편이 정신건강에 좋다.

git을 이용해서 remote 서버인 origin에 쓰기가 필요한 경우 사용자 정보를 입력 해준다 ‘ㅅ’a

 


더 많은 사용 방법이 있겠지만 대부분 툴을 쓰는 부분이기도 하고 이정도만 알면 shell 에서 사용하는데 무리가 없을듯 하다 ‘ㅅ’a

 


다른 방법으로는 ssh-key 를 만들어서 ssh 방식으로 사용하는 방법이 있다.

1. rsa key 생성

cat 을 통해 확인된 공개 키를 git 서비스를 제공 하는 사이트에 ssh key 등록을 한다.

  • AWS CodeCommit 의경우 IAM – 사용자 – 보안 자격 증명 에 codecommit 용 ssh-key 등록 메뉴가 존재 한다.

2022-04-22_133032

2. config 파일 생성 (키등록후 나온 ssh 키 ID 가 User 값으로 사용 된다.)

 

3. git 을 사용한다 ‘ㅅ’b (ssh 키로 등록해서 사용할 경우 git 주소의 시작이 https 에서 ssh 으로 변경되어야 한다.)

 

AWS 서버 발생 로그의 분리 보관 (amazon-cloudwatch-agent)

서버내 dbus -> rsyslogd 에 의해 수집된 시스템 로그는 /var/log 아래에 파일 형태로 저장 된다.

이는 /etc/logrotate.conf 설정에 따라 서버내에 보관이 된다.

 

다만 보관된 파일의 파일 형태로 저장되어 있기 때문에 구조만 알고 있다면 파일을 삭제 하거나 변조 할 수 있으므로

추후 추적을 용의 하게 하기 위해, 데이터 무결성을 보장하기 위해, 혹은 다중의 서버의 데이터를 모아서 보관 하기위해 log 콜렉팅을 하는것이 일반적인 보안 방법 이다.

 

단순한 rsyslogd 를 이용한 udp 푸시 및 graylog collecting 은 기존에 설명을 했지만

AWS 상에서는 CloudWatch Log 라는 기능을 제공 한다 이를 통해 지표 형태로 보거나 알람 설정등을 할 수 있다.

 

서버에서는 CloudWatch log 쪽으로 데이터를 넣어주는 프로그램을 설치해서 운용 하며 이후

Log 파일의 안전한 분리 보관, 보관 주기 설정, 알람 설정 등을 웹 콘솔상에서 편하게 진행할 수 있다.

 

기존에 centos 7 에서는 yum 을 이용하여 awslogs 라는 프로그램을 설치하여 같은 기능을 사용하고 있었으나

Rockylinux 8 에서는 dnf 패키지가 없는 관계로 RPM 설치를 필요로 한다.


AWS 웹콘솔 에서 IAM 메뉴의 Role (역할) 을 생성 하고 권한을 부여 한다. (중간에 권한은 지정하지 않고 생성 하고 추후 인라인 정책으로 생성 한다.)

2022-04-08_161452 2022-04-08_161613 2022-04-08_162326

 

인라인 정책을 생성 한다. (생성한 정책이 다른 계정 이나 역할에 공통으로 부여할 필요하 있으면 일반 정책 생성 후 연결 한다.)

2022-04-08_162608 2022-04-08_163101 2022-04-08_163232

위 json 정책은 ap-northeast-2 (서울) 리전에 로그 를 쌓는 기능만 허용 하는것으로 제한 하였다.

 

생성된 Role (역할) 을 필요한 EC2에 연결 한다.

2022-04-08_164417 2022-04-08_164648

 

위에서 이야기 했지만 yum(dnf) 설치가 RockyLinux 8 에서 되지 않는다. 때문에 AWS 에서 배포 하는 rpm 파일을 가지고 설치를 진행 한다. (amazon-cloudwatch-agent  설치 메뉴얼)

 

편리하게 사용하라고 대화식 명령어를 실행 하도록 되어 있다.
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

하지만 문답 형식의 영어를 읽기도 귀찮고(어렵고) Role (정책)을 부여하여 키없이 로그를 쌓게 하고자 했으나

스크립트에서는 필수적으로 Access Key/Secret Key 를 입력 해야 하는 부분이 있기 때문에 스크립트로 진행이 어렵다.

때문에 /opt/aws/amazon-cloudwatch-agent/bin/config.json 파일을 직접 수정 해 준다. (amazon-cloudwatch-agent 설정 메뉴얼)

위 예제는 apache, php, nginx 등을 dnf(yum) 설치를 한경우 일반 적인 log 포멧의 timestamp를 인식 하도록 정리한 것이다. (secure, message 로그 및 apache, nginx, php-fpm 로그)

필요에 따라 수정을 해서 사용 하도록 한다.

 

이후 다음 명령어로 설정된 config.json 을 점검 하고 문제가 없다면 자동으로 서비스가 시작된다.

 

웹 콘솔 에서 Cloudwatch > 로그 그룹에서 보관 기간 을 설정 하고 로그 데이터가 잘 적재 되고 있는지 확인 한다.

2022-04-08_1810182022-04-08_1649512022-04-08_181557