#############################################
######### RockyOS 9.5 PHP 7.4 설치 ##########
#############################################
# 본 스크립트는 반드시 관리자 권한에서 실행해야 한다.
# openssl 버전 확인 => TLS 1.3을 지원하더라.
openssl version
## 현재 설치된 PHP 버전 확인
dnf module list php
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
dnf -y install expat-devel
## 설치확인
dnf list installed | grep MariaDB
rpm -qa | grep MariaDB
# 설치되어 있는 PHP 모듈 확인 방법
php -m
# 시스템 업데이트
sudo dnf -y update
sudo dnf -y install wget unzip mc git nmap
# SSL 관련 패키지 설치 확인
sudo dnf -y install openssl openssl-devel
# 1. Apache 설치
sudo dnf install httpd -y
# 2.EPEL 및 Remi 저장소 설치
sudo dnf -y install epel-release
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
# 3.PHP 모듈 재설정 및 Remi 저장소 활성화
sudo dnf module reset php
sudo dnf module enable php:remi-7.4
# 4.PHP 7.4 및 필요한 확장 모듈 설치
sudo dnf -y install php php-cli php-fpm php-curl php-mysqlnd php-gd php-opcache php-zip php-intl php-common php-bcmath
sudo dnf -y install php-imagick php-xmlrpc php-json php-readline php-redis php-mbstring php-apcu php-xml php-dom php-redis
sudo dnf -y install php-memcached php-memcache php-devel php-openssl
sudo dnf -y install mod_ssl openssh
sudo dnf -y install ImageMagick ImageMagick-devel
# PHP 7.4 에서는 설치 필요. PHP 8.X에서는 에러 표시함.
sudo dnf -y install php-mcrypt
# 5. PHP 버전 확인
php -v
# Apache 버전 확인
httpd -v
# PHP와 웹 서버 간 통신이 차단될 수 있으니 SELinux 설정 확인
sudo setsebool -P httpd_can_network_connect 1
# 서비스 시작
sudo systemctl start php-fpm
sudo systemctl start httpd
# 서비스 활성화
sudo systemctl enable php-fpm
sudo systemctl enable httpd
systemctl stop httpd
systemctl restart httpd
systemctl status httpd
#####################################################################
## httpd.conf 파일 수정
#####################################################################
vi /etc/httpd/conf/httpd.conf
ServerName localhost
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Options +FollowSymLinks -Indexes
AllowOverride All
Require all granted
<LimitExcept GET POST>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.php index.jsp
</IfModule>
<IfModule mime_module>
TypesConfig /etc/mime.types
#AddType application/x-gzip .tgz
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php .html .do
AddType application/x-httpd-php-source .phps
AddType text/css .css
AddType text/javascript .js
#AddHandler cgi-script .cgi
#AddHandler type-map var
#AddOutputFilter INCLUDES .shtml
</IfModule>
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 402 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 405 /error.php
ErrorDocument 408 /error.php
ErrorDocument 500 /error.php
ErrorDocument 501 /error.php
ErrorDocument 502 /error.php
ErrorDocument 503 /error.php
# 보안 검증 통과를 위해 반드시 서버 정보 노출 방지 해야 함.
ServerTokens Prod
ServerSignature Off
TraceEnable Off
# Apache HTTPOXY 취약점 방지
RequestHeader unset Proxy early
저장하고 나온다.
#####################################################################
# php.ini 환경 설정
#####################################################################
vi /etc/php.ini
short_open_tag = On
;경로 기반의 공격 방지
cgi.fix_pathinfo=0
;PHP 버전 정보 노출 방지(Hide PHP Version Number)
expose_php = Off
post_max_size = 20M ;// 8M 으로 되어 있었음.
upload_max_filesize = 18M ;// 기본 2M 으로 되어 있었음
date.timezone ="Asia/Seoul"
;PHP에서 세션은 일단 생성 된 뒤에, 가비지 콜렉터 관리로직에 의해 소멸된다.
session.gc_probability = 1
session.gc_divisor = 1
;이값이 100이면 1/100 즉 1%의 확률로 가비지콜렉션이 실행된다.
;1이면 정확하게 유효기간이 넘은 데이타가 삭제될 것이다.
session.gc_maxlifetime = 3600
# 저장하고 나온다.
# Apache 서버 재기동
systemctl restart httpd
# 서버 정보 확인
# ip addr 로 IP 주소 정보를 확인하고 해당 IP주소로 대체하여 입력
curl -i 192.168.1.20
# Apache 라는 서버 정보가 보인다. 이것마저 방지하고자 한다면....
dnf install mod_security
vi /etc/httpd/conf/httpd.conf
<IfModule security2_module>
SecRuleEngine on
ServerTokens Full
SecServerSignature "Link2me"
</IfModule>
저장하고 나온다.
# Apache 서버 재기동
systemctl restart httpd
# 서버 정보 확인
curl -i 192.168.1.20
#####################################################################
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
# PHP-FPM 구성
vi /etc/php-fpm.d/www.conf
user = apache
group = apache
listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
;shift + G 눌러서 제일 하단으로 이동하여
php_value[opcache.file_cache] = /var/lib/php/opcache ; 주석만 제거
저장하고 나온다.
vi /etc/httpd/conf.d/php-fpm.conf
<FilesMatch \"\.php$\">
SetHandler \"proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/\"
</FilesMatch>
확인하고 틀리면 수정/저장하고 빠져나온다.
sudo systemctl restart httpd
sudo systemctl restart php-fpm
#####################################################################
# 반드시 추가구현해야 문제없이 동작한다.
cd /var/www/html/
vi .htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ error.php?/$1 [QSA,PT,L]
</IfModule>
## 보안설정
sudo chmod 640 /etc/httpd/conf/httpd.conf
sudo chown root:root /etc/httpd/conf/httpd.conf
sudo chmod 640 /etc/php.ini
sudo chown root:root /etc/php.ini
sudo chown -R apache:apache /var/www/html
sudo chmod -R 755 /var/www/html
####################################################################################
# CentOS7 과 달리 chmod 644 를 지정해줘야 제대로 동작되는 걸 확인했다.
mkdir -p /home/rsa/key/
cd /home/rsa/key/
openssl genrsa -out rsa_pri.pem 2048
openssl rsa -pubout -in rsa_pri.pem -out rsa_pub.pem
# Rockey Linux 9 에서 읽기가 관리자권한만 가능하게 되어 있어서 수정해서 해결했다.
# 이 한줄 때문에 숱한 버그 찾기 끝에 해결했다.
chmod 644 rsa_pri.pem
# 세션이 저장되는 디렉토리 퍼미션 지정
sudo chmod 777 -R /var/lib/php/session
sudo chmod 1733 /var/lib/php/session
sudo chown apache:apache /var/lib/php/session
# 세션 확인
cd /var/lib/php/session
ll
# Clear Old Sessions
sudo rm -rf /var/lib/php/session/*
####################################################################################
# 방화벽 데몬 시작
systemctl start firewalld
# 서버 부팅 시 firewalld 데몬 자동 시작 설정
systemctl enable firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=mysql
firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --permanent --zone=public --add-port=8000/tcp
firewall-cmd --reload
firewall-cmd --list-all
#######################################################################
cd /var/www/html
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
unzip phpMyAdmin-5.2.1-all-languages.zip
chown -R apache:apache phpMyAdmin-5.2.1-all-languages
mv phpMyAdmin-5.2.1-all-languages pma
cd pma
cp -rp config.sample.inc.php config.inc.php
# 환경 설정
vi config.inc.php
$cfg['blowfish_secret'] = 'qtdRoGmbcr]0s)r$9b_JUnoGmbcbcr]0s)r$9b_JUnoGmr]0s)r$9b{~Xz'; // 임의의 값 설정
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['compress'] = true;
$cfg['TempDir'] = '/tmp';
###############################
###### composor 설치 #####
###############################
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer -V
export COMPOSER_ALLOW_SUPERUSER=1
composer -V
echo "export COMPOSER_ALLOW_SUPERUSER=1" >> ~/.bashrc
cat ~/.bashrc | grep export
composer require phpoffice/phpspreadsheet
composer require phpmailer/phpmailer
####################################################################################
# 기본 버전을 설치하고 싶다면 아래와 같이 제거 후에 재설치
dnf remove php
# 제거후에는 반드시 Reset 해야 한다.
dnf module reset php
# 8.2로 활성화
dnf module enable php:8.2
# 재설치 진행
dnf install php
####################################################################################
# 서버가 지원하는 TLS 버전 확인 코드
<?php
$ch = curl_init('https://www.howsmyssl.com/a/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
$json = json_decode($data);
echo "<h1>Your TLS version is: " . $json->tls_version . "</h1>\n";
?>
####################################################################################