여기서는 우분투 18.04 서버 + LEMP stack (Linux, Nginx, MySQL, and PHP) 기반으로 워드프레스를 설치하는 방법을 알아본다.
Prerequisites
본격적인 진행에 앞서 다음의 준비를 마쳐야 한다.
- sudo 사용자 생성
- LEMP 스택 설치 : 이미 앞선 게시물에서 별도로 다룬바 있다
- SSL 을 통한 사이트 보안
Step 1 — Creating a MySQL Database and User for WordPress
워드프레스는 MySQL 을 이용하여 사이트 데이터를 관리하고 저장한다. 앞서 MySQL 은 이미 설치를 마쳤고, 본 단계에서는 워드프레스에서 사용할 데이터베이스와 사용자를 생성한다.
먼저 root (administrative) 계정으로 MySQL 에 접속한다. 만약 기본설정인 auth_socket 인증 플러그인을 사용중이라면 sudo 를 이용하여 MySQL 에 접속할 수 있다. 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | (dominika) founder@hilbert:~/dominika$ sudo mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.24-0ubuntu0.18.04.1 (Ubuntu) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> | cs |
만약 인증방법을 패스워드 사용으로 바꾸었으면 다음 포맷으로 로그인을 하면 된다.
1 | (dominika) founder@hilbert:~/dominika$ mysql -u root -p | cs |
먼저 워드프레스가 컨트롤할 수 있는 별도의 데이터베이스를 만들자. 그 데이터베이스 이름을 본 가이드에서는 redsparrow 라고 편의상 부르기로 한다. 다음과 같이 데이터베이스를 생성할 수 있다.
1 2 3 | mysql> CREATE DATABASE redsparrow DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; Query OK, 1 row affected (0.02 sec) | cs |
MySQL 명령문은 반드시 세미 콜론 (;) 으로 끝나야되는 점에 주의한다.
다음으로 별도의 MySQL 사용자 계정을 생성한다. 다음의 명령문으로 계정을 생성하고, 암호를 입력하고, 방금 생성한 데이터베이스에 접근 권한을 부여할 수 있다.
1 2 3 4 5 | mysql> GRANT ALL ON redsparrow.* TO 'jennifer'@'localhost' IDENTIFIED BY '***********'; Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> | cs |
이제 워드프레스 사용을 위한 데이터베이스와 사용자 계정 생성을 마쳤다. 현재 인스턴스가 변경사항을 인지할 수 있도록 flush 명령을 사용하자.
1 | mysql> FLUSH PRIVILEGES; | cs |
exit 로 해당 쉘을 빠져나온다.
1 2 3 4 | mysql> exit Bye | cs |
Step 2 — Installing Additional PHP Extensions
앞서 LEMP 스택을 설치할 때, PHP 가 MySQL 과 통신하기 위한 최소한의 익스텐션만 요구했음을 기억하자. 워드프레스와 많은 플러그인은 추가적인 PHP 익스텐션을 요구한다. 다음과 같이 유용한 PHP 익스텐션을 다운로드 받아 설치할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 | (dominika) founder@hilbert:~/dominika$ sudo apt update Hit:1 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic InRelease Get:2 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] Get:3 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] Hit:4 https://packages.microsoft.com/repos/vscode stable InRelease Hit:5 http://archive.canonical.com/ubuntu bionic InRelease Get:6 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB] Fetched 247 kB in 1s (179 kB/s) Reading package lists... Done Building dependency tree Reading state information... Done 47 packages can be upgraded. Run 'apt list --upgradable' to see them. | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | (dominika) founder@hilbert:~/dominika$ sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip Reading package lists... Done Building dependency tree Reading state information... Done The following package was automatically installed and is no longer required: grub-pc-bin Use 'sudo apt autoremove' to remove it. The following additional packages will be installed: libxmlrpc-epi0 libzip4 php7.2-curl php7.2-gd php7.2-intl php7.2-mbstring php7.2-soap php7.2-xml php7.2-xmlrpc php7.2-zip The following NEW packages will be installed: libxmlrpc-epi0 libzip4 php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip php7.2-curl php7.2-gd php7.2-intl php7.2-mbstring php7.2-soap php7.2-xml php7.2-xmlrpc php7.2-zip 0 upgraded, 18 newly installed, 0 to remove and 47 not upgraded. Need to get 1001 kB of archives. After this operation, 3715 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 libzip4 amd64 1.1.2-1.1 [37.8 kB] Get:2 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 php7.2-curl amd64 7.2.10-0ubuntu0.18.04.1 [28.9 kB] Get:3 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 php-curl all 1:7.2+60ubuntu1 [1996 B] Get:4 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 php7.2-gd amd64 7.2.10-0ubuntu0.18.04.1 [27.1 kB] Get:5 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 php-gd all 1:7.2+60ubuntu1 [1996 B] Get:6 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 php7.2-intl amd64 7.2.10-0ubuntu0.18.04.1 [124 kB] Get:7 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 php-intl all 1:7.2+60ubuntu1 [2012 B] Get:8 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 php7.2-mbstring amd64 7.2.10-0ubuntu0.18.04.1 [483 kB] Get:9 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 php-mbstring all 1:7.2+60ubuntu1 [2008 B] Get:10 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 php7.2-soap amd64 7.2.10-0ubuntu0.18.04.1 [113 kB] Get:11 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 php-soap all 1:7.2+60ubuntu1 [2000 B] Get:12 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 php7.2-xml amd64 7.2.10-0ubuntu0.18.04.1 [107 kB] Get:13 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 php-xml all 1:7.2+60ubuntu1 [2024 B] Get:14 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libxmlrpc-epi0 amd64 0.54.2-1.2 [30.5 kB] Get:15 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 php7.2-xmlrpc amd64 7.2.10-0ubuntu0.18.04.1 [12.7 kB] Get:16 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 php-xmlrpc all 1:7.2+60ubuntu1 [2004 B] Get:17 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 php7.2-zip amd64 7.2.10-0ubuntu0.18.04.1 [20.3 kB] Get:18 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 php-zip all 1:7.2+60ubuntu1 [1996 B] Fetched 1001 kB in 5s (211 kB/s) Selecting previously unselected package libzip4:amd64. (Reading database ... 90845 files and directories currently installed.) Preparing to unpack .../00-libzip4_1.1.2-1.1_amd64.deb ... Unpacking libzip4:amd64 (1.1.2-1.1) ... Selecting previously unselected package php7.2-curl. Preparing to unpack .../01-php7.2-curl_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-curl (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-curl. Preparing to unpack .../02-php-curl_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-curl (1:7.2+60ubuntu1) ... Selecting previously unselected package php7.2-gd. Preparing to unpack .../03-php7.2-gd_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-gd (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-gd. Preparing to unpack .../04-php-gd_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-gd (1:7.2+60ubuntu1) ... Selecting previously unselected package php7.2-intl. Preparing to unpack .../05-php7.2-intl_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-intl (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-intl. Preparing to unpack .../06-php-intl_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-intl (1:7.2+60ubuntu1) ... Selecting previously unselected package php7.2-mbstring. Preparing to unpack .../07-php7.2-mbstring_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-mbstring (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-mbstring. Preparing to unpack .../08-php-mbstring_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-mbstring (1:7.2+60ubuntu1) ... Selecting previously unselected package php7.2-soap. Preparing to unpack .../09-php7.2-soap_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-soap (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-soap. Preparing to unpack .../10-php-soap_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-soap (1:7.2+60ubuntu1) ... Selecting previously unselected package php7.2-xml. Preparing to unpack .../11-php7.2-xml_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-xml (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-xml. Preparing to unpack .../12-php-xml_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-xml (1:7.2+60ubuntu1) ... Selecting previously unselected package libxmlrpc-epi0:amd64. Preparing to unpack .../13-libxmlrpc-epi0_0.54.2-1.2_amd64.deb ... Unpacking libxmlrpc-epi0:amd64 (0.54.2-1.2) ... Selecting previously unselected package php7.2-xmlrpc. Preparing to unpack .../14-php7.2-xmlrpc_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-xmlrpc (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-xmlrpc. Preparing to unpack .../15-php-xmlrpc_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-xmlrpc (1:7.2+60ubuntu1) ... Selecting previously unselected package php7.2-zip. Preparing to unpack .../16-php7.2-zip_7.2.10-0ubuntu0.18.04.1_amd64.deb ... Unpacking php7.2-zip (7.2.10-0ubuntu0.18.04.1) ... Selecting previously unselected package php-zip. Preparing to unpack .../17-php-zip_1%3a7.2+60ubuntu1_all.deb ... Unpacking php-zip (1:7.2+60ubuntu1) ... Setting up php7.2-gd (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/gd.ini with new version Setting up php7.2-xml (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/dom.ini with new version Creating config file /etc/php/7.2/mods-available/simplexml.ini with new version Creating config file /etc/php/7.2/mods-available/wddx.ini with new version Creating config file /etc/php/7.2/mods-available/xml.ini with new version Creating config file /etc/php/7.2/mods-available/xmlreader.ini with new version Creating config file /etc/php/7.2/mods-available/xmlwriter.ini with new version Creating config file /etc/php/7.2/mods-available/xsl.ini with new version Processing triggers for php7.2-fpm (7.2.10-0ubuntu0.18.04.1) ... Setting up php7.2-curl (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/curl.ini with new version Setting up php-curl (1:7.2+60ubuntu1) ... Setting up php7.2-mbstring (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/mbstring.ini with new version Setting up php-xml (1:7.2+60ubuntu1) ... Setting up php7.2-soap (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/soap.ini with new version Setting up libzip4:amd64 (1.1.2-1.1) ... Setting up libxmlrpc-epi0:amd64 (0.54.2-1.2) ... Processing triggers for libc-bin (2.27-3ubuntu1) ... Setting up php-mbstring (1:7.2+60ubuntu1) ... Setting up php7.2-intl (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/intl.ini with new version Setting up php-gd (1:7.2+60ubuntu1) ... Setting up php-intl (1:7.2+60ubuntu1) ... Setting up php7.2-xmlrpc (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/xmlrpc.ini with new version Setting up php7.2-zip (7.2.10-0ubuntu0.18.04.1) ... Creating config file /etc/php/7.2/mods-available/zip.ini with new version Setting up php-soap (1:7.2+60ubuntu1) ... Setting up php-zip (1:7.2+60ubuntu1) ... Setting up php-xmlrpc (1:7.2+60ubuntu1) ... Processing triggers for php7.2-fpm (7.2.10-0ubuntu0.18.04.1) ... | cs |
설치가 끝났으면 새롭게 설치한 기능들이 반영되도록 PHP 프로세서를 구동하는 PHP-FPM 프로세스를 재시작한다.
1 | (dominika) founder@hilbert:~/dominika$ sudo systemctl restart php7.2-fpm | cs |
이제 필요한 PHP 익스텐션을 모두 갖췄다.
Step 3 — Configuring Nginx
이제 nGINX 서버 블락 파일에 몇 가지 소소한 설정을 해볼 것이다. 앞선 LEMP 스택 설치가 완료되었다고 가정한다. 여기서는 /etc/nginx/sites-available/dominika.com 을 설정 파일로 사용할 것이다. 이 부분은 설정에 맞게 고쳐서 본 가이드를 따라하자. 그리고 /var/www/html 를 워드프레스를 설치할 루트 디렉토리로 사용할 것이다. 사이트의 서버 블락 파일을 sudo 권한으로 오픈한다.
1 | (dominika) founder@hilbert:~/dominika$ sudo nano /etc/nginx/sites-available/dominika.com | cs |
메인 서버 블락 안에 몇 개의 로케이션 블록을 넣도록 하자. 정규표현식을 사용하여 아래 빨간 텍스트의 내용을 추가한다.
/etc/nginx/sites-available/dominika.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name example.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } | cs |
/ 로케이션 블록안에 기존의 내용을 주석처리하고 다음과 같은 내용으로 try_files 을 수정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name example.com; location / { #try_files $uri $uri/ =404; try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } | cs |
저장하고 파일을 닫는다.
구문 오류가 없는지 검증해보자.
1 2 3 | (dominika) founder@hilbert:~/dominika$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful | cs |
1 | (dominika) founder@hilbert:~/dominika$ sudo systemctl reload nginx | cs |
그럼 워드프레스를 다운로드 받아서 셋팅을 해보자.
Step 4 — Downloading WordPress
이제 워드프레스를 다운로드 받아보자. 보안상의 이유로 최신 버전을 받기를 권장한다. 쓰기 가능한 디렉토리로 이동한 후 다음과 같이 최신 버전을 다운로드 받아 압축을 풀도록 하자.
1 2 3 4 5 | (dominika) founder@hilbert:~/dominika$ cd /tmp (dominika) founder@hilbert:/tmp$ curl -LO https://wordpress.org/latest.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 8538k 100 8538k 0 0 692k 0 0:00:12 0:00:12 --:--:-- 764k | cs |
압축된 파일을 워드프레스 디렉토리에 푼다.
1 2 3 | (dominika) founder@hilbert:/tmp$ tar xzvf latest.tar.gz wordpress/ | cs |
압축해제한 파일을 도큐먼트 루트로 이동시키기에 앞서, 샘플 환경설정 파일부터 복사를 해두자.
1 | (dominika) founder@hilbert:/tmp$ cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php | cs |
이제 워드프레스 디렉토리의 모든 파일을 도큐먼트 루트로 이동시킨다. -a 플래그를 이용하여 권한이 그래도 유지되도록 한다. 소스 디렉토리 맨 마지막에 . 을 포함하여 숨겨진 파일을 포함하여 해당 디렉토리의 모든 내용이 복사되도록 한다.
1 | (dominika) founder@hilbert:/tmp$ sudo cp -a /tmp/wordpress/. /var/www/html | cs |
이제 www-data 사용자와 그룹에 소유권을 부여할 차례다. 이는 Nginx 를 구동시킬 때 필요한 사용자 계정 및 그룹으로, Nginx 는 웹사이트 서비스 제공 및 자동 업데이트를 위해 해당 디렉토리에 읽기/쓰기 권한이 필요하기 때문이다.
1 | (dominika) founder@hilbert:/tmp$ sudo chown -R www-data:www-data /var/www/html | cs |
Step 5 — Setting up the WordPress Configuration File
메인 워드프레스 설정 파일을 변경해야 한다. 워드프레스는 보안생성기를 제공하고 있는데, 이를 활용하여 설치에 필요한 보안키들을 생성하자.
1 | (dominika) founder@hilbert:/tmp$ curl -s https://api.wordpress.org/secret-key/1.1/salt/ | cs |
실행하면 다음과 같은 유일한 값들을 받게 될 것이다.
내용을 복사한 다음 워드프레스 설저어 파일을 열어보자.
1 | (dominika) founder@hilbert:/tmp$ sudo nano /var/www/html/wp-config.php | cs |
아래 부분을 찾아서 위의 값으로 대체한다. 해당 라인을 모두 지운 후 복사한 값을 붙여넣자.
/var/www/html/wp-config.php
다음으로 데이터베이스 설정을 수정하자. 데이터베이스 이름, 사용자, 그리고 MySQL 내에 설정했던 패스워드 등의 정보를 입력해야 한다. 그리고 하나 더 파일시스템 쓰기와 관련한 메서드 설정이다. 우리의 경우는 필요한 곳에 쓰기 퍼미션을 부여했으므로, "direct" 라고 설정해야 한다. 이 부분 설정이 잘못되면 가끔 FTP 인증을 하라는 메시지가 뜨게 된다. 설정 파일 어디에든 아래 라인을 삽입하면 된다.
1 | define('FS_METHOD', 'direct'); | cs |
아래와 같은 모양일 것이다. 저장하고 파일을 닫는다.
/var/www/wordpress/wp-config.php
Step 6 — Completing the Installation Through the Web Interface
이것으로 서버 환경 설정은 끝났다. 이제 웹인터페이스에서 나머지 설치작업을 하도록 하자.
웹브라우저를 열고, 도메인 이름 또는 ip 주소를 입력한다. 이후 프로세스를 진행하면 되겠다.
원문보기 https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lemp-on-ubuntu-18-04