[컴] logrotate 사용

log roatation / log rotate / 로그 / nginx 에서 log rotate / mongodb 에서 logrotate

logrotate 사용

  • 사용한 os: rockylinux 8 (CentOS 8)

logrotate 를 설치

설치를 하면 /etc/cron.daily/ 가 생성되고, 이 안에 logstate 가 들어가게 된다. 즉 매일 실행되게 된다.

dnf install logrotate -y

/etc/logrotate.d/<app>

nginx 에 대한 logrostate

아래처럼 /etc/logrotate.d/nginx 를 만들면 nginx 라는 app 에 대한 logrotate 설정을 할 수 있다.

vi /etc/logrotate.d/nginx

아래 option 에 대한 설명은 ref. 1, ref. 2 를 보면 된다. 아래 postrotate 를 실행하면 nginx 는 새로운 log 에 log 를 쓰게 된다.(ref. 3 참고)

# /etc/logrotate.d/nginx
/var/log/nginx/*log {
    create 0644 nobody root
    daily                   # 매일 rotate
    dateext
    dateformat %Y-%m-%d-%s
    rotate 10               # 10개의 log 를 보관
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

아래처럼 하면 제대로 conf 가 동작하는지 확인할 수 있다. 다만 log 가 조건에 맞아야 rotate 가 진행된다. 그래서 개인적으로 size 1k 를 이용한다.

logrotate -v /etc/logrotate.d/nginx

mongodb 에 대한 logrostate

kill -SIGUSR1 에 대해서는 ref. 4를 참고하자.

# /etc/logrotate.d/mongodb
/home/user/apps/mongodb-5.0.6/log/mongod.log
{
   rotate 10
   daily
   dateext
   dateformat .%Y-%m-%d-%s
   extension .log
   dateyesterday
   size 10000M
   missingok
   create 600 mongod mongod
   delaycompress
   compress
   sharedscripts
   postrotate
     /bin/kill -SIGUSR1 $(cat /var/run/mongodb.pid)
   endscript
}
logrotate -v /etc/logrotate.d/mongodb

References

  1. How to install Logrotate and configure Nginx log rotation – Evelyn’s Blog
  2. logrotate(8) - Linux man page
  3. Log Rotation | NGINX
  4. Rotate Log Files — MongoDB Manual

[컴][웹] nginx build 방법

 

nginx 1.20 빌드하기

nginx build 방법

절차

  1. 필요한 package 설치
  2. 소스 다운로드
  3. 빌드
    • make module : module 만 빌드할 때 사용하면 된다.
    • make install : nginx 를 만들어준다.

Dockerfile

아래 docker 는 headers-more-nginx-module(3rd party modules) 를 같이 빌드하는 내용이다. 빌드가 완료되면, /usr/local/nginx 에 nginx 가 저장된다.

module 은 /nginx-build/nginx-1.20.2/objs/ngx_http_headers_more_filter_module.so 에 생성된다.

nginx 는 /usr/local/nginx/ 에 실행파일과 기타 파일들을 만든다.

/usr/local/nginx/
  |
  +- conf
  +- html
  +- logs
  +- modules
  +- sbin
FROM rockylinux:8
LABEL maintainer="coosal@duck.com"

# ----------------------------
# requirement
# ----------------------------

RUN dnf -y update
RUN dnf -y group install "Development Tools"
RUN dnf -y install bzip2
# RUN dnf -y install openssl


# ----------------------------
# 소스 download
# ----------------------------
RUN mkdir nginx-build
WORKDIR /nginx-build

# download nginx-1.20.2.tar.gz
RUN curl -L -o './nginx-1.20.2.tar.gz' http://nginx.org/download/nginx-1.20.2.tar.gz
RUN tar -xf ./nginx-1.20.2.tar.gz

RUN curl -L -o './headers-more-nginx-module-v0.33.tar.gz' https://github.com/openresty/headers-more-nginx-module/archive/refs/tags/v0.33.tar.gz
RUN tar -xf ./headers-more-nginx-module-v0.33.tar.gz

# download pcre-8.45
RUN curl -L -o './pcres-8.45.tar.bz2' https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.bz2
RUN tar -xf ./pcres-8.45.tar.bz2

# download zlib-1.2.11
RUN curl -L -o './zlib-1.2.11.tar.gz' https://zlib.net/zlib-1.2.11.tar.gz
RUN tar -xf ./zlib-1.2.11.tar.gz


# ----------------------------
# build
# ----------------------------
WORKDIR /nginx-build/nginx-1.20.2

RUN ./configure --with-compat --add-dynamic-module=../headers-more-nginx-module-0.33 --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11

# ----------------------------
# module 을 build
# ----------------------------
RUN make modules

# ----------------------------
# nginx 를 build
# ----------------------------
RUN make install

ENTRYPOINT ['/bin/bash']

Reference

  1. Install | NGINX

[컴][웹] nginx에서 log 설정

 nginx log, how to se nginx log path 

nginx에서 log 설정

access_log, error_log 설정

# /etc/nginx/nginx.conf

http {
  ...
  # 여기서 log path 를 설정해 주면 된다.
  access_log  /var/log/nginx/access.log;
  # error_log 를 사용하는 위치 지정, 기본 level 은 error 이다.
  error_log /var/log/nginx/error.log;
  ...

  server {
    server_name domain.com
    # 서버별로 access log 를 만들려고 하면 여기에 적는다.
    access_log  /var/log/nginx/domain.access.log;
    # error 로그레벨을 warn 으로 한다.
    error_log /var/log/nginx/domain.error.log warn;
    ...
  }
}

log format 설정

# /etc/nginx/nginx.conf

http {
  ...
  log_format mylogformat  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  # 아래처럼 mylogformat 을 지정할 수 있다.
  access_log  /var/log/nginx/access.log mylogformat;
  ...

  server {
    
    ...
  }
}

log off

# /etc/nginx/nginx.conf

http {
  ...
  # log 를 기록하지 않게 할 수 있다.
  access_log  off;
  ...

  server {
    
    ...
  }
}

Reference

  1. Configuring the Nginx Error and Access Logs | Linuxize

[컴] mongodb 를 tgz 를 이용해서 설치

 mongdb 설치하기 / tgz 로 설치하는 법

mongodb 를 tgz 를 이용해서 설치

절차

  1. tarball download
  2. untar
  3. /usr/local/bin 에 link 만들기
  4. mongodb shell 설치

Dockerfile

# Dockerfile
FROM centos:centos8
LABEL maintainer="coosal@duck.com"

RUN groupadd mongod
RUN useradd -g mongod mongod

RUN groupadd mydeploy
RUN useradd -g mydeploy mydeploy

# ----------------------------
# mongod
# ----------------------------
# --------------------
# .tar download
# --------------------
WORKDIR /home/mydeploy/
USER mydeploy
RUN mkdir apps

WORKDIR /home/mydeploy/apps
RUN curl https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-5.0.6.tgz --output mongodb-linux-x86_64-rhel80-5.0.6.tgz
RUN tar -zxvf mongodb-linux-x86_64-rhel80-5.0.6.tgz
RUN mv mongodb-linux-x86_64-rhel80-5.0.6 mongodb-5.0.6
# --------------------
# data, log dir
# --------------------
RUN mkdir -p mongodb-5.0.6/data
RUN mkdir -p mongodb-5.0.6/log

USER root
RUN chmod o+rx /home/mydeploy
RUN chown -R mongod:mongod mongodb-5.0.6/data
RUN chown -R mongod:mongod mongodb-5.0.6/log
# --------------------
# /usr/local/bin path
# --------------------
RUN ln -s /home/mydeploy/apps/mongodb-5.0.6/bin/* /usr/local/bin/
# --------------------
# .conf
# --------------------
COPY --chown=mydeploy:mydeploy mongod.conf ./mongodb-5.0.6

# ----------------------------
# mongosh
# ----------------------------
# --------------------
# .tar download
# --------------------
WORKDIR /home/mydeploy/apps
USER mydeploy
RUN curl https://downloads.mongodb.com/compass/mongosh-1.1.9-linux-x64.tgz --output mongosh-1.1.9-linux-x64.tgz
RUN tar -zxvf mongosh-1.1.9-linux-x64.tgz
RUN mv mongosh-1.1.9-linux-x64 mongosh-1.1.9
# --------------------
# /usr/local/bin path
# --------------------
USER root
RUN ln -s $(pwd)/mongosh-1.1.9/bin/* /usr/local/bin/
# --------------------
# root 암호 설정
# --------------------
RUN echo 'root:mypassword' | chpasswd

USER mongod
ENTRYPOINT [ "/usr/local/bin/mongod", "-f", "/home/mydeploy/apps/mongodb-5.0.6/mongod.conf"].conf ./mongodb-5.0.6

# mongod.conf

# Where and how to store data.
storage:
  dbPath: /home/mydeploy/apps/mongodb-5.0.6/data
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  logRotate: reopen # 이렇게 하면 mongod 를 새로실행할 때마다 rotate 해준다. ref.3 을 보자.
  path: /home/mydeploy/apps/mongodb-5.0.6/log/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

replication:
   replSetName: "rs0"

기타

혹시 root 등을 이용해서 test 를 하게 되면, dbPath/ 내에 file 들과 /tmp/*.lock file 의 owner 가 root 이 된다. 이렇게 되면 다른 일반 계정으로 실행하게 될 때 error 가 발생한다.

See Also

  1. MongoDB Log Rotation Automation | dasbotask.com : 주기적으로 log 를 rotate 하는 법
  2. 쿠…sal: [컴][db] mongodb 를 production 에서 배포시 확인할 사항
  3. 쿠…sal: [컴][DB] Windows7 64 bit 에서 MongoDB 설치하기
  4. 쿠…sal: [컴] wsl2 에서 mongodb 접근

Reference

  1. Install MongoDB Community on Red Hat or CentOS using .tgz Tarball — MongoDB Manual
  2. Install mongosh — MongoDB Shell
  3. Rotate Log Files — MongoDB Manual

[컴] docker 에서 systemd 를 사용

 docker에서 systemd / systemctl 사용 / docker 에서 systemd 사용법

docker 에서 systemd 를 사용

update:

  • redhat/ubi8-init 이라는 docker image 가 있다. 이것을 이용하면 container 내에 systemd 가 자동으로 실행된다.

docker에서 systemd 가 없는 이유

systemd 는 CAP_SYS_ADMIN capability 를 필요로 한다. Docker 는 non privileged container 에서는 이 능력을 없앤버린다.

그리고 docker는 container 하나에 하나의 service를 실행하라고 한다.[ref. 3] 그러니 굳이 처음에 무엇인가를 더 실행하게 할 이유가 없다.

systemd 실행하기

요즘은 CAP_SYS_ADMIN 능력만 추가할 수 있다. 이것을 추가하고, cgroup file system 을 추가해줘야 한다. 이것은 현재 내 linux system 의 cgroup 을 mount 해주는 것으로 해결한다.

  • CAP_SYS_ADMIN capability 추가
  • cgroup file system 추가
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf

sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-Linux-*
dnf install -y systemd

sudo docker run -d -v /sys/fs/cgroup/:/sys/fs/cgroup:ro --cap-add SYS_ADMIN -p 8089:80 --name systemd_websrv centos /sbin/init

systemctl

일반적으로, container 를 실행할 때 init system 을 실행하지 않는다.[ref. 2]

systemctl 은 dbus를 이용해서 systemd 와 통신을 하는 process인데, 만약 dbus 나 systemd 를 실행하지 않으면, systemctl 은 동작하지 않는다.[ref. 2]

windows

/sys/fs/cgroup/ 이 필요하기 때문에 wsl2 의 linux distro 내에서 docker를 실행해야 한다.

아래에서 전부 시도해봤지만 실패했다.

  • WSL2, Ubuntu 20.04 : 실패
  • WSL2, Ubuntu 18.04 : 실패
  • WSL2, Debian10 : docker 를 start 하지 못해서 test 를 못해봤다.
    • 이 글 에서 가능하다고 이야기 하는 듯 싶다.

References

  1. Running systemd within a Docker Container | Red Hat Developer, 2014
  2. Systemctl status is not working in my Docker container - General Discussions / General - Docker Community Forums
  3. Docker and systemd | The Startup
  4. Running Docker on WSL2 without Docker Desktop (the right way) - DEV Community
  5. [1.10] –cap-add=SYS_ADMIN change of behavior? · Issue #20082 · moby/moby · GitHub
  6. Systemd not starting - Failed to connect to bus: No such file or directory · Issue #18 · geerlingguy/docker-ubuntu2004-ansible · GitHub

[컴] host name 과 domain name 의 차이

host name vs domain name / 호스트 / 도메인 정의 / underbar / underscore / host name 만들기 전에 주의할 점

host name 과 domain name 의 차이

결론을 이야기 하면, domain name 이 좀 더 넓은 범위라거 보면 될 것 같다.

domain name > host name

host name 은 말그대로 host 에 붙이는 name 이라고 할 수 있는데, host 라는 것은 특정 ip address 를 소유한 객체로 보면 될 것 같다.( “RFC 1035 - Domain names - implementation and specification, section-2.3.1 Preferred name syntax” 에서도 host name 을 ip address 와 mapping 되는 객체로 보고 이야기 한다.)

그래서 host name 은 이 특정 ip address 와 mapping 된 이름(name) 이라 할 수 있겠다.

dns 의 table 을 생각하면 쉽다. A record 와 AAAA record 에 쓰이는 것이 host name 이라고 생각하면 된다.

그 외에 CNAME, MX record 들에 쓰이는 domain 들은 host name 이 아니라고 보면 될 것 같다. 이 들은 더 넓은 범주인 domain name 이긴 하다

host name 을 만들때 주의할 점

RFC 1035, 2.3.1 Preferred name syntax” 를 보면, domian name 을 지을 때 다른 조건도 만족할만한 이름을 짓는게 낫다고 이야기 하면서 예시로 main domain 과 host name 이름을 지을때 어떤 조건을 만족하는게 좋은 지 이야기 해주고 있다.

mail domain같은 경우는 domain name 의 조건도 만족해야 하지만 "RFC 822 - STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES" 의 조건도 만족해야 한다.

host name 을 정할 때는 옛날 hosts.txt 에서 사용했던 규칙을 따르라고 한다. 이유는 옛날에 host 의 이름에 대해 사용했던 규칙으로 옛날 프로그램들이 만들어져 있어서 이 규칙에 맞지 않는 host name 은 host name 이 틀렸다고, 규칙에 맞지 않다고 error 를 던질 수 있기 때문이다.

그 규칙이 아래와 같다.

<domain> ::= <subdomain> | " "

<subdomain> ::= <label> | <subdomain> "." <label>

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9

domain name에 대,소문자 사용은 가능하지만, 같은 철자로 된 domain name 이면, 대문자로 된 domain name 이나 소문자로 된 domain name 이나 같은 것으로 취급한다.

label 들은 ARPANET host name rules 을 따라야만 한다. - letter 로 시작해야만 하고 - letter 나 digit 으로 끝나야만 한다. - 그 사이의 문자는 letter, digit, hyphen 만 가능하다. - 길이는 63 자 이하여야 한다.

RFC1123 를 보면, 이전의 label 의 제약 사항중에 letter로 시작해야만 했던것은 digit으로 시작해도 된다고 바뀌었다.

From RFC-1039
     <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
To RFC-1123
      <name>  ::= <let-digit>[*[<let-or-digit-or-hyphen>]<let-or-digit>]

underscore(_) 문제

몇몇 library 들에서 host name 에 _ underscore 가 들어간 경우 문제가 된다. 특히 오래된 library 일수록 그런 경향이 있는 듯 보인다. 그러니 위의 오래된 hostname 규칙을 따르는 것이 낫다.

See Also

  1. HostNamingRules < CF < TWiki : host naming rule 과 관련한 RFC 문서 내용을 모아놓았다.

Refrences

  1. dns - Can (domain name) subdomains have an underscore "_" in it? - Stack Overflow

[컴][db] mongo db collection 을 복사하는 법

 

copy / clone collectioon / clone table in mongo db / mongodb / query / 복사 query

mongo db collection 을 복사하는 법

ref. 1 에서 알려주는 7가지 방법중에 query 로 할 수 있는 방법만 정리한다.

copyTo 를 이용하는 방법

db.collection1.copyTo("collection2")

forEach 를 이용하는 방법

db.collection1.find().forEach(
  function(docs){
    db.collection2.insert(docs);
})

aggregate 을 사용하기

속도로는 이것이 셋중에선 가장 나은듯 하다.

db.collection1.aggregate([{ $match: {} }, { $out: "collection2" }])

See Also

  1. 쿠…sal: [컴][DB] MongoDB 의 map reduce 사용법
  2. 쿠…sal: [컴][DB] mongodb 팁 - field 변경 방법

References

Ways to duplicate (clone) MongoDB collection