우분투(Ubuntu) 18.04/20.40 서버 초기 설정

Share

Last Updated on 6월 20, 2022 by Jade(정현호)

안녕하세요 
AWS 클라우드 프리티어 연재글로 이번에는 EC2 생성 이후 우분투(Ubuntu) OS 의 기본 설정에 대해서 살펴보도록 하겠습니다. 
      

시작 전

AWS 클라우드 프리티어 가입 생성 부터 , Nginx PHP MariaDB 스택구성 , WordPress 구성까지 이어지는 연재글의 중간글 입니다. 

다음 글의 링크는 하단에 있습니다.

연재 관련 이전 글 목록
- AWS 클라우드 계정 생성과 계정의 2차 인증(2FA) 인 OTP 설정 [Link]
- AWS EC2 VM 머신 생성 [Link]
- AWS 클라우드 - 탄력적 IP(고정IP) 생성 및 할당 [Link]


이번 포스팅은 AWS 클라우드 프리티어의 EC2 VM에서 우분투 18.04/20.04 서버 설치를 하였을 때의 환경으로 포스팅은 설명되어 있습니다.

EC2 의 우분투 18.04/20.04 에 Nginx + PHP-FPM + MariaDB 를 설치할 예정이며, 웹 구성 요소를 설치 및 구성 하기 전에 사전에 OS에서 설정이 필요한 몇 가지에 대해서 변경 및 설정을 진행하려고 합니다.



* 프롬프트 환경은  ubuntu$  입니다.
* 포스팅 환경의 대상 버전은 우분투 18.04/20.04 입니다.


해당 내용은 우분투 18.04 와 20.04 공통으로 설정이 가능한 내용입니다.
            

OS 설정 확인 및 변경

버전 정보 확인

ubuntu$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.5 LTS
Release: 18.04
Codename: bionic


패스워드 없이 sudo 사용으로 변경

On-premise 일 경우 - 선택사항

클라우드 환경은 보통 NOPASSWD 로 이미 설정되어 있습니다.

ubuntu$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),27(sudo),<중략..>
--> 27(sudo) 이 있음

/etc/sudoers 파일을 수정합니다
ubuntu$  sudo vi /etc/sudoers

%sudo ALL=(ALL:ALL) ALL

위의 내용을 아래 내용으로 수정 합니다

%sudo ALL=(ALL:ALL) NOPASSWD:ALL


apt repository를 kakao 로 변경

클라우드 환경 일 경우 - 선택사항

클라우드 환경은 자체 리전내 구축된 Repository 로 설정된 경우가 많습니다.
이런 경우 해당 클라우드내 설정되어 있는 Repository 를 사용하여도 됩니다.

ubuntu$ cd /etc/apt/
ubuntu$ sudo cp -rp sources.list sources.list.backup
ubuntu$ sudo vi /etc/apt/sources.list


vi 로  들어가서 아래의 명어를 통해 변경 합니다.
기존에 입력된 내용이 us 이거나 kr 일수 있어서 기존에 입력된 주소를 보시고 실행하시면 됩니다.
또는 AWS는 자체 리전내 Repository 로 설정되어 있습니다.

# AWS 일 경우
:%s/ap-northeast-2.ec2.archive.ubuntu.com/mirror.kakao.com
=> 클라우드 환경은 자체 Repository 를 사용하여도 어느정도 속도는 보장 될것으로 생각 됩니다.

# 그외 별도 설치 일 경우
:%s/us.archive.ubuntu.com/mirror.kakao.com

or
:%s/kr.archive.ubuntu.com/mirror.kakao.com


timezone 변경

OS가 설치 직후 timezone 은 UTC 로 설정되어 있습니다. 우리나라 시간과 9시간 차이가 발생하고 system timezone 을 이용하는 어플리케이션이나 데몬들의 로그 기록에도 영향을 주게 됩니다.

ubuntu$ date

Sun Oct 18 14:30:41 UTC 2020

