이 글은 Amazon Lightsail에서 Ubuntu 18.04(LTS, Long Term Support) 버전을 사용한다는 전제하에 쓰였습니다.
따라서 서버 환경이 다르면 세팅 방법이 다소 상이할 수 있습니다.
서버의 유지·보수를 위한 기록용 글이며 내용은 지속해서 수정·보완될 예정입니다.
blog.lael.be의 글을 바탕으로 작성되었습니다.
Creative Commons Zero로 자유롭게 글을 활용하게 해주신 라엘님께 감사의 인사드립니다.
(0) 우분투 업그레이드
현재 Amazon Lightsail에서 인스턴스 생성 시 선택 가능한 우분투 이미지는 16.04(LTS) 버전이다. Ubuntu 18.04(LTS) 버전으로 업그레이드한다.
- OS 버전 확인
$ lsb_release -a - 우분투의 모든 패키지를 최신 버전으로 업그레이드
$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade - 업데이트 매니저 설치 후 릴리즈 업그레이드
$ sudo apt install update-manager-core
$ sudo do-release-upgrade -d
터미널에 재접속하면 Welcome to Ubuntu 18.04 LTS라고 상단에 나온다.
(1) 서버 정보 확인 및 설정
- OS 버전 확인
$ lsb_release -a - 운영체제 확인
$ getconf LONG_BIT - CPU 정보 확인
$ cat /proc/cpuinfo
CPU 코어 수만 확인
$ cat /proc/cpuinfo | grep processor | wc -l - 메모리 확인
$ free -m - 저장소 용량 확인
$ df -h
본격적인 세팅에 앞서 패키지를 최신 버전으로 업그레이드한다.
- $sudo apt update
$sudo apt upgrade - 시스템 시간 설정
$ dpkg-reconfigure tzdata
(2) 루트 로그인 및 비밀번호 설정
- 기본 계정 확인
$ whoami - 루트 로그인
$ sudo su
이제부터 별도의 언급이 없으면 루트 로그인으로 진행한다.
- 비밀번호 설정
$ passwd root
$ passwd 기본계정
Amazon Lightsail에서 우분투 기본 계정은 ubuntu다.
(3) vsftpd 설치 및 설정
이 글에선 쉬운 세팅을 위해 파일질라 (FileZilla) 같은 FTP 소프트웨어를 활용할 것이므로 먼저 설치해준다.
(주의) 파일 업로드나 디렉토리 생성시 접속한 계정의 권한으로 생성된다.
- vsftpd 설치
$ apt install vsftpd
$ vi /etc/vsftpd.conf
white_enable=yes 주석제거
local_umask=022 주석제거
chroot_local_user=YES 주석제거
$ service vsftpd restart
Amazon Lightsail는 sftp root로그인을 위해 추가설정 필요하다.
- Lightsail sftp 루트 로그인 설정
$ vi /etc/ssh/sshd_config
PermitRootLogin yes로 변경
PasswordAuthentication yes로 변경
$ service sshd restart
이제 sftp로 root 로그인 가능한 걸 확인할 수 있다.
(3) apache2 설치 및 모듈설정
- apache2 설치
$ apt install apache2 - 버전 확인
$ apache2 -v
주소창에 서버 IP를 입력해 접속되는지 확인한다.
- 기본 파일 삭제
$ rm /var/www/html/index.html - 모듈 설정
$ a2enmod rewrite
$ a2enmod headers
$ a2enmod ssl
$ a2dismod -f autoindex
$ systemctl restart apache2 - apache2 기본 언어셋 설정
$ vi /etc/apache2/conf-available/charset.conf
UTF-8 라인의 주석을 제거한다.
Ubuntu Apache 패키지 제작자가 미리 써놓은 보안설정을 주석을 제거해 적용한다.
- apache 추가 보안 설정
$vi /etc/apache2/conf-available/security.conf
(4) PHP 설치 및 설정
PHP7.2 버전이 설치된다.
- php 설치
$ apt install php - 다국어처리, 이미지처리 모듈을 설치
$ apt install php-mbstring php-gd php-curl php-xml - 원격지 불러오는 모듈 설치
$ apt install php-curl php-xml - 버전 확인
$ php -v
웹 서비스 구동 시 발생할 수 있는 Nobody 퍼미션 문제를 해결하기 위한 프로그램을 설치한다. 이 세팅을 하면 shell, sftp, web의 권한이 같게 취급되며 보안이 좋아진다.
- php 권한설정
$ apt-cache search mpm-itk
$ apt install libapache2-mpm-itk
$ chmod 711 /home
$ chmod -R 700 /home/*
- PHP Default timezone 설정
$ vi /etc/php/7.2/apache2/php.ini
$ vi /etc/php/7.2/cli/php.ini
date.timezone 값을 찾아서 주석 제거 후 Asia/Seoul 설정
(5) MariaDB 설치 및 기본 언어셋 설정
- MariaDB 설치
$ apt install mariadb-server - MariaDB 초기화
$ /usr/bin/mysql_secure_installation
비밀번호만 설정한 후 다른 항목은 엔터를 누른다.
실수하면 명령어를 재실행하면 된다. - DB연동 모듈 설치
$ apt install php-mysql - 버전 확인
$ mysql -V
DB의 기본 언어셋을 utf8mb4로 설정해준다.
- 언어셋 설정
$ vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld] 항목 아래에 두 줄 추가한다.character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci
$ service mysqld restart
실사용의 편의를 위해 셸 기반 인증 방식에서 비밀번호 인증 방식으로 바꿔준다.
- root의 인증 플러그인 정보 제거하기
$ mysql
$ use mysql;
$ update user set plugin=” where User=’root’;
$ flush privileges;
$ exit;
(6) 보안 설정
(참고) sftp에 루트로 로그인해 파일을 다운, 수정 후 업로드한다.
- php 실행 확장자 변경 (.php를 제외한 확장자의 접근을 차단한다)
$ vi /etc/apache2/mods-available/php7.2.conf<FilesMatch ".+\.ph(p3|p4|p5|p7|t|tml)$"> Require all denied </FilesMatch>
- apache2 보안패치 (파일 및 폴더 보호, Web Access가 되어서는 안 될 파일들의 접근 제어)
/etc/apache2/apache2.conf
파일 <FilesMatch “^\.ht”> 구문 아래에 추가# deny file, folder start with dot <DirectoryMatch "^\.|\/\."> Require all denied </DirectoryMatch> # deny (log file, binary, certificate, shell script, sql dump file) access. <FilesMatch "\.(?i:log|binary|pem|enc|crt|conf|cnf|sql|sh|key|yml|lock|gitignore)$"> Require all denied </FilesMatch> # deny access. <FilesMatch "(?i:composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml|access_log|error_log|gruntfile\.js|config)$"> Require all denied </FilesMatch> # Allow Lets Encrypt Domain Validation Program <DirectoryMatch "\.well-known/acme-challenge/"> Require all granted </DirectoryMatch>
(7) phpMyAdmin 설치
- phpmyadmin 설치
$ apt install phpmyadmin
$ sudo vi /etc/apache2/apache2.conf
Include /etc/phpmyadmin/apache.conf
$ service apahce2 restart
phpMyAdmin 접속해서 테이블을 불러올 때 오류가 발생하면 /usr/share/phpmyadmin 폴더를 지운 후, 최신 버전의 phpmyadmin을 내려받아 usr/share/ 경로에 phpmyadmin 폴더명으로 넣어준다. phpMyAdmin
- phpMyAdmin 암호화 문자열 (blowfish secret) 오류 해결방법
/usr/share/phpmyadmin/config.sample.inc.php 파일을 수정해
$cfg[‘blowfish_secret’] = ‘쿠키값’ 적용 후
config.inc.php로 파일명을 바꿔준다.
쿠키값 생성
(8) 기타 프로그램 설치 및 재시작
- Unzip 설치
$ apt install unzip - Sendmail 설치
$ apt install sendmail - 적용을 위해 서비스 재시작
$ service apache2 restart
$ service mysqld restart
또는
$ reboot
(9) Let’s Encrypt SSL 인증서 발급받기
- 인증서 발급 프로그램 설치
$ apt-get install letsencrypt
Let’s Encrypt는 HTTP(HTTPS)-based DCV를 사용하여 인증한다. 따라서 해당 도메인에 대한 HTTP 접속이 가능해야 한다.
- 명령어 예시
$ letsencrypt certonly --webroot --webroot-path=/var/www/html -d urdomain.com -d www.urdomain.com
- 명령어 설명
-d 뒤쪽에 원하는 도메인명 입력, 한 인증서가 최대 100개의 도메인 인증이 가능하다. 일반적으로는 기본도메인과 www 도메인 두 개를 지정한다. 외부 인증프로그램이 -d에 지정된 도메인 사이트에 접속한다.
-webroot-path는 웹루트 경로다. 보통 index 페이지가 위치하는 경로다. 인증 프로그램이 이 경로에 임시로 파일을 생성하고, 외부 인증프로그램이 이 파일에 접근할 수 있다면 Domain Validation이 되는 것이다. - /etc/letsencrypt/live/[인증서명]/ 위치에 발급된다.
cert.pem – 인증서 파일
chain.pem – 인증서 발급자 파일
fullchain.pem – cert.pem 과 chain.pen 을 하나로 합쳐놓은 파일
privkey.pem – 인증암호를 해독하는 개인키
Apache2 서버에서는 cert.pem, chain.pem, privkey.pem을 사용
Nginx 서버에서는 fullchain.pem, privkey.pem을 사용
Let’s Encrypt 는 3개월짜리 인증서를 발급해준다. 즉 인증서를 3개월마다 주기적으로 갱신(renewal)해 주어야 한다. 갱신은 만료일 기준 1개월 전부터 할 수 있다.
- 인증서 갱신하기
$ letsencrypt renew - 인증서 갱신 프로그램 주기적으로 실행하기
$ crontab -e
만약 에디터 선택 문구가 출력된다면 3번을 누른다.
10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
15 5 * * 1 /usr/sbin/service apache2 reload
매주 월요일 새벽 5시 10분에 인증서 갱신, 5시 15분에 웹서버 프로그램 변경사항 적용이 설정됐다.
추후 도메인 추가 등의 이유로 인증서 교체가 필요할 경우 아래 과정을 따른다.
- $ a2dissite 환경설정파일명(10번 참고)
$ systemctl reload apache2 - 사용 중인 인증서 목록 보기(인증서명 확인)
$ cd /etc/letsencrypt/live
$ ls - 인증서 삭제
$ letsencrypt revoke –cert-path /etc/letsencrypt/archive/urdomain.com(인증서명)/cert1.pem
- 재발급
(10) Apache 웹사이트 환경설정파일 작성
자신의 사이트에 맞게 수정한 후, 원하는파일명.conf로 /etc/apache2/sites-available/ 폴더에 저장한다.
-
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^ - [E=protossl] RewriteCond %{HTTPS} on RewriteRule ^ - [E=protossl:s] RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </IfModule> </VirtualHost> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com DocumentRoot /home/user/www <Directory /home/user/www> Options FollowSymLinks MultiViews AllowOverride All require all granted </Directory> AssignUserID user user ErrorLog ${APACHE_LOG_DIR}/example.com-error.log CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined Header always set Strict-Transport-Security "max-age=31536000" SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCertificateFile "/etc/letsencrypt/live/example.com/cert.pem" SSLCertificateKeyFile "/etc/letsencrypt/live/example.com/privkey.pem" SSLCertificateChainFile "/etc/letsencrypt/live/example.com/chain.pem" </VirtualHost>
이후 수정은 터미널로 해도 좋다.
$ vi /etc/apache2/sites-available/원하는파일명.conf
- 사이트 활성화 및 적용
$ a2ensite 환경설정파일명
(참고) 비활성화는 a2dissite - 아파치 설정 다시 불러오기
$ service apache2 reload
(11) mysql 계정생성
- 도메인(IP)/phpmyadmin로 접속해 계정을 만들어준다.
(12) php.ini 설정
/etc/php/7.2/apache2/php.ini는 Apache2 – PHP일 때 참조하는 설정파일,
/etc/php/7.2/cli/php.ini는 Console에서 PHP를 직접실행할 때 참조하는 설정파일이다.
- php.ini 설정
$ vi /etc/php/7.2/apache2/php.ini
(수정예시)
max_execution_time = 1200
max_input_time = 1200
max_input_vars = 10000
memory_limit = 256M
post_max_size = 2000M
upload_max_filesize = 1024M
max_file_uploads = 100 - 아파치 재시작
$ service apache2 restart
(13) SSL 테스트
웹서버를 설치했으면 SSL이 정상적용되었는지 확인해본다. 433 포트를 열어놨어야 한다.
- SSL Chain Test – 인증서가 올바르게 설치되었는지
- SSL Algorithm Test – 안전한 암호화 통신이 이루어지는지
Chain Test는 모두 Valid이어야 하고, SSL Algorithm Test는 A 이상이면 정상적인 운영이 가능
(14) Amazon Lightsail 추가 디스크 마운트
- 연결된 디스크 확인
$ lsblk
/dev/xvdf 경로의 디스크가 연결되었다 가정한다.
- 파일 시스템이 있는지 확인
$ file -s /dev/xvdf
/dev/xvdf: data 같은 결과가 출력되면 새로운 디스크이므로 파일시스템을 생성한다. 아닌 경우 파일시스템 생성은 건너뛴다.
- ext4 파일시스템 생성(새로운 디스크만)
$ mkfs -t ext4 /dev/xvdf - 디스크 마운트
$ mount /dev/xvdf 마운트할위치
재부팅 시 디스크 마운트가 풀린다면 아래를 참고한다.
- 자동으로 디스크 탑재
$ vi /etc/fstab
/dev/xvdf /data ext4 defaults, nofail 0 2
재부팅 시 /dev/xvdf 경로의 디스크를 /data에 탑재하도록 설정됐다.
자세한 내용은 라이트세일 설명서 참고
(15) 명령어 참고
- 계정생성
$ adduser 계정명 - 계정삭제
$ userdel -r 계정명 - 디렉터리 생성
$ mkdir 폴더명 - 소유자와 그룹 변경
$ chown -R
(예시) $ chown -R test:test /targetdirectory - 권한 변경
$ chmod 옵션 모드 파일명 - 복사
$ cp -pr
(예시) $ cp -pr /sourcedirectory/www /targetdirectory
sourcedirectory에 있는 www 폴더를 targetdirectory 밑으로 복사한다.
-p 시간과 권한을 그대로 보존하여 복사한다.
-r 하위 디렉터리와 파일을 모두 복사한다.
자세한 내용은 명령어사전 참고
(16) 참고사항
- 데이터베이스 기본경로
/var/lib/mysql
아주 잘 정리해 주셔서 많은 도움이 되었습니다. 고맙습니다.
도움이 되었다니 기쁩니다. 댓글 감사합니다.
자세히 정리해주셔서 많은 도움되었습니다. 감사합니다.
Lael님 블로그 잘 보고 있습니다. 항상 많은 도움을 받고 있습니다. 쓰신 글을 바탕으로 제 환경에 맞게 일부 추가했을 뿐인데 잘 봐주셨다니 감사합니다.
아파치 설치시 index.html을 삭제하는 이유가 있나요?
그리고 도메인 index.html을 삭제해서 도메인 생성할때 오류가 나는것 같아요
답변 부탁합니다
답변이 늦어 죄송합니다. 위에 언급된 index.html은 아파치 기본 웹페이지로 삭제하지 않으셔도 무방하며, 삭제한다고 도메인 생성에 영향을 끼치지 않습니다. index.html은 웹에서 해당 경로로 접근 시 보이는 페이지의 역할만 수행합니다.