Rocky Linux - 웹 서버 구축 [LAPM] 설치

    LINUX LAPM란?

    APM은 하나의 소프트웨어가 아닌 [Apache, MariaDB(Mysql), PHP] 3개의 오픈소스 소프트웨어 앞글자를 딴 줄임말입니다. 리눅스의 앞글자까지 따서 [LAPM]라 명칭을 하기도 합니다.

    Linux(Rocky) [공식 홈페이지] Redhat 엔터프라이즈급 운영체재와 100% 목표로 호환될 수 있도록 개발된 Linux 기반 OS
    Apache [공식 홈페이지] HTTP를 통해 웹페이지[텍스트/그림]등을 요청 처리해주는 웹서버 프로그램
    PHP[Hypertext Preprocessor] [공식 홈페이지] 오픈 소스 범용 스크립팅 언어
    MariaDB [공식 홈페이지] 오픈 소스의 관계형 데이터베이스 관리 시스템

    해당 오픈소스 소프트웨어는 서로 호환성 및 범용성이 좋아 대부분이 개인 및 웹호스팅 업체에서 기본적으로 제공을 하고 적용을 하고 있습니다.

    [설치환경 및 준비물]

    릴리즈 설치 테스트 : 2021-10-20

    VMware Workstation 가상화에서 Rocky Linux 8.4 OS 준비 [포스팅 참고]

    □ [root@localhost ~]# dnf update [※ OS 설치 후 기본 패키지 최신 업데이트]

    □ [root@localhost ~]# cat /etc/selinux/config | grep SELINUX  [보안 설정]
    SELINUX=disabled  [빠른 테스트를 위해 비활성화, 재시작 필요]

     

    □ Rocky Linux 8 - AppStream [2021-10-21] 기준으로 설치되는 기본 버전들

    Apache(Httpd) 2.4.X
    PHP 7.2.X [Rocky Linux 8 - AppStream 저장소 : 7.4.X]
    MariaDB 10.3.X [마리아 저장소 : 10.6.X]

    원래는 웹을 개발하려는 환경에 따라 버전에 맞게 RPM/소스파일로 설치하는 게 좋겠지만 크게 영향을 받지 않는다면 일반적으로 dnf(자동 설치)로 쉽게 진행하는 게 좋습니다. 기회가 된다면 소스로 설치하는 방법은 따로 포스팅하도록 하겠습니다.

    ■ [APM] Apache, PHP, MariaDB Install Guide 시작

    ※ dnf(패키지 자동 설치)로 진행할 경우는 설치 순서는 상관없습니다만, 소스로 설치할 경우는 연동 편의성을 위해 일반적으로는 Apache, MariaDB, PHP 설치 순서로 진행한다는 것만 기억하시면 됩니다.


    STEP01 → 아파치[Apache] 설치

    [root@localhost ~]# dnf install httpd

     

    STEP02 → 마리아[Maria DB] 설치

    [root@localhost ~]# dnf install mariadb-server mariadb

    ※ 다른 버전을 설치하고 싶을 경우

    배포 사이트 : https://mariadb.org/

    버전별 세팅 방법[스크린샷 참고] : https://downloads.mariadb.org/mariadb/repositories/#mirror=yongbok

    Rocky는 아직 없기 때문에 호환되는 CentOS/Redhat 패키지 설치 방법을 따라가면 됩니다.

    먼저 YUM 저장소 생성[파일 생성 후 저장]

    [root@localhost ~]# vi /etc/yum.repos.d/MariaDB.repo

    # MariaDB 10.6 RedHat repository list - created 2021-10-21 06:15 UTC
    http://downloads.mariadb.org/mariadb/repositories/
    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.6/rhel8-amd64
    module_hotfixes=1
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1

    MariaDB 설치

    [root@localhost ~]# dnf install mariadb-server mariadb

    다시 기본버전으로 설치하고 싶다면 아래와 같이 제거 후에 재설치[10.3.X] 진행

    [root@localhost ~]# dnf remove mariadb-server mariadb  [10.6.X 제거]

    [root@localhost ~]# rm -f /etc/yum.repos.d/MariaDB.repo  [미러사이트 제거]

     

    STEP03 → PHP 설치

    [root@localhost ~]# dnf install php

    ※ 다른 버전을 설치하고 싶을 경우

    이전에는 레미(Remi)저장소를 이용했지만 Rocky Linux AppStream는 자체 저장소에서도 선택을 할 수 있습니다.

    사용 가능한 PHP 버전 확인

    [root@localhost ~]# dnf module list php

    PHP [7.4] 모듈을 사용하기 위한 활성화 및 디폴트 설정

    [root@localhost ~]# dnf module enable php:7.4

    PHP [7.4] 설치

    [root@localhost ~]# dnf install php

    다시 기본버전으로 설치하고 싶다면 아래와 같이 제거 후에 재설치[7.2] 진행

    [root@localhost ~]# dnf remove php  [7.4 제거]

    [root@localhost ~]# dnf module reset php  [제거 후에는 리셋을 꼭 해야 합니다.]

    [root@localhost ~]# dnf module enable php:7.2  [7.2로 활성화]

    [root@localhost ~]# dnf install php  [재설치 진행]

     

    추가로 설치 되어 있는 모듈 확인

    [root@localhost ~]# php -m

     

    STEP04 → 설치 버전 확인

    [root@localhost ~]# httpd -v
    Server version: Apache/2.4.37 (rocky)
    Server built:   Oct 13 2021 02:29:38

    [root@localhost ~]# php -v
    PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

    [root@localhost ~]# mysql -V  [옵션 대문자]
    mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

    ■ 여기서부터는 [APM] Apache, PHP, MariaDB config(설정) 및 구동


    STEP05 → 아파치(Apache) 설정 및 구동

    □ 5-1 기본 설정(수정 후 저장)

    [root@localhost ~]# vi /etc/httpd/conf/httpd.conf

     

         69 User nobody      [apache → nobody 변경]
         70 Group nobody      [apache → nobody 변경]

     

         98 #ServerName www.example.com:80
         99 ServerName 192.168.150.149:80      [도메인 또는 해당 서버 IP 입력 추가]

    [참고]
    ◇ apache → nobody 변경
    ROOT 권한으로 실행된 아파치의 하위 프로세스를 이곳에서 지정한 사용자로 실행한다는 의미,
    기본값으로 apache 또는 daemon으로 되어있지만 대부분 nobody로 변경하여 이용한다. 약간 보안적인 의미를 포함

    라고 이전에 말씀드렸지만, 기존에 있는 흔한 유저 계정보다 해당 서버에서만 사용하는 계정을 생성하여 실행하도록 하는 게 좀 더 좋습니다.

     

    ◇ ServerName

    본인 서버가 이 도메인을 사용한다는 것을 알리기 위한 수단, 예를 들어

    ServerName www.test.com:80 → 홈페이지 접속 시 해당 도메인(http://www.test.com)으로 연결

    ServerName 192.168.150.149:80 → 홈페이지 접속 시 해당 도메인(http://192.168.150.149)으로 연결 (도메인이 없을 경우 IP 입력)

     

    본인 서버 IP 세팅

    [root@localhost ~]# ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.150.149  netmask 255.255.255.0  broadcast 192.168.150.255

    □ 5-2 방화벽 설정 및 적용

    [root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp  [HTTP 80번 포트 추가]
    [root@localhost ~]# firewall-cmd --reload  [적용]

    [root@localhost ~]# firewall-cmd --list-all  [추가된 포트 확인]

      ports: 80/tcp

    □ 5-3 아파치 시작 및 프로세스 구동 확인[service httpd start(stop) 명령어 사용 가능]

    [root@localhost ~]# systemctl start httpd  [시작]

     

    부팅 후 자동 실행 설정[비활성화 시 disable]
    [root@localhost ~]# systemctl enable httpd
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

     

    [root@localhost ~]# ps -ef |grep httpd  [프로세스 확인]

    □ 5-4 웹 구동 확인 테스트[스크린샷 참고]

     

    STEP06 → PHP 환경설정 및 구동(경로)

    □ 6-1 httpd 설정 기본 파일 PHP MINE 기본 설정[수정 후 저장]

    [root@localhost ~]# vi /etc/httpd/conf/httpd.conf

     

        167 <IfModule dir_module>
        168     DirectoryIndex index.html index.htm index.php  [일부 추가]
        169 </IfModule>

     

        287     AddType application/x-compress .Z
        288     AddType application/x-gzip .gz .tgz
        289     AddType application/x-httpd-php .php  [라인 추가]
        290     AddType application/x-httpd-phps .phps  [라인 추가]

    [참고]
    ◇ 실제 PHP환경설정을 관리하는 파일은 아래의 경로입니다.
    [root@localhost conf.modules.d]# vi /etc/php.ini
    위 httpd.conf 쪽에 세팅하는 건 아파치에 php 관련 처리를 할 수 있게 추가를 하는 부분입니다.  php.ini 파일 설정은 사용하려는 웹 환경에 맞게튜닝을 해야 하지만 현재는 기본 세팅으로 갑니다. 나중에 따로 설명하도록 하겠습니다.

    ◇ YUM설치 시 PHP7 모듈 파일 경로
    [root@localhost httpd]# ls -al /etc/httpd/modules/ | grep php7
    -rwxr-xr-x 1 root root 4976632  5월 30 15:49 libphp7.so

    ◇ PHP7 모듈 적용 설정 파일 경로[이미 세팅되어있음]
    [root@localhost httpd]# vi /etc/httpd/conf.modules.d/15-php.conf
    <IfModule !mod_php5.c>
      <IfModule prefork.c>
        LoadModule php7_module modules/libphp7.so
      </IfModule>
    </IfModule>

    □ 6-2 PHP-FPM 기본 설정[수정 후 저장]

    [root@localhost ~]# vi /etc/php-fpm.d/www.conf

         23 ; RPM: apache user chosen to provide access to the same directories as httpd
         24 user = nobody           [apache → nobody 변경]
         25 ; RPM: Keep a group allowed to write in log dir.
         26 group = nobody          [apache → nobody 변경]

     

         52 ; When POSIX Access Control Lists are supported you can set them using
         53 ; these options, value is a comma separated list of user/group names.
         54 ; When set, listen.owner and listen.group are ignored
         55 listen.acl_users = apache,nginx     [; 주석처리]
         56 listen.acl_groups = nobody        [라인 추가]

    [참고]
    ◇ PHP-FPM (PHP FastCGI Process Manager)란?
    웹서버(apache/nginx)와 상호작용(동적)으로 통신 처리하기 위한 프로그램입니다. CGI의 상위 버전이며 통신 시 발생되는 부하를 줄이고 서버가 한 번에 더 많은 웹페이지 요청을 관리할 수 있게 합니다. 예를 들어 [XE/그누보드/워드프레스] 게시판 같은 로그인과 게시글 등록 등의 변화가 많은 사이트에 적합하다고 할 수 있습니다. Apache 보다는 Nginx과 많이 연동하여 사용하며 Remi를 이용해 YUM 설치하면 같이 설치되다 보니 Apache 사용하는 김에 이용하면 좋을 것으로 판단되어 같이 설정합니다.

    ◇ listen.acl_groups 옵션은 listen.owner 및 listen.group 권한으로 실행되는 것을 제외하는 옵션
    아마 검색해서 들어오시는 대부분의 사용자가 아래와 같은 경험을 하신 분들이 많을 것으로 예상됩니다.
    Apache와 연동하는 경우에는 이상하게 아래의 옵션을 적용을 한 뒤에 PHP-FPM 재시작을 해도

    listen.owner  = nobody
    listen.group = nobody
    isten.mode = 0660

    [root@localhost php-fpm]# ls -al /var/run/php-fpm/
    -rw-r--r--   1 root root   4 10월 25 03:12 php-fpm.pid
    srw-rw----+  1 root root   0 10월 25 03:12 www.sock

    무조건 ROOT 권한으로 실행이 됩니다. 이상태에서. PHP를 열게 되면 아래와 같이 권한 때문에 페이지 에러 발생

    [웹 페이지 에러메세지(스크린샷 참고)]
    Service Unavailable
    The server is temporarily unable to service your request due to maintenance downtime or capacity problems.
    Plsase try again later.

    [서버 로그 메시지]
    [Tue Jun 23 21:13:02.896505 2020] [proxy:error] [pid 38425:tid 140299678566144] (13)Permission denied: AH02454: F CGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed
    [Tue Jun 23 21:13:02.896554 2020] [proxy_fcgi:error] [pid 38425:tid 140299678566144] [client 192.168.232.1:49559] AH01079: failed to make connection to backend: httpd-UDS

     

    이문제는 순수 권한 문제로 발생했기 때문에 실행 권한이 있는 계정과 동일하게 맞춰주면 해결은 됩니다.

     

    [root@localhost ~]# chown -R nobody:nobody /var/run/php-fpm/
    [root@localhost php-fpm]# ls -al /var/run/php-fpm/
    -rw-r--r--   1 nobody nobody   4 10월 25 03:12 php-fpm.pid
    srw-rw----+  1 nobody nobody   0 10월 25 03:12 www.sock

    다만 재시작 시 원상 복구되므로 할 때마다 위 명령어를 해줘야 하는 불편함이 있으므로 [listen.acl_groups = nobody] 명령어를 이용해 ROOT로 시작돼도 해당 계정은 예외 될 수 있도록 하는 게 더 좋습니다.

    □ 6-3 PHP-FPM 활성화 및 설정 적용을 위한 재시작

    PHP-FPM 재시작[service php-fpm start(stop) 명령어 사용 가능]
    [root@localhost ~]# systemctl restart php-fpm

    부팅 후 자동 실행 설정[비활성화 시 disable]
    [root@localhost ~]# systemctl enable php-fpm
    Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service  → /usr/lib/systemd/system/php-fpm.service.

    httpd.conf 설정 변경으로 동일하게 재시작
    [root@localhost ~]# systemctl restart httpd

    □ 6-4 PHP-FPM 구동 확인
    [root@localhost ~]# ps -ef |grep php

    □ 6-5 PHP 적용 확인

    [root@localhost ~]# cd /var/www/html/

    해당 경로에서 PHP의 정보를 보여주는 함수 파일 생성 후 저장
    [root@localhost html]# vi /var/www/html/phpinfo.php

    <?php phpinfo();?>      [라인 추가]

    [root@localhost html]# ls
    phpinfo.php

    □ 6-6 PHP 웹 연동 확인 테스트[스크린샷 참고]

     

    STEP07 → MariaDB 구동 및 설정

    □ 7-1 MariaDB 구동

    [root@localhost ~]# systemctl start mariadb

     

    부팅 시 자동 시작 활성화

    [root@localhost ~]# systemctl enable mariadb
    Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
    Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.

     

    구동 확인

    [root@localhost ~]# ps -ef | grep mysql
    mysql      11378       1  0 21:51 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr
    root       11464    1536  0 21:52 pts/0    00:00:00 grep --color=auto mysql

    ※ 예외상황

    설치 후 다음과 같이 MariaDB 구동이 실패하는 경우[스크린샷 참고]

    해당 메시지만으로는 정확한 원인을 알 수 없어 로그를 확인

    [root@localhost ~]# vi /var/log/mariadb/mariadb.log

    2021-10-27 21:35:35 0 [ERROR] InnoDB: Invalid flags 0x15 in ./ibdata1
    2021-10-27 21:35:35 0 [ERROR] InnoDB: Plugin initialization aborted with error Data structure corruption

    오류 데이터 구조 손상으로 인해 플래그인 초기화가 중단되었다는 오류를 확인할 수 있습니다.

    즉, 이전에 테스트로 버전을 바꿔가면서 설치 및 삭제를 하다 보니 기존 정보가 남아 있어 충돌하는 문제였습니다.

     

    해결방법

    [root@localhost ~]# rm -rf /var/lib/mysql/*  [기존 데이터베이스 정보 삭제]

    [root@localhost ~]# systemctl start mariadb  [이후 재시작 정상]

    □ 7-2 Maria DB 기본 설정 [DB가 구동된 상태에서 진행 가능]

    [root@localhost ~]# mysql_secure_installation

     

    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!


    In order to log into MariaDB to secure it, we'll need the current
    password for the root user. If you've just installed MariaDB, and
    haven't set the root password yet, you should just press enter here.

     

    Enter current password for root (enter for none): [패스워드가 없기 때문에 엔터]
    OK, successfully used password, moving on...

     

    ※ 이 부분은 버전에 따라 안 나올 수 있습니다.
    Setting the root password or using the unix_socket ensures that nobody
    can log into the MariaDB root user without the proper authorisation.


    You already have your root account protected, so you can safely answer 'n'.
    Switch to unix_socket authentication [Y/n] Y    [MariaDB 실행 시 통신 소켓 생성 여부? Y 엔터]

    You already have your root account protected, so you can safely answer 'n'.
    Change the root password? [Y/n] Y   [DB ROOT 패스워드 설정할 것인가? Y 엔터]
    New password:  패스워드 입력
    Re-enter new password:  재확인 패스워드 입력
    Password updated successfully!
    Reloading privilege tables..
     ... Success!


    By default, a MariaDB installation has an anonymous user, allowing anyone
    to log into MariaDB 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? [Y/n] Y  [익명의 접근을 막을 것인지? 보안을 위해 Y 엔터]
     ... Success!

    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? [Y/n] Y  [DB ROOT 원격을 막을 것인지? 보안을 위해 Y 엔터]
     ... Success!

     

    By default, MariaDB 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? [Y/n] Y [Test 용으로 생성된 데이터베이스를 삭제할 것인가? Y 엔터]
     - Dropping test database...
     ... Success!

     - Removing privileges on test database...

     ... Success!

     

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


    Reload privilege tables now? [Y/n] Y [현재 설정한 값을 적용할 것인지? 당연히 Y 엔터]
     ... Success!


    Cleaning up...


    All done!  If you've completed all of the above steps, your MariaDB
    installation should now be secure.


    Thanks for using MariaDB! [설정 완료]

    □ 7-3 MariaDB 접속

    [root@localhost mysql]# mysql -u root -p
    Enter password: 패스워드 입력

    ◇ MariaDB(Mysql) 환경설정을 관리하는 파일은 아래의 경로입니다.
    [root@localhost ~]# vi /etc/my.cnf

    my.cnf 파일 설정은 사용하려는 DB 환경에 맞게 튜닝을 해야 하지만 현재는 기본 세팅으로 갑니다.
    이 내용은 따로 포스팅하도록 하겠습니다.


    마치며

    Rocky Linux에 APM을 설치를 해보았는데요. 일부 수정이 있었지만, 역시나 패키지로 설치하면 크게 변하는 부분은 없습니다. 복귀로 익숙해지기 위해 이미 한 내용으로 복습을 해보았습니다. 이것만 알면 클라우드 서비스를 통해 일반 사용자들도 쉽게 웹 홈페이지 공간을 구축할 수 있습니다. 이후 APM 설치한 공간에 게시판(WordPress/XE)등을 추가로 설치하는 방법을 알아보도록 하겠습니다.

    Designed by JB FACTORY