NGINX와 NGINX Unit 앱 서버로 WordPress 설치

WordPress 는 오늘날 가장 인기 있는 Open Source 콘텐츠 관리 시스템(CMS) 중 하나이며, 모든 웹사이트의 30% 이상이 온라인 웹 애플리케이션을 호스팅 하는데 사용합니다. WordPress는 PHP로 작성되었으며 PHP와 WordPress 모두 NGINX의 새로운 동적 애플리케이션 서버인 NGINX Unit에서 실행할 수 있습니다.

이전에는 NGINX와 함께 WordPress를 배포하려면 Apache 또는 PHP‑FPM과 같은 별도의 애플리케이션 서버를 사용해야 했습니다. NGINX Unit은 PHP와 함께 Go, Perl, Python 및 Ruby를 지원하여 더 유연해졌습니다.

NGINX Unit을 사용하면 RESTful JSON API를 사용하여 서비스 중단이나 구성 Reload 없이 애플리케이션 서버를 동적으로 설정하고 변경할 수 있습니다. 이렇게 하면 실제 관리가 더 쉬워지고 관리 작업의 일부 또는 전체를 훨씬 쉽게 자동화할 수 있습니다.

이 포스트에서는 Ubuntu 16.04를 실행하는 호스트의 “LEMU” 스택(Linux, NGINX 오픈 소스, MySQL 또는 MariaDB 및 NGINX Unit)에 WordPress를 설정하는 방법을 설명합니다.

먼저 아키텍처에 대해 설명합니다. 그런 다음 데이터베이스, 애플리케이션 언어, 애플리케이션 서버, 마지막으로 웹 서버 및 Load Balancer를 설치하는 방법을 보여줍니다. 이렇게 하면 설치의 모든 단계를 검증하여 오류 발생 시 문제 해결을 단순화할 수 있습니다.

목차

1. 전제조건
2. WordPress 아키텍처 개요
3. MySQL 설치
4. MySQL 데이터베이스 및 WordPress 사용자 생성
5. WordPress 설치
6. WordPress 보안 및 구성
7. PHP 설치
8. NGINX Unit 설치
9. NGINX Unit 구성
10. NGINX Open Source 설치
11. NGINX Open Source 구성
12. NGINX Plus의 향상된 기능

1. 전제조건

  • NGINX Unit이 지원하는 배포판 중 하나를 실행하는 호스트(이 포스트에서는 Ubuntu 16.04를 사용하고 있습니다)
  • root 권한 또는 sudo를 통한 동등한 액세스

2. WordPress 아키텍처 개요

WordPress 는 상당히 표준적인 Three ‑ Tier 웹 애플리케이션입니다. 여기에는 PHP 프로세서에 의해 실행되어야 하는 PHP 스크립트와 웹 서버에 의해 전달되어야 하는 정적 파일이 포함됩니다.

Diagram of WordPress with NGINX Unit

간단한 WordPress 애플리케이션 아키텍처

그러나 WordPress 에는 두 가지 다른 URL 체계가 있습니다.

  • Direct URL. PHP 파일을 직접 요청하는 사용자의 경우(예: GET /wp-admin/admin.php 사용) 애플리케이션 서버는 필요한 PHP 파일을 열고 처리해야 합니다.
  • User ‑ Friendly URL. 대부분의 WordPress 관리자는 /index.php?p=123, /index.php?p=234 또는 /index.php?p=4567 대신 /blog, /products/software 또는 /store와 같은 의미 있는 URL을 선호합니다. .

WordPress는 파일 시스템에 User‑Friendly 파일과 폴더를 생성하지 않습니다. 대신 웹 서버나 애플리케이션 서버가 알 수 없는 파일에 대한 모든 요청을 /index.php로 보낼 것으로 예상합니다.

NGINX Unit

NGINX Open Source 및 NGINX Unit을 사용하면 두 개의 URL 체계가 별도의 위치에서 실행되는 두 개의 별도 애플리케이션으로 구성됩니다.

3. MySQL 설치

