메뉴 건너뛰기

IT지혜

Apple 에서 2020년 출시된  Silicon M1 시리즈에서 로컬에 웹서버 구축을 해보겠습니다.

 

구성 : Apache + PHP + MariaDB(MySQL)

시스템 : Mac mini (M1, 2020) 16GB, 256GB

OS : macOS Big Sur 11.2.3

 

1. Homebrew 설치 (Homebrew 를 이용해서 Apple 에서 제공하지 않는 유용한 패키지들을 설치관리자)

iTerm 등 터미널 창을 열어서 아래의 명령어를 실행합니다. sudo 를 실행하기 때문에 시스템 계정의 패스워드를 물어보게 됩니다. 입력하여 주시면 됩니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 

m1-homebrew_install.png

/opt/homebrew 아래에 구성파일들이 설치되며 설치를 계속하기 위해 엔터키를 한번 더 눌러주세요. 1~3분 이내에 설치가 완료됩니다.

m1-homebrew_install2.png

설치가 완료되었습니다. 추가적으로 아래의 명령어를 통해 Homebrew를 PATH 에 추가해줍니다. jhlove 는 자신의 계정이름으로 변경하여 실행하여 주세요.

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/jhlove/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

 

아래의 명령어를 통해 Homebrew 가 정상적으로 설치되었는지 확인 하실 수 있습니다.

brew help

 

m1-homebrew_help.png

 

2. MariaDB 10.5.9 설치하기

- Homebrew 를 이용해 아래의 명령어로 간단하게 설치가 가능합니다.

brew install mariadb

 

 

- 설치된 mariadb 를 아래의 명령어로 기동합니다.

brew services start mariadb

 

m1-mariadb_ps.png

- mariadb(mysql) root 패스워드를 아래와 같이 명령어를 실행하여 변경합니다. sudo 로 명령어를 실행하면 바로 Password 를 물어보는데 여기에서는 Mac OS 계정의 패스워드를 입력하면 됩니다. 그리고 그 다음에 "Enter current password for root (enter for none):" 여기는 mysql 의 root 패스워드인데 아직 설정한게 없으므로 그냥 엔터를 누르시고 그 아래의 " Change the root password" 에서 root 패스워드를 변경하여 주시면 됩니다.

sudo mysql_secure_installation

 

m1-mariadb_root.png

- mysql root 계정이 정상적으로 접속되는지 아래의 명령어를 사용하여 확인합니다.

mysql -u root -p

 

m1-mariadb_root_check.png

 

3. PHP 8.0.3 설치

- 설치는 역시 Homebrew 를 사용해서 아래와 같이 간단하게 설치할 수 있습니다. (설치 시간은 조금 오래 걸립니다.)

brew install php

 

- 설치가 완료되면 간단하게 php 의 timezone, upload 용량을 수정합니다.

perl -p -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 50M/g' /opt/homebrew/etc/php/8.0/php.ini
perl -p -i -e 's/post_max_size = 8M/post_max_size = 50M/g' /opt/homebrew/etc/php/8.0/php.ini
perl -p -i -e 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /opt/homebrew/etc/php/8.0/php.ini

 

 

- 그리고 이제 php-fpm 을 중지했다가 다시 기동하겠습니다.

brew services stop php
brew services start php

 

4. 도메인의 A레코드 설정하기

- 웹서비스를 띄우기 전에 먼저 도메인의 A레코들 설정을 먼저 진행하도록 하겠습니다.(SSL인증서를 발급시 올바른 DNS 구성이 되어 있어야 합니다.) 아래와 같이 클라우드 플레어에서 A 레코드를 설정하였습니다. 사용할 도메인은 jihye.pw 입니다.

m1-caddy-dns.png

- certbot 설치(무료 SSL 인증서를 받기 위하여)

brew install certbot

m1-certbot_install.png

 

- 그리고 아래의 명령어에서 이메일 주소를 자신의 메일주소로 변경, 도메인도 사용할 도메인으로 변경하여 실행합니다.

sudo certbot certonly --manual --preferred-challenges=dns --email 메일주소 --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d '*.도메인' -d '도메인' --rsa-key-size 4096

m1-cerbot_progress1.png

위의 명령어에 따라 와일드카드 인증서 발급을 진행하면 위와 같은 화면대로 진행이 됩니다. _acme-challenge.jihye.pw 에 대한 TXT 레코드를 아래의 값을 설정하여 줍니다. 클라우드플레어에서 아래와 같이 설정해주면 됩니다. 그리고 1-2 분후 엔터를 눌러 진행합니다.

m1-certbot_progress2.png

- 그러면 한번 더 아래와 같은 화면이 나오고, 조금전에 한것처럼 클라우드플레어에서 동일한 TXT 레코드를 새롭게 추가하여 줍니다. 위에서 추가한 레코드를 변경하는게 아니라 하나 더 추가해 주는것입니다.

m1-certbot_progress4.png

- 1-2분정도 시간이 지난 후에 다시 엔터를 누르게 되면 아래와 같이 인증서 발급이 정상적으로 완료됩니다.

m1-certbot_progress5.png

인증서 설치 경로 : /etc/letsencrypt/live/jihye.pw/fullchain.pem

