[태그:] php8

PHP 8 설치와 Nginx 연동, WordPress 운영 환경, 서버 설정 관련 글 모음입니다. Ubuntu 기반 웹서비스 구축에 필요한 내용을 확인할 수 있습니다.

  • Nextcloud 설치 및 셋팅

    Nextcloud 설치 및 셋팅

    1. 사전 준비

    아래의 설치 과정은 ubuntu 22 환경에서 진행되는 절차입니다. 사전 준비가 필요하면 아래 단계를 참고해주세요

    1. Ubuntu 22.04.1 설치(VirtualBox)
    2. ubuntu update 및 upgrade
    3. Ubuntu 방화벽 iptables 설치 및 활성화
    4. Ubuntu 방화벽 iptables 설정 및 관리
    5. Ubuntu OpenSSH 설치 및 MobaXterm 설치
    6. Ubuntu SSH 포트 설정 및 연결
    7. Nginx 웹서버 설치(ubuntu)
    8. PHP 8 설치(ubuntu)
    9. Nginx + Php8 설정
    10. MariaDB 설치 및 관리(MySQL)
    11. OpenSSL 설치
    12. 무료 HTTPS 설정(Let’s Encrypt, Cloudflare)
    13. 메모리 caching APCu, Redis, Memcached 설치

    2. 설치형 클라우드 Nextcloud 이해

    Nextcloud는 개인 및 기업용 클라우드 저장소 및 협업 플랫폼입니다. Nextcloud는 2016년 Frank Karlitschek이 ownCloud 프로젝트를 떠나 개발한 오픈 소스 소프트웨어로 ownCloud의 커뮤니티 구성원들이 Nextcloud를 만들기 위해 모여 개발을 시작하였습니다.

    1) Nextcloud 특징

    Nextcloud는 개인 및 기업에서 안전하고 효율적인 클라우드 저장소 및 협업 도구로 많이 사용되고 있습니다.

    1. 파일 동기화 및 공유: Nextcloud를 사용하면 여러 디바이스 간에 파일을 동기화하고 공유할 수 있습니다.
    2. 보안: Nextcloud는 데이터 암호화, 2단계 인증 등 다양한 보안 기능을 제공하여 사용자의 데이터 보호를 강화합니다.
    3. 협업 도구: 문서 편집, 캘린더, 주소록 등과 같은 협업 도구를 포함하여 다양한 작업을 팀원들과 함께 수행할 수 있습니다.
    4. 앱 생태계: 다양한 앱과 확장 기능을 제공하여 사용자의 요구에 맞게 Nextcloud를 확장할 수 있습니다.
    5. 자체 호스팅: Nextcloud는 온프레미스나 클라우드에서 사용할 수 있으며, 사용자는 자신만의 서버를 운영하여 데이터를 관리할 수 있습니다.

    2) 장점

    1. 개인정보 보호: Nextcloud는 사용자가 직접 데이터를 관리할 수 있으므로 개인정보 보호에 용이합니다.
    2. 확장성: 다양한 앱과 확장 기능을 통해 사용자의 요구에 맞게 Nextcloud를 확장할 수 있습니다.
    3. 협업 기능: 문서 편집, 캘린더 등 다양한 협업 도구를 제공하여 팀원들과 함께 작업하기 용이합니다.

    3) 단점

    1. 기술적 지식 필요: 서버 설정 및 유지보수에 대한 기술적인 이해가 필요합니다.
    2. 초기 설정 복잡성: 처음에 Nextcloud를 설정하는 과정은 다소 복잡할 수 있습니다.

    4) 시스템 요구사항

    플랫폼옵션
    운영 체제 (64비트)Ubuntu 22.04 LTS(권장)
    우분투 20.04 LTS
    Red Hat Enterprise Linux 8(권장)
    데비안 12
    리눅스 엔터프라이즈 서버 15
    openSUSE Leap 15.4
    CentOS 스트림
    데이터베이스MySQL 8.0+ 또는 MariaDB 10.3/10.4/10.5/10.6(권장)
    Oracle Database 11g(엔터프라이즈 구독의 일부로만 해당))
    PostgreSQL 10/11/12/13/14/15
    SQLite(테스트 및 최소 인스턴스에만 권장됨))
    웹서버Apache 2.4 및 or (권장) mod_phpphp-fpm
    nginx php-fpm
    PHP 런타임8.0(더 이상 사용되지 않음))
    8.1
    8.2(권장)

    3) 하드웨어 요구사항

    1. 프로세서: 1GHz 이상의 듀얼 코어 프로세서
    2. 메모리: 최소 512MB RAM (추천: 2GB 이상)
    3. 저장 공간: 최소 10GB 이상의 여유 공간
    4. 네트워크: 인터넷 연결을 위한 네트워크 인터페이스

    2. Nextcloud 설치

    nextcloud 설치는 all-in-one VM, all-in-one Docker, 웹 인스톨러 설치 등의 방법이 있습니다. 여기서는 웹 인스톨러를 사용해서 설치를 진행하겠습니다.

    1) 폴더 생성 및 설치 파일 다운로드

    nextcloud를 설치할 폴더를 생성합니다. 하위에 웹 로그를 저장할 logs 폴더와 nextcloud 를 설치할 public 폴더를 생성합니다.

    sudo mkdir  /var/www/nc.skdream.com
    sudo mkdir  /var/www/nc.skdream.com/logs
    sudo mkdir  /var/www/nc.skdream.com/public

    public 폴더에 설치 파일을 다운로드 합니다. https://download.nextcloud.com/server/installer/setup-nextcloud.php

    cd /var/www/nc.skdream.com/public
    sudo wget https://download.nextcloud.com/server/installer/setup-nextcloud.php

    public 폴더 사용자를 www-data로 변경합니다.

    sudo chown -R www-data:www-data /var/www/nc.skdream.com/public

    2) Nginx의 서버 블럭 생성

    도메인 연결을 위한 서버 블럭 파일을 생성합니다.

    sudo nano /etc/nginx/sites-available/nc.skdream.com

    아래 코드를 붙여넣고 도메인 부분을 자신의 도메인으로 변경합니다.

    upstream php-handler {
            server unix:/var/run/php/php8.2-fpm.sock;
    
    }
    # Set the `immutable` cache control options only for assets with a cache busting `v` argument
    map $arg_v $asset_immutable {
            "" "";
            default "immutable";
    }
    server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    
            server_name example.com;
    
            ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
            ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
            ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_prefer_server_ciphers on;
            ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;
            ssl_ecdh_curve secp384r1;
            ssl_session_timeout 10m;
            ssl_session_cache shared:SSL:10m;
            ssl_session_tickets off;
            ssl_stapling on;
            ssl_stapling_verify on;
            resolver 1.1.1.1 1.0.0.1 valid=300s;
            resolver_timeout 5s;
    
            access_log /var/www/nc.skdream.com/logs/access.log;
            error_log /var/www/nc.skdream.com/logs/error.log;
    
            root /var/www/nc.skdream.com/public/;
            #index index.php index.html;
    
            #Nextcloud
            # Prevent nginx HTTP Server Detection
            server_tokens off;
    
            # HSTS settings
            # WARNING: Only add the preload option once you read about
            # the consequences in https://hstspreload.org/. This option
            # will add the domain to a hardcoded list that is shipped
            # in all major browsers and getting removed from this list
            # could take several months.
            add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
    
            # set max upload size and increase upload timeout:
            client_max_body_size 512M;
            client_body_timeout 300s;
            fastcgi_buffers 64 4K;
    
            # Enable gzip but do not remove ETag headers
            gzip on;
            gzip_vary on;
            gzip_comp_level 4;
            gzip_min_length 256;
            gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
            gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
            # Pagespeed is not supported by Nextcloud, so if your server is built
            # with the `ngx_pagespeed` module, uncomment this line to disable it.
            #pagespeed off;
    
            # The settings allows you to optimize the HTTP2 bandwitdth.
            # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
            # for tunning hints
            client_body_buffer_size 512k;
    
            # HTTP response headers borrowed from Nextcloud `.htaccess`
            add_header Referrer-Policy                   "no-referrer"       always;
            add_header X-Content-Type-Options            "nosniff"           always;
            #add_header X-Download-Options                "noopen"            always;
            add_header X-Frame-Options                   "SAMEORIGIN"        always;
            add_header X-Permitted-Cross-Domain-Policies "none"              always;
            add_header X-Robots-Tag                      "noindex, nofollow" always;
            add_header X-XSS-Protection                  "1; mode=block"     always;
    
            # Remove X-Powered-By, which is an information leak
            fastcgi_hide_header X-Powered-By;
    
            # Add .mjs as a file extension for javascript
            # Either include it in the default mime.types list
            # or include you can include that list explicitly and add the file extension
            # only for Nextcloud like below:
            include mime.types;
    
            # Specify how to handle directories -- specifying `/index.php$request_uri`
            # here as the fallback means that Nginx always exhibits the desired behaviour
            # when a client requests a path that corresponds to a directory that exists
            # on the server. In particular, if that directory contains an index.php file,
            # that file is correctly served; if it doesn't, then the request is passed to
            # the front-end controller. This consistent behaviour means that we don't need
            # to specify custom rules for certain paths (e.g. images and other assets,
            # `/updater`, `/ocs-provider`), and thus
            # `try_files $uri $uri/ /index.php$request_uri`
            # always provides the desired behaviour.
            index index.php index.html /index.php$request_uri;
            #types {
            #        text/javascript js mjs;
            #}
            # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
            location = / {
                    if ( $http_user_agent ~ ^DavClnt ) {
                            return 302 /remote.php/webdav/$is_args$args;
                    }
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
    
            # Make a regex exception for `/.well-known` so that clients can still
            # access it despite the existence of the regex rule
            # `location ~ /(\.|autotest|...)` which would otherwise handle requests
            # for `/.well-known`.
            location ^~ /.well-known {
                    # The rules in this block are an adaptation of the rules
                    # in `.htaccess` that concern `/.well-known`.
    
                    location = /.well-known/carddav { return 301 /remote.php/dav/; }
                    location = /.well-known/caldav  { return 301 /remote.php/dav/; }
    
                    location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
                    location /.well-known/pki-validation    { try_files $uri $uri/ =404; }
    
                    # Let Nextcloud's API for `/.well-known` URIs handle all other
                    # requests by passing them to the front-end controller.
                    return 301 /index.php$request_uri;
            }
    
    
            # Rules borrowed from `.htaccess` to hide certain paths from clients
            location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
            location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }
    
            # Ensure this block, which passes PHP files to the PHP process, is above the blocks
            # which handle static assets (as seen below). If this block is not declared first,
            # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
            # to the URI, resulting in a HTTP 500 error response.
    
            # to the URI, resulting in a HTTP 500 error response.
            location ~ \.php(?:$|/) {
                    # Required for legacy support
                    rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
    
                    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                    set $path_info $fastcgi_path_info;
    
                    try_files $fastcgi_script_name =404;
    
                    include fastcgi_params;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    fastcgi_param PATH_INFO $path_info;
                    fastcgi_param HTTPS on;
    
                    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
                    fastcgi_param front_controller_active true;     # Enable pretty urls
                    fastcgi_pass php-handler;
    
                    fastcgi_intercept_errors on;
                    fastcgi_request_buffering off;
    
                    fastcgi_max_temp_file_size 0;
            }
            # Javascript mimetype fixes for nginx
            # Note: The block below should be removed, and the js|mjs section should be
            # added to the block below this one. This is a temporary fix until Nginx 
            # upstream fixes the js mime-type
            location ~* \.(?:js|mjs)$ {
                types { 
                    text/javascript js mjs;
                } 
                default_type "text/javascript";
                try_files $uri /index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463, $asset_immutable";
                access_log off;
            }
    
            # Serve static files
            location ~ \.(?:css|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ {
                try_files $uri /index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463, $asset_immutable";
                access_log off;     # Optional: Don't log access to assets
    
                location ~ \.wasm$ {
                    default_type application/wasm;
                }
            }
            location ~ \.woff2?$ {
                    try_files $uri /index.php$request_uri;
                    expires 7d;         # Cache-Control policy borrowed from `.htaccess`
                    access_log off;     # Optional: Don't log access to assets
            }
    
            # Rule borrowed from `.htaccess`
            location /remote {
                    return 301 /remote.php$request_uri;
            }
    
            location / {
                    try_files $uri $uri/ /index.php$request_uri;
            }
    
    
    }
    
    server {
            listen 80;
            listen [::]:80;
    
            server_name example.com;
            # Prevent nginx HTTP Server Detection
            server_tokens off;
    
            return 301 https://example.com$request_uri;
    }

    심볼릭 링크를 설정하고 nginxt를 재시작합니다.

    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    sudo systemctl restart nginx

    3) DB 생성 및 권한 부여

    아래 명령어로 MariaDB에 접속합니다.

    mysql -u root -p

    MariaDB를 설치하지 않았다면 다음 글을 참고하세요 MariaDB 설치 및 관리(MySQL) – Thinknote

    Nextcloud에 사용할 데이터베이스를 생성합니다.

    CREATE DATABASE nextcloud;

    새로운 사용자를 생성합니다. 기존 사용자를 연결하려면 생략해도 됩니다.

    CREATE USER '[사용자 이름]'@'localhost' IDENTIFIED BY '[비밀번호]';

    생성한 사용자에게 새로운 데이터베이스의 권한을 부여합니다.

    GRANT ALL PRIVILEGES ON [데이터베이스 이름].* TO '[사용자 이름]'@'localhost';

    변경된 권한 설정을 적용합니다.

    FLUSH PRIVILEGES;
    exit;

    4) php 요구사항

    Nextcloud를 사용하기 위해서는 추가적인 php모듈이 필요합니다. 아래는 Nextcloud manual 에 제시되어 있는 요구사항입니다.

    • PHP (see System requirements for a list of supported versions)
    • PHP module ctype
    • PHP module curl
    • PHP module dom
    • PHP module fileinfo (included with PHP)
    • PHP module filter (only on Mageia and FreeBSD)
    • PHP module GD
    • PHP module hash (only on FreeBSD)
    • PHP module JSON (included with PHP >= 8.0)
    • PHP module libxml (Linux package libxml2 must be >=2.7.0)
    • PHP module mbstring
    • PHP module openssl (included with PHP >= 8.0)
    • PHP module posix
    • PHP module session
    • PHP module SimpleXML
    • PHP module XMLReader
    • PHP module XMLWriter
    • PHP module zip
    • PHP module zlib

    아래 코드를 입력해서 설치되지 않은 모듈을 설치합니다. PHP8이 설치되지 않았다면 다음 글을 참고하세요. PHP 8 설치(ubuntu) – Thinknote

    sudo apt install php8.2-ctype php8.2-curl php8.2-dom php8.2-gd php8.2-mbstring php8.2-zip php8.2-intl php8.2-gmp php8.2-bcmath libmagickcore-6.q16-6-extra php8.2-apcu php8.2-bz2 php8.2-imagick php8.2-imap php8.2-ldap php8.2-mysql php8.2-smbclient php8.2-xml php8.2-zip

    php를 재시작합니다.

    sudo systemctl restart php8.2-fpm

    3. 웹 인스톨러 통한 설치

    자신의 도메인에서 웹 인스톨러에 접속해서 설치를 진행합니다.

    https://example.com/setup-nextcloud.php

    만약 Fatal error: Uncaught ValueError: Invalid or uninitialized Zip object in 에러가 발생하면 이는 압축 해제 경로가 /var/www/html로 되어있기 때문입니다. 이때는 직접 압축을 풀어서 설치해야 합니다. 압축이 풀려 있다면 도메인 url로 접속하면 됩니다.

    설치가 완료되었습니다.

    4. 보안 및 경고 확인

    관리자로 로그인하고 관리자 설정으로 들어갑니다. 이때 보안 및 설치 경고 메시지가 나온다면 항목별 해결방법을 참고하시기 바랍니다.

    1) 파일 무결성과 관련된 오류

    /etc/php/8.2/fpm/pool.d/www.conf 에서 clear_env = no의 주석을 해제합니다.

    sudo nano /etc/php/8.2/fpm/pool.d/www.conf 
    clear_env = no #주석해제

    2) 시스템 환경변수 getenv(‘path’)오류

    관리자 설정의 무결성과 관련된 파일 리스트를 확인하고 문제가 되는 파일을 삭제합니다. 그리고 아래 코드를 실행하여 무결성 문제가 해결 되었는지 확인합니다.

    sudo -u www-data php occ integrity:check-core

    3) PHP 메모리 제한

    php.ini에서 memory_limit값과 upload_max_filesize 을 512M 이상으로 설정합니다.

    Memory_limit = 1G
    upload_max_filesize = 1G

    4) 국가 전화번호 설정

    nextcloud config.php 파일에 다음 내용을 추가합니다.

    'default_phone_region' => 'kr'

    5) 트렌젝션 성능 향상 – memcached 구성

    memcached 구성 다음 글을 참고하시기 바랍니다. 메모리 caching APCu, Redis, Memcached 설치 – Thinknote

    트렌젝션 파일 잠금과 함께 memcached 를 사용하려면 redis도 설치해야 합니다.

    설치가 완료되면 nextcloud config.php 파일에 다음 내용을 추가합니다.

    'memcache.local' => '\\OC\\Memcache\\Redis',
    'memcache.distributed' => '\\OC\\Memcache\\Redis',
    'memcache.locking' => '\\OC\\Memcache\\Redis',
    'filelocking.enabled' => 'true',
    'redis' =>
        array (
            'host' => 'localhost',
            'port' => 0,
            'timeout' => 0.0,
    ),

    6) 보안 및 배경 작업 확인

    Thinknote

  • 메모리 caching APCu, Redis, Memcached 설치

    1. 메모리 캐싱 방법(APCu, Redis, Memcached)

    ubuntu에서 사용할 수 있는 메모리 캐싱 방법으로 APCu, Redis, Memcached 가 있습니다. 각각의 캐싱 도구는 다양한 용도와 요구 사항에 맞게 선택해야 합니다.

    • 예를 들어, APCu는 PHP 코드의 성능을 향상시킬 수 있지만 단일 서버에서만 사용 가능하므로 분산 환경에는 적합하지 않습니다.
    • Redis는 다양한 데이터 구조와 클러스터링 기능을 제공하여 복잡한 애플리케이션에 적합합니다.
    • Memcached는 분산 환경에서 대규모 처리량을 지원하기 위해 설계되었습니다.

    1) APCu (Alternative PHP Cache user caching)

    APCu는 PHP 확장 기능으로서 로컬 서버 내에서 데이터를 캐시하는 데 사용되며 단일 서버 환경에서 사용하기 적합합니다. APCu는 프로세스 간 데이터 공유가 불가능하며, 데이터는 해당 프로세스에서만 유지됩니다.

    1. PHP용 메모리 캐싱 시스템입니다.
    2. PHP 코드에 직접 접근하여 데이터를 캐싱할 수 있습니다.
    3. 단일 서버에서만 사용 가능하며 분산 환경에는 적합하지 않습니다.
    4. APCu는 기본적으로 메모리에 데이터를 저장하므로 빠른 읽기/쓰기 속도를 제공합니다.
    5. 그러나 APCu는 데이터 유지 및 복제를 지원하지 않으므로 서버 장애 시 데이터 손실 가능성이 있습니다.

    2) Redis

    Redis는 오픈 소스 인메모리 데이터 구조 저장소로 다중 서버 환경에서 스케일 아웃이 가능하며, 데이터를 메모리에 저장하고 디스크에 지속적으로 저장할 수 있습니다. 다양한 데이터 구조 (문자열, 해시, 리스트, 세트 등)를 지원하며 Pub/Sub 메커니즘을 통해 메시지 브로커로도 사용할 수 있습니다.

    1. 단일 스레드로 작동하며, 이벤트 기반 아키텍처를 사용하여 동시성 문제를 해결합니다.
    2. 문자열, 해시, 목록, 세트, 정렬된 세트 등 다양한 데이터 구조를 지원합니다..
    3. Publish/Subscribe (Pub/Sub) 메커니즘을 지원하여 메시지 기반 아키텍처를 구축할 수 있습니다
    4. 마스터-슬레이브 복제 및 Redis 클러스터와 같은 분산 시스템을 지원합니다.
    5. 다양한 성능 모니터링 및 관리 도구를 제공하여 데이터베이스 인스턴스의 상태를 모니터링하고 성능을 최적화할 수 있습니다.

    3) Memcached

    Memcached는 분산 메모리 객체 캐시 시스템으로 다중 서버 환경에서 스케일 아웃이 가능하며, 데이터를 메모리에 저장합니다. 데이터는 키-값 형태로 저장되며, 복잡한 데이터 구조를 지원하지 않습니다.

    1. 분산 객체 캐싱 시스템입니다.
    2. 키-값 형태의 데이터를 저장하고 검색하는 데 사용됩니다.
    3. 분산 환경에서 사용하기 적합하며, 여러 서버 간에 데이터를 공유할 수 있습니다.
    4. Memcached는 단순한 키-값 저장소로서 복잡한 데이터 구조를 지원하지 않습니다.
    5. 메모리 사용량이 크고, 디스크에 데이터를 저장하지 않으므로 서버 장애 시 데이터 손실 가능성이 있습니다.

    일반적으로 APCu, Redis 및 Memcached 모두 설치하고 운영할 수 있습니다.

    모든 시스템을 동시에 운영할 때는 서버 리소스 (메모리 및 CPU)를 고려해야 하며, 각 캐시 시스템의 설정과 운영 방법을 이해하고 최적화해야 합니다. 또한 데이터 일관성과 동기화 문제도 고려해야 합니다.

    2. APCu 캐싱

    1) APCu 설치

    APCu를 설치하기 위해 다음 명령어를 실행합니다.

    sudo apt install php8.2-apcu

    2) APCu 활성화(acpu.ini)

    PHP 설정 파일을 열기 위해 다음 명령어를 실행합니다. php 버전은 서버에 설치된 php 버전을 입력합니다.

    Apache 웹 서버를 사용한다면 /etc/php/8.2/apache2/php.ini을 수정해야 합니다.

    sudo nano /etc/php/8.2/apache2/php.ini

    PHP-FPM (PHP FastCGI Process Manager)에서 php를 사용한다면 sudo nano /etc/php/8.2/fpm/php.ini를 수정하거나 acpu.ini 파일을 수정합니다.
    만약 acpu.ini 파일이 없다면 /etc/php/8.2/mods-available/apcu.ini 파일을 생성하고 다음 내용을 붙여 넣습니다.

    sudo nano /etc/php/8.2/mods-available/apcu.ini
    extension = apcu.so
    apc.enabled = 1

    다음 명령어로 apcu 모듈을 활성화합니다.

     sudo phpenmod -v 8.2 apcu

    nginx 서버를 재시작하여 변경 사항이 적용되도록 합니다.

    sudo systemctl restart nginx

    3) APCu 실행 확인(acpu.ini)

    아래 명령어를 실행해서 phpinfo() 함수의 결과를 출력하고 APCu 관련 설정, 버전 정보, 디렉토리 경로 등을 확인할 수 있습니다.

    php -i | grep apcu

    1. Redis 캐싱

    1) Redis 설치

    Redis를 설치하기 위해 다음 명령어를 실행합니다. 설치가 완료되면 Redis 서버가 자동으로 시작됩니다

    sudo apt install redis-server

    2) Redis 상태 확인

    서비스 상태를 확인하기 위해 다음 명령어를 실행합니다.
    Redis 서버가 정상적으로 실행 중인지 확인한 후, 필요에 따라 Redis 구성 파일을 수정할 수 있습니다. 구성 파일은 /etc/redis/redis.conf 경로에 위치해 있습니다

    sudo systemctl status redis-server
    sudo usermod -a -G redis www-data
    

    3) 방화벽 설정(iptables)

    redis-server가 사용하는 6379 port 를 개방하고 iptable을 저장 및 리로드 합니다.

    sudo iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
    sudo netfilter-persistent save
    sudo netfilter-persistent reload

    4) Redis와 php 연동

    Redis PHP 확장 모듈을 설치합니다.

    sudo apt install php8.2-redis

    nginx 서버를 재시작하여 변경 사항이 적용되도록 합니다.

    sudo systemctl restart nginx

    5) Redis 활성화(redis.ini)

    sudo nano /etc/php/8.2/mods-available/redis.ini에서 아래 코드를 추가합니다.

    sudo nano /etc/php/8.2/mods-available/redis.iniextension = redis.so

    PHP-FPM 서버를 재시작합니다.

    sudo systemctl restart php8.2-fpm

    새로운 PHP 파일을 생성하고 다음과 같은 코드를 작성하여 Redis와의 연결 및 작업을 확인할 수 있습니다(value 출력)

    <?php
    $redis = new Redis();
    $redis->connect('localhost', 6379);
    
    // 문자열 저장 및 조회 예제
    $redis->set("key", "value");
    echo $redis->get("key");
    
    // 해시 저장 및 조회 예제
    $redis->hSet("hash", "field", "value");
    echo $redis->hGet("hash", "field");
    
    // 연결 종료
    $redis->close();
    ?>

    2. Memcached 캐싱

    1) Memcached 설치

    Memcache를 설치하기 위해 다음 명령어를 실행합니다.

    sudo apt install memcached

    2) Memcached 서비스 시작

    다음 명령어를 실행해서 Memcached 서비스를 시작합니다.

    sudo systemctl start memcached
    sudo systemctl status memcached

    Memcached 서비스가 부팅시 자동으로 시작되도록 아래 코드를 실행합니다.

    sudo systemctl enable memcached

    3) 방화벽 설정(iptables)

    Memcached는 localhost(127.0.0.1)의 11211 포트에서 실행됩니다.
    Memcached가 실행되도록 iptables 11211 포트를 개방합니다.

    sudo iptables -A INPUT -p tcp --dport 11211 -j ACCEPT
    sudo netfilter-persistent save
    sudo netfilter-persistent reload

    추가로, Memcached를 사용하는 애플리케이션 구성을 위해 다음과 같은 설정 파일을 편집할 수 있습니다:

    • 메모리 할당량 수정: /etc/memcached.conf 파일에서 -m 옵션 값을 수정하여 할당량을 조정할 수 있습니다.
    • 바인딩 주소 수정: /etc/memcached.conf 파일에서 -l 옵션 값을 변경하여 다른 IP 주소로 바인딩할 수 있습니다.
    • 포트 수정: /etc/memcached.conf 파일에서 -p 옵션 값을 변경하여 다른 포트 번호로 설정할 수 있습니다.

    4) PHP 연동(php.ini)

    아래 명령어를 실행해서 패키지를 설치합니다.

    sudo apt install php8.2-memcached

    /etc/php/8.2/fpm/php.ini 파일 또는 /etc/php/8.2/mods-avaiable/memcached.ini 에서 extension=memcached.so 라인을 찾아 주석 해제하고 저장합니다.

    sudo nano /etc/php/8.2/mods-available/memcached.ini

    5) Memcached 작동 확인

    다음 코드를 사용하여 Memcached 서버에 연결하고 값을 저장하고 검색하며 테스트 할 수 있습니다.(value 출력 정상)

    <?php
    $memcached = new Memcached();
    $memcached->addServer('localhost', 11211);
    
    $memcached->set('key', 'value', 60); // 60초 동안 값 저장
    
    $value = $memcached->get('key');
    echo $value; // 저장된 값 출력
    ?>

    4. 추가 학습 자료

    APCu, Redis, Memcached와 관련된 공식 문서 및 참고 자료 링크입니다

    1) APCu

    2) Redis

    3) Memcached

    Thinknote

    함께 읽으면 좋은 글

  • PHP R 연동 방법: 웹에서 R 스크립트를 호출하고 결과 받는 법

    PHP R 연동 방법: 웹에서 R 스크립트를 호출하고 결과 받는 법

    1. PHP와 R 코드 연동 실행

    PHP와 R 코드 연동: PHP와 R 코드를 연동해서 실행하는 것은 두 프로그래밍 언어의 장점을 결합하여 복잡한 웹 애플리케이션과 데이터 분석을 함께 처리할 수 있습니다. 하지만 여러 장단점이 존재하기에 개발 목표와 시나리오를 고려해서 PHP와 R 코드를 연동할 것인지 결정해야 합니다.

    1) PHP와 R 코드 연동 장점

    1. 언어 전문성 활용: PHP는 웹 개발에, R은 데이터 분석에 강점을 가지고 있습니다. 두 언어의 각각의 장점을 활용할 수 있습니다.
    2. 코드 재사용: 이미 R로 작성된 데이터 분석 코드나 모델을 웹 애플리케이션에서 쉽게 재사용할 수 있습니다.
    3. 동적인 웹 콘텐츠 생성: PHP에서 R 코드를 실행하면 실시간 데이터 분석 결과를 웹사이트에 동적으로 표현할 수 있습니다.
    4. 복잡한 분석 가능: R은 통계 분석, 머신러닝, 그래프 생성 등 매우 다양한 데이터 분석 기능을 제공합니다.
    5. 시스템 리소스 효율성: 필요한 경우에만 R 코드를 실행하여 시스템 리소스를 효율적으로 활용할 수 있습니다.

    2) PHP와 R 코드 연동 단점

    1. 성능 이슈: PHP에서 R 코드를 실행하는 것은 일반적으로 느릴 수 있고, 대량의 데이터를 다루거나 복잡한 분석을 할 때에는 특히 성능에 문제가 될 수 있습니다.
    2. 보안 취약성: execshell_exec 같은 함수를 사용하면 서버가 취약해질 위험이 있습니다. 이러한 함수를 사용할 때는 신중해야 합니다.
    3. 환경 설정과 관리: R과 PHP를 함께 실행하려면 두 환경을 모두 잘 설정하고 유지해야 하며, 이로 인해 복잡성이 증가할 수 있습니다.
    4. 에러 처리: 두 언어간의 연동에서는 에러 처리가 복잡해질 수 있습니다. PHP와 R 양쪽에서 발생할 수 있는 에러를 모두 캐치하고 관리해야 합니다.
    5. 메모리 사용량: R은 메모리를 상당히 많이 사용하는 언어입니다. PHP 프로세스와 R 프로세스가 동시에 실행되면 메모리 사용량이 크게 증가할 수 있습니다.
    6. 버전 호환성: 시간이 지남에 따라 R 라이브러리나 PHP 패키지가 업데이트되고, 이로 인해 호환성 문제가 발생할 수 있습니다.

    2. exec 함수를 사용하여 PHP에서 R 코드 실행

    PHP의 exec() 함수를 사용하여 R 코드를 실행하는 것은 PHP에서 외부 프로그램을 실행할 수 있는 간단한 방법입니다. 이 방법은 일반적으로 PHP가 실행되는 서버에 R이 설치되어 있어야 하며, exec() 함수가 서버 설정에서 비활성화되지 않았는지 확인해야 합니다.

    1) 개념

    exec() 함수는 PHP에서 외부 프로그램을 실행할 때 사용합니다. 이 함수를 사용하여 R 스크립트를 실행하려면, 명령 줄에서 R 스크립트를 실행하는 명령어를 인수로 전달하면 됩니다. 일반적으로 이 명령어는 Rscript입니다.

    exec("Rscript [R 스크립트 경로]", $output);

    2) 예제1

    예제1은 PHP의 exec() 함수를 사용하여 R 스크립트 simple_example.R을 실행하는 매우 간단한 예시입니다.

    R 스크립트 (simple_example.R):

    result <- 1 + 1
    cat(result)

    PHP 코드:

    <?php
    exec("Rscript simple_example.R", $output);
    echo "R output: " . implode("\n", $output);
    ?>

    2) 예제2

    예제2는 PHP에서 R 스크립트를 실행하여 선형 모델을 적합하고, 그 결과를 요약하여 텍스트 파일에 저장하는 과정을 보여줍니다. 이후에 PHP 코드는 이 텍스트 파일을 읽어 출력합니다.

    R 스크립트 (linear_model.R):

    x <- c(1, 2, 3, 4, 5)
    y <- c(2, 4, 1, 8, 7)
    fit <- lm(y ~ x)
    summary_str <- capture.output(summary(fit))
    write(summary_str, "summary.txt")

    PHP 코드:

    <?php
    exec("Rscript linear_model.R");
    
    // R로부터 생성된 summary.txt 파일을 읽기
    $summary = file_get_contents("summary.txt");
    echo "R Summary:\n$summary";
    ?>

    3) 예제3

    예제3는 R 스크립트와 PHP가 CSV 파일을 읽고 쓰는 과정을 통해 상호작용하는 방법을 보여줍니다. 이 예제에서는 특히 R 스크립트가 명령 줄 인자를 받아 동적으로 처리하는 방법을 설명합니다.

    R 스크립트 (data_processing.R):

    args <- commandArgs(trailingOnly = TRUE)
    input_file <- args[1]
    output_file <- args[2]
    
    data <- read.csv(input_file)
    data$sum <- rowSums(data[, c("col1", "col2")])
    
    write.csv(data, output_file)

    PHP 코드:

    <?php
    $input_file = "input.csv";
    $output_file = "output.csv";
    
    exec("Rscript data_processing.R $input_file $output_file");
    
    // R로부터 생성된 output.csv 파일을 읽기
    $output_data = file_get_contents("output.csv");
    echo "R Output Data:\n$output_data";
    ?>

    주의사항

    • exec() 함수는 서버에서 비활성화되지 않았는지 확인해야 합니다.
    • 보안 문제: exec() 함수는 잘못 사용되면 서버의 보안에 문제를 일으킬 수 있으므로 주의가 필요합니다.
    • 에러 처리: exec() 함수는 기본적으로 실패시에 PHP 경고를 출력하지 않으므로, 별도의 에러 처리 로직을 구현해야 할 수 있습니다.

    3. Rserve 패키지를 사용하여 PHP에서 R 코드 실행

    1) Rserve 개념

    Rserve는 R에서 제공하는 패키지 중 하나로, R을 서버로 운영하게 해주는 패키지입니다. 일반적으로 R은 대화형 통계 계산을 위한 도구로 사용되지만, Rserve를 통해 R을 서버로서 운영하고 다른 애플리케이션(예: PHP, Java, Python 등)에서 R 코드를 실행할 수 있습니다. 이러한 작업은 TCP/IP 프로토콜을 사용하여 이루어집니다.

    • TCP/IP 프로토콜 지원: 다른 언어나 프레임워크와 통신이 쉽습니다.
    • 다중 세션 지원: 여러 사용자가 동시에 R의 서비스를 사용할 수 있습니다.
    • 플랫폼 독립성: 다양한 운영 체제와 언어에서 사용할 수 있습니다.
    • 진입 장벽이 낮음: R에 익숙한 사용자는 비교적 쉽게 Rserve를 사용할 수 있습니다.

    2) 장단

    1. 언어 간의 통합 가능: R만의 특별한 데이터 분석 라이브러리나 기능을 다른 언어에서 쉽게 이용할 수 있습니다.
    2. 성능 최적화: R 작업을 별도의 서버에서 처리하므로 웹 서버의 부하를 줄일 수 있습니다.
    3. 코드 재사용성: 같은 R 코드를 여러 애플리케이션에서 재사용할 수 있습니다.
    4. 동시성: 여러 사용자가 동시에 R 분석을 수행할 수 있습니다.

    3) 단점

    1. 설정 복잡성: R과 Rserve, 그리고 다른 프로그래밍 언어 사이의 인터페이스를 설정해야 하는 복잡성이 있을 수 있습니다.
    2. 디버깅 어려움: R과 다른 언어 간의 연동은 디버깅을 복잡하게 만들 수 있습니다.
    3. 보안 취약성: TCP/IP를 통해 통신하기 때문에, 잘못 구성하면 보안 취약점이 될 수 있습니다.

    4) 기본 사용

    1. R에서 Rserve를 설치합니다:
      install.packages("Rserve")
    2. R에서 Rserve를 시작합니다:
      library(Rserve)
      Rserve()
    3. PHP Rserve 클라이언트를 설치합니다. composer.json 파일을 생성하고 아래 내용을 추가합니다.
      {
          "require": {
              "cturbelin/rserve-php": "^2.1"
          }
      }
    4. 터미널에서 composer instll을 실행하면 vendor폴더가 생성되고 관련 파일이 포함됩니다
    5. PHP 코드에서 R 함수를 호출합니다:
      <?php
      require './vendor/autoload.php';
      define('RSERVE_HOST', 'localhost');
      use Sentiweb\Rserve\Connection;
      use Sentiweb\Rserve\Parser\NativeArray;
      $cnx = new Connection(RSERVE_HOST);
      $r = $cnx->evalString('2+2'
      );
      echo $r;
      ?>
    6. 실행시 에러가 발생된다면 php-mbstring이 올바르게 설치되어 있는지를 확인해야 합니다.

    5) 여러 줄 사용

    $r->evalString() 안에 여러 줄의 R 코드를 넣어 실행할 수 있습니다. R 코드를 문자열로 여러 줄에 걸쳐 작성하면 됩니다.

    <?php
    require './vendor/autoload.php';
    define('RSERVE_HOST', 'localhost');
    use Sentiweb\Rserve\Connection;
    use Sentiweb\Rserve\Parser\NativeArray;
    $cnx = new Connection(RSERVE_HOST);
    
    // 여러 줄의 R 코드
    $script = <<<RSCRIPT
    x <- c(1, 2, 3, 4, 5)
    y <- c(2, 4, 1, 8, 7)
    fit <- lm(y ~ x)
    summary_fit <- summary(fit)
    RSCRIPT;
    
    $r->evalString($script);
    
    $summary = $cnx->evalString('capture.output(summary_fit)');
    foreach($summary as $line) {
        echo $line . "\n";
    }
    ?>

    이 예제에서는 R 코드를 HereDoc (<<<RSCRIPT ... RSCRIPT;) 형식으로 작성하여 여러 줄을 포함시켰습니다. 그 후, evalString() 메서드를 호출하여 이 여러 줄의 코드를 한 번에 실행하고 있습니다.

    이렇게 하면 복잡한 R 스크립트도 PHP에서 실행할 수 있습니다.

    3. Rserve 패키지를 사용하여 PHP에서 R 코드 실행

    Rserve는 웹 서버나 다른 애플리케이션에서 복잡한 통계 분석이나 데이터 처리를 필요로 할 때 유용하게 사용될 수 있습니다. 하지만 사용 전에 위에서 언급한 장단점을 충분히 고려해야 합니다.

    R 프로그램을 다운로드하려면 R 프로그램 공식 웹사이트(https://www.r-project.org/)에서 다운로드 링크를 클릭하여 다운로드할 수 있습니다.

    R 프로그램 모두보기 :

    함께 읽으면 좋은 글

  • 텍스트 교체 str_replace, str_replace_all 함수

    텍스트 교체 str_replace, str_replace_all 함수

    텍스트 교체(str_replace, str_replace_all) 함수는 문자열 처리에 있어서 매우 유용한 도구입니다. 텍스트 교체 함수는 stringr 패키지에 포함되어 있으며, 특정 문자열을 다른 문자열로 치환하는 작업을 수행합니다.

    1. 텍스트 교체(str_replace, str_replace_all) 함수의 개념

    1) str_replace()

    str_replace() 함수는 문자열 내에서 첫 번째로 나타나는 특정 패턴을 다른 문자열로 치환합니다.

    # stringr 패키지 로드
    library(stringr)
    
    # 예제
    str_replace("apple orange apple", "apple", "banana")
    # 출력: "banana orange apple"

    위 예시에서 “apple”이 첫 번째로 등장할 때만 “banana”로 치환되었습니다.

    2) str_replace_all()

    반면에 str_replace_all() 함수는 문자열 내에서 모든 특정 패턴을 다른 문자열로 치환합니다.

    # 예제
    str_replace_all("apple orange apple", "apple", "banana")
    # 출력: "banana orange banana"

    위 예시에서 “apple”이 모두 “banana”로 치환되었습니다.

    2. str_replace, str_replace_all 함수의 주요 사용법

    기본 사용법

    • str_replace(string, pattern, replacement)
    • str_replace_all(string, pattern, replacement)

    string: 대상 문자열
    pattern: 찾을 패턴
    replacement: 치환할 문자열

    1) 정규 표현식을 사용한 패턴 매칭

    pattern 파라미터에는 정규 표현식을 사용할 수 있습니다. 예를 들어, 모든 숫자를 제거하고 싶다면 다음과 같이 할 수 있습니다.

    # str_replace() 사용 예제
    str_replace("apple1 orange2", "[0-9]", "")
    # 출력: "apple orange2"
    
    # str_replace_all() 사용 예제
    str_replace_all("apple1 orange2", "[0-9]", "")
    # 출력: "apple orange"

    2) 여러 패턴을 한 번에 치환

    str_replace_all() 함수는 여러 패턴을 한 번에 치환할 수 있습니다. 이 때는 patternreplacement를 명명된 벡터로 전달합니다.

    # 여러 패턴 치환 예제
    str_replace_all("apple orange pear", c("apple" = "banana", "orange" = "grape"))
    # 출력: "banana grape pear"

    3) 한글, 영문, 그리고 숫자를 제외한 모든 문자 빈 데이터로 치환

    한글, 영문, 그리고 숫자를 제외한 모든 문자를 빈 데이터로 치환하기 위해 str_replace_all 함수를 사용할 수 있습니다. 정규 표현식을 사용하여 이를 적용해보겠습니다.

    아래는 stringr 패키지를 사용한 예시입니다.

    # stringr 패키지 로드
    library(stringr)
    
    # 예제 문자열
    example_str <- "안녕하세요! Hello, 1234!!@@"
    
    # 한글, 영문, 숫자를 제외한 모든 문자를 빈 데이터로 치환
    cleaned_str <- str_replace_all(example_str, "[^가-힣a-zA-Z0-9]", "")
    
    # 결과 출력
    print(cleaned_str)
    #안녕하세요Hello1234

    위의 코드에서 "[^가-힣a-zA-Z0-9]"는 한글(가-힣), 영문(a-zA-Z), 그리고 숫자(0-9)를 제외한 모든 문자를 의미합니다. 이들을 빈 문자열로 치환하여 결과를 얻을 수 있습니다.

    3. 텍스트 교체 함수 사용법을 마치며

    텍스트 교체(str_replace, str_replace_all) 함수는 텍스트 데이터를 처리할 때 매우 유용한 도구입니다. 이 함수들을 활용하여 복잡한 문자열 처리 작업을 간단하게 해결할 수 있습니다.

    특히, 정규 표현식과 함께 사용하면 더욱 강력한 문자열 처리 능력을 발휘할 수 있습니다.

    R 프로그램을 다운로드하려면 R 프로그램 공식 웹사이트(https://www.r-project.org/)에서 다운로드 링크를 클릭하여 다운로드할 수 있습니다.

    R 프로그램 모두보기

    함께 읽으면 좋은 글

  • Nginx + Php8 설정

    Nginx + Php8 설정

    1. Nginx와 PHP 8 연결

    nginx php8 패키지를 설치했다고 웹서버에서 php파일이 적용되는 것은 아닙니다. nginx가 php8를 서비스할 수 있도록 일부 파일의 수정이 필요합니다. 설정이 올바르지 않다면 nginx에서 php8이 제대로 작동하지 않습니다. 특히 php파일이 다운로드 되거나 phpinfo 또는 php 코드를 실행시 아무것도 나타나지 않는 문제가 생깁니다.

    지금 확인하는 부분은 nginx와 php8 설정을 통해서 웹서버에서 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번의 단계는 생략해도 됩니다.

    아래에서 php버전에 따라 설정된 user가 다를 수 있습니다. user는 sudo nano /etc/php/8.1/fpm/pool.d/www.conf의 user, group, listen.owner, listen.group 정보와 일치해야 합니다.

    파일을 생성합니다.

    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 확인

    이 글은 nginx 설치 이후 PHP8 셋팅에 있는 내용 중 문제해결에 대한 부분만 별도로 골라내서 작성된 글로 이전 글과 중복되어 있습니다. nginx 설치에 대해서 자세히 알고 싶다면 다음 링크를 클릭하세요

    Nginx 웹서버 설치(ubuntu) – Thinknote

    ubuntu의 nginx가 설치된 상태에서 php8을 설치하고자 한다면 다음 링크를 클릭하세요. php설치는 wordpress를 설치하기 위한 준비 단계로 진행됩니다.

    PHP 8 설치(ubuntu) – 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 설치 글에서 다루도록 하겠습니다.

    함께 읽으면 좋은 글