새로운 WordPress 설치의 핵심 필수 구성 요소 중 하나는 사용자 계정 및 사이트 데이터를 저장하는 데이터베이스입니다. 이 포스트에서는 MySQL을 사용하고 있습니다.

Note: 각 작업에 대한 자세한 설명은 설치 보안 에 대한 MySQL 설명서를 참조하십시오.

1. MySQL 설치 및 구성:

$ sudo apt-get install mysql-server

2. Prompt가 표시되면 새 MySQL root Password를 입력하십시오.

Prompt

3. MySQL 구성 도구를 실행하고 Prompt에 응답합니다.

$ sudo mysql_secure_installation
VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It
checks the strength of password and allows the users to set only those passwords
which are secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

By default, a MySQL installation has an anonymous user, allowing anyone to log
into MySQL 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? (Press y|Y for Yes, any other key for No) :

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? (Press y|Y for Yes, any other key for No) :

By default, MySQL 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? (Press y|Y for Yes, any other key for No) :

Reloading the privilege tables will ensure that all changes made so far will take
effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

All done!

4. MySQL 데이터베이스 및 WordPress 사용자 생성

이제 MySQL이 설치되었으므로 WordPress 콘텐츠를 저장할 데이터베이스와 데이터베이스 관리 권한이 있는 사용자 계정을 만듭니다.

주황색 값은 이 포스트에서 사용하는 예제입니다. 배포에 적합한 값으로 대체하십시오.

1. MySQL root 계정에 로그인합니다:

$ sudo mysql -u root -p

2. WordPress에서 사용할 데이터베이스를 만듭니다.

mysql> CREATE DATABASE wordpress;

3. WordPress 사용자 및 암호를 만듭니다.

mysql> CREATE USER user@localhost IDENTIFIED BY 'secure_password';

4. 새로 생성된 사용자에게 권한을 부여합니다.

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO user@localhost;

5. MySQL이 변경 사항을 인식하도록 합니다.

mysql> FLUSH PRIVILEGES;

6. MySQL 종료:

mysql> Exit
Bye

5. WordPress 설치

이 포스트에서는 임시 디렉토리에 WordPress 설치를 준비하고 나중에 파일을 문서 root로 이동합니다.

1. 디렉토리를 /var/www로 변경합니다.

$ cd /var/www/

2. 최신 버전의 WordPress를 다운로드하고 파일의 압축을 풉니다.

$ sudo wget http://wordpress.org/latest.tar.gz
$ sudo tar xzvf latest.tar.gz

6. WordPress 보안 및 구성

WordPress를 구성하는 빠르고 간단한 방법으로 WordPress에서 제공하는 샘플 구성 파일의 복사본으로 시작하여 몇 가지 수정을 수행합니다.

1. 샘플 구성 파일의 복사본을 만들고 이름을 wp-config.php로 지정합니다.

$ cd /var/www/wordpress
$ sudo cp wp-config-sample.php wp-config.php

2. 보안을 강화하기 위해 WordPress Salt 기능을 사용하여 새로운 Secret Key를 무작위로 생성합니다. Key를 변경하면 관리자가 모든 사용자가 다시 로그인하도록 강제할 수 있습니다.

Output은 다음과 유사합니다. 4단계에서 Output 값을 wp-config.php로 복사합니다.

$ curl -s https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY',         '3LJ|w/!Fit|/mo]>XLxWU+dG+7N+)64Y.KVVNoQ#X}1.s[os');
define('SECURE_AUTH_KEY',  ')%C_q0{RNEe1+A{>C=#|y3c2} e J)AsxXq}z0H;x#$0J{o{');
define('LOGGED_IN_KEY',    '@hD(g;-os^||uVI%6&`U1WI3YIz)F:7&Y%[jW]@DawoP{]A[');
define('NONCE_KEY',        'fVv:A3(XNG`fXNi6Pmg#4,UnX)K|t8+jO{iv7g2Fay&kDJzV');
define('AUTH_SALT',        ']s2/a`+2z~5+c6g)f-^h~D,@7C(eNr63x}Zz[)H]:!>=Q5(f');
define('SECURE_AUTH_SALT', 'Xw8x`IO.,@Y6l5)NK9)#!8V?s=&nzwXLRIwiBc,k];k3_%Fo');
define('LOGGED_IN_SALT',   '3<.D-+I#Lr6+~We@1+~%LO=s9FHkgxV+w-l-S8g%BVC:dMD<');
define('NONCE_SALT',       'UVc/gj1Mjh*Tcl|9aq)YR|1!045=-2VpxNXrDNl>})9-Q>[x');

