FREEDOM. FRIENDS. FEATURES. FIRST. 페도라 한국 사용자 모임

페도라 리눅스 APM(Apache PHP MySQL) 설치 연동

게시판 Tech/Tip 페도라 리눅스 APM(Apache PHP MySQL) 설치 연동

  • This topic has 0개 답변, 1명 참여, and was last updated 4 years, 9 months 전에 by 태랑. This post has been viewed 2216 times
  • #20566
    태랑
    키 마스터
      게시글304 댓글1078 총합1382
    @admin
     

    안녕하세요 운영자 태랑 입니다.

     

    Fedora에 APM 구성에 대해서 최신화 하여 오랜만에 작성해 공유 합니다.

     

    APM 은 Apache + PHP + MySQL 의 약자

     

    웹 서버를 구축하고 PHP 로 작성된 웹 어플리케이션을 구동하기 위해 이전부터 많이 사용해온 스택 입니다.

    PHP 를 구동 하기 위한 서버 스택의 구성은 여러가지 방식으로 할 수 있습니다.
    Apache + PHP(mod_php) + MySQL 나 MariaDB
    Apache + PHP-FPM + MySQL 나 MariaDB
    Nginx + PHP-FPM + MySQL 나 MariaDB

     

    이번 글에서는 yum(rpm)으로 Apache + PHP-FPM + MySQL 기술 하도록 하겠습니다.

     

     

    설치 환경

    OS: Fedora 33
    APACHE2.4.46 + PHP 7.4.12 + MySQL 8.0.22

     

    설치순서는 apache mysql php 순으로 설치 하겠습니다 작업은 root 로 진행하겠습니다

    # root 로 변경
    $ sudo su -
    [root]#

     

     

     

    1. Apache 설치

    [root]# dnf -y install httpd mod_proxy_html

    [root]# httpd -v
    Server version: Apache/2.4.46 (Fedora)
    Server built: Aug 25 2020 00:00:00

     

     

     

     

     

    2. Mysql 설치

     

    Mysql Repository 설치

    [root]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-fc33-1.noarch.rpm
    [root]# dnf clean all

     

     

    MySQL 설치

    [root]# dnf -y install mysql-community-server mysql-community-devel mysql-community-server-debug

     

     

    # MySQL 의 root 패스워드 변경

    [root]# systemctl start mysqld

     

    * mysql 를 처음 시작 하고 로그에서 임시 비밀번호를 확인 할 수 있습니다.
    [root]# cat /var/log/mysqld.log | grep "temporary password"
    [Note] A temporary password is generated for root@localhost: RTZwovJ#r8*:

     

    [root]# mysql -uroot -p
    Enter password: <==위에서의 비밀번호 입력, RTZwovJ#r8*:

     

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '변경할 패스워드';
    <-- 패스워드는 복잡도를 고려 해야 합니다.
    mysql> commit;
    mysql> flush privileges;
    mysql> exit;

     

     

     

    기본적인 MySQL 파라미터 추가

    [root]# vi /etc/my.cnf

    [mysqld] <-- 아래 내용을 추가로 입력
    user=mysql
    server-id=1
    log_bin = binlog
    expire_logs_days=10
    innodb_buffer_pool_size = 384M
    innodb_file_per_table=TRUE
    bind-address=0.0.0.0
    log_timestamps=SYSTEM
    character-set-client-handshake=OFF
    skip-character-set-client-handshake
    max_allowed_packet=500M
    init_connect=SET collation_connection = utf8mb4_general_ci
    init_connect=SET NAMES utf8mb4
    character-set-server = utf8mb4
    collation-server = utf8mb4_general_ci

    [참고] 코드 하이라이트 기능은 사이트 안내 글[링크] 에 설명 되어 있습니다.

     

     

     

    MySQL 를 재시작 합니다.

    [root]# systemctl restart mysqld

     

     

     

     

     

     

    3. PHP 설치

    [root]# dnf -y install php php-common \
    php-fpm php-gd \
    build php php-devel \
    php-mysqlnd php-opcache \
    php-mbstring php-pdo \
    php-pecl-imagick-devel php-pecl-mcrypt \
    php-pecl-zip php-bcmath \
    curl curl-devel php-pecl-imagick \
    libpng libpng-devel libwebp libwebp-devel \
    libXpm libXpm-devel openssl openssl-devel \
    autoconf zlib zlib-devel freetype freetype-devel \
    gd gd-devel libmcrypt libmcrypt-devel \
    libtool-ltdl-devel libxml2-devel \
    libxml2 libcurl libcurl-devel

     

     

    [root] php -v
    PHP 7.4.12 (cli) (built: Oct 27 2020 15:01:52) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.12, Copyright (c), by Zend Technologies

     

     

     

     

    php.ini 파일 수정

    [root]# vi /etc/php.ini

     

    아래 5개는 주석 제거 및 내용 수정
    date.timezone = Asia/Seoul
    expose_php = Off
    post_max_size = 500M
    upload_max_filesize = 200M
    memory_limit = 512M

     

     

     

     

     

    4. PHP-FPM 으로 Apache 연동

    Apache 와의 연동을 PHP-FPM으로 하도록 하겠습니다.

     

    향후 Nginx 로의 변경시 변경이 자유롭고 Apache MPM방식을 event(thread) 방식을 사용할 수 있는 장점이 있습니다.

    성능 또한 Apache + mod_php 방식에 비해 PHP-FPM을 사용하여 별도로 php 로직을 처리해주는것이 성능적으로도 더좋다고 확인 되고 있습니다.

     

    그래서 이미 이전 부터 php-fpm 을 많이 사용하는 추세 입니다.

     

     

    ## 먼저 apache 설정을 변경

    # /etc/httpd/conf/httpd.conf  파일 수정

     

    [root]# vi /etc/httpd/conf/httpd.conf

    ServerName www.example.com:80
    -> 주석 해제

    -> 아래 쪽에 2개 내용추가
    ServerTokens Prod
    ServerSignature Off

     

    아래 Directory 사이의 내용을 변경 합니다.
    <Directory "/var/www/html">
    .... 사이의 내용...
    </Directory>

    #Options Indexes FollowSymLinks
    -> 주석 처리 후 아래 내용으로 입력

    Options MultiViews FollowSymLinks
    -> 내용 추가

    #AllowOverride None
    -> 주석 처리 후 아래 내용으로 입력

    AllowOverride All
    -> 내용 추가

     

     

     

     

    # 00-proxy.conf 파일 수정

    [root]# vi /etc/httpd/conf.modules.d/00-proxy.conf

    아래 4개 내용 추가

    ProxyRequests Off
    ProxyErrorOverride on
    ProxyTimeout 600
    ProxyPreserveHost On

     

     

     

     

     

    # php-fpm.conf 파일 수정

    [root]# vi /etc/php-fpm.conf

     

    include=/etc/php-fpm.d/*.conf
    --> 주석이 해제 되어 있는지 확인

    daemonize = yes
    -> 주석으로 되어 있다면 주석을 해제 합니다.

     

    ; Log level
    ; Possible Values: alert, error, warning, notice, debug
    ; Default Value: notice
    ;log_level = notice
    -> PHP-FPM 데몬의 Log level Default 는 notice 입니다.
    -> 문제에 대한 분석이나 초기 설정 후 확인 등이 필요하다면 debug 레벨로 변경하여 사용해도 됩니다.

     

     

     

    ## www.conf 파일 수정

    [root]# cd /etc/php-fpm.d/

    [root]# vi www.conf

    ; pool name ('www' here)
    [www]
    -> PHP Pool 이름을 지정하는 항목 입니다.
    -> 프로그램명이나 사이트 명이나, 업무가 있다면 업무명 등을 입력 하여도 됩니다.
    -> Pool 혹은 Container 의 식별, 이름 입니다 기본으로 www 지정되어 있습니디.
    -> Pool은 conf 파일 별로 여러개의 Pool을 만들 수 있습니다. 이때는 Pool 별로 이름을 지정하여 겹치지 않게 해야 합니다.

     

    = 아래 내용과 같이 되어 있는지 확인 및 주석이 되어 있다면 주석을 해제 합니다.
    user = apache
    group = apache
    listen.acl_users = apache,nginx

     

     

    listen = /run/php-fpm/www.sock
    => 이부분은 접속을 받는 방식을 설정하는 부분으로 Socket(UDS) 방식으로 사용 하거나 IP 방식으로 사용하거나 둘 중 하나를 선택하여 설정해야 합니다.

     

    => IP 방식으로는 아래와 같이 지정 할 수 있습니다.
    listen = 123.123.123.123.123:9000
    listen = 127.0.0.1:9000
    listen = 9000 <== 이와 같이 IP 없이 포트만 기재하면 모든 주소에서 접속이 가능한 상태 입니다
    (listen on a TCP socket to all addresses)

     

    소켓 방식은 아래와 같이 파일명을 지정해주면 됩니다.
    listen = /run/php-fpm/www.sock

    같은 서버에서 apache 와 php-fpm 사용 하는 설정으로 할 것임으로 socket 을 지정하여 설정하도록 하겠습니다
    같은 서버내 라도 IP를 사용 할 수 있고 사용하여도 됩니다.

     

     

    # 프로세스 수와 관련된 pm 으로 시작하는 파라미터 가 있습니다
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 5
    pm.min_spare_servers = 5
    pm.max_spare_servers = 40
    pm.max_requests = 500

    * 위의 설정값은 예시입니다.

    pm.max_children 는 설정된 PHP Pool(여기서는 www) 내에서 가동할 수 있는 최대 자식 프로세스 수를 의미 합니다

    pm.start_servers 는 php-fpm 을 실행할 때 초기에 생성하는 자식 프로세스의 개수입니다

    pm.min_spare_servers 는 idle 상태의 자식 프로세스 개수가 이 개수보다 작으면 자식 프로세스를 생성합니다

    pm.max_spare_servers 는 idle 상태의 자식 프로세스의 최대 개수를 의미 합니다.

    pm.max_requests 는 각 프로세스가 최대 request를 처리하면 수 입니다.
    500 으로 설정되어 있다면 500번 request 후 프로세스를 다시 생성 합니다
    프로세스가 점진적인 메모리 증가에 대한부분을 방지 할 수 있습니다.
    apache 에서 유사한 설정으로는 MaxRequestsPerChild 있습니다.

     

     

     

     

     

    [참고] PHP-FPM 메모리 사용현황 및 세션 계산

    아래 명령어를 이용하면 현재 fork된 php-fpm 프로세스 당 메모리 사용량을 확인 할 수 있습니다.

    [root]# ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

    시스템에 가용한 메모리나 사용 할 정도에서 프로세스당 사용메모리를 나누어서 최대 자식프로세스 개수를 산정 해도 되겠습니다

    ex) PHP에 6GB 를 사용 하려고 함 , PHP-FPM이 현재 사용중인 메모리량이 대략 60MB 임
    6000MB / 60MB = 자식 프로세스 개수 100개 로 설정

    이와 같이 각 시스템 마다 메모리 상황을 고려하여 적절한 pm.max_children 값을 선정하여 설정하면 되겠습니다.

     

     

     

     

    로그 관련된 파라미터의 주석 해제와 변경을 합니다

    access.log = /var/log/php-fpm/$pool.access.log
    -> 주석 해제 및 경로 지정

     

    access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
    --> 주석제거

     

    slowlog = /var/log/php-fpm/$pool.slow.log
    --> 주석제거, 파일명 변경

     

    request_slowlog_timeout = 5
    --> 주석제거, 내용변경
    --> 단위는 초로 5는 예시 입니다. 해당 시간은 선택해서 변경 하시면 됩니다.

     

    catch_workers_output = yes
    -> 주석 제거
    -> main error log 파일에 worker 의 에러 로그가 같이 기록 되게 됩니다.

     

    php_admin_value[error_log] = /var/log/php-fpm/www-error.log
    php_admin_flag[log_errors] = on
    -> 주석 제거

     

     

     

     

    # PHP Opcache 파라미터

    [참고] PHP 5.5 버전 부터 기본에 포함되었으며 이전에는 zend optimizer 를 별도로 설치 및 plugin 하여 사용 하였습니다.

     

    사용 용도는 컴파일 / 실행 / 결과 의 순으로 처리되는 PHP에 대해서 Opcache(예전의 Zend Optimizer)를
    이용하여 컴파일된 PHP 코드를 메모리에 Cache 해서 접속요청에 더 빠르게 응답을 줄수 있는 기능 입니다

     

    php7.x 버전부터 Opcache 의 기본 메모리가 128M  입니다.

    메모리를 변경하거나 다른 파라미터를 조정 하고자 한다면 10-opcache.ini 에서 설정할 수 있습니다.

     

     

    [root]# cd /etc/php.d
    [root]# vi 10-opcache.ini

    10-opcache.ini 파일에는 opcache 의 활성화 내용부터 해서 기본적으로 사용 될수 있는 파라미터는
    주석이 해제되어 활성화가 되어 있는 상태 입니다.

    opcache의 파라미터의 간략한 설명은 아래와 같습니다.

     

    opcache.enable=1 - Zend Opacache 활성화 여부 결정 , 1일때 활성화 됨
    opcache.enable_cli=1 - PHP CLI 버전에서(명령행 버전에서도) Zend Opcache 활성화 여부 결정
    opcache.memory_consumption - 캐쉬에 사용할 메모리 크기. 7.0부터 기본 크기는 128M
    opcache.interned_strings_buffer=8 - 메모리에서 interned 문자열을 위해 사용할 메모리량
    opcache.fast_shutdown=1 - 활성화 시 accelerated code 에 대해서 사용되어짐
    opcache.interned_strings_buffer - Opcache 가 사용하는 내부 스트링( class name 이나 file등)을 저장하기 위한 메모리의 크기.

    opcache.max_accelerated_files - Opcache 가 캐쉬할 최대 파일 갯수.

    opcache.validate_timestamps - Default 1 / 0(off)이 아닐 경우 opcache.revalidate_freq 에 설정된
    시간마다 코드와 캐쉬의 변경 여부를 체크한다.

    validate_timestamps 가 꺼져 있을 경우 코드의 변경 여부를 체크하지 않으므로 PHP 소스가 수정되어도 반영되지 않는다.

    그러므로 변경 사항을 반영하려면 httpd 를 재기동하거나 httpd 에 SIGUSR2 시그널을 전송해야 한다.

     

    opcache.file_cache_only=1 - makes sure that the in-memory opcache is disabled and only files are used, which is what you want for CLI.

    1 로 설정할 경우 in-memory opcache 사용이 안됨 = php-fpm 에서 사용할수 없음

     

     

    그래서 메모리 관련하여 수정이 필요 할 경우 아래와 같이 용량을 늘려서 사용 할 수 있습니다.

    opcache.memory_consumption=256
    -> 입력의 예시 이며 단위는 MB 입니다
    -> 이부분(메모리 변경) 은 필수는 아닙니다.

     

     

     

     

    php-fpm 재시작

    [root]]# systemctl restart php-fpm
    * PHP-FPM 설치 후 자동으로 기동되어 있음

     

     

     

     

    프로세스 및 포트 오픈 확인

    [root]]# ps -ef| grep php
    root 62849 1 0 11:26 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
    apache 62850 62849 0 11:26 00:00:00 php-fpm: pool www
    apache 62851 62849 0 11:26 00:00:00 php-fpm: pool www
    apache 62852 62849 0 11:26 00:00:00 php-fpm: pool www
    apache 62853 62849 0 11:26 00:00:00 php-fpm: pool www
    apache 62854 62849 0 11:26 00:00:00 php-fpm: pool www

     

     

    # listen을 Unix Socket 으로 사용 할 경우
    [root]]# ls -al /run/php-fpm
    srw-rw----+ 1 root root 0 11월 29 11:35 www.sock

     

    # listen을 IP 으로 사용 할 경우
    [root]]# netstat -antp | grep 9000
    tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 6389/php-fpm: master

     

     

     

     

    OS 방화벽 오픈 합니다.

    # 80 포트 추가
    [root]]# firewall-cmd --permanent --add-port=80/tcp

    # 80 포트 삭제(참고)
    [root]]# firewall-cmd --permanent --remove-port=80/tcp

    # 정책 재반영 및 방화벽 정책 확인
    [root]]# firewall-cmd --reload;firewall-cmd --list-all

     

     

    /var/www/html 에 아래 내용으로 phpinfo.php 파일을 생성 합니다.

    [root]]# cd /var/www/html
    [root]]# vi phpinfo.php

     

    <?php
    phpinfo();
    ?>

     

     

     

     

    # apache 재시작

    [root]# systemctl restart httpd

     

     

     

    # 접속 테스트

    http://ip주소/phpinfo.php

     

     

    Ref link

    Fedora 33 - APM(Apache PHP Mysql) 설치 및 연동

     

    글의 최상단으로 이동 [클릭]

    오픈소스를 응원합니다 Blog https://hoing.io
    Senior Database Administrator(MySQL, Oracle)

    사이트 이용 문의 사항은 댓글이나 admin@fedoralinux.or.kr 로 메일주세요

  • 답변은 로그인 후 가능합니다.

지금 이 순간


RTSP:// 플레이(with mplayer & vlc)
스크립트 하나 만드는 것도 쉽지가 않군요,
가입 인사드립니다~~
RHEL5에 Microsoft Office 2003 설치하기
Fedora14에서 SSD 사용에 관해서 질문이 있습니다.
Fedora12용 윈도 부트관리자를 이용한 멀티 부트
페도라 33 서버 vnc 연결을 위한 gui 설정
시험이 끝나도...
페도라 16 에서는 코덱 은 기본탑재가 아닌가봐요..
시간지나면 자동으로 로그아웃 되는 것 막는 방법좀 알려주세요.