웹사이트 검색

Linux의 Apache에서 Python을 CGI 모듈로 설치하는 방법


목차

1. 웹 서버에서 Python 스크립트를 실행하는 방법

2. Debian(Ubuntu, Linux Mint, Kali Linux)의 Apache에서 Python을 CGI 모듈로 설정하는 방법

2.1 단일 디렉토리에 대한 Python CGI 설정

2.2 전체 웹 서버에 대한 Python CGI 설정

3. Arch Linux(Manjaro, BlackArch)의 Apache에서 Python을 CGI 모듈로 설정하는 방법

3.1 단일 디렉토리에 대한 Python CGI 설정

3.2 전체 웹 서버에 대한 Python CGI 설정

4. Python CGI 구성 시 오류

4.1 웹 서버가 실행하는 대신 Python 스크립트의 소스 코드를 표시하거나 실행하는 대신 파일을 다운로드합니다.

4.2 Python 스크립트에만 해당하는 서버 오류 오류 500. 헤더 앞의 스크립트 출력 끝(그렇지 않으면 웹 서버가 제대로 작동함)

4.3 서버 오류 오류 500. 스크립트 'test.py'의 잘못된 헤더: 잘못된 헤더

4.4 오류 “이 사이트에 연결할 수 없습니다. localhost가 연결을 거부했습니다”

5. 유용한 링크

웹 서버에서 Python 스크립트를 실행하는 방법

Python은 CGI(Common Gateway Interface)를 지원합니다. 즉, Python으로 작성된 프로그램(스크립트)은 HTTP 서버(예: Apache)와 같은 정보 서버와 상호 작용할 수 있습니다.

웹 서버는 웹 서버 CGI 모듈로 Python이 설치되어 있지 않아도 Python 스크립트를 실행하고 결과 데이터를 출력할 수 있습니다.

예를 들어 다음 PHP 스크립트에서 스크립트는 POST 메서드를 사용하여 양식에서 데이터를 수신한 다음 Python 프로그램을 실행하여 수신된 데이터를 명령줄 인수로 전달합니다.

<?php

echo shell_exec ('python /srv/http/test-python/script.py ' . $_POST["name"] . ' ' . $_POST["surname"] . ' '. $_POST["info"]);

Python 스크립트의 실행이 완료되면 script.py에서 받은 정보가 표시됩니다.

이 접근 방식에는 이점이 있지만(Python을 웹 서버 CGI 모듈로 구성할 필요가 없음) 몇 가지 단점이 있습니다.

Python이 CGI 모듈로 설치되지 않은 경우:

  1. Python 스크립트를 실행하려면 PHP를 사용해야 합니다.
  2. Python 스크립트는 GET 및 POST 메서드로 전달된 데이터에 직접 액세스할 수 없습니다.

따라서 Python을 웹 서버 CGI 모듈로 구성하면 GET 및 POST 메서드로 전달된 데이터를 포함하여 스크립트를 직접 실행하고 웹 서버 환경 변수에 직접 액세스할 수 있습니다.

두 배포 그룹에 대한 CGI로 Python을 Apache에 설정하는 방법은 다음과 같습니다.

  • Debian 및 파생 배포판(Ubuntu, Linux Mint, Kali Linux)
  • Arch Linux 파생 배포판(Manjaro, BlackArch)

Python은 대부분의 운영 체제에 기본적으로 사전 설치되어 있으므로 운영 체제에 Python을 설치하는 단계는 건너뜁니다. Linux에 Python이 없으면 먼저 설치하십시오.

2가지 설정 옵션이 있습니다.

  • Python 스크립트는 웹 서버의 특수 디렉토리(예: cgi-bin)에 있는 경우에만 CGI 모듈에서 처리됩니다.
  • Python 스크립트는 웹 서버 폴더의 CGI 모듈에 의해 처리됩니다.

참조: Python 스크립트에서 GET 및 POST 메서드를 사용하여 웹페이지에서 데이터를 가져오는 방법

Debian의 Apache에서 Python을 CGI 모듈로 설정하는 방법(Ubuntu, Linux Mint, Kali Linux)

단일 디렉토리에 대한 Python CGI 설정

다음 명령을 실행하여 CGI 모듈을 활성화합니다.

sudo a2enmod cgi

변경 사항을 적용하려면 웹 서버를 다시 시작하십시오.

sudo systemctl restart apache2

/usr/lib/cgi-bin/test.py 파일 생성:

sudo gedit /usr/lib/cgi-bin/test.py

다음 콘텐츠를 이 파일에 복사합니다.

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

이 파일을 실행 가능하게 만드십시오.