타임존은 아래와 같이 설정을 변경 할 수 있습니다.
ubuntu$ sudo timedatectl set-timezone 'Asia/Seoul'

변경 확인
ubuntu$ date

Sun Oct 18 23:31:24 KST 2020

timezone 등의 정보는  timedatectl  을 통해서도 할 수 있습니다

타임존이 변경 되었다면 아래와 같이 2개의 서비스를 재시작을 합니다.

ubuntu$ sudo systemctl restart cron
ubuntu$ sudo systemctl restart sshd

* 설치 타입이나 버전 등에 따라서 cron 이 설치가 안되어 있을수 있습니다.(아래에서 설치 진행을 함)


OS 방화벽 확인

 - 방화벽이 설정 / 활성화 되어있는지 확인 / 패키지 설치

ubuntu$ sudo ufw status
  => ufw 서비스 사용 여부 확인

ubuntu$ sudo ufw show raw

ubuntu$ sudo iptables -nL
  => 설정된 정책 확인


[참고] 모든 클라우드 환경이 iptables 이 설정되어 있지 않은건 아닙니다.

오라클 클라우드의 경우 Centos 나 Ubuntu 모두 OS방화벽이 기본 활성화 및 기본 차단 정책이 설정되어 있습니다.

사용하는 클라우드나 VPS 에서 iptables 사용이나 기본 룰 이 설정되어 있는지 초기에 확인 해봐야 합니다.


iptables 간단 설명

iptables 룰 정책 저장을 위한 패키지 설치

ubuntu$ sudo apt-get install iptables-persistent netfilter-persistent

-> 우분투의 iptables 는 재부팅시 내역이 초기화되기 때문에 아래 2개의 패키지를 설치가 필요합니다


특정 포트 오픈 규칙 추가( -I 가장 먼저 추가)
ubuntu$ sudo iptables -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

특정 포트 오픈 규칙 삭제
ubuntu$ sudo iptables -D INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

포트 오픈시 특정 IP(123.123.123.123) 로 만 허용
ubuntu$ sudo iptables -I INPUT -p tcp -s 123.123.123.123 --dport 8009 -j ACCEPT

위의 "포트 오픈시 특정 IP 로 만 허용" 정책 삭제
ubuntu$ sudo iptables -D INPUT -p tcp -s 123.123.123.123 --dport 8009 -j ACCEPT

정책 영구 저장
ubuntu$ sudo netfilter-persistent save


hostname 변경

ubuntu@123.123.123.123:~$


AWS 등의 클라우드에서 VM 생성시 위와 같이 IP나 특정 Tag 명등의 식별자로 호스트네임이 설정되는 경우가 있습니다.

이럴 경우 사용자가 원하는 hostname 으로 변경 하여 사용하여도 됩니다.

여기서는 hoing 으로 설정 해보도록 하겠습니다.
ubuntu$ sudo hostnamectl set-hostname hoing
ubuntu$ sudo cat /etc/hostname
hoing


= 즉시 반영 수행, 다음 명령어 수행 이후 재접속 하면 변경된 호스트 명으로 확인 됩니다.
ubuntu$ sudo hostname -F /etc/hostname


AWS 클라우드 환경에서는 재부팅하게 되면 설정이 원복 될수도 있습니다.
먼저 /etc/cloud/cloud.cfg 파일이 있는지 확인 합니다.
ubuntu$ ls -al /etc/cloud/cloud.cfg


있다면 cloud.cfg 안에 preserve_hostname 설정을 변경 합니다.

 
ubuntu$ sudo vi /etc/cloud/cloud.cfg
preserve_hostname : true
                  false => true  로 변경


/etc/hosts 에 호스트 추가

ubuntu$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 123.123.123.123 <------
<중략>


ubuntu$ sudo vi /etc/hosts

123.123.123.123 WMP
   <== 내용 입력

* IP 와 호스트네임 명칭은 예시입니다.


rc.local 활성화

