워드프레스를 설치하는 다양한 방법의 하나로 VPS 터미널을 통해 직접 모든 걸 설치하고 관리하는 방법에 관해 설명한다. – LEMP stack : (Linux + Nginx + MYSQL + PHP) + WordPress 이 방법은 서버나 관련 지식이 있지 않다면, 어려울 수도 있으니 사전 설치되어 있는 워드프레스 또는 원클릭 설치가 지원되는 호스팅 서비스 이용을 권장한다. 그럼에도 아래 순서대로 따라 하기만 한다면, 워드프레스를 쉽게 설치할 수가 있다.
여기서 다루는 내용은 기본적인 설치이므로, 워드프레스 & 엔진엑스(Nginx) 등의 최적화 방법은 설명하지 않는다. 추후 별도의 포스팅에서 다룰 예정이다.
사전 준비 사항
#도메인 준비 – 추천 vpshost.kr
#VPS 서비스 가입 – 추천 vultr.com
모든 설치는 편의상 root 계정을 통해 진행한다. 권장은 sudo 계정으로 진행하는 것이 보안상 좋다. – sudo 계정 만들기 바로가기
설치환경 Linux OS
#우분투 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)
#AMD EPYC 2 vCPUs / 4 GB memory / 100GB NVME – VULTR cloud compute / $ 24
#설치할 것들 : 2023-01-08 기준
- Nginx stable 1.18
- MariaDB 10.6.12
- php-fpm 8.2
- WordPress 6.4.2
Nginx 1.18.0 stable 버전 설치
#Nginx 최신 버전 확인 – Nginx 공식사이트
우분투 22.04 기본 저장소 인덱스를 갱신하고, OS를 최신상태로 만들자.
apt update -y && apt upgrade -y
우분투 22.04 기본 저장소 Nginx 설치 버전은 1.18.0 이다.
apt install nginx
#설치 버전 확인 ‘nginx -v‘ 명령어로 확인
root@techplay:~# nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
서비스가 정상적으로 실행되고 있는지 상태를 확인하기 위해 다음 명령어 ‘service nginx status‘ 명령어를 입력하여 확인 한다.
service nginx status
#정상적으로 실행중이면, 아래와 같이 출력된다.
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-11-29 22:46:07 UTC; 1 months 5 days ago
Docs: man:nginx(8)
Main PID: 79099 (nginx)
Tasks: 5 (limit: 18813)
Memory: 31.0M
CGroup: /system.slice/nginx.service
├─ 79099 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─513039 nginx: worker process
├─513040 nginx: worker process
├─513041 nginx: worker process
└─513042 nginx: worker process
Nov 29 22:46:07 techplay systemd[1]: Starting A high performance web server and a reverse proxy server...
Nov 29 22:46:07 techplay systemd[1]: Started A high performance web server and a reverse proxy server.
안내 : 아직 테스트 전인데, 요즘 배포판에서는 아래 수동 등록이 필요 없는 것으로 보인다. 배포판에서 자동으로 실행되도록 기본 설정되어 있는 것 같다. 확인은 아래 명령어로 가능하다.
# 2024-01-14 확인 결과 -> 그렇다 별도로 등록하지 않아도 된다. – Vultr 서비스 배포판 기준
systemctl list-unit-files --type=service
만약 서버를 재시작 할 경우 엔진엑스(nginx)는 일부 배포판에 따라서 자동으로 실행되지 않을 수 있다. 시스템 데몬에 등록하여 자동으로 실행되도록 설정하자.
systemctl enable nginx
위 명령어가 현대적인 시스템 데몬에 등록하는 표준 방법이며, 적용이 안될 시 아래 명령어로 등록한다.
/lib/systemd/systemd-sysv-install enable nginx
이제 브라우저를 통해, Nginx 웹서버가 정상적으로 작동하면, 아래와 같은 화면을 볼 수 있다. 아직 도메인 연동 전이므로, 서비스 받는 VPS의 공인 IP를 통해 확인한다.
화면을 볼 수 없다면, 확인해 볼 것이 있다. 로컬 호스트에서는 별문제가 없겠지만, 클라우드 서비스를 이용 중이라면, 80,443 포트는 기본적으로 보안의 이유로 닫혀 있을 것이다. 이를 아래와 같은 방법으로 통신을 할 수 있도록 개방한다.
아래 명령어로 방화벽이 작동 중 인지 확인한다. 만약 작동 중이 아닐 경우 예를 들어 아마존 서비스를 이용할 경우 별도의 방화벽 규칙을 적용해야 한다.
방화벽 상태 확인 – vultr.com 기준
ufw status
#ssh 22번 포트가 열려 있다.
root@techplay:~# ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
방화벽 앱 목록 보기
ufw app list
#이용 가능한 애플리케이션 목록 출력
OutputAvailable applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
허용할 정책 지정, 이 가이드에서는 SSL을 다루지 않으므로, 아래와 같이 지정하였지만, ‘Nginx Full’을 미리 지정하여도 된다. 또는 포트를 직접 지정이 가능하다. 예를 들어, ‘ufw allow 80’과같이 입력이 가능하다.
ufw allow 'Nginx HTTP'
#정상적으로 ‘Nginx HTTP’ 룰이 추가 되었다.
root@techplay:~# ufw allow 'Nginx HTTP'
Rule added
Rule added (v6)
root@techplay:~# ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
방화벽 재시작
ufw reload
Nginx 가상호스트 서버 블록 생성
아래 명령어로 나노(nano) 편집기를 사용하여 가상 호스트 서버 블록을 생성한다.
nano /etc/nginx/sites-available/domain.com
아래 내용을 붙여넣기 후, 내용을 저장(ctrl + o ) 하고 에디터를 종료 ( ctrl + x ) 한다.
server_name, error_log, access_log, root 웹 루트 폴더는 사용자에게 맞게 수정하여 사용.
# Virtual Host configuration for a WordPress site
# HTTP 서버 리스닝 설정
server {
listen 80; # IPv4를 위한 HTTP 포트 80 리스닝
listen [::]:80; # IPv6를 위한 HTTP 포트 80 리스닝
server_name domain.com www.domain.com; # 도메인명 설정
# 에러 로그와 엑세스 로그 경로 설정
error_log /var/log/nginx/domain_error.log; # 에러 로그 파일
access_log /var/log/nginx/domain_access.log; # 엑세스 로그 파일
# WordPress에서 큰 파일 업로드를 허용
client_max_body_size 256M;
# 웹 루트 디렉토리 및 인덱스 파일 설정
root /var/www/domain; # 웹 컨텐츠를 저장할 디렉토리
index index.php; # 인덱스 파일 설정
# 특정 리다이렉트 규칙 : 선택사항
rewrite ^/wp-content/uploads/edd/(.*)\.zip$ / permanent;
# 주 URL 처리 규칙
location / {
try_files $uri $uri/ /index.php$is_args$args; # 정적 파일 또는 index.php로 요청 처리
}
# PHP 파일 처리
location ~ \.php$ {
try_files $uri =404; # 존재하지 않는 PHP 파일에 대해 404 반환
fastcgi_split_path_info ^(.+\.php)(/.+)$; # PHP 경로 정보 분할
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # PHP-FPM 소켓으로 전달
fastcgi_index index.php; # fastcgi 인덱스 파일 설정
include fastcgi.conf; # fastcgi 관련 추가 설정 포함
}
# .user.ini 파일 접근 차단
location ~ ^/\.user\.ini {
deny all; # 모든 접근 차단
}
# robots.txt 파일에 대한 로그 설정 비활성화
location = /robots.txt {
access_log off; # 접근 로그 끄기
log_not_found off; # 찾을 수 없음 로그 끄기
}
# wp-config.php 파일 접근 차단
location = /wp-config.php {
deny all; # 모든 접근 차단
}
# 업로드된 PHP 파일 접근 차단
location ~* /(?:uploads|files)/.*\.php$ {
deny all; # 모든 접근 차단
}
# 특정 파일 타입 접근 차단
location ~* ^/wp-content/.*\.(txt|md|exe|sh|bak|inc|php|pot|po|mo|log|sql)$ {
deny all; # 모든 접근 차단
}
# 숨김 파일 및 버전 관리 시스템 파일 접근 차단
location ~ /\.(ht|svn)? {
deny all; # 모든 접근 차단
}
# xmlrpc.php 파일 접근 차단
location = /xmlrpc.php {
deny all; # 모든 접근 차단
}
# 정적 파일 캐시 및 로그 설정
location ~* ^.+\.(flv|pdf|avi|mov|mp3|wmv|m4v|webm|aac|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|webp|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
expires max; # 캐시 만료 시간 최대로 설정
add_header Pragma public; # 캐시 제어 헤더 추가
add_header Cache-Control "public"; # 캐시 제어 헤더 추가
access_log off; # 접근 로그 끄기
log_not_found off; # 찾을 수 없음 로그 끄기
}
# 폰트 파일에 대한 CORS 설정
location ~* \.(eot|ttf|woff|woff2)$ {
add_header Access-Control-Allow-Origin *; # 모든 출처에서 폰트 접근 허용
}
# 파비콘 아이콘에 대한 로그 설정 비활성화
location = /favicon.ico {
log_not_found off; # 찾을 수 없음 로그 끄기
access_log off; # 접근 로그 끄기
}
}
기본 연동되어 있는 default 블록을 연결 해제한다.
cd /etc/nginx/sites-enabled
unlink default
위에서 만든 서버블록를 활성화 한다.
ln -s /etc/nginx/sites-available/domain.com /etc/nginx/sites-enabled
엔진엑스 문법검사 – 구문에 오류가 없는지 확인한다.
nginx -t
엔진엑스 환경설정을 다시 불러온다.
nginx -s reload
PHP-FPM 8.2 설치
#PHP 최신 버전 확인-> PHP 공식사이트 or PHP watch
데비안 및 우분투에서는 최신 PHP 버전을 OS 기본 저장소(repositories1)에서 지원하지 않으므로, Ondřej Surý에서 유지관리하는 별도 저장소를 추가하여 설치한다.
apt install software-properties-common
add-apt-repository ppa:ondrej/php
아래 명령어를 실행하여 설치를 진행한다.
apt install php8.2-fpm
#'Y' 누르고 enter!
root@techplay:~# apt install php8.2-fpm
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
php8.2-cli php8.2-common php8.2-opcache php8.2-readline
Suggested packages:
php-pear
The following NEW packages will be installed:
php8.2-cli php8.2-common php8.2-fpm php8.2-opcache php8.2-readline
0 upgraded, 5 newly installed, 0 to remove and 2 not upgraded.
Need to get 4,888 kB of archives.
After this operation, 21.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y ↵
PHP 확장 모듈을 설치한다. (보통, 선택사항으로 분류하지만 경험상 대부분 다 사용되어 진다.)
apt-get install php8.2-zip php8.2-xmlrpc php8.2-gd php8.2-curl php8.2-intl php8.2-imagick php8.2-bcmath php8.2-memcached php8.2-mysql
- php8.2-zip: ZIP 압축 파일을 다루기 위한 확장.
- php8.2-xmlrpc: XML-RPC 프로토콜을 사용하기 위한 확장.
- php8.2-gd: 이미지 처리와 생성을 위한 확장.
- php8.2-curl: URL 요청을 다루기 위한 확장.
- php8.2-intl: 국제화 기능을 지원하는 확장.
- php8.2-imagick: ImageMagick을 사용하여 이미지를 조작하기 위한 확장.
- php8.2-bcmath: 고정 소수점 및 큰 숫자를 위한 확장.
- php8.2-memcached: Memcached 캐싱 시스템을 사용하기 위한 확장.
- php8.2-mysql: MySQL 데이터베이스를 사용하기 위한 확장.
PHP fpm 설치경로는 아래와 같다.
cd /etc/php/8.2/fpm
PHP 환경 설정값을 변경하기 전에 혹시 모를 사태에 대비하여 항상 백업 후 진행한다. 환경 설정값 변경은 선택사항으로 변경하지 않아도 워드프레스 실행에는 아무런 문제가 없다.
cp /etc/php/8.2/fpm/php.ini /etc/php/8.2/fpm/php.bak
에디터를 이용하여 직접 수정할 수 있지만, 아래 sed 명령어를 통해 빠르게 변경 가능하다.
sed -i "s/memory_limit = .*/memory_limit = 1024M/" /etc/php/8.2/fpm/php.ini && \
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 256M/" /etc/php/8.2/fpm/php.ini && \
sed -i "s/post_max_size = .*/post_max_size = 256M/" /etc/php/8.2/fpm/php.ini && \
sed -i "s/session.gc_maxlifetime = .*/session.gc_maxlifetime = 7200/" /etc/php/8.2/fpm/php.ini && \
sed -i "s/max_execution_time = .*/max_execution_time = 18000/" /etc/php/8.2/fpm/php.ini && \
sed -i "s/;date.timezone =/date.timezone = Asia\/Seoul/g" /etc/php/8.2/fpm/php.ini && \
sed -i "s/;max_input_vars = .*/max_input_vars = 5000/" /etc/php/8.2/fpm/php.ini
sed -i "s/max_input_time = .*/max_input_time = 60/" /etc/php/8.2/fpm/php.ini
PHP 환경설정을 워드프레스에 맞춰 변경한다. 이 값들은 테마 또는 플러그인에서 요구하는 환경에 맞게 수정하여 사용한다. 아래 명령어로 오리지널 환경설정과 변경 값을 비교할 수 있다.
diff /etc/php/8.2/fpm/php.bak /etc/php/8.2/fpm/php.ini
#비교 값 출력 결과
TIP 409c409 : 이 값의 뜻은 원본 파일(.bak) 409번 줄 값과 비교 대상 파일(.ini) 409번 줄 값이 (c)변경되었단 뜻이다.
root@techplay:/etc/php/8.2/fpm# diff /etc/php/8.2/fpm/php.bak /etc/php/8.2/fpm/php.ini
409c409
< max_execution_time = 30
---
> max_execution_time = 18000
426c426
< ;max_input_vars = 1000
---
> max_input_vars = 5000
435c435
< memory_limit = 128M
---
> memory_limit = 1024M
703c703
< post_max_size = 8M
---
> post_max_size = 256M
855c855
< upload_max_filesize = 2M
---
> upload_max_filesize = 256M
979c979
< ;date.timezone =
---
> date.timezone = Asia/Seoul
1456c1456
< session.gc_maxlifetime = 1440
---
> session.gc_maxlifetime = 7200
PHP8.2-fpm 재시작하여, 위에서 변경한 환경설정을 반영한다.
systemctl restart php8.2-fpm
#선택사항 : 시스템 데몬에 등록되지 않았다면 자동 실행을 활성화하자.
/lib/systemd/systemd-sysv-install enable php8.2-fpm
MariaDB – 데이터베이스 설치
#마리아 DB 최신 버전 확인 -> MariaDB Server – All releases
워드프레스에서 사용할 데이터베이스를 설치해 보자. 여기서는 Mysql 대안으로 오픈소스인 마리아 DB를 사용한다.
우분투 22.04에서 24년 1월 15일 기준 별도로 저장소를 추가하지 않은 기본 상태에서 설치 시 MariaDB 10.6.12 stable 버전이 설치된다. 상위 버전을 설치하고 싶으면 별도 저장소를 추가 후 진행한다.
apt install mariadb-server mariadb-client -y
정상적으로 설치가 되었는지 아래 명령어로 확인한다.
service mysql status
#정상적으로 실행 중이면 아래와 같이 보인다.
root@techplay:~# service mysql status
● mariadb.service - MariaDB 10.6.12 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 08:02:16 UTC; 53s ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 40194 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 40195 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 40197 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0>
Process: 40247 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 40249 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Main PID: 40230 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 17 (limit: 9381)
Memory: 61.3M
CPU: 264ms
CGroup: /system.slice/mariadb.service
└─40230 /usr/sbin/mariadbd
Jan 15 08:02:16 techplay mariadbd[40230]: 2024-01-15 8:02:16 0 [Note] /usr/sbin/mariadbd: ready for connections.
Jan 15 08:02:16 techplay mariadbd[40230]: Version: '10.6.12-MariaDB-0ubuntu0.22.04.1' socket: '/run/mysqld/mysqld.sock' port: 3306 Ubuntu 22.04
Jan 15 08:02:16 techplay systemd[1]: Started MariaDB 10.6.12 database server.
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40254]: Looking for 'mariadb' as: /usr/bin/mariadb
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40254]: Looking for 'mariadb-check' as: /usr/bin/mariadb-check
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40254]: This installation of MariaDB is already upgraded to 10.6.12-MariaDB.
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40254]: There is no need to run mysql_upgrade again for 10.6.12-MariaDB.
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40254]: You can use --force if you still want to run mysql_upgrade
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40262]: Checking for insecure root accounts.
Jan 15 08:02:16 techplay /etc/mysql/debian-start[40268]: Triggering myisam-recover for all MyISAM tables and aria-recover for all Aria tables
선택사항 : 데이터베이스 또한 별다른 등록없이 자동실행이 등록되어 있다. 등록되어 있지 않다면 아래 명령어로 등록하자.
/lib/systemd/systemd-sysv-install enable mariadb
보안스크립트 실행 > 반드시 실행해야할 대화형 보안 스크립트다. 그 이유는 다음과 같다.
> 데이터베이스 루트 계정에 대한 암호가 설정되어 있지 않다.
> 테스트 데이터베이스가 포함되어 있다.
> 루트 계정에대해 외부 접속을 제한한다.
> 데이터베이스 테스트(익명) 계정이 포함되어 있다.
> 위 설정으로 재시작 없이 바로 적용한다.
mysql_secure_installation
빠른진행 enter > Y > N > Y > Y >Y >Y 끝!
Unix_socket 인증으로 전환 > ‘Y’를 선택하여 Unix_socket 인증 방식을 활성화했다. 이로써 시스템의 root 사용자만 MariaDB의 root 계정에 접근할 수 있게 되었다.
Root 비밀번호 변경 건너뛰기 > 이미 root 계정이 보호되고 있었기 때문에, root 비밀번호 변경은 건너뜀(‘n’ 선택).
익명 사용자 제거>’Y’를 선택하여 MariaDB 설치 시 기본적으로 생성되는 익명 사용자를 제거, 이는 불필요한 접근을 차단하여 보안을 강화한다.
원격에서의 Root 로그인 금지 > ‘Y’를 선택하여 root 계정이 원격에서 로그인하는 것을 금지한다.
Test 데이터베이스 제거 > ‘Y’를 선택하여 MariaDB의 테스트용 데이터베이스를 제거.
권한 테이블 재로딩 > ‘Y’를 선택하여 모든 변경 사항이 즉시 적용되도록 권한 테이블을 다시 불러온다.
root@techplay:~# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
... Success!
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] Y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
워드프레스에서 사용할 데이터베이스, 계정, 암호 를 생성하고 만든 계정을 통해 워드프레스 데이터베이스를 사용 가능하도록 권한을 부여한다.
데이터베이스 명령줄 콘솔로 접속한다.
mysql -u root -p
#DB명에 사용할 데이터베이스 이름으로 넣어주면 된다. 예: ‘db_wordpress’
CREATE DATABASE db_wordpress;
#데이터베이스의 사용자를 생성한다. 예:’user_wordpress’
CREATE USER user_wordpress@localhost;
#데이터베이스 명 ‘db_wordpress’ 의 사용자 ‘user_wordpress’ 의 암호를 생성한다. 예:my_password
SET PASSWORD FOR user_wordpress'@localhost=PASSWORD("my_password");
#데이터베이스 사용자 ‘user_wordpress’ 에게 데이터베이스 ‘db_wordpress’에 사용 권한을 부여한다.
GRANT ALL PRIVILEGES ON db_wordpress.* TO user_wordpress@localhost IDENTIFIED BY 'my_password';
#권한 테이블을 갱신하고 즉시 적용한다.
FLUSH PRIVILEGES;
#위 과정을 한눈에 보기
MariaDB [(none)]> CREATE DATABASE db_wordpress;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> CREATE USER user_wordpress@localhost;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SET PASSWORD FOR 유저명@localhost=PASSWORD("암호");
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON db_wordpress.* TO user_wordpress@localhost IDENTIFIED BY '암호';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> exit;
워드프레스에서 사용할 데이터베이스와 사용자, 암호를 생성하였다. 위 정보는 워드프레스 설치시 ‘wp-config.php’ 에 해당 정보를 기입한다.
워드프레스 설치
#워드프레스 최신 버전 확인 -> Releases – WordPress News
대단원의 마지막 단계로, 최종 목표인 워드프레스 설치를 위해 우리는 위의 여러 과정을 거쳤다. 이러한 과정은 서버의 스택을 최대한 최신 상태로 유지할 수 있으며, 공유 호스팅보다 빠르게 보안패치 스택 버전업 등을 적용할 수 있다. 이러한 이유로 보다 안전하고 쾌적한 워드프레스 운영이 가능하게 된다.
임시 폴더로 이동 후, 최신 워드프레스 버전을 다운로드하도록 하자.
cd /tmp; curl -O https://wordpress.org/latest.tar.gz;
다운로드한 워드프레스 최신 버전을 압축 해제한다.
tar xzvf latest.tar.gz
‘wp-config.php’ 파일을 설정하기 위해 샘플 파일을 복사하여 사용한다.
cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php
나노(nano) 에디터를 사용하여 ‘wp-config.php’ 파일을 수정한다. 데이터베이스 설치 단원에서 만들어둔, DB 명, 유저명, 암호를 입력한다. 반드시 솔트 키값을 설정하여 보안을 강화하자.
nano /tmp/wordpress/wp-config.php
#데이터베이스 정보 입력
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', '데이터베이스명');
/** MySQL database username */
define('DB_USER', '데이터베이스_사용자');
/** MySQL database password */
define('DB_PASSWORD', '데이터베이스_사용자_암호');
/** MySQL hostname */
define('DB_HOST', 'localhost');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8mb4');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
$table_prefix = 'wp_'; /* 보안을 위해 프릭픽스 변경 권장 */
워드프레스 보안키 생성 주소에서 키값을 복사하여, 아래 해당 부분을 찾아서 붙여넣자. – 워드프레스 공식사이트 에서는 주기적으로 변경할 것을 보안상 권장하고 있다.
define('AUTH_KEY', 'your unique phrase here');
define('SECURE_AUTH_KEY', 'your unique phrase here');
define('LOGGED_IN_KEY', 'your unique phrase here');
define('NONCE_KEY', 'your unique phrase here');
define('AUTH_SALT', 'your unique phrase here');
define('SECURE_AUTH_SALT', 'your unique phrase here');
define('LOGGED_IN_SALT', 'your unique phrase here');
define('NONCE_SALT', 'your unique phrase here');
#Define 각줄에 대한 간략 설명은 아래와 같다.
AUTH_KEY > 사용자가 로그인할 때 사용되는 쿠키에 대한 인증 키값, 쿠키 데이터를 암호화하고 사이트 로그인 과정의 보안에 관여한다.
SECURE_AUTH_KEY > SSL(HTTPS)을 통해 로그인할 때 사용되는 인증 키값, 보안 로그인 세션을 위한 추가 보안 계층을 제공한다.
LOGGED_IN_KEY > 사용자가 로그인 상태를 유지하는 동안 사용되는 키값, 로그인한 사용자의 쿠키를 암호화하고, 로그인 상태를 유지하게 한다.
NONCE_KEY > ‘nonce'(number used once의 약자) 값을 생성하는 데 사용되는 키값, 워드프레스의 보안 메커니즘 CSRF(크로스 사이트 요청 위조) 공격을 방지한다.
나머지 SALT 키 값들 (AUTH_SALT, SECURE_AUTH_SALT, LOGGED_IN_SALT, NONCE_SALT)은 위 키들과 함께 작동하여, 인증 쿠키를 좀더 복잡하게 만들어 보안을 강화해 준다.
https://api.wordpress.org/secret-key/1.1/salt/
wp-config.php 파일을 모두 수정하였다면 파일을 저장한다. 다음은 선택사항으로 ‘upgrade’폴더를 만들어 두 자.
mkdir /tmp/wordpress/wp-content/upgrade
워드프레스 웹 루트 폴더를 만든다. 도메인명으로 폴더를 만들면 나중에 관리가 편하다,
mkdir /var/www/domain.com
현재 임시 폴더(/tmp)에 압축 해제한 WordPress 폴더와 파일을 이동시킨다.
mv wordpress/* /var/www/domain.com
다운로드한 워드프레스 파일과 폴더를 정리한다.
rmdir wordpress && rm latest.tar.gz
소유자 변경과 데이터 확인을 위해 디렉터리 이동
cd /var/www
root 계정으로 진행했으므로, 폴더와 파일들의 그룹과 사용자를 ‘www-data’로 변경한다. 파일 퍼미션은 수정할 필요가 없다.
chown -R www-data:www-data /var/www/domain.com/
브라우저에서 워드프레스를 설치하고자 하는 자신의 도메인 주소를 입력하면 아래와 같은 화면을 볼 수 있다.
#설치 초기화면 : 언어 선택
- 언어 선택 : 한글은 번역이 이상하게 되어 있어, 항상 영문으로 선택하여 사용한다.
- ‘계속(continue) 버튼’을 눌러 설치를 계속 진행한다.
#설치 1단계 : 정보 입력
- 사이트명 – 자신이 짓고자 하는 사이트명을 입력한다.
- 최고 관리자 아이디 입력
- 최고 관리자 암호 입력 – 초기에 강력한 암호가 자동으로 입력되니, 계속 사용하려면 별도로 기록해두자.
- 최고 관리자 이메일 주소 입력 – 비밀번호 찾기, 로그인, 여러 알림 등을 받기 위해서 필수로 잘 사용하는 메일로 기록하자.
- ‘워드프레스 설치 (Install WordPress)’ 버튼을 눌러 설치를 계속 이어가자.
안내 : 대게 VPS 서비스 업체는 메일 포트를 스팸 메일 발송 남용으로 인한 자원 낭비, 호스팅 업체의 퍼블릭 IP 평판 하락 우려, 보안 등의 목적으로 허용하지 않는다. 메일 전송을 위해서는 다른 포트를 사용하는 서비스를 이용하던지, 메일 포트 허용을 서비스 업체에 별도로 요청해야 한다.
#설치 2단계 : 정보확인
- ‘성공! (Success!)’이란 메세지가 보인다. 드디어 설치가 끝났다. ‘로그인 (Log In)’ 버튼을 눌러 다음 화면으로 넘어가자.
#설치 3단계 : 관리자 로그인
- 앞서 설치 1단계에서 입력한 관리자 아이디를 입력하거나 관리자 이메일 주소를 입력한다.
- 최고 관리자 암호를 입력한다.
- 로그인(Log In) 버튼을 눌러 로그인 한다.
#관리자 화면 : 로그인에 성공하면, 아래와 같이 관리자 화면으로 진입한다.
- 좌 상단에 마우스을 올리면, ‘Visit Site’ 가 나온다. 눌러서 사이트 메인페이지를 확인해 보자.
#워드프레스 기본 테마 ‘Twenty Twenty-Four’
드디어 마무리되었다. 모든 과정을 순조롭게 잘 따라서 진행하였다면, 위와 같이 워드프레스 테마 ‘Twenty Twenty-Four’를 볼 수 있다. 매년 기본 테마가 바뀐다. 워드프레스에는 정말 다양한 테마가 존재하며, 원하는 테마를 입맛대로 고를 수가 있다. 이제부터 자신만의 홈페이지, 블로그, 쇼핑몰 등 원하는 형태로 수정하여 사용하면 된다.
마무리
이 가이드를 만들게 된 이유는 워드프레스에 대한 올바른 설치 방법에 대해 공유 및 기록하여, 이것을 통해 누군가에게 수익을 창출할 수 있는 기회를 제공하고자 한다. 실제로 워드프레스 수요는 상당하다. 사전 설치되어 있는 워드프레스는 이렇게 직접 설치하고 관리되는 사이트의 성능을 따라잡을 수가 없으며, 그 유연성은 말할 것도 없다.
- repositories 리포지토리(저장소) : 우분투 OS 소프트웨어 패키지를 설치하고 관리하는 서버를 말한다. 각 저장소는 수많은 패키지를 포함하고, 소프트웨어 설치, 업그레이드 및 시스템 유지 보수에 필수적 이다. ↩︎