[태그:] wordpress

WordPress 운영, 웹서버 설정, PHP와 Nginx 연동, 블로그 환경 구성과 관련된 글을 모았습니다. 사이트 운영 실습 흐름을 확인할 수 있습니다.

  • 무료 HTTPS 설정(Let’s Encrypt, Cloudflare)

    1. HTTPS 설정 환경

    Let’s Encrypt와 Cloudflare를 함께 사용하여 HTTPS 연결을 설정할 수 있다

    1) Let’s Encrypt

    Let’s Encrypt는 무료로 SSL/TLS 인증서를 발급하는 인증 기관입니다. Ubuntu 시스템에서 Let’s Encrypt를 사용하면 웹 서버에 안전한 HTTPS 연결을 제공할 수 있습니다.

    1. 무료: Let’s Encrypt는 무료로 사용할 수 있는 공개 프로젝트입니다. 따라서 비용 문제 없이 SSL/TLS 인증서를 발급받을 수 있습니다.
    2. 자동화: Let’s Encrypt는 인증서 발급 및 갱신 프로세스를 자동화하여 편리하게 사용할 수 있도록 지원합니다. 이는 일반적으로 명령어 한 줄을 입력하는 것만으로 인증서를 발급하고 갱신할 수 있다는 의미입니다.
    3. 보안: Let’s Encrypt는 모든 연결에 대해 암호화된 HTTPS 연결을 제공함으로써 보안을 강화합니다. 이를 통해 사용자의 데이터와 개인 정보를 안전하게 보호할 수 있습니다.

    2) Cloudflare.com

    Cloudflare는 웹 보안 및 성능 최적화 서비스를 제공하는 회사입니다. 이 회사는 웹사이트의 속도, 보안 및 가용성을 향상시키기 위해 글로벌 네트워크를 통해 트래픽을 라우팅하고, 악성 행위로부터 보호하며, 웹 콘텐츠를 압축 및 최적화하는 기능을 갖추고 있습니다.

    Cloudflare의 주요 기능은 다음과 같습니다

    1. CDN (Content Delivery Network): Cloudflare의 글로벌 네트워크를 통해 사용자들이 웹사이트에 더 빠르게 접근할 수 있도록 도와줍니다.
    2. 웹 방화벽: DDoS 공격, SQL 인젝션 등과 같은 악성 행위로부터 보호하기 위한 방화벽을 제공합니다.
    3. SSL/TLS 암호화: SSL/TLS 인증서를 사용하여 웹사이트를 안전하게 전송합니다.
    4. 성능 최적화: 캐싱, 이미지 최적화, 자바스크립트 최소화 등의 기술을 사용하여 웹사이트의 로딩 속도를 개선합니다.

    Cloudflare의 장점

    1. 높은 가용성: Cloudflare는 글로벌 네트워크를 통해 트래픽을 분산시키므로 웹사이트의 가용성이 향상됩니다.
    2. 보안 강화: DDoS 공격 및 다른 악성 행위로부터 보호하기 위한 강력한 웹 방화벽을 제공합니다.
    3. 성능 개선: 캐싱 및 최적화 기술을 사용하여 웹사이트의 로딩 속도를 개선합니다.

    2. Let’s Encrypy 패키지 설치 및 설정

    1) Let’s Encrypt 설치

    Certbot 설치: Certbot은 Let’s Encrypt의 공식 클라이언트로, 인증서 발급 및 관리에 필요한 도구입니다.

    다음 명령어로 Certbot을 설치합니다

    sudo apt update
    sudo apt install certbot

    python3-certbot-dns-cloudflare 패키지는 Certbot의 DNS-01 도메인 검증 방식을 사용하여 클라우드플레어(DNS 제공 업체) DNS 서버에 도메인 레코드를 자동으로 추가하고 관리하는 기능을 제공하며 다음 순서에 따라 작동합니다.

    1. Certbot은 도메인의 소유자임을 확인하기 위해 클라우드플레어 DNS 서버에 특정한 TXT 레코드를 추가하도록 요청합니다.
    2. python3-certbot-dns-cloudflare 패키지는 클라우드플레어 API를 사용하여 인증된 사용자 계정으로 로그인합니다.
    3. 패키지는 Certbot으로부터 전달받은 인증 요청 정보를 기반으로 클라우드플레어 DNS 서버에 TXT 레코드를 추가합니다.
    4. Certbot은 클라우드플레어 DNS 서버에 레코드가 반영되었는지 확인합니다.
    5. 인증이 성공적으로 완료되면 Certbot은 SSL/TLS 인증서를 발급받아 사용자가 지정한 경로로 저장합니다.

    다음 코드를 실행하여 python3-certbot-dns-cloudflare 를 설치합니다.

    sudo apt install python3-certbot-dns-cloudflare

    2) Cloudflare API 키 생성

    • Cloudflare 계정으로 로그인하고, “My Profile”로 이동합니다.
    • “API Tokens” 섹션으로 이동하고, “Create Token” 버튼을 클릭합니다.
    • “Use Template” 섹션에서 “Edit Zone DNS” 템플릿을 선택합니다.
    • Zone에 대한 액세스를 선택한 후, “Continue to Summary” 버튼을 클릭합니다.
    • Token 이름을 지정하고, 생성된 토큰 값을 안전한 곳에 저장합니다.

    3) API Token 저장

    /root/.secrets/certbot 디렉토리를 생성합니다.

    /root/.secrets/certbot/cloudflare.ini 파일을 생성합니다.

    sudo mkdir /root/.secrets/certbot
    sudo nano /root/.secrets/certbot/cloudflare.ini

    cloudflare.ini에 cloudflare 에서 확인한 token을 입력합니다.

    dns_cloudflare_email = cloudflare에_등록된_이메일
    dns_cloudflare_api_key = YOUR_CLOUDFLARE_API_TOKEN
    • example.com 을 자신의 도메인으로 변경해야 합니다.
    • /root/.secrets/certbot/cloudflare.ini는 아래와 같은 내용으로 생성되어야 합니다

    생성된 폴더와 파일의 권한을 변경합니다.

    sudo chmod 0700 /root/.secrets/certbot
    sudo chmod 0400 /root/.secrets/certbot/cloudflare.ini
    

    3. 인증서 발급

    1) 인증서 발급 코드

    인증서 발급을 원하는 도메인을 입력합니다. 여기서 서브 도메인을 인증한다면 서브 도메인을 입력합니다.

    sudo certbot certonly --dns-cloudflare --preferred-challenges dns-01 --dns-cloudflare-propagation-seconds 20 --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d example.com

    Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to cancel): 자신의 이메일 주소를 입력합니다.(취소하려면 c)

    2) 코드 설명

    위의 코드는 Certbot을 사용하여 example.com 도메인에 대한 인증서를 생성하는 명령어입니다.

    1. certbot: Certbot 도구를 실행합니다.
    2. certonly: 인증서만 생성하고 웹 서버와 연결하지 않습니다. (인증서 발급만 수행)
    3. --dns-cloudflare: Cloudflare DNS에 대한 도메인 확인을 통해 인증서를 발급합니다.
    4. --preferred-challenges dns-01: DNS 기반의 도메인 확인 방식 중 하나인 dns-01을 사용합니다.
    5. --dns-cloudflare-propagation-seconds 20: Cloudflare DNS 업데이트가 완료되기까지 기다리는 시간(초)입니다. 여기에서는 20초로 설정되어 있습니다.
    6. --dns-cloudflare-credentials /root/.secrets/certbot/certbot-cloudflare.ini: Cloudflare API에 액세스하기 위한 인증 정보가 포함된 파일의 경로입니다. 여기에서는 /root/.secrets/certbot/cloudflare.ini 파일을 사용합니다.
    7. -d example.com: 인증서를 발급할 도메인 이름으로, 여기에서는 example.com이 사용됩니다.

    2) 발급 확인

    발급된 인증서는 /etc/letsencrypt/live 하위의 도메인 폴더에 생성됩니다.

    총 4개의 파일(cert.pem, chain.pem, fullchain.pem, privkey.pem)이 생성됩니다

    4. 추가 학습 자료

    Let’s Encrypt와 Certbot의 공식 문서 및 참고 자료 링크입니다

    Thinknote

    함께 읽으면 좋은 글

  • PHP 8 설치(ubuntu)

    PHP 8 설치(ubuntu)

    1. PHP 이해 및 특징

    1) PHP 이해

    PHP 8 설치는 Nginx 웹서버와 연동하여 WordPress를 사용하기 위한 목적입니다. 향후 PHP를 활용하여 데이터를 일부 조작하고 PHP 코드를 삽입하는 방법에 대해서도 다루겠지만 그보다는 PHP로 개발된 WordPress를 운영하기 위한 목적에서 설명합니다.

    PHP는 Hypertext Preprocessor의 약자로 동적 웹페이지를 구현하기 위해 설계되었습니다.  PHP로 작성된 코드를 PHP 엔진에서 html 파일과 같이 처리하여 원하는 웹 페이지를 만들수 있습니다. php는 8.x 버전으로 넘어가고 있으며 7.0이후에는 PHP 코드와 HTML을 별도 파일로 분리하여 작성하며 웹서버가 아닌 php-fpm(PHP FastCGI Process Manager)을 통해 실행하는 경우가 늘어나고 있습니다.

     서버 측 오픈 소스 소프트웨어는 PHP로 구현된 경우가 많습니다. PHP에 기반한 대표적인 프로그램으로 워드프레스, 미디어위키, 넥스트클라우드 등이 있습니다. PHP는 텍스트와 HTML의 처리에 강점을 가지고 있어 URL의 파싱이나 폼 처리, 정규 표현식 등을 다양하게 적용할 수 있고 다양한 데이터베이스를 지원합니다.

    자바, 파이썬 등 다양한 프로그래밍 언어가 널리 활용되고 있지만 오픈소스의 영향력에 기반하여 지속적인 개발이 진행되고 있습니다.

    2) PHP 특징

    php는 단순, 능률, 안전, 유연성, 친숙함의 4가지 특징을 갖고 있습니다.

    • PHP는 시스템 기능, 즉 시스템의 파일에서 생성, 열기, 읽기, 쓰기 및 닫을 수 있습니다.
    • PHP는 양식, 즉 파일에서 데이터를 수집하고, 파일에 데이터를 저장하고, 이메일을 통해 데이터를 보내고, 사용자에게 데이터를 반환 할 수 있습니다.
    • PHP를 통해 데이터베이스 내의 요소를 추가, 삭제, 수정합니다.
    • 쿠키 변수에 액세스하고 쿠키를 설정합니다.
    • PHP를 사용하면 사용자가 웹 사이트의 일부 페이지에 액세스하도록 제한 할 수 있습니다.
    • 데이터를 암호화 할 수 있습니다.

    3) PHP 활용

    자바나 C 언어에서 접근하려면 여러 Include 등을 통해야 했던 작업들이 내장함수로 있어서 적은 코드로도 쉽게 구현이 가능합니다. 현재의 PHP는 절차적인 형태에서 ‘객체지향(클래스- Class)’ 프로그램 작성이 가능한 상태로 진화되었습니다.

    • PHP는 동적 페이지 콘텐츠를 생성 할 수 있습니다.
    • PHP는 서버에서 파일을 만들고, 열고, 읽고, 쓰고, 삭제하고, 닫을 수 있습니다.
    • PHP는 양식 데이터를 수집 할 수 있습니다.
    • PHP는 쿠키를 보내고받을 수 있습니다.
    • PHP는 데이터베이스의 데이터를 추가, 삭제, 수정할 수 있습니다.
    • PHP를 사용하여 사용자 액세스를 제어 할 수 있습니다.
    • PHP는 데이터를 암호화 할 수 있습니다

    2. PHP 8 설치

    1) PHP 8 사전 준비

    ubuntu의 패키지를 업데이트 및 업그레이드를 진행합니다.

    sudo apt update
    sudo apt upgrade
    php 8
    [Step 1] 패키지 업데이트

    2) PHP 8 패키지 확인 및 설치

    apt list 명령으로 php와 관련된 항목을 확인할 수 있습니다. 하지만 php관련 패키지가 너무 많기 때문에 무엇을 설치해야 할지 망설여집니다. 특히 php 버전도 다양하기 때문에 기존 프로그램의 개발 환경에 따라서 특정 버전이 필요할 수도 있습니다.

    php 설치의 core는 php-fpm입니다. php 버전에 따라서는 php7.x-fpm, php8.x-fpm 등 버전별로 존재합니다. 특정 버전을 설치하는 방법은 다른 글에서 다루도록 하겠습니다.

    apt list *fpm으로 php 8 설치의 핵심 패키지를 확인합니다. 여기서는  php-fpm은 8.1버전이고 php-fpm은 8.1.2 버전으로 나옵니다. 최신 버전이 좋을 수도 있지만 호환성에서 문제가 발생될 수 있기 때문에 가장 최신 버전은 피하는 것도 방법입니다.

    sudo apt list *fpm
    php 8
    [Step 2] 패키지 확인

    여기서는 php을 설치합니다.

    sudo apt install php8.1-fpm
    php 8
    [Step 3] php-fpm 설치
    php 8
    [Step 4] php-fpm 설치
    php 8
    [Step 5] php-fpm 설치

    3) PHP 8 상태 확인

    설치가 완료되고 잘 작동되고 있는지 확인하기 위해서 sudo systemctl status php8.1-fpm 명령어를 실행합니다. 앞서 특정 버전을 설치했다면 php뒤에 버전을 함께 작성해서 확인하면 됩니다.

    sudo systemctl status php8.1-fpm
    php 8
    [Step 6] php 서비스 확인

    서비스가 정상적으로 실행되고 있습니다. 출력된 내용을 보면 서비스는 php8.1-fpm.service로 작동되며 conf 파일은 /etc/php/8.1/fpm/php-fpm.conf 파일입니다.

    4) WordPress를 위한 php 8 패키지 추가 설치

    패키지 중에는 지금 당장 필요하지 않은 패키지도 있습니다. 하지만 미리 설치해도 큰 상관이 없기 때문에 기본적인 패키지는 모두 설치합니다.

    sudo apt install php8.1-common php8.1-mysql php8.1-xml php8.1-xmlrpc php8.1-curl php8.1-gd php8.1-imagick php8.1-cli php8.1-dev php8.1-imap php8.1-mbstring php8.1-opcache php8.1-redis php8.1-soap php8.1-zip
    php 8
    [Step 7] php 추가 패키지 설치

    3. Nginx와 PHP 8 연결

    php 패키지를 설치했다고 웹서버에서 php파일이 적용되는 것은 아닙니다. nginx가 php를 서비스할 수 있도록 일부 파일의 수정이 필요합니다.

    1개의 파일 유무와 3개의 파일을 수정해야 합니다.

    1. /etc/nginx/nginx.conf 파일이 존재하는지
    2. /etc/nginx/fastcgi_params의 fastcig_param 확인 및 추가
    3. /etc/nginx/sites-available/default 설정에서 php script 추가 및 수정
    4. /etc/nginx/nginx.conf의 default_type

    4번째는 수정하지 않는 경우 php파일이 실행되지 않고 다운 받아지는 문제가 생깁니다.

    1) /etc/nginx/nginx.conf 확인

    앞선 설치 및 진행을 따라 했다면 nginx.conf 파일은 존재합니다. 만약 없다면 다음 내용을 복사해서 파일을 생성하면 됩니다. 아래 내용을 복사해서 파일을 만든다면 4번의 단계는 생략해도 됩니다.

    파일을 생성합니다.

    sudo nano /etc/nginx/nginx.conf

    다음 코드를 붙여넣습니다.

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
            worker_connections 768;
            # multi_accept on;
    }
    
    http {
            ##
            # Basic Settings
            ##
            sendfile on;
            tcp_nopush on;
            types_hash_max_size 2048;
            # server_tokens off;
            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;
            include /etc/nginx/mime.types;
            #default_type application/octet-stream;
            default_type text/html;
            ##
            # SSL Settings
            ##
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
            ssl_prefer_server_ciphers on;
    
            ##
            # Logging Settings
            ##
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            ##
            # Gzip Settings
            ##
            gzip on;
            # gzip_vary on;
            # gzip_proxied any;
            # gzip_comp_level 6;
            # gzip_buffers 16 8k;
            # gzip_http_version 1.1;
            # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
            ##
            # Virtual Host Configs
            ##
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    }
    
    #mail {
    #       # See sample authentication script at:
    #       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
    #
    #       # auth_http localhost/auth.php;
    #       # pop3_capabilities "TOP" "USER";
    #       # imap_capabilities "IMAP4rev1" "UIDPLUS";
    #
    #       server {
    #               listen     localhost:110;
    #               protocol   pop3;
    #               proxy      on;
    #       }
    #
    #       server {
    #               listen     localhost:143;
    #               protocol   imap;
    #               proxy      on;
    #       }
    #}
    

    2) /etc/nginx/fastcgi_params의 fastcig_param 확인 및 추가

    편집기로 /etc/nginx/fastcgi_param을 열고 다음 내용이 없으면 추가합니다.

    sudo nano /etc/nginx/fastcgi_params

    첫 번째 줄에 다음 코드를 추가합니다.

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    [Step 8] fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 추가

    3) /etc/nginx/sites-available/default 설정에서 php script 추가 및 수정

    default 파일을 편집기로 실행하고 location 부분을 다음과 같이 수정합니다. 여기서는 8.1버전을 기준으로 수정합니다. 기존 파일에서 다음 부분을 찾아 변경하면 됩니다.

    # pass PHP scripts to FastCGI server
    
    location ~ \.php$ {
           include snippets/fastcgi-php.conf;
    
           # With php-fpm (or other unix sockets):
           fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }
    [Step 9] pass PHP scripts to FastCGI server 추가

    Nginx와 php를 모두 재시작 합니다.

    sudo systemctl restart nginx
    sudo systemctl restart php8.1-fpm

    4. PHP 8 실행 및 확인

    php정보를 확인할 파일을 생성합니다. 파일은 web root 에 생성합니다.

    sudo nano /var/www/html/info.php

    php 코드 규칙에 따라 다음 내용을 복사해서 붙여 넣습니다.

    <?php
    phpinfo();
    ?>

    웹사이트에서 localhost/info.php 또는 주소/info.php로 php 정보를 확인합니다.

    [Step 10] php info 확인

    참고로 워드프레스를 설치하기 위해서는 php.ini 파일의 수정이 필요합니다. php 파일 실행 및 php.ini 파일 수정은 wordpress 설치 글에서 다루도록 하겠습니다.

    함께 읽으면 좋은 글

  • Nginx 웹 서버 설치(Centos 8)

    Nginx 웹 서버 설치(Centos 8)

    1. 리눅스 Nginx 웹 서버 vs apache 웹 서버

    리눅스에서 설치되는 웹 서버는 Nginx 웹 서버와 apache 웹 서버로 나눠지며 다음과 같은 차이점을 갖고 있다.

    • 아파치는 오픈 소스 HTTP 서버인 반면 Nginx는 오픈 소스, 고성능 비동기 웹 서버 및 역방향 프록시 서버이다.
    • 아파치 HTTP 서버의 개발 및 발전은 전 세계 사용자 커뮤니티(Apache Software Foundation)에서 관리 및 유지되지만 Nginx는 2011년에 설립된 동일한 이름의 회사에서 유지 및 관리 된다.
    • Apache는 클라이언트 요청 및 웹 트래픽을 처리하는 다양한 다중 처리 모듈을 제공하지만 Nginx는 최소한의 하드웨어 리소스로 여러 클라이언트 요청을 동시에 처리하도록 설계되었다.
    • 아파치에서 단일 스레드는 하나의 연결과 연결되지만 Nginx의 단일 스레드는 여러 연결을 처리할 수 있다. 이 프로세스는 메모리를 적게 소모하여 성능이 향상시킨다.
    • 아파치 HTTP Server에는 확장성이 없는 다중 스레드 아키텍처지만 Nginx는 여러 클라이언트 요청을 처리하기 위한 비동기 이벤트 기반 접근 방식을 따마란다.
    • 아파치 서버는 기존의 메서드를 사용하여 정적 콘텐츠를 제공하고 웹 서버 자체 내에서 기본적으로 동적 콘텐츠를 처리한다. 반면 Nginx는 동적 콘텐츠를 내부적으로 처리할 수 없고 위해 외부 프로세스에 의존합니다.

    2. nginx 웹 서버 설치

    1) 업데이트

    sudo dnf update

    2) nginx 검색 및 버전 확인

    sudo dnf list install nginx
    nginx 웹 서버

    3) nginx 설치

    sudo dnf install -y nginx.x86_64
    nginx 웹 서버

    4) nginx 상태 확인

    sudo systemctl status nginx
    nginx 웹 서버

    5) nginx 시작

    Ctrl+c 키를 눌러 빠져 나온 후 nginx를 시작한다.

    sudo systemctl start nginx
    nginx 웹 서버

    부팅시 자동 실행 되도록 enable 시켜준다. 다음 명령어를 실행하지 않으면 부팅시 running 상태가 아닌 dead 상태로 구동된다.

    sudo systemctl enable nginx

    3. firewall 방화벽 설정

    1) 방화벽 상태 확인

    sudo firewall-cmd --state

    2) firewall 목록 확인

    sudo firewall-cmd --zone=public --list-all
    nginx 웹 서버

    3) http(80) 포트 추가

    sudo firewall-cmd --permanent --zone=public --add-port=80/tcp

    4) 방화벽 갱신

    sudo firewall-cmd --reload

    다음 명령어로 확인하면 ports의 80/tcp 항목이 추가된 걸 확인할 수 있다.

    sudo firewall-cmd --state
    nginx 웹 서버

    만약 포트를 삭제하려 한다면 다음 명령어를 활용해서 열린 port를 삭제할 수 잇다.

    firewall-cmd --permanent --zone=public --remove-port=80/tcp

    5) 웹 접속 확인

    웹 브라우져에서 ip주소를 입력해서 다음과 같은 화면이 나오면 된다.

    nginx 웹 서버

    웹 브라우저에서 에러가 나온다면 nginx의 status를 확인해서 정상적으로 작동되는 지를 확인한다. 그 다음 방화벽이 작동하고 있으며 80번 port가 열려 있는지를 확인한다.

    함께 읽으면 좋은 글