sudo chmod +x /usr/lib/cgi-bin/test.py

웹 브라우저에서 http://localhost/cgi-bin/test.py 열기

모든 것이 올바르게 구성되면 웹 브라우저에 한 줄이 표시됩니다.

Hello.

참고: CGI 스크립트에 /usr/lib/cgi-bin/ 디렉토리 대신 다른 폴더를 사용하려면 /etc에 지정하십시오. /apache2/conf-enabled/serve-cgi-bin.conf 파일.

전체 웹 서버에 대한 Python CGI 설정

다음 명령을 실행하여 CGI 모듈을 활성화합니다.

sudo a2enmod cgi

/etc/httpd/conf/httpd.conf 파일(웹 서버 구성 파일)을 엽니다.

sudo gedit /etc/httpd/conf/httpd.conf

거기에서 줄 그룹을 찾으십시오.

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

그리고 그들을 교체

<Directory /var/www/>
	Options Indexes FollowSymLinks ExecCGI
	AllowOverride None
	Require all granted
</Directory>

주의: 옵션 집합이 다를 수 있습니다.

파일 끝에 다음 줄을 추가합니다.

AddHandler cgi-script .cgi .py

파일을 닫습니다.

변경 사항을 적용하려면 웹 서버를 다시 시작하십시오.

sudo systemctl restart apache2

/var/www/html/test.py 파일 만들기:

sudo gedit /var/www/html/test.py

다음 콘텐츠를 이 파일에 복사합니다.

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

이 파일을 실행 가능하게 만드십시오.

sudo chmod +x /var/www/html/test.py

웹 브라우저에서 http://localhost/test.py 열기

모든 것이 올바르게 구성되면 웹 브라우저에 한 줄이 표시됩니다.

Hello.

Arch Linux(Manjaro, BlackArch)의 Apache에서 Python을 CGI 모듈로 설정하는 방법

단일 디렉토리에 대한 Python CGI 설정

/srv/http/cgi-bin/ 디렉토리를 생성합니다. 여기에 Python 스크립트가 위치합니다.

sudo mkdir /srv/http/cgi-bin/

/etc/httpd/conf/httpd.conf 파일(웹 서버 구성 파일)을 엽니다.

sudo gedit /etc/httpd/conf/httpd.conf

줄 그룹 찾기:

<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

그리고 다음으로 교체하십시오.

<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Require all granted
</Directory>

참고: 차이점이 보이지 않으면 옵션 지시문에 주의하십시오. ExecCGI 옵션이 추가되었습니다.

라인 그룹 찾기

<IfModule mpm_prefork_module>
	#LoadModule cgi_module modules/mod_cgi.so
</IfModule>

그리고 교체

<IfModule mpm_prefork_module>
	LoadModule cgi_module modules/mod_cgi.so
</IfModule>

즉, 행의 주석을 제거하십시오.

줄을 확인

ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/"

변경할 필요는 없지만 원하는 경우 /srv/http/cgi-bin/ 대신 다른 폴더를 사용할 수 있습니다. /srv/http/cgi-bin/ 대신 이 지시문을 사용하십시오.

파일을 닫습니다.

변경 사항을 적용하려면 웹 서버를 다시 시작하십시오.

sudo systemctl restart httpd.service

/srv/http/cgi-bin/test.py 파일 생성:

sudo gedit /srv/http/cgi-bin/test.py

다음 콘텐츠를 이 파일에 복사합니다.

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

이 파일을 실행 가능하게 만드십시오.

sudo chmod +x /srv/http/cgi-bin/test.py

웹 브라우저에서 http://localhost/cgi-bin/test.py 열기

모든 것이 올바르게 구성되면 웹 브라우저에 한 줄이 표시됩니다.

Hello.

전체 웹 서버에 대한 Python CGI 설정

/etc/httpd/conf/httpd.conf 파일(웹 서버 구성 파일)을 엽니다.

sudo gedit /etc/httpd/conf/httpd.conf

라인 그룹 찾기

<IfModule mpm_prefork_module>
	#LoadModule cgi_module modules/mod_cgi.so
</IfModule>

그리고 교체

<IfModule mpm_prefork_module>
	LoadModule cgi_module modules/mod_cgi.so
</IfModule>

즉, 행의 주석을 제거하십시오.

그런 다음 라인을 찾으십시오.

Options Indexes FollowSymLinks

ExecCGI를 추가합니다. 다음 줄이 표시되어야 합니다(주의: 옵션 집합이 다를 수 있음).

Options Indexes FollowSymLinks ExecCGI

이제 줄을 찾으십시오.