3. 원하는 텍스트 편집기를 사용하여 wp-config.php를 엽니다. 여기서는 nano를 사용합니다.

$ sudo nano wp-config.php

4. wp-config.php에서 다음 행을 찾아 주황색 텍스트를 MySQL 데이터베이스 및 WordPress 사용자 만들기의 2단계와 3단계에서 정의한 데이터베이스 이름과 암호로 바꿉니다. 해당 섹션에 사용된 사용자 이름을 wpuser 또는 유사한 값으로 대체합니다.

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wpuser');

/** MySQL database password */
define('DB_PASSWORD', 'secure_password');

5. wp-config.php와 2단계에서 salt에 의해 생성된 값의 각 사본에서 다음 행을 찾으십시오.

define('AUTH_KEY',         'value generated by salt');
define('SECURE_AUTH_KEY',  'value generated by salt');
define('LOGGED_IN_KEY',    'value generated by salt');
define('NONCE_KEY',        'value generated by salt');
define('AUTH_SALT',        'value generated by salt');
define('SECURE_AUTH_SALT', 'value generated by salt');
define('LOGGED_IN_SALT',   'value generated by salt');
define('NONCE_SALT',       'value generated by salt');

6. 파일을 저장한 후 종료합니다.

7. 사용자에 대해 다음 read‑write 권한을 설정합니다(wpuser를 적절한 이름으로 대체).

$ sudo chown -R wpuser:www-data /var/www/wordpress
$ sudo find /var/www/wordpress -type d -exec chmod g+s {} \;
$ sudo chmod g+w /var/www/wordpress/wp-content
$ sudo chmod -R g+w /var/www/wordpress/wp-content/themes
$ sudo chmod -R g+w /var/www/wordpress/wp-content/plugins

7. PHP 설치

NGINX Unit을 설치하기 전에 PHP 및 관련 확장 프로그램을 설치하는 것이 좋습니다. WordPress의 경우 NGINX Unit의 종속성 목록에 없는 여러 확장이 필요합니다.

다음 섹션의 지침에 따라 미리 Build된 NGINX Unit 패키지를 설치하면 패키지 관리자가 올바른 종속성을 다운로드합니다. 우리가 사용하고 있는 OS 버전인 Ubuntu 16.04의 경우 종속성은 PHP 7.0을 기반으로 하지만 OS 버전에 대한 올바른 값으로 대체합니다. 예를 들어 CentOS 7.0의 경우 종속성은 PHP 5.4에 대한 것입니다. Ubuntu 18.04의 경우 PHP 7.3용입니다.

Ubuntu 16.04를 사용하여 WordPress에서 가장 일반적으로 사용되는 PHP 7.0 확장을 설치합니다(OS 버전에 따라 조정):

$ sudo apt-get install -y php7.0 php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt

8. NGINX Unit 설치

1. NGINX Unit 설명서의 지침에 따라 운영 체제용으로 미리 컴파일된 NGINX Unit 패키지를 설치합니다.

2. PHP용 추가 NGINX Unit 모듈을 설치합니다.

$ sudo apt-get install unit-php

3. 다음 명령을 실행하여 NGINX Unit 및 PHP가 예상대로 작동하는지 확인합니다.

$ sudo service unit restart
$ sudo curl -X PUT --data-binary @/usr/share/doc/unit-php/examples/unit.config --unix-socket /run/control.unit.sock http://localhost/config 
$ curl http://localhost:8300/

phpinfo 페이지가 나타나면 NGINX Unit이 올바르게 설치된 것입니다. 그렇지 않은 경우 NGINX Unit 문제 해결 가이드를 참조하세요.

