ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Amazon Lightsail] Ubuntu 22.04 LTS 웹서버(Apache, PHP, MariaDB) 구성
    Knowledge Base 2024. 4. 10. 02:06

    진행단계의 대부분은 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
Designed by Tistory.