Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 121. .NET 개발자가 처음 설치해 본 Apache + PHP [링크 복사], [링크+제목 복사],
조회: 38857
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 6개 있습니다.)
.NET 개발자가 처음 설치해 본 Apache + PHP

제 인생에 처음으로 PHP와 Apache를 만져보는군요. 그래도 많이 다양해졌죠. Tomcat도 설치해봤으니. ^^

.NET 개발자가 처음 설치해 본 TOMCAT
; https://www.sysnet.pe.kr/2/0/798

설치 방법을 알아보려고 웹을 검색하니 다음과 같이 친절한 설명이 되어 있군요. ^^

Windows에서 Apache, PHP를 이용하여 CUBRID 사용하기
; http://www.cubrid.com/zbxe/32448

그래서, 위의 설명에 따라 Apache는 다음의 경로에서 다운로드 받아서 설치해 보았습니다.

Downloading the Apache HTTP Server
; http://httpd.apache.org/download.cgi

현재(2011-05-21) 2.2.18 버전이 최신 버전이어서 선택했고, 아직 소스 코드 빌드까지는 필요없는 상태의 단순 실습을 위한 차원이기 때문에 SSL도 제외한 "Win32 Binary without crypto (no mod_ssl)"을 받아서 설치했습니다.

Win32 Binary without crypto (no mod_ssl) (MSI Installer): httpd-2.2.18-win32-x86-no_ssl-r2.msi
; http://mirror.khlug.org/apache//httpd/binaries/win32/httpd-2.2.18-win32-x86-no_ssl-r2.msi

일단, 설치 중의 포트 선택 옵션을 "for All Users, on Port 80, as a Service -- Recommended."로 했습니다. 비록, IIS가 현재 80 포트를 물고 있긴 하지만 설치 후 환경 설정 파일에서 아파치의 포트를 직접 변경할 작정으로 그렇게 했습니다.

어쨌든 그렇게 하면 설치 중에 다음과 같은 오류가 발생합니다.

php_installation_1.png

"
httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.0.95 for ServerName
(OS 10013)An attempt was made to access a socket in a way forbidden by its access permissions. : make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
Note the errors or message above, and press the  key to exit.
"

일단 무시하고 지나간 후 모두 설치된 다음 "[설치폴더]\conf\httpd.conf" 파일을 메모장으로 열어 "Listen 80"이라고 설정된 항목을 원하는 포트로 변경하고 트레이에 있는 아파치 서비스 제어 응용 프로그램(또는 NT 서비스 관리자)을 통해 웹 서버를 구동시켰습니다. (참고로, 저는 포트를 8000으로 지정했고, "http://localhost:8000/"로 검사를 해서 정상적으로 동작하고 있음을 확인했습니다.)




아파치를 msi로 설치하는 것이 싫다면 다음의 경로에서 zip 파일을 다운로드해도 됩니다.
Apache 2.4 VS16 Windows Binaries and Modules
 - httpd-2.4.48-win64-VS16.zip  
; https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.48-win64-VS16.zip

zip 압축 파일로 풀은 경우, 역시 \conf\httpd.conf의 "Listen 80" 포트를 원한다면 다른 걸로 바꾸고, Apache가 설치된 디렉터리를 바꿔야 하는데 기본값은 ServerRoot에 지정이 됩니다.

// \conf\httpd.conf
Define SRVROOT "c:/Apache24"

ServerRoot "${SRVROOT}"

보는 바와 같이 c:\apache24가 기본 디렉터리로 되어 있으므로 그 디렉터리로 apache 인스톨 경로를 맞춰 주거나 아니면 현재의 경로를 지정하면 됩니다. 제 경우에는 d:\temp\apache24에 zip 압축을 풀었으므로 저 값을 지정했습니다. 만약 이 값을 바꾸지 않고 httpd.exe를 실행하면 다음과 같은 식의 오류 메시지를 보게 됩니다.

D:\temp\Apache24\bin> httpd
httpd: Syntax error on line 39 of D:/temp/Apache24/conf/httpd.conf: ServerRoot must be a valid directory

