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

Last Updated on 3월 2, 2021 by 태랑(정현호)



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

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


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






시작 전



AWS 클라우드 프리티어의 EC2 VM에서 우분투 18.04 서버 설치가 된 상태 입니다.


EC2 에 생성한 우분투 18.04 에 Nginx + PHP-FPM + MariaDB 를 설치할 예정이며,

설치 하기전에 AWS 또는 On Premise 에서 설치한 우분투18.04 버전에 대해서 몇가지 설정을 진행 하려고 합니다.


* 프롬프트 환경은  ubuntu$  입니다.
* AWS EC2 로 생성한 우분투 18.04 서버 버전 입니다







우분투 18.04 설정



# 버전 정보 확인

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








# 패키지 최신화

repository 를 변경 하였으니 리스트를 갱신하고 업데이트를 수행 합니다
ubuntu$ sudo apt update
ubuntu$ sudo apt upgrade -y







# timezone 변경

처음 설치 후 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  을 통해서도 할 수 있습니다








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

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) 로 만 허용
iptables -I INPUT -p tcp -s 123.123.123.123 --dport 8009 -j ACCEPT


위의 "포트 오픈시 특정 IP 로 만 허용" 정책 삭제
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 으로 변경 하여 사용하여도 됩니다.


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



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



클라우드 환경에서는 재부팅하게 되면 설정이 원복 될수도 있습니다.
/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







# 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 = 5
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=10
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
5







# user 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당 오픈할 수 있는 파일 개수







#   패키지 추가 설치

ubuntu$  sudo apt update

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



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

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





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






다음은 추가적으로 Chrony 를 통한 시간 동기화를 설정 하도록 하겠습니다.


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


연관된 영상
XP 매트릭스 - 오래동안 RHEL계열을 하다가 Ubuntu 오랜만에 하니 다시 생각나서 예전 영상 링크를 추가 합니다