#AddHandler cgi-script .cgi

즉, 줄 시작 부분에서 # 기호를 제거하고 줄 끝에 .py를 추가합니다. 새 줄은 다음과 같이 표시됩니다.

AddHandler cgi-script .cgi .py

파일을 닫습니다.

변경 사항을 적용하려면 웹 서버를 다시 시작하십시오.

sudo systemctl restart httpd.service

/srv/http/test.py 파일 만들기:

sudo gedit /srv/http/test.py

다음 콘텐츠를 이 파일에 복사합니다.

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

이 파일을 실행 가능하게 만드십시오.

sudo chmod +x /srv/http/cgi-bin/test.py

웹 브라우저에서 http://localhost/test.py 열기

모든 것이 올바르게 구성되면 웹 브라우저에 한 줄이 표시됩니다.

Hello.

Python CGI 구성 시 오류

웹서버가 실행하는 대신 파이썬 스크립트의 소스코드를 보여주거나, 실행하는 대신 파일을 다운로드 받는 경우

이는 CGI 설정이 완료되지 않았거나 완료되지 않았음을 의미합니다. 이유는 다음과 같습니다.

  • 구성 파일을 변경한 후 웹 서버가 다시 시작되지 않음
  • 잘못된 구성 파일을 편집했습니다.
  • 한 폴더에서만 실행되도록 CGI 스크립트를 구성했지만 다른 폴더에서 스크립트를 실행하려고 합니다.

서버 오류 Error 500. End of script output before headers(Python 스크립트에만 해당)(그렇지 않으면 웹 서버가 제대로 작동함)

웹 서버에서 Python 스크립트를 실행하려고 할 때 웹 브라우저에 표시되는 오류의 예:

Server error!
The server encountered an internal error and was unable to complete your request.

Error message:
End of script output before headers: test.py

If you think this is a server error, please contact the webmaster.

Error 500

오류의 원인은 다음과 같습니다.

  • Python 파일을 실행할 수 없습니다(실행 권한 없음).
  • Python 프로그램에 스크립트가 조기에 종료되는 구문 오류가 있습니다.

스크립트에 실행 권한이 있는지 확인하려면 ls 유틸리티를 -l 옵션과 함께 사용한 다음 파일의 전체 경로를 지정할 수 있습니다.

ls -l /srv/http/cgi-bin/test.py

샘플 출력:

-rwxr-xr-x 1 root root 127 May 20 13:11 /srv/http/cgi-bin/test.py

x 문자는 프로그램으로 실행할 수 있는 권한이 있음을 의미합니다.

구문 오류를 확인하려면 전체 경로를 앞에 두고 명령줄에서 스크립트를 실행합니다.

/srv/http/cgi-bin/test.py

서버 오류 오류 500. 스크립트 'test.py'의 잘못된 형식의 헤더: 잘못된 헤더

다른 오류의 예:

Server error!
The server encountered an internal error and was unable to complete your request.

Error message:
malformed header from script 'test.py': Bad header: <html><head>

If you think this is a server error, please contact the webmaster.

Error 500

핵심은 잘못된 헤더의 스크립트 메시지, 즉 잘못된 헤더입니다.

이것은 HTTP 프로토콜 헤더를 나타냅니다. Python이 CGI로 실행 중일 때 스크립트는 HTTP 헤더와 두 개의 빈 줄을 전송하여 출력을 시작해야 합니다.

예를 들어 다음 코드는 오류를 발생시킵니다.

#!/usr/bin/python3

print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

오류를 방지하려면 코드가 다음과 같아야 합니다.

#!/usr/bin/python3

print ("Content-type: text/html")
print ("")
print ("")
print ("<html><head>")
print ("")
print ("</head><body>")
print ("Hello.")
print ("</body></html>")

오류 “이 사이트에 연결할 수 없습니다. localhost가 연결을 거부했습니다”

Apache 구성 파일을 변경한 후 오류 메시지가 표시되기 시작하는 경우:

This site can’t be reached

localhost refused to connect.

Apache 구성이 잘못되어 웹 서버를 다시 시작할 수 없었을 가능성이 큽니다.

오류는 잘못된 구문 때문일 수 있습니다.

Debian 및 파생 배포에서 웹 서버의 상태를 보려면 다음 명령을 실행하십시오.

sudo systemctl status apache2

Arch Linux 및 파생 배포판에서 웹 서버 상태를 보려면 다음 명령을 실행하십시오.

sudo systemctl status httpd.service

유용한 링크:

  • https://docs.python.org/3/library/cgi.html
  • https://www.tutorialspoint.com/python/python_cgi_programming.htm