워드프레스 설치 방법 (LEMP)

By: master

대부분의 서버 업체에서는 클릭 몇 번으로 쉽게 워드프레스를 설치 할 수 있습니다. 원하는 버전으로 설치 가능하도록 간편 설치 없이 LEMP로 워드프레스를 설치 하는 방법을 정리합니다. 그리고 워드프레스 설치 중 생길 수 있는 문제 상황에 대한 해결 방법까지 정리합니다.

LAMP- Linux, Apache, MySQL, PHP

LEMP- Linux, NGINX[Engine x] , MySQL, PHP

워드프레스 설치 - 아마존

라이트 세일 APP + OS 옵션 기본 워드프레스는 Apache서버로 설치, nginx는 OS가 Debian 12으로 설치

OS를 Ubuntu 22.04로 하며 LEMP로 설치하기 위해서는 OS만 설치 한 후에 나머지 요소를 설치하며 진행해야 합니다.

그래서 OS only에 있는 Ubuntu 22.04로 인스턴스를 생성해서 작업을 진행합니다.

워드프레스 설치 환경

서버: Lightsail 5달러 플랜

OS: Ubuntu 22.04

PHP: 8.3.10

NGINX: 1.18.0

mariadb: 10.6.18

우분투 기본 설정

비밀번호 설정

Ubuntu 22.04 설치 시 root 계정이 ubuntu로 되어있음

sudo su -
passwd ubuntu

우분투 패키지 업데이트 업그레이드

sudo apt update
sudo apt upgrade

nginx 설치

sudo apt-cache policy nginx
sudo apt-get update

sudo apt-get install nginx

nginx -v      #설치 버전 확인

문제 없이 설치가 된 후 브라우저에서 Public IP로 접속하면 Welcome nginx 라는 화면을 볼 수 있습니다.

기본적으로 nginx가 보여주는 첫 화면은 /var/www/html/ 디렉터리 안에 있는 html파일 또는 PHP파일이 화면에 보여집니다.

nginx에서 /etc/nginx/sites-available/default 파일 내에 있는 내용에 의해 PHP파일 또는 html파일을 실행하게 됩니다.

/etc/nginx/sites-enabled/ 과 /etc/nginx/sites-available/ 는 가상 호스팅 설정 파일을 포함하는 디렉토리

nginx 종료 실행 재시작

sudo service nginx stop
sudo service nginx start
sudo service nginx restart

아파치가 실행되는 경우 아파치 종료하고 삭제

sudo service --status-all       #아파치 실행중인지 확인

sudo service apache2 stop
sudo apt-get remove apache2*
sudo apt-get --purge remove apache2*
sudo apt-get autoremove


sudo service apache-htcacheclean stop
sudo apt-get remove apache*
sudo apt-get --purge remove apache*
sudo apt-get autoremove

sudo apt update
sudo apt upgrade

PHP 설치

pHP 8.3 설치

sudo apt-get update
sudo apt-cache policy php      #설치 가능한 버전 없으면 레포지토리 추가 필요

#레포지토리 추가
sudo apt-get install ca-certificates apt-transport-https software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update



sudo apt-get install php8.3-fpm
sudo apt-get install php8.3-cli php8.3-curl php8.3-gd php8.3-mysql php8.3-mbstring zip unzip
sudo apt-get install php8.3-zip php8.3-xmlrpc php8.3-gd php8.3-curl php8.3-intl php8.3-imagick php8.3-bcmath php8.3-memcached php8.3-mysql

sudo service php8.3-fpm start

php -v # 설치된 PHP 버전 확인


systemctl restart php8.3-fpm
/lib/systemd/systemd-sysv-install enable php8.3-fpm

php 버전 설정, 필요 업는 버전 삭제

sudo update-alternatives --config php            #다른 버전 설치된게 있는지 확인 번호 누르고 엔터 누른게 default로 설정됨


sudo apt-get remove php5.6                      #필요없는 버전 삭제  
sudo apt-get remove php5.6-*                    #필요없는 버전의 모듈까지 삭

설치 후 php 버전 확인

nginx 설정 파일 수정

파일 권한 + 사용자 수정

sudo chgrp ubuntu /etc/nginx/sites-available/default
sudo chmod 664 /etc/nginx/sites-available/default

nginx가 php파일을 해석하기 위한 설정 파일의 권한 변경

vi sudo /etc/nginx/site-available/default      #vi로 파일 열어서 내용 수정
server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 
    root /var/www/html; 
    index index.php index.html index.htm index.nginx-debian.html ; 
    server_name _;

    location / {
      try_files $uri $uri/ =404; 
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
       fastcgi_pass unix:/run/php/php8.3-fpm.sock;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params; 
       fastcgi_read_timeout 300;
    }

   location ~ /\.ht {
     deny all;
   }
}

파일 내용을 다음과 같이 수정

root 경로는 php파일 또는 html파일을 찾을 경로

