본문 바로가기
Knowledge Base

[Amazon Lightsail] Ubuntu 22.04 LTS 웹서버(Apache, PHP, MariaDB) 구성

by 조롱박소년 2024. 4. 10.

진행단계의 대부분은 root 권한으로 실행

 

설치된 운영체제 정보 확인

#lsb_release -a

Timezone 설정

#dpkg-reconfigure tzdata

GUI환경이 나오면 Asia, Seoul을 차례대로 선

 

시간확인

#date

 

시스템 시간 설정 확인

#timedatectl

현재 설치된 프로그램을 최신버전으로 패치

패키지 목록갱신

#apt update

최신버전으로 패치

(설치과정에서 일부의 프로그램 설정파일을 초기화할 것인지 물어보면 Keep Local Version(기본값) 선택

#apt upgrade

 

설치, 제거, 업데이트 과정중에 생긴 gabage file 제거

#apt autoremove

재부팅

#reboot

 

방화벽 확인

ufw (uncomplicated firewall) 설치

#apt install ufw

port open 후 활성화 (22, 80, 443 만 오픈 : port 22 미오픈시 콘솔접속 불가)

#ufw allow 22
#ufw allow 80
#ufw allow 443
#ufw enable
#ufw status

Apache2 설치

#apt install apache2

설치된 아파치 버전 확인

#apache2 -v

apache2가 정상적으로 설치되었다면 브라우저로 접속하면 아래와 같은 화면이 출력됨

https 인증서 관련 프로그램 설치

#apt install ssl-cert

무료인증서 발급 프로그램 설치

#apt install certbot

사용할 apache2 Module 활성화

#a2enmod rewrite
#a2enmod headers
#a2enmod ssl
#a2dismod -f autoindex

변경사항 적용

#service apache2 restart

Apache2 환경설정 문법 검사

#apache2ctl -S

기본 언어셋 변경

#vi /etc/apache2/conf-available/charset.conf

주석처리된 UTF-8 주석(#)제거

추가보안설정

#vi /etc/apache2/conf-available/security.conf

아래를 참고하여 설정

추가보안패치 (.git, .svn, .env 등의 파일보호, 기타 web Access가 되어서는 안될 파일들의 접근제어)

#vi /etc/apache2/apache2.conf

추가할 내용

# 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|config|sql|sh|key|yml|lock|bak|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|bower\.json|changelog\.md|console|legalnotice|license|security\.md|privacy\.md)$">
    Require all denied
</FilesMatch>
 
# Allow Lets Encrypt Domain Validation Program
<DirectoryMatch "\.well-known/acme-challenge/">
    Require all granted
</DirectoryMatch>
 
# Block .php file inside upload folder. uploads(wp), files(drupal), data(gnuboard).
<DirectoryMatch "/(uploads|default/files|data|wp-content/themes)/">
    <FilesMatch ".+\.php$">
        Require all denied
    </FilesMatch>
</DirectoryMatch>
 
<DirectoryMatch "/(data/session)/">
    Require all denied
</DirectoryMatch>

변경사항 적용

#service apache2 restart

Apache 개별사용자 권한 설정 

Permission(권한) 문제 해결을 위한 모듈설치 (shell, sftp, web 권한이 동일하게 취급)

#apt-cache search mpm-itk
#apt install libapache2-mpm-itk
#chmod 711 /home
#chmod -R 700 /home/*

변경사항 적용

#service apache2 restart

 

기본사이트 추가설정

#vi /etc/apache2/sites-available/000-default.conf

ServerName localhost 추가

https 기본사이트 켜기

#mv /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/000-default-ssl.conf

* mv 명령어를 사용하는 이유

Apache 는 가장 처음으로 로딩하는 파일을 기본 사이트로 취급합니다. 기본 사이트는 지정한 ServerName 에 모두 해당하지 않을 경우, 연결되는 사이트입니다.
Apache 의 conf 로딩 순서는, 알파벳 순서에 따릅니다. 그리고 숫자를 더 우선시 합니다.
따라서 위의 mv 명령어를 사용하지 않고, 당신의 도메인이 d 보다 앞단계 일 경우 (예를 들어 apple.com) 이 도메인 conf가 먼저 불러와지게 되고 기본 사이트가 됩니다.
우리는 위의 default-ssl 을 기본 사이트로써 동작하기를 원하기 때문에, 로딩 우선순위를 높이기 위해서, 이름을 000-default-ssl.conf 로 변경하는 것입니다.

 위 파일에 ServerName localhost 추가

#vi /etc/apache2/sites-available/000-default-ssl.conf

#a2ensite 000-default-ssl.conf

환경설정 구문확인

#apache2ctl -S

설정적용

#service apache2 reload

PHP설치 (8.1)

Ubuntu 22.04 LTS에서는 PHP8.1이 설치됨

#apt install php

버전확인

#PHP -v

* apt update 및 apt upgrade를 해주면 최신의 상태를 유지해 줄 수 있다.

PHP 모듈 설치

#apt install php-mbstring
#apt install php-gd
#apt install php-curl php-xml
#apt install php-bcmath
#apt install php-oauth
#apt install php-mysql
#apt install composer

* 모듈설명

- 멀티바이트 문자열 처리모듈

- 이미지 처리모듈

- 원격지 정보를 불러오는 모듈

- 수학 연산 확장모듈

- OAuth 인증모듈

- MySQL 연동 모듈

- PHP패키지 의존성 관리 프로그램 (Composer)

 

더 설치할 모듈을 확인후 선택하여 설치

#apt-cache search php- | grep ^php- | grep module

 

PHP 보안설정

*php를 해석하는 확장자를 제한

#vi /etc/apache2/mods-available/php8.1.conf
그림을 참고하여 추가
<FilesMatch ".+\.ph(p3|p4|p5|p7|ar|t|tml)$">
    Require all denied
</FilesMatch>

적용을 위해 Apache 재시작

#service apache2 restart

PHP Default Timezone 설정 (권장)

#vi /etc/php/8.1/apache2/php.ini
#vi /etc/php/8.1/cli/php.ini

위 2개 파일에서 추가

date.timezone = Asia/Seoul 

입력하되 제일 앞의 주석(#)제거

변경사항 적용

#service apache2 restart

phpmyadmin 설치

#wget https://files.phpmyadmin.net/phpMyAdmin/5.1.3/phpMyAdmin-5.1.3-all-languages.zip -O /var/www/html/dbmyadmin.zip.lock

* 브라우저에서 http://내아이피/dbmyadmin 으로 접속하면 phpMyAdmin 뜨면 정상

phpmyadmin 환경설정 진행

#mv /var/www/html/dbmyadmin/config.sample.inc.php /var/www/html/dbmyadmin/config.inc.php
#vi /var/www/html/dbmyadmin/config.inc.php

내용을 모두 지우고 아래의 내용으로 채움

<?php
declare(strict_types=1);
 
$valid_passwords = ['webuser1' => 'webpass1', 'webuser2' => 'webpass2'];
$valid_users = array_keys($valid_passwords);
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
$validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);
if (!$validated) {
    header('WWW-Authenticate: Basic realm="password?"');
    header('HTTP/1.0 401 Unauthorized');
    die ("Not authorized");
}
 
$cfg['blowfish_secret'] = 'RkyE=T6t6KjX65KPC7/XNQ\Bk9EhBXar'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$cfg['NavigationTreeEnableGrouping'] = false;
$cfg['MaxNavigationItems'] = '200';
$cfg['FirstLevelNavigationItems'] = '200';
$cfg['ShowDatabasesNavigationAsTree'] = false;
$cfg['NumRecentTables'] = 0;
 
/**
* Servers configuration
*/
$i = 0;
 
$i++;
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3306';
 
/*
$i++;
$cfg['Servers'][$i]['host'] = 'mydatabase-instance01.cohyfvqnmewt.ap-northeast-2.rds.amazonaws.com';
$cfg['Servers'][$i]['port'] = '3306';
*/
 
/*
$i++;
$cfg['Servers'][$i]['host'] = '211.192.211.192';
$cfg['Servers'][$i]['port'] = '3306';
*/

 

도메인 적용 및 테스트

일반사용자 계정 생성

user1 사용자계정 생성 후 해당 사용자로 전환하여 www 디렉토리 생성 (/home/user1/www)

#adduser user1
#su -l user1
#mkdir www
exit

웹사이트를 위한 Apache 환경설정파일 작성

* 아래의 환경설정 생성기로 자신의 환경에 맞추어 입력 (80, 443포토 열려있는지 확인)

Apache2 환경설정 생성기
https://webmaster.cafe/tools/apache-conf-generator/

 

Apache2 환경설정 생성기에서 두번째 탭 [HTTPS (임시인증서)] 내용을 복사하여 

/etc/apache2/sites-availible/자신의 도메인.conf 위치에 생성

#/etc/apache2/sites-available/[[사이트주소]].conf

사이트 활성화 (*.conf 파일이 있는 위치에서 실행)

#a2ensite [[자신의사이트주소]].conf

* 사이트 비활성화 명령어는 #a2dissite [[자신의사이트주소]].conf

변경사항 적용

#service apache2 reload

무료인증서 발급을 통해 보안서버를 구축하려면 

Apache2 환경설정 생성기의 네번째 탭 [인증서 설정가이드]로 이동하여 3) cerbot을 사용하여 도메인 인증 및 인증서 발급을 실행

#certbot certonly --webroot --webroot-path=/home/user1/www -d [[MySite]].com -d www.[[MySite]].com

다시 Apache2 환경설정 생성기의 세번째 탭 [HTTPS (LetsEncrypt)]로 이동하여 /etc/apache2/sites-availible/자신의 도메인.conf 변경
* 임시 인증서로 구동했으므로 이제 유효한 인증서로 구동해야 함

 

적용 마무리

#service apache2 reload

 

웹브라우저로 접속하면 보안서버가 적용되어 있음

인증서관련

Let's Encrypt는 3개월 짜리 인증서이며 주기적으로 갱신해 주어야 한다.

#letsencrypt renew

 

인증서 갱신을 주기적으로 실행해주면 된다.

#crontab -e
10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
15 5 * * 1 /usr/sbin/service apache2 reload

위 내용을 등록

MariaDB 설치

mariadb의 server와 client패키지 설치

#apt install mariadb-server
#apt install mariadb-client

설치후 mariadb 실행하여 접속가능한지 확인

#mariadb

Mariadb 보안설정

#mariadb-secure-installation

* 처음 실행시에는 패스워드가 지정되어 있지않기때문에 Enter로 패스하고 이후 root 패스워드 지정, 나머지 익명계정 내용등은 삭제

Mariadb에 접속하여 정상적으로 접속가능한지 확인

#mariadb -u root -p
password :

 

 

 

 

'Knowledge Base' 카테고리의 다른 글

Laravel 11.x api.php가 존재하지 않음  (0) 2024.04.05
Laravel 11.x 에서 lang 폴더가 존재하지 않음  (0) 2024.04.01
sail 명령어  (0) 2024.04.01