리눅스

[CentOS 7] Python + MariaDB 10.4 + PHP 7.4 설치 스크립트

Link2Me 2021. 11. 6. 10:35
728x90

파이썬 3.6 + MariaDB 10.4 + PHP 7.4 를 설치하는 스크립트이다.

MariaDB를 Python 에서 이용하기 위해서는 Python 3.6 을 먼저 yum 설치해야 한다.

 

설치 스크립트는 편의상 구분 작성했다.

 

Updated : 2021.12.30

SQLite 3.7.17 버전이라 더 높은 버전의 SQLite 설치가 필요하다는 메시지가 나올 경우

아래 명령어를 실행하면 에러없이 환경 설정 가능하다.

Docker 테스트 할 때 sudo 명령어가 먹히지 않았을 때 나온 현상이라 아래 코드는 별도 설정하지 않아도 된다.

# SQLite 3.7.17 버전보다 높은 버전을 설치하기 위한 작업
wget https://www.sqlite.org/2018/sqlite-autoconf-3240000.tar.gz
tar zxvf sqlite-autoconf-3240000.tar.gz
cd sqlite-autoconf-3240000
./configure --prefix=/usr/local
make
make install
 
python3.6 -"import sqlite3; print(sqlite3.sqlite_version)"
export LD_LIBRARY_PATH=/usr/local/lib
python3.6 -"import sqlite3; print(sqlite3.sqlite_version)"
# 3.24.0 버전으로 확인될 것이다.
 
cd ..
rm -rf sqlite-autoconf-3240000
#로 파일을 삭제한다.
 

 

파이썬 3.6 설치 스크립트

###############################################################
## CentOS 7 Package Update
#yum update할 때 kernel은 업데이트되지 않게 하기
vi /etc/yum.conf 
[main]
exclude=kernel*
#저장(:wq)하고 나온다. 
# 그래야만 CentOS 7.4 커널은 업데이트 되지 않고 나머지 사항은 업데이트된다.
 
yum -y update
 
###############################################################
# 파이썬(Python) 설치 과정
###############################################################
 
rpm -qa | grep mariadb
# 설치된 것이 없다면 아래 한꺼번에 지우기는 실행하지 않아도 된다.
 
## 설치된 것 한꺼번에 지우기
rpm -qa | grep mariadb >list
 
# vi list로 해서 삭제 안할 리스트는 선별 제거한다.
sudo yum -y remove $(awk '{print $1}' <list)
 
# python 2.7.X 버전이 설치된 것을 확인한다.
rpm -qa | grep python
 
# Python 모듈을 빌드하려면 개발 도구가 필요
yum -y install epel-release
yum -y groupinstall 'Development Tools'
yum -y install yum-utils
yum -y install zlib zlib-devel libffi-devel
yum -y install zip unzip wget mc git net-tools
yum -y install mariadb-devel 
yum -y install gcc gcc-c++ python3 python3-devel openssl openssl-devel
 
python3 -V
pip3 -V
 
# pip 설치는 가상환경 만들어서 하는 걸 권장하므로 아래 한줄은 주석처리했다.
# pip3 install --upgrade pip
 
# 현재 Alias 확인
ls -/bin/python*
 
ln -/bin/pip3.6 /bin/pip
 
# 아래와 같이 수정하지 않으면 yum 설치가 되지 않는다.
vi /usr/bin/yum
# 첫줄에 python 을 python2.7 로 변경하고 저장(:wq)한다.
 
vi /usr/libexec/urlgrabber-ext-down
# 첫줄에 python 을 python2.7 로 변경하고 저장(:wq)한다.
 
###### SQLite3 DB 설정 ###################################
cd /root
mkdir sqlite3
cd sqlite3
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.10.2/1.fc22/x86_64/sqlite-3.10.2-1.fc22.x86_64.rpm
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.10.2/1.fc22/x86_64/sqlite-devel-3.10.2-1.fc22.x86_64.rpm
sudo yum -y install sqlite-3.10.2-1.fc22.x86_64.rpm sqlite-devel-3.10.2-1.fc22.x86_64.rpm
sqlite3 –version
.quit
# 빠져나오는 것은 .quit
 