index 경로안에 어떤 파일을 먼저 읽을지 설정

server_name 부분에는 도메인 써주면됨

sudo service nginx restart

nginx 재시작

mariadb 설치 및 DB 생성

sudo apt-cache policy mariadb-server

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,arm64,i386,ppc64el] https://ftp.harukasan.org/mariadb/repo/10.3/ubuntu xenial main'
sudo apt update


apt install mariadb-server mariadb-client -y      #mariadb 설치

service mysql status                              #동작 확인

/lib/systemd/systemd-sysv-install enable mariadb    #동작 안하는 경우 enable시켜준다


mysql_secure_installation                #Y N Y Y Y Y


sudo apt install mariadb-server
service mysql status

sudo apt-cache policy php8.3-mysql
sudo apt-get install php8.3-mysql


mysql -u root -p

db 추가

CREATE DATABASE db_wp;
CREATE USER user_wp@localhost;
SET PASSWORD FOR user_wp@localhost=PASSWORD("password");
GRANT ALL PRIVILEGES ON db_wp.* TO user_wp@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
exit

워드프레스 설치

cd /var/www/html; curl -O https://wordpress.org/latest.tar.gz;
tar xzvf latest.tar.gz
sudo mv ./wordpress/* ./
cp wp-config-sample.php wp-config.php

sudo vi wp-config.php

파일 내용 수정

define('DB_NAME', 'db_wp');

define('DB_USER', 'user_wp');

define('DB_PASSWORD', 'password');





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');

https://api.wordpress.org/secret-key/1.1/salt

위에 사이트에 들어가서 key를 받아서 입력

chown -R www-data:www-data /var/www/html

여기까지 하면 아이피로 접속하면 워드프레스 초기 설정 화면이 나옴

ssl 적용

sudo apt update -y
sudo apt install certbot python3-certbot-nginx -y

sudo ufw status
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

sudo certbot --nginx -d example.com -d www.example.com

sudo certbot renew --dry-run

방화벽 룰 추가

lightsail의 경우 Networking – IPv4 Firewall 에서 add rule – https 추가

이미지로 보는 전체 설치 과정

staticIP 설정

방화벽 규칙 추가

DNS 설정에 static IP를 넣어서 설정

비밀번호 설정

sudo su –

passwd ubuntu

nginx 설치

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install nginx

nginx -v

PHP 8.3 설치

sudo apt-get install php8.3-fpm

그냥 설치 했는데 안되어서 레포지토리 등록 후 다시 설치

sudo apt-get install ca-certificates apt-transport-https software-properties-common

sudo add-apt-repository ppa:ondrej/php

sudo apt-get update

sudo apt-get install php8.3-fpm

sudo apt-get install php8.3-cli php8.3-curl php8.3-gd php8.3-mysql php8.3-mbstring zip unzip

sudo apt-get install php8.3-zip php8.3-xmlrpc php8.3-gd php8.3-curl php8.3-intl php8.3-imagick php8.3-bcmath php8.3-memcached php8.3-mysql

마리아디비 설치

apt install mariadb-server mariadb-client -y

service mysql status

sudo mysql_secure_installation #Y N Y Y Y Y

sudo mysql -u root -p

DB 생성

CREATE DATABASE db_wp;
CREATE USER user_wp@localhost;
SET PASSWORD FOR user_wp@localhost=PASSWORD(“password”);
GRANT ALL PRIVILEGES ON db_wp.* TO user_wp@localhost IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;
exit

워드프레스 설치

cd /var/www/html; sudo curl -O https://wordpress.org/latest.tar.gz;
sudo tar xzvf latest.tar.gz
sudo mv ./wordpress/* ./
sudo rm -rf ./wordpress/

sudo cp wp-config-sample.php wp-config.php

sudo vi wp-config.php

define(‘DB_NAME’, ‘db_wp’);
define(‘DB_USER’, ‘user_wp’);
define(‘DB_PASSWORD’, ‘password’);

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’);

수정 후

cd /etc/nginx/site-available/

sudo vi default

# 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; # 접근 로그 끄기
    }
}

입력 후 nginx 재시작

sudo service nginx restart

sudo apt update -y
sudo apt install certbot python3-certbot-nginx -y
sudo certbot –nginx -d example.com -d www.example.com

sudo vi /var/www/html/wp-config.php

define(‘WP_HOME’,’http://example.com’);
define(‘WP_SITEURL’,’http://example.com’);

추가 후 저장

워드프레스에 완벽하게 ssl이 적용된 것을 확인 가능

certbot이 알아서 /etc/nginx/site-available/default 파일에 ssl 규칙추가

http:example.com

http:www.example.com

https://example.com

https://www.example.com

네 가지 접속시 항상 https://example.com으로 나옴

못쓴거 폴더 권한 파일 권한 변경

1 thought on “워드프레스 설치 방법 (LEMP)”

Leave a Comment