booting을 하면서 스크립트나 명령어등이 같이 수행되도록 하는 방법에는 여러가지가 있습니다.
그 중에서 가장 쉽게 빠르게 할 수 있는 방법이 /etc/rc.local 을 사용 하는 것이기도 합니다.


= 파일을 생성 후 아래와 같이 입력 합니다.
ubuntu$ sudo vi /etc/rc.local
#!/bin/bash

touch /tmp/test


* touch /tmp/test  이부분은 서비스가 정상적으로 실행 되는지를 확인 해보기 위해서 추가한 내역으로 서비스가 정상적으로 실행되었고 /etc/rc.local 이 수행되었다면 /tmp 아래 test 라는 파일이 생성될 것입니다.

파일 생성 여부로 해당 작업의 정상 유무를 확인 할 수 있습니다.


= 퍼미션 권한 부여
ubuntu$ sudo chmod 755 /etc/rc.local


= rc-local.service 파일 수정
ubuntu$ sudo vi /lib/systemd/system/rc-local.service

[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no


위의 내용이 기존에 존재하는 내용입니다
아래 [Install] 부분을 추가 합니다


[Install]

WantedBy=multi-user.target


===== 추가 하게 되었을 때 내용 =======
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target
===== 추가 하게 되었을 때 내용 =======


= 서비스 enable 및 시작 
ubuntu$ sudo systemctl enable rc-local
Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /lib/systemd/system/rc-local.service.

ubuntu$ sudo systemctl start rc-local.service


= 테스트 파일 생성 여부 확인
ubuntu$ ls -al /tmp
-rw-r--r-- 1 root root 0 Oct 20 15:28 test


= touch 명령어 부분 삭제 
ubuntu$ sudo vi /etc/rc.local


touch /tmp/test <== 삭제합니다.


transparent hugepage 비활성화

transparent hugepage 기능은 hugepage 와 관련된 자동적 활성화 기능으로 자세한 내용은 이전의 포스팅을 참조하시면 됩니다.


= 현재 설정 내역 조회
ubuntu$ sudo cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
* madvise 로 되어 있을수도 있습니다.



ubuntu$ sudo apt install hugepages -y
ubuntu$ sudo hugeadm --thp-never
ubuntu$ sudo cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]


= 재부팅시 다시 활성화를 방지하기 위해서 위에서 활성화한 /etc/rc.local 을 활용하여 명령어가 실행 되도록 하겠습니다.

추가
ubuntu$ sudo /bin/sed -i '$i /usr/bin/hugeadm --thp-never' /etc/rc.local


확인
ubuntu$ cat /etc/rc.local
#!/bin/bash

/usr/bin/hugeadm --thp-never


SWAP 추가

우분투의 경우 기본 swap 이 설정이 안되어 있는 경우가 많습니다.

AWS 클라우드도 그렇고 다른 프리티어 서비스에서 제공되는 VM의 메모리가 크지 않기 때문에 사용하다보면 어쩔수 없이 메모리가 부족한 상황이 발생되게 됩니다.

그러다 보면 부족한 메모리에 의해서 Page IN/OUT 처리가 되어야 하고 그에 따라서 kswapd0 프로세스가 바쁘게 동작하여 높은 CPU 사용율을 보이거나 과점 하는 상황도 발생 하게 됩니다.
과점하는 상황까지 되면 VM 이 다운이 되거나 응답하지 않는 다고 느낄 정도로 아주 매우 느린 상황이 되기도 합니다.
그래서 이런 상황이나 현상을 방지 하기 위해서 SWAP 을 사용하는 것이 더 좋은 성능과 안정성을 확보 할 수 있습니다.

우분투에서 SWAP 은 아래와 같은 절차로 생성 및 설정 할 수 있으며 포스팅에서는 4GB 용량으로 설정 하였습니다.

1) swap 파일의 생성
sudo fallocate -l 4GB /swapfile

2) 권한 변경
sudo chmod 600 /swapfile

3) Swap 영역으로 변경
sudo mkswap /swapfile