##### 파이썬 가상환경 설정 ####################################
mkdir -/home/httpd/python/
cd /home/httpd/python/
python3 -m pip install virtualenv
python3 -m pip install --upgrade pip
 
# 가상환경 이름을 django 로 설정했는데 다른 명칭으로 변경해도 된다.
virtualenv django
cd /home/httpd/python/django
 
# django 가상환경 실행
source /home/httpd/python/django/bin/activate
 
pip3 install --upgrade pip setuptools
pip3 install Django
pip3 install djangorestframework
 
# MySQL 이나 MaraiDB 와 연동 목적
pip3 install mysqlclient
 
# 파이썬 디버깅 도구 설치
pip3 install pylint
pip3 install twisted
 
# Flask 를 하지 않을 경우에는 생략한다. 
# Flask 는 아직 테스트해보지 않아 틀릴 수도 있다.
# Flask 로 API 서버 개발시 필요한 패키지
pip3 install --upgrade pip setuptools
pip3 install flask
pip3 install PyJWT
pip3 install flask-mysqldb
pip3 install bcrypt
pip3 install python-dateutil
pip3 install -U flask-cors
pip3 install pillow
pip3 install pymysql
pip3 install requests
pip3 install firebase-admin
 
 
# 장고 프로젝트 생성 및 Web 서버 구동 테스트
cd /home/httpd/python/django
django-admin startproject config .
chmod 755 manage.py
python manage.py makemigrations
python manage.py migrate
 
# superuser 는 추가하고 싶은 만큼 여러번 실행하면 된다.
python manage.py createsuperuser
# userid,email,password 생성
 
cd config
vi settings.py
ALLOWED_HOSTS = ['*']
 
# 변경하고 :wq (저장)하고 나온다.
 
# 8000번 포트로 Web 서버 구동
python manage.py runserver 0.0.0.0:8000
 
# 서버를 재부팅하거나 Web 서버를 중지시킨 경우에 다시 실행하는 명령어
cd /home/httpd/python/django/
source /home/httpd/python/django/bin/activate
python manage.py runserver 0.0.0.0:8000
 
 
# django 프로젝트를 생성해서 하는 사항은 여기서는 배제한다.
 
##########################################################################
# 방화벽 설정
yum -y install firewalld
 
# 방화벽 데몬 시작
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
 
#########################################################################
# Databse 접근을 위한 SELinux 설정 변경
# SELinux 상태 확인
sestatus
 
#SELinux httpd flag 확인 : 네트워크를 통해 Database에 연결할 수 있는 옵션이 꺼져 있음
getsebool -| grep httpd
 
# Database 접근을 위한 SELinx 설정 변경
setsebool -P httpd_can_network_connect_db 1
 
# SELinux 비활성화 하기
vi /etc/sysconfig/selinux
SELINUX=disabled
:wq 로 저장하고 나온다.
 
# 재부팅해야 SELinux 명령어 수정한 사항이 적용된다.
reboot 
 
# 임시 비활성화 방법
setenforce 0
 

 

 

MariaDB 10.4 설치 스크립트

################################
##### MariaDB 10.4 버전 설치 #####
################################
 
vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
 
:wq 로 저장하고 나온다.
 
sudo yum makecache fast
yum -y install mariadb-server mariadb-client
 
# mariadb 부팅 시 자동 시작 설정
systemctl enable mariadb
 
# mariadb 시작
systemctl start mariadb
 
# mariadb 상태 확인
service mariadb status
 
# Maria DB 보안 설정하기
mysql_secure_installation
# root 비밀번호 설정 등 상세 과정은 생략한다. 거의 Y만 누르면 끝난다.
 