D:\temp\Apache24\bin> httpd
httpd.exe: Syntax error on line 75 of D:/apache/Apache24/conf/httpd.conf: Cannot load modules/mod_actions.so into server: The specified module could not be found.

마지막으로 다음의 메시지는 경고인데,

D:\temp\Apache24\bin> httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::6958:11bd:362:1794. Set the 'ServerName' directive globally to suppress this message

무시해도 되지만, 역시 httpd.conf 파일의 내용에서 ServerName을 다음과 같은 식으로 지정해 주면 메시지를 없앨 수 있습니다.

// Listen 필드에 지정했던 포트

ServerName 127.0.0.1:8000




이제 PHP 설치 차례군요. 아파치를 종료시켜야 한다고 하니, 방금 전의 트레이 응용 프로그램으로 다시 NT 서비스를 중지시킨 후 다음의 사이트를 방문합니다.

PHP 다운로드
; http://www.php.net/downloads.php

위의 웹 페이지를 보면, 소스 코드를 직접 다운로드 받게 되어 있는데 지금은 빌드해야 할 특별한 이유가 없으므로 빌드된 결과물을 다운로드 받을 수 있는 링크를 방문합니다.

Windows Binaries
; http://windows.php.net/download/

위의 사이트에서 "VC9 x86 Thread Safe" 항목의 ZIP 파일을 다운로드 받고,

VC9 x86 Thread Safe (2011-Mar-22 13:27:32)
; http://windows.php.net/downloads/releases/php-5.3.6-Win32-VC9-x86.zip

VS16 x64 Thread Safe (2021-Jun-29 16:38:40)
; https://windows.php.net/downloads/releases/php-8.0.8-Win32-vs16-x64.zip

제 경우에는 "[아파치 설치폴더]\phpmodule"에 압축을 풀어 놓았고, "[아파치 설치폴더]\phpmodule\php5ts.dll" (php8ts.dll 등의 버전이 붙습니다.) 파일을 "[아파치 설치폴더]\bin" 폴더에 복사했습니다.

다음으로, "[아파치 설치폴더]\conf\httpd.conf" 파일을 열어서 다음의 내용을 추가하고,

LoadModule php5_module phpmodule/php5apache2_2.dll

// 역시 버전이 붙는데, PHP 8 버전인 경우,
// LoadModule php_module phpmodule/php8apache2_4.dll
//
// 모듈 이름이 "php_module"인데, 만약 이것을 "php8_module"로 지정하면 httpd.exe 실행 시 이런 오류가 발생합니다.
// httpd: Syntax error on line 187 of D:/temp/Apache24/conf/httpd.conf: Can't locate API module structure `php8_module' in file D:/temp/Apache24/phpmodule/php8apache2_4.dll: No error

이어서 동일한 파일의 <IfModule mime_module><IfModule /> 노드 내에 아래의 MIME 타입을 추가합니다.

AddType application/x-httpd-php .php

이제 정상적으로 설치되었는지 확인하기 위해 아파치 서버를 다시 구동시키고, "[아파치 설치폴더]\htdocs" 내에 phpinfo.php 파일을 만들어 다음과 같은 내용을 포함시킵니다.

<? phpinfo(); ?>

웹 브라우저를 이용하여 "http://localhost:8000/phpinfo.php"으로 확인하는 것으로 끝! 우와~~~ 신기하네요. ^^

php_installation_2.png

(그나저나... 아무리 임시 페이지이긴 하지만, 오타를 포함하고 있군요. "Unknow" --> "Unknown")




재미있는 현상이 하나 있는데요. 설명서에 의하면 "[아파치 설치폴더]\phpmodule\php.ini-development" 파일(또는 php.ini-production)을 C:\Windows 폴더에 복사하라고 나오는데요. (물론, 복사 후 Apach 서비스 재시작하고.)