4) Swap을 사용하도록 설정
sudo swapon /swapfile

5) 영구적 사용
영구적으로 사용하고자 할 때에는 /etc/fstab 을 수정하여 마운트 내용을 설정 해야 합니다.

sudo vi /etc/fstab

## 아래  내용을 입력

/swapfile   swap    swap    defaults    0   0

             

커널 파라미터 변경

swappiness 확인

ubuntu$ cat /proc/sys/vm/swappiness

60

현재 테스트 및 사용한 환경에서는 swappiness가 60 으로 설정되어 있습니다
(보통의 경우가 default가 60입니다)

현재 프리티어 사용중으로 메모리가 많지 않으니 최대한 swap 사용을 하지 않도록 수치를 낮추도록 하겠습니다.

그외 커널파미터는 네트워크 tcp send/receive buffer Asyc I/O  동시 요청 수 사용 가능한 파일 핸들의 사용 수 를 추가로 늘려 준 내역 입니다.


커널 파라미터 변경
ubuntu$ sudo vi /etc/sysctl.conf


vm.swappiness = 1
net.core.rmem_max=56777216
net.core.rmem_default=16777216
net.core.wmem_max=56777216
net.core.wmem_default=16777216
net.ipv4.tcp_window_scaling=1
net.core.netdev_max_backlog=2500
fs.aio-max-nr=1048576
fs.file-max = 6815744


파일 저장 후 커널 파라미터 적용
ubuntu$ sudo sysctl -p


swappiness 확인
ubuntu$ cat /proc/sys/vm/swappiness
1
            

user ulimit 설정 변경

limits.conf 파일을 수정하여 ulimit 을 설정 합니다.

ubuntu$ sudo vi /etc/security/limits.conf


apache hard nofile 65536

apache soft nofile 65536
apache soft nproc 16384
apache hard nproc 16384

nginx hard nofile 65536

nginx soft nofile 65536
nginx soft nproc 16384
nginx hard nproc 16384

mysql hard nofile 65536

mysql soft nofile 65536
mysql soft nproc 16384
mysql hard nproc 16384


* 유저명이나 ulimit 추가 내역은 수정/추가 하여도 됩니다.

* nproc : User당 사용할 수 있는 프로세스 최대 개수
* nofile : User당 오픈할 수 있는 파일 개수
                  

패키지 설치 관련

패키지 최신화

초기 설치 시 이후 패키지를 최신화 하려면 upgrade 를 실행하면 됩니다.
ubuntu$ sudo apt update
ubuntu$ sudo apt upgrade -y

다수의 패키지 등이 설치가 되기 때문에 패키지 별로 최신화 및 설치를 진행하려면 update 만 수행하고 upgrade 를 진행 하지 않으면 됩니다.



패키지 추가 설치

ubuntu$ sudo apt update

ubuntu$ sudo apt install vim unzip zip git \
tree build-essential openjdk-8-jdk rsync \
python3.8 python3.8-dev python3.8-dbg \
python3-pip software-properties-common \
rsyslog rdate cmake nano iputils-ping net-tools \
cron telnet -y


[software-properties-common]
--> 일반적으로 우분투 소프트웨어 센터에서 다운로드 받을수 있는 각종 패키지의 버전들은 최신의 것들이 아닙니다 
그렇기 때문에 PPA(Personal Package Archive)를 통해 최신 버전 들을 다운로드 할 수 있습니다.

PPA 사용하기 위한 필요 패키지 입니다


[참고] 리눅스 VM 컴퓨트 설치 후 SSH 보안 설정 및 보안 툴을 설치 않았다면 fail2ban 포스팅을 참조하시면 됩니다.



다음 포스팅에서는 Chrony 를 통한 시간 동기화를 설정 하도록 하겠습니다.

이어지는 연재 다음글: 우분투(Ubuntu) 시간 동기화 설정 - Chrony



연관된 다른 글

 

 

 

 

              

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x