# UTF-8 로 통신하기 위한 서버/클라이언트 설정
vi /etc/my.cnf.d/server.cnf
[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
 
vi /etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
 
# MariaDB 재시작
service mariadb restart
 
# MariaDB 접속하여 적용된 사항 확인
mysql -u root -p
status
show variables like 'c%';
 
#########################################
####### 실제 적용 예제 ######
#########################################
// DB 생성
create database pythondb default character set utf8;
 
use mysql;
create user codefox@localhost identified by 'NiceWonderfull!#%';
grant all privileges on pythondb.* to codefox@localhost;
flush privileges;
quit
 
 
### 테이블 백업하기 ####
mysqldump -uroot ---databases pythondb > pythondb.sql
 
### 테이블 구조만 백업하기 ####
mysqldump -uroot ---no-data --databases pythondb > pythondb.sql
 
###################################
#####   root 패스워드 분실 복구   #####
###################################
# 서비스 정지
systemctl stop mariadb
 
# mariadb 안전모드 실행
sudo /usr/bin/mysqld_safe --skip-grant &
 
# 패스워드 변경
mysql -uroot mysql
update user set password=password('변경할비밀번호') where user='root';
flush privileges;
exit;
 

 

 

PHP 7.4 설치 스크립트

 

#############################################
# PHP 7.4 와 Apache 설치 
#############################################
## 현재 설치된 PHP 버전 확인
yum list php
 
yum -y install expat-devel
 
# 설치 확인 방법1
yum list installed | grep httpd
yum list installed | grep php
 
# 설치 확인 방법2
rpm -qa | grep httpd
rpm -qa | grep php
 
## 설치된 것 한꺼번에 지우기
rpm -qa | grep php >list
# vi list로 해서 삭제 안할 리스트는 선별 제거한다.
sudo yum -y remove $(awk '{print $1}' <list)
 
rpm -qa | grep httpd >list
# vi list로 해서 삭제 안할 리스트는 선별 제거한다.
sudo yum -y remove $(awk '{print $1}' <list)
 
 
# yum 삭제 방법 (실제 삭제할 사항이 아니라 주석(#) 처리)
# yum remove -y vsftpd
 
 
# Remi 저장소를 설치하고 활성화한다.
yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
 
# yum 저장소와 패키지를 관리
yum -y groupinstall "Development tools"
yum -y install epel-release yum-utils
 
# Disable repo for PHP 5.4
yum-config-manager --disable remi-php54
yum-config-manager --enable remi-php74
 
# Install PHP 7.4 on CentOS 7
yum install ---enablerepo=remi-php74 httpd php php-cli php-common php-devel php-ldap 
yum install ---enablerepo=remi-php74 php-mbstring php-mcrypt php-mysqlnd mod_ssl php-pdo 
yum install ---enablerepo=remi-php74 php-pgsql php-sqlite php-process php-snmp php-soap 
yum install ---enablerepo=remi-php74 php-libxml php-xml php-pear php-gd php-fpm php-dom 
yum install ---enablerepo=remi-php74 php-ssh2 php-xmlreader php-curl php-date php-exif 
yum install ---enablerepo=remi-php74 php-filter php-simplexml php-hash php-iconv php-imagick 
yum install ---enablerepo=remi-php74 php-json php-openssl php-pcre php-posix php-sockets 
yum install ---enablerepo=remi-php74 php-spl php-tokenizer php-zlib php-gmp php-Icinga php-intl 
yum install ---enablerepo=remi-php74 php-pecl-zip zip php-zip php-pspell 
yum install ---enablerepo=remi-php74 wget unzip mc git nmap telnet net-tools
 
# PHP 버전 확인
php -v
 
# Apache 버전 확인
httpd -v
 
# 서비스 활성화(재부팅시 auto start)
systemctl enable httpd
 
# 서비스 시작
systemctl start httpd
 
# 서비스 구동 상태 확인
systemctl status httpd
 
# 서비스 중지
systemctl stop httpd
# 서비스 재시작
systemctl restart httpd
 
# openssl 버전 확인
openssl version
 
###################################################
# Apache 환경 설정 
###################################################
# Web root 디렉토리 : /var/www/html 기본 설정인데 아래는 home 디렉토리 하단으로 수정했다.
# 보안 설정 부분이 같이 포함되어 있으니 아래와 같이 설정하면 도움된다.
# 더 자세한 사항은 구글링해서 찾아보시라.
## httpd.conf 파일 수정
vi /etc/httpd/conf/httpd.conf
ServerName localhost
 
DocumentRoot "/home/httpd/htdocs"
 
<Directory "/home/httpd">
    AllowOverride None
    Require all granted
</Directory>
 
<Directory "/home/httpd/htdocs">
    Options +FollowSymLinks -Indexes
    AllowOverride All
    Require all granted
    <LimitExcept GET POST>
      Order deny,allow
      Deny from all
    </LimitExcept>
</Directory>
 
<IfModule dir_module>
    DirectoryIndex index.php index.html 
</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
 
# 저장(:wq)하고 나온다.
 
# Apache HTTPOXY 취약점 방지
echo "RequestHeader unset Proxy early" >> /etc/httpd/conf/httpd.conf
 
 
##################################
# 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이면 정확하게 유효기간이 넘은 데이타가 삭제된다.
; 세션 시간은 1시간으로 설정한다.
session.gc_maxlifetime = 3600
 
# 저장(:wq)하고 나온다.
 
#####################################################################
# Web 서버 root 디렉토리 생성
mkdir -/home/httpd/htdocs
 
# 반드시 추가구현해야 문제없이 동작한다. error.php 파일 내용은 오픈하지 않는다.
# error.php 대신에 index.php 로 설정해도 무방하다.
# 해커가 없는 파일을 검색으로 찾을 때 비정상적으로 검색한다는 걸 알려주는 error.php 파일인데,
# 비정상적인 파일 검색 실행시 무조건 index.php 로 가도록 설정해도 되기 때문이다.
 
# Web 서버 root 디렉토리로 이동
cd /home/httpd/htdocs/
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 /home/httpd/htdocs
sudo chmod -755 /home/httpd/htdocs
 
# 방화벽 설정 확인
iptables -L
 
# Apache 재시작
systemctl restart httpd
 
# 만약 Web 서버가 동작하지 않는다면 에러 로그를 살펴봐야 한다.
cd /var/log/httpd/
 
 
# 열린포트 확인
yum -y install net-tools 
netstat -nltp
 
### 시간 동기화
yum -y install rdate
 
crontab -e
00 00  * * * /usr/bin/rdate -s time.bora.net && /sbin/clock -w
 
 
#####################################
# 최신버전 phpMyAdmin 설치
#####################################
# Web 서버 root 디렉토리로 이동
cd /home/httpd/htdocs
wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zip
unzip phpMyAdmin-5.1.1-all-languages.zip
chown -R apache:apache phpMyAdmin-5.1.1-all-languages
mv phpMyAdmin-5.1.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_JUnoGmbcr]0s)r$9b{~Xz'// 임의의 값 설정
$cfg['Servers'][$i]['host'= 'localhost';
$cfg['Servers'][$i]['compress'= true;
$cfg['TempDir'= '/tmp';
 
# 저장(:wq)하고 빠져나온다.
 
# 주의사항
# phpMyAdmin 편리한 만큼 특정 IP에서만 접속하도록 IPFiltering을 설정하는 걸 추가해줘야 안전하다.
# 설정 방법은 블로그 게시글을 찾아서 적용하기 바란다.
 
###############################
# composor 설치 
###############################
cd /home/httpd/htdocs
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer -V
export COMPOSER_ALLOW_SUPERUSER=1
echo "export COMPOSER_ALLOW_SUPERUSER=1" >> ~/.bashrc
cat ~/.bashrc | grep export
 
# PHPSpredSheet 설치
cd /home/httpd/htdocs
composer require phpoffice/phpspreadsheet
 
# PHP Excel 예제는 본 블로그에 게시되어 있다.
 
###############################
# RSA 암호화 통신을 위한 설정
###############################
#리눅스 SSH 에서 RSA 공개키, 개인키 생성방법
mkdir -/home/rsa/key/
cd /home/rsa/key/
 
# Private Key 생성
openssl genrsa -out rsa_pri.pem 1024
 
# Public Key 생성
openssl rsa -pubout -in rsa_pri.pem -out rsa_pub.pem
 
# RSA javascript 암호화 PHP 복호화 예제는 구글링으로 찾아보시라.
# RSA kotlin 암호화 PHP 복호화 예제는 구글링으로 찾아서 해결하시라.
 

 

728x90