파이썬/Python 환경설정
Django(장고) 배포 환경 구축 CentOS 7 with Apache and mod_wsgi
Link2Me
2022. 4. 9. 16:28
728x90
장고 배포를 위한 환경 구성을 할 때마다 실패를 해서 삽질을 엄청했다.
https://computingforgeeks.com/deploy-python-3-django-application-on-centos-with-apache-and-mod-wsgi/
위 사이트에 적힌 순서에 따라 해도 안되더니 마지막 2줄이 해결책이더라.
Windows 10 Pycharm 툴을 이용해서 Python 3.9.5 or Python 3.10.2 환경에서 개발 테스트 한 것을 CentOS 7 으로 옮겨서 실행하다보니 동일 환경을 구성하기 어렵다.
그래서 pip install -r requirements.txt 를 하면 에러가 발생한다.
이런 점을 감안해서 작성한 스크립트이다.
1. 선행 작업사항
##########################################################################
## CentOS 7 Package Update
yum -y update
##########################################################################
# 방화벽 설정
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 --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
firewall-cmd --list-all
#########################################################################
# Databse 접근을 위한 SELinux 설정 변경
# SELinux 상태 확인
sestatus
#SELinux httpd flag 확인 : 네트워크를 통해 Database에 연결할 수 있는 옵션이 꺼져 있음
getsebool -a | grep httpd
# Database 접근을 위한 SELinx 설정 변경
setsebool -P httpd_can_network_connect_db 1
# SELinux 비활성화 하기
vi /etc/sysconfig/selinux
SELINUX=disabled
:wq 로 저장하고 나온다.
# 재부팅해야 SELinux 명령어 수정한 사항이 적용된다.
reboot
# 임시 비활성화 방법
setenforce 0
|
2. Python 설치 과정
#########################################################################
# 파이썬(Python) 설치 과정
#########################################################################
# python 2.7.X 버전이 설치된 것을 확인한다.
rpm -qa | grep mariadb
# 설치된 것이 없다면 아래 한꺼번에 지우기는 실행하지 않아도 된다.
## 설치된 것 한꺼번에 지우기
rpm -qa | grep mariadb > list
# vi list로 해서 삭제 안할 리스트는 선별 제거한다.
sudo yum -y remove $(awk '{print $1}' <list)
# Python 모듈을 빌드하려면 개발 도구가 필요
yum -y update
yum -y groupinstall 'Development Tools'
yum -y install yum-utils
yum -y install zip unzip wget mc git net-tools
# 아파치와 mode_wsgi 를 설치하기 위해 아래 명령어를 실행한다.
yum -y install epel-release
yum -y makecache
yum -y install httpd mod_wsgi
yum -y install mariadb-devel
# PHP 관련으로 httpd 를 설치하지 말아야 한다.
# 먼저 설치하면 mariadb-devel 이 PHP와 관련되어 설치되기 때문에
# pip install mysqlclient 명령어 실행시 에러가 발생하더라.
# 아래 명령어는 필요시 설치해 주면 될 거 같아서 주석처리했다.
#yum -y install gcc openssl-devel bzip2-devel libffi-devel xz-devel sqlite-devel tk-devel
#yum -y install zlib-devel bzip2-devel gdbm-devel
# Enable Software Collections
sudo yum -y install centos-release-scl
sudo yum -y install rh-python36 python36-devel httpd-devel rh-python36-mod_wsgi
scl enable rh-python36 bash
#sudo yum -y install rh-python38 python38-devel httpd-devel rh-python38-mod_wsgi
#scl enable rh-python38 bash
python --version
python -V
# yum 설치 문제가 발생하지 않도록 아래와 같이 수정한다.
vi /usr/bin/yum
# 첫줄에 python 을 python2.7 로 변경하고 저장(:wq)한다.
vi /usr/libexec/urlgrabber-ext-down
# 첫줄에 python 을 python2.7 로 변경하고 저장(:wq)한다.
# 현재 Alias 확인
ls -l /bin/python*
pip -V
pip3 -V
###### SQLite3 DB 설정 ###################################
# Python 에서 SQLite3 를 찾는데, 기본 설치 버전이 3.7.17 이다.
# 장고 설치시에 더 높은 버전을 요구하므로, 아래와 같이 3.10.2 버전을 설치해준다.
# https://kojipkgs.fedoraproject.org//packages/sqlite/ 접속하여 확인한다.
# 원하는 파일을 찾아서 링크를 복사하고 wget 으로 붙여넣기 한다.
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 버전 확인 방법
python -c "import sqlite3; print(sqlite3.sqlite_version)"
#########################################################
##### 파이썬 가상환경 설정 ####################################
#########################################################
# Step : Install virtual environment
cd /var/www
python -m pip install virtualenv
# 가상환경 이름을 venv 로 설정했는데 다른 명칭으로 변경해도 된다.
mkdir -p /var/www/logs
# venv 가상환경 생성
cd /var/www
virtualenv venv
# venv 가상환경 실행
source /var/www/venv/bin/activate
pip install --upgrade pip setuptools
pip install django
pip install djangorestframework
# MySQL 이나 MaraiDB 와 연동 목적
pip install mysqlclient
# 파이썬 디버깅 도구 설치
pip install pylint
pip install twisted
# venv 가상환경 종료
deactivate
|
3. MaraiDB 10.5 설치
################################
##### MariaDB 10.5 버전 설치 #####
################################
vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/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 pythonfox@localhost identified by 'PythonWonder#$';
grant all privileges on pythondb.* to pythonfox@localhost;
flush privileges;
quit
### 테이블 백업하기 ####
mysqldump -uroot -p --databases pythondb > pythondb.sql
### 테이블 구조만 백업하기 ####
mysqldump -uroot -p --no-data --databases pythondb > pythondb.sql
|
4. 장고 프로젝트 생성 예시
################################################
# 장고 프로젝트 생성 및 Web 서버 구동 테스트
################################################
# venv 가상환경 실행
source /var/www/venv/bin/activate
# 프로젝트 생성 예시
cd /var/www/html/
django-admin startproject config .
python manage.py startapp accounts
python manage.py startapp blog
python manage.py startapp bookmark
# bootstrap4 라이브러리 설치
pip install django-bootstrap4
# Client IP address 수집을 위한 라이브러리
pip install django-ipware
# RSA/AES 암호화 라이브러리
pip install pycryptodome
pip install pycryptodomex
# mariadb db 연동 라이브러리
pip install mariadb
# 이제 Windows/MAC 환경에서 구현했던 코드를 리눅스 각 APP에 Override로 한다.
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic # 8000번 포트로 Web 서버 구동(개발자 모드)
python manage.py runserver 0.0.0.0:8000
# 정상 동작하는 걸 확인하고 나서
deactivate
sudo chown -R apache:apache /var/www/html/
# Django 배포(운영)를 위한 설정
vi /etc/httpd/conf.d/django.conf
<VirtualHost *:80>
ServerName localhost
DocumentRoot /var/www/html/
Alias /static /var/www/html/static
<Directory "/var/www/html/static">
Options FollowSymLinks
Order allow,deny
Allow from all
Require all granted
</Directory>
Alias /media /var/www/html/media
<Directory "/var/www/html/media">
Options FollowSymLinks
Order allow,deny
Allow from all
Require all granted
</Directory>
ErrorLog /var/www/logs/error.log
CustomLog /var/www/logs/access.log combined
WSGIPassAuthorization On
WSGIDaemonProcess wowdjango python-path=/var/www/html:/var/www/venv/lib/python3.6/site-packages
WSGIProcessGroup wowdjango
WSGIScriptAlias / /var/www/html/config/wsgi.py
<Directory /var/www/html/config>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
# 아래 두줄을 실행하기 전에는 에러가 발생하면서 동작되지 않더라.
sudo cp /opt/rh/httpd24/root/usr/lib64/httpd/modules/mod_rh-python36-wsgi.so /lib64/httpd/modules
sudo cp /opt/rh/httpd24/root/etc/httpd/conf.modules.d/10-rh-python36-wsgi.conf /etc/httpd/conf.modules.d
systemctl restart httpd
# 서버를 재부팅하거나 Web 서버를 중지시킨 경우에 가상환경 재실행 명령어
source /var/www/venv/bin/activate
cd /var/www/html/
python manage.py runserver 0.0.0.0:8000
# 가상환경 종료
deactivate
# Web 브라우저에서 접속시 문제가 없는지 테스트 해본다.
|
파일 위치 찾기
개발 서버 구동
환경설정 파일
mod_wsgi 설치하는 또다른 방법이다.
sudo yum -y install httpd httpd-devel
#mod_wsgi 는 python pip 로 설치할 것이므로 yum 설치는 생략한다.
# venv 가상환경 실행
source /var/www/venv/bin/activate
# mod_wsgi 설치
pip install mod_wsgi
# mod_wsgi 설치 확인
mod_wsgi-express start-server
#wsgi_module 등록하기
mod_wsgi-express install-module
cd /etc/httpd/conf.modules.d/
vi 10-wsgi.conf
LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
# :wq(저장)하고 빠져나온다.
# 정상 동작하는 걸 확인하고 나서
deactivate
# Web 브라우저에서 잘 동작되는 걸 확인할 수 있다.
|
728x90