9. NGINX Unit 구성

다음 지침에서는 WordPress 용 JSON 형식 구성 파일을 만들고 NGINX Unit API를 사용하여 NGINX Unit에 Load합니다. 그러면 이전 섹션의 3단계에서 Load한 초기 NGINX Unit 테스트 구성이 즉시 업데이트됩니다.

1. WordPress 구성 파일을 저장할 위치로 디렉토리를 변경합니다(/var/www/wordpress 사용).

$ cd /var/www/wordpress

2. 원하는 텍스트 편집기를 사용하여 wordpress.config라는 새 파일을 만듭니다. 이전과 마찬가지로 nano를 사용하고 있습니다.

$ sudo nano wordpress.config

3. 다음 내용을 복사하고 파일을 저장합니다.

{
    "listeners": {
        "127.0.0.1:8090": {
            "application": "script_index_php"
        },
        "127.0.0.1:8091": {
            "application": "direct_php"
        }
    },

    "applications": {
        "script_index_php": {
            "type": "php",
            "processes": {
                "max": 20,
                "spare": 5
            },
            "user": "www-data",
            "group": "www-data",
            "root": "/var/www/wordpress",
            "script": "index.php"
        },
        "direct_php": {
            "type": "php",
            "processes": {
                "max": 5,
                "spare": 0
            },
            "user": "www-data",
            "group": "www-data",
            "root": "/var/www/wordpress",
            "index": "index.php"
        }
    }
}

이 구성은 각 URL 체계(웹 애플리케이션 및 관리 패널)에 대해 하나씩 두 개의 NGINX Unit 애플리케이션을 생성합니다.

index 매개변수 대신 NGINX Unit 스크립트 매개변수를 사용한다는 것은 찾을 수 없는 페이지에 대한 요청이 WordPress의 기본 index.php 스크립트를 사용함을 의미합니다. 자세한 내용은 PHP 애플리케이션 객체에 대한 NGINX Unit 설명서를 참조하세요.

애플리케이션을 확장하려면 그에 따라 IP 주소와 포트를 변경하십시오.

4. 다음 curl 명령을 실행하여 구성을 Load합니다.

$ curl -X PUT --data-binary @/var/www/wordpress/wordpress.config --unix-socket /run/control.unit.sock http://localhost/config

10. NGINX Open Source 설치

공식 Repository의 mainline branch에서 미리 Build된 패키지로 NGINX Open Source를 설치하는 것이 좋습니다. 다른 Source에서 사용할 수 있는 패키지는 종종 여러 릴리스 뒤에 있습니다. Source에서 NGINX Open Source를 Build할 수도 있습니다.

대규모 및 Production WordPress 배포를 위해 NGINX Plus에는 사이트 성능을 개선하고 관리를 더 쉽게 만드는 향상된 기능이 포함되어 있습니다. 30일 동안 무료로 사용해 볼 수 있습니다. 자세한 내용은 NGINX Plus의 솔루션을 참조하십시오.

1. NGINX Open Source를 설치합니다.

2. NGINX를 시작합니다.

$ sudo service nginx start

3. 브라우저에서 NGINX 호스트의 IP 주소 또는 호스트명으로 이동합니다. 이 페이지는 NGINX가 실행 중임을 확인합니다.

Welcome to NGINX screen

NGINX 호스트에서 다음 명령을 실행하고 페이지의 Raw HTML 코드가 터미널에 나타나는지 확인할 수도 있습니다.

$ curl localhost

curl 명령이 작동하지만 브라우저 액세스가 작동하지 않는 경우 NGINX 호스트와 클라이언트 시스템 간의 트래픽에 영향을 미치는 라우팅 구성, 방화벽 및 모든 네트워크 설정을 확인하십시오.

11. NGINX Open Source 구성

이제 트래픽을 두 개의 NGINX Unit 애플리케이션 서버로 적절하게 전달하는 location 블록을 정의하여 아키텍처 개요에 설명된 두 URL 체계를 모두 지원하도록 NGINX Open Source를 구성합니다.