priv key 설치 경로 : /etc/letsencrypt/live/jihye.pw/privkey.pem

 

- 그리고 Mac OS 홈계정의 경로에 web 이라는 디렉토리를 만들고 그 아래에 db.jihye.pw 라는 폴더를 생성하고 phpmyadmin 을 업로드 하였고, jihye.pw 에는 phpinfo 를 보여주는 index.php 파일을 미리 생성해두었습니다.

m1-caddy_home.png

 

5. Apache 설치하기

- 마찬가지로 Homebrew 를 이용해 아래의 명령어로 간단히 설치가 가능합니다.

brew install httpd
기본 설정
- 초기 웹페이지 경로 : /opt/homebrew/var/www
- 포트(HTTP) : 8080
- 포트(HTTPS) : 8443

- 시작명령어 : brew services start http

 

- httpd.conf 설정하기

+ DirectoryIndex 설정 : httpd.conf 에서 DirectoryIndex 에 index.php 추가

perl -p -i -e 's/DirectoryIndex index.html/DirectoryIndex index.php index.html/g' /opt/homebrew/etc/httpd/httpd.conf

 

+ 다음으로 <Files ".ht*"> ... 중략 ... </Files> 아래에 아래 내용을 추가합니다.

# 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|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>

 

+ 버츄얼 호스팅(conf 파일 각각 도메인별로 하기 위해) 환경설정파일 디렉토리 생성

echo '# Virtual hosts' >> /opt/homebrew/etc/httpd/httpd.conf
echo 'Include /opt/homebrew/etc/httpd/vhost/*.conf' >> /opt/homebrew/etc/httpd/httpd.conf
mkdir /opt/homebrew/etc/httpd/vhost

 

+ PHP 및 아파치 모듈 설정 및 SSL관련 기본설정

perl -p -i -e 's/Listen 8080/Listen 80\nListen 443/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule rewrite_module/LoadModule rewrite_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule vhost_alias_module/LoadModule vhost_alias_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule http2_module/LoadModule http2_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule ssl_module/LoadModule ssl_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule unique_id_module/LoadModule unique_id_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule expires_module/LoadModule expires_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule deflate_module/LoadModule deflate_module/g' /opt/homebrew/etc/httpd/httpd.conf
perl -p -i -e 's/#LoadModule socache_shmcb_module/LoadModule socache_shmcb_module/g' /opt/homebrew/etc/httpd/httpd.conf

echo '    #SSLSessionCache         "dbm:/opt/homebrew/var/run/httpd/ssl_scache"' > /opt/homebrew/etc/httpd/vhost/base.conf
echo '    SSLSessionCache        "shmcb:/opt/homebrew/var/run/httpd/ssl_scache(512000)"' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo '    SSLSessionCacheTimeout  300' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo '' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo 'LoadModule php_module $(brew --prefix)/opt/php/lib/httpd/modules/libphp.so' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo '' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo '     <FilesMatch \.php$>' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo '     SetHandler application/x-httpd-php' >> /opt/homebrew/etc/httpd/vhost/base.conf
echo '     </FilesMatch>' >> /opt/homebrew/etc/httpd/vhost/base.conf

 

+ jihye.pw 도메인 버츄얼 호스트 설정파일 생성

vi /opt/homebrew/etc/httpd/vhost/jihye.pw.conf

내용은 아래 내용을 추가합니다.

<VirtualHost *:80>
    ServerName jihye.pw
    ServerAlias www.jihye.pw
    
    <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>

# Specify the SSL cache directory. If possible, use shmcb, otherwise use the provided path.
SSLStaplingCache shmcb:/opt/homebrew/var/run/ocsp(128000)

<VirtualHost *:443>
    ServerName jihye.pw
    ServerAlias www.jihye.pw
    
    DocumentRoot /Users/jhlove/web/jihye.pw

    <Directory /Users/jhlove/web/jihye.pw>
        Options FollowSymLinks MultiViews
        AllowOverride All
        require all granted
    </Directory>

    ErrorLog /opt/homebrew/var/log/httpd/jihye.pw-error.log
    CustomLog /opt/homebrew/var/log/httpd/jihye.pw-access.log combined

    Header always set Strict-Transport-Security "max-age=31536000"

    SSLEngine on
    SSLProtocol all -TLSv1 -TLSv1.1 -SSLv3
    SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"

    SSLHonorCipherOrder on
    SSLCertificateFile "/etc/letsencrypt/live/jihye.pw/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/jihye.pw/privkey.pem"
    SSLCertificateChainFile "/etc/letsencrypt/live/jihye.pw/chain.pem"

    # Turn on OCSP stapling
    SSLUseStapling on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
</VirtualHost>

 

+ 이제 아파치(httpd) 웹서버를 시작합니다.

sudo brew services start httpd

 

- 마지막으로 확인을 위해서 크롬으로 사이트 주소에 접속하면 아래와 같이 웹페이지를 확인하실 수 있습니다. 

m1-caddy_jihye.pw.png

 

- SSL Labs 에서 A+ 등급을 확인할 수 있습니다.

apache-ssllabs.png