AWS EC2(Amazon Linux 2) 서버에서 Apache2.4, Python3, wsgi 실행 환경 구축

개요



Amazon Linux 2에는 처음부터 Python2가 포함되어 있지만 Python3 및 wsgi 환경을 구축합니다.

WSGI에 대해서는 이쪽.
htps : // / cs. py 응. rg/그럼/3/ぃb 등 ry/ws 꺾어 f. HTML
htps : // 기효. jp/에서 v/후아트레/01/ws기/0001
※Python을 다양한 웹 서버에서 사용하기 위한 구조

Apache, Python3 설치



먼저 Apache2.4를 설치합니다.
sudo su
yum install httpd

그런 다음 python3을 설치합니다.
yum install python3

※이 문장의 작성 시점에서는/usr/bin/python3 에 인스톨 되었습니다.
버전 확인
/usr/bin/python3 --version

원래부터 들어있는 파이썬
/bin/python --version

wsgi 컴파일 준비



mod_wsgi도 yum으로 설치할 수 있지만 python2와 연결되어 버리기 때문에,
소스 코드에서 컴파일합니다.
yum install gcc

※gcc가 없으면, configure시
configure: error: no aceptable C compiler found in $PATH
라는 오류가 발생합니다.
yum install httpd-devel

※httpd-devel이 없으면 congigure 시
/bin/sh: apxs: command not found
라는 오류가 발생합니다.
yum install python3-devel

※python3-devel이 없으면 make시
src/server/wsgi_python.h:24:10: fatal error: Python.h: No such file or directory
라는 오류가 발생합니다.
yum install git
git clone https://github.com/GrahamDumpleton/mod_wsgi.git
cd mod_wsgi

wsgi 컴파일



configure(잘못된 경로)



./configure --with-python=/usr/lib64/python3.7/

아니다.
※이 옵션이라면 make시에
src/server/wsgi_python.h:24:10: fatal error: Python.h: No such file or directory
라는 오류가 발생합니다.
※python3-devel이 없을 때와 같은 에러가 됩니다.

configure(올바른 경로)


./configure --with-python=/usr/bin/python3
make
make install

아래와 같은 메시지가 표시되면 성공입니다.
Libraries have been installed in:
   /usr/lib64/httpd/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_wsgi.so


/etc/httpd/modules/mod_wsgi.so
가 생성됩니다.

모듈 로드 설정



httpd.conf에 작성해도 좋지만 아래에 파일을 만듭니다.
/etc/httpd/conf.modules.d/
vim /etc/httpd/conf.modules.d/wsgi.conf

내용
LoadModule wsgi_module modules/mod_wsgi.so

httpd.conf 설정을 변경하고 문서 루트에서 프로그램 동작을 허용합니다.
※이 설정이 없으면 Internal Error가 발생합니다.
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.`date "+%Y%m%d"`
vim /etc/httpd/conf/httpd.conf

변경점
Options Indexes FollowSymLinks
→
Options Indexes FollowSymLinks ExecCGI
#AddHandler cgi-script .cgi#AddHandler cgi-script .cgi
AddHandler wsgi-script .wsgi

서버를 다시 시작합니다.
systemctl restart httpd.service

문서 루트 권한을 변경합니다.
chmod 777 /var/www/html

※ 프로덕션 환경에서는 적절한 권한 설정으로 하십시오.

프로그램 설치



wsgi 프로그램의 경우 일반적인 다음과 같은 python 프로그램은 작동하지 않습니다.

hello.py
#!/bin/python
# -*- coding: utf-8 -*-

import sys, codecs
import io

print("Content-Type: text/html\n")
print("Hello World")

브라우저에서는 404 Not Found입니다.
오류 로그(/var/log/httpd/error_log)를 보면
mod_wsgi (pid = 8942) : Target WSGI script '/var/www/html/test.wsgi' does not contain WSGI application 'application'.
라는 오류가 표시됩니다.

github의 샘플과 같이 application 함수가 필요합니다.
htps : // 기주 b. 이 m / G 등은 m mp ぇ 톤 /도 d_ws 기 / t 리에 /에서 ゔ ぉ p / sts

hello world 만들기


vim /var/www/html/hello.wsgi

내용

hello.wsgi
def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

권한 변경
chmod 755 /var/www/html/hello.wsgi

브라우저로 액세스
http://ip 주소/hello.wsgi

버전 확인 페이지 만들기


vim /var/www/html/version.wsgi

내용

version.wsgi

import sys

def application(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [sys.version.encode()]

권한 변경
chmod 755 /var/www/html/version.wsgi

브라우저로 액세스
http://ip 주소/version.wsgi

아래와 같은 페이지가 나오면 성공입니다.



수고하셨습니다.

좋은 웹페이지 즐겨찾기