실제로 그렇게 복사해 두고 phpinfo(); 호출을 포함하고 있는 phpinfo.php 파일을 방문하면 빈 페이지만 출력이 됩니다. 물론, C:\Windows 폴더에서 제거하면 다시 phpinfo.php 웹 페이지가 정상적으로 출력되고.

혹시나 싶어서, INI 경로를 출력해 주는 다음의 내용으로 test.php 파일을 만들어서 실행시키면,

==== 출처: http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=317904&page=4 ====
<?php 
$inipath = php_ini_loaded_file(); 

if ($inipath) { 
    echo 'Loaded php.ini: ' . $inipath; 
} else { 
    echo 'A php.ini file is not loaded'; 
} 
?> 

C:\Windows\php.ini 파일이 있는 경우 정상적으로 "Loaded php.ini: C:\Windows\php.ini"로 출력되는 것이 확인됩니다. 반대로 C:\Windows\php.ini 파일이 없으면 "A php.ini file is not loaded"라고 출력은 되지만 "phpinfo.php" 파일은 정상적으로 실행되고.

누구 이 현상에 대해서 설명해 주실 분 계신가요?




여담으로!

원래 PHP를 빌드까지 해보려고 했는데, 빌드에 필요한 binary-tools.zip이라는 파일을 다운로드 받을 수 있는 http://pecl2.php.net/downloads/php-windows-builds/php-libs/ 웹 사이트가 현재 서비스를 못하고 있습니다. (복구 시간은 예측이 안된다는 군요.)

php_installation_3.png

그런데 이 정도면 꽤나 놀랍습니다. 3월 19일에 발견(되었다는 것은 곧, 그 이전부터 해킹된 상태였다는 것이고.)되었는데 5월 21일 오늘까지도 복원을 못했다는 것인데... 심지어 "php.net security notice"에 의하면, 현재까지도 어디가 문제인지조차도 파악이 안된 것 같습니다.

근데, 문제 대응면에서 이해가 다소 안되는 부분이 있군요.

PHP 서버 해킹으로 코드 무결성 검사
; http://itlkorea.kr/html/lat_new_view.php?No=255

위의 기사에 보면, '해킹당한 컴퓨터는 포맷'되었다고 하는데... 그럼 어떻게 해킹당한 것인지 무슨 수로 찾아낸다는 것인지 의문이군요.




참고로 우분투 리눅스에 아파치 설치는 이런 환경 구성을 갖습니다.

[설치]
$ sudo apt install apache2

[확인]
$ apt show apache2
$ systemctl list-unit-files | grep apache2
$ systemctl status apache2

[환경 설정 파일]
$ cat /etc/apache2/apache2.conf

[index 위치]
$ cat /var/www/html/index.html




PHP를 Visual Studio Code에서 편집하는 경우 "php.validate.executablePath" 설정을 하라고 합니다. 그런 경우 settings.json에서 다음과 같은 식으로 입력하면 됩니다.

{
    "php.validate.executablePath": "D:\\temp\\Apache24\\phpmodule\\php.exe"
}