1. NGINX 기본 구성 파일의 백업을 생성합니다.

$ cd /etc/nginx/conf.d/
$ sudo mv default.conf default.conf.bak

2. 선호하는 텍스트 편집기를 사용하여 새 기본 구성 파일을 생성합니다(여기에서도 nano를 사용합니다).

$ sudo nano default.conf

3. 다음 내용을 파일에 복사하고 저장합니다.

upstream index_php_upstream {
    server 127.0.0.1:8090; # NGINX Unit backend address for index.php with
                           # 'script' parameter
}

upstream direct_php_upstream {
    server 127.0.0.1:8091; # NGINX Unit backend address for generic PHP file handling
}

server {
    listen      80;
    server_name localhost;
    root        /var/www/wordpress/;

    location / {
        try_files $uri @index_php;
    }

    location @index_php {
        proxy_pass       http://index_php_upstream;
        proxy_set_header Host $host;
    }

    location /wp-admin {
        index index.php;
    }

    location ~* .php$ {
        try_files        $uri =404;
        proxy_pass       http://direct_php_upstream;
        proxy_set_header Host $host;
    }
}

첫 번째 location 블록은 root URL(/)에 대한 요청을 처리합니다. try_files 지시문은 정확한 URI를 검색합니다. 존재하지 않는 경우 요청은 index_php_upstream Upstream 그룹으로 Proxy되는 @index_php라는 두 번째 location으로 요청이 전송됩니다.

세 번째 location 블록은 /wp-admin에 대한 요청을 처리하고 index.php 파일을 직접 제공합니다. 이 location는 찾을 수 없는 URL을 처리할 필요가 없습니다.

마지막 location 블록은 정규 표현식과 일치하는 .php 확장에 대한 요청을 처리합니다. 일반 NGINX Unit 애플리케이션이 모든 PHP 요청을 직접 처리하는 index_php_upstream Upstream 그룹에 대한 요청을 Proxy합니다. try_files 지시문은 NGINX에서 직접 생성된 페이지를 표시하여 404 오류를 처리합니다. 또 다른 옵션은 =404를 @index_php로 대체하여 WordPress가 404 오류를 처리하도록 하는 것입니다.

보안을 위해 또는 트래픽을 추가로 분리하기 위해 추가 location 블록 및 다른 매개변수를 try_files 지시문에 포함할 수 있습니다.

4. 기본 /etc/nginx/nginx.conf 구성 파일에 /etc/nginx/conf.d 디렉토리에서 파일을 읽는 include 지시문이 있는지 확인합니다.

include /etc/nginx/conf.d/*.conf;

5. 구성이 구문적으로 유효한지 확인하려면 다음 명령을 실행합니다.

$ sudo nginx -t

6. 구성을 Reload합니다.

$ sudo nginx -s reload

7. 웹 브라우저에서 WordPress 사이트의 IP 주소 또는 호스트명으로 이동하여 설치를 완료합니다.

WordPress

준비가 완료되었습니다! 이제 WordPress가 NGINX 및 NGINX Unit과 함께 “LEMU” 스택에서 실행되고 있습니다.

12. NGINX Plus의 향상된 기능

WordPress 애플리케이션을 최대한 활용하려면 애플리케이션 Health Check, 정적 및 동적 Content의 정교한 Caching, Live Activity 모니터링과 같은 향상된 기능을 위해 NGINX Plus를 권장합니다. 이러한 기능은 여러 WordPress 서버가 있고 Load Balancing이 필요한 경우에 특히 유용합니다. 그리고 그들은 NGINX Unit과 잘 작동합니다. 아래 이미지는 3개의 NGINX Unit 앱 서버를 Load Balancing하는 NGINX Plus 인스턴스의 Live Activity 모니터링 대시보드를 보여줍니다.

Live Activity 모니터링

NGINX Unit의 최신 소식을 빠르게 전달 받고 싶으시면 아래 뉴스레터를 구독하세요.

NGINX STORE 뉴스레터 및 최신 소식 구독하기

* indicates required