[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/20/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2011-05-27 08시06분
"<? phpinfo(); ?>"로 작성한 페이지가 php.ini 설치 후에 동작하지 않는 것은 "<?php phpinfo(); ?>"로 수정하면 정상적으로 다시 동작되었습니다. php.ini에 PHP 파싱과 관련해서 뭔가 설정이 있나 본데... 잘 모르겠군요. ^^
정성태
2011-05-27 10시04분
PHPSchool에 물어봤는데, 답변이 금방 오네요. ^^

<? 와 <?php 의 차이가 뭔가요?
; http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=328325

기본값이 On으로 되어 있는 short_open_tag가 php.ini 파일에는 Off로 설정되어 있어서 발생한 문제였습니다. ^^
정성태

... 151  [152]  153  154  155  156  157  158  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1249정성태2/26/201230975.NET Framework: 311. .NET 스레드 콜 스택 덤프 (5) - ICorDebug 인터페이스 사용법 [2]파일 다운로드3
1248정성태2/25/201242458.NET Framework: 310. C#의 Shift 비트 연산 정리파일 다운로드1
1247정성태2/25/201225193.NET Framework: 309. .NET 응용 프로그램에 기본 생성되는 스레드들에 대한 탐구 [1]파일 다운로드1
1246정성태2/25/201224739개발 환경 구성: 145. 한영 변환은 되지만, 정작 한글 입력이 안되는 경우
1245정성태2/25/201235446개발 환경 구성: 144. 윈도우에서도 유닉스처럼 명령행으로 원격 접속하는 방법
1244정성태2/24/201232635.NET Framework: 308. .NET System.Threading.Thread 개체에서 Native Thread Id를 구할 수 있을까? [1]파일 다운로드1
1243정성태2/23/201232576개발 환경 구성: 143. Visual Studio 2010 - .NET Framework 소스 코드 디버깅 - 두 번째 이야기 [1]
1242정성태2/20/201239467VC++: 58. API Hooking - 64비트를 고려해야 한다면? EasyHook! [7]파일 다운로드1
1241정성태2/20/201226294.NET Framework: 307. .NET 4.0 응용 프로그램을 위한 ILMerge
1240정성태2/19/201232548디버깅 기술: 48. C/C++ JNI DLL을 Visual Studio로 디버깅하는 방법 [2]
1239정성태2/19/201224198.NET Framework: 306. 컴퓨터에 실행된 프로세스 중에 닷넷 응용 프로그램임을 알 수 있는 방법 - C# [1]파일 다운로드1
1238정성태2/19/201228075.NET Framework: 305. GetPrivateProfileSection / WritePrivateProfileSection의 C# 버전파일 다운로드1
1237정성태2/18/201232404개발 환경 구성: 142. Windows Embedded POSReady 7 설치 [1]
1236정성태2/17/201228228개발 환경 구성: 141. Windows 2008 R2 RDP 라이선스 서버 설치하는 방법
1235정성태2/16/201226672.NET Framework: 304. Hyper-V의 가상 머신을 C#으로 제어하는 방법 [1]파일 다운로드1
1234정성태2/16/201227098.NET Framework: 303. 원본 파일의 공백/라인을 유지한 체 XML 파일을 저장하는 방법 [1]파일 다운로드1
1233정성태2/16/201233176.NET Framework: 302. supportedRuntime 옵션과 System.BadImageFormatException 예외 [5]
1232정성태2/9/201229061VC++: 57. 웹 브라우저에서 Flash만 빼고 다른 ActiveX를 차단할 수 있을까? [3]파일 다운로드1
1231정성태2/8/201238606VC++: 56. Win32 API 후킹 - Trampoline API Hooking [5]파일 다운로드1
1230정성태2/6/201223943개발 환경 구성: 140. 프로젝트 생성 시부터 "Enable the Visual Studio hosting process" 옵션을 끄는 방법
1229정성태2/4/201228945.NET Framework: 301. P/Invoke의 성능을 높이기 위해 C++/CLI가 선택되려면? [5]파일 다운로드1
1228정성태2/4/201278286.NET Framework: 300. C#으로 만드는 음성인식/TTS 프로그램 [47]파일 다운로드1
1227정성태2/3/201229167.NET Framework: 299. 해당 어셈블리가 Debug 빌드인지, Release 빌드인지 알아내는 방법파일 다운로드1
1226정성태1/28/201270072.NET Framework: 298. 홀 펀칭(Hole Punching)을 이용한 Private IP 간 통신 - C# [15]파일 다운로드3
1225정성태1/24/201225691.NET Framework: 297. 특정 EXE 파일의 실행을 Internet Explorer처럼 "Protected Mode"로 실행하는 방법 [1]파일 다운로드1
1224정성태1/21/201237197개발 환경 구성: 139. 아마존 EC2에 새로 추가된 "1년 무료 Windows 서버 인스턴스"가 있다는데, 직접 만들어 볼까요? ^^ [11]
... 151  [152]  153  154  155  156  157  158  159  160  161  162  163  164  165  ...