Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 121. .NET 개발자가 처음 설치해 본 Apache + PHP [링크 복사], [링크+제목 복사],
조회: 38868
글쓴 사람
정성태 (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로 설정되어 있어서 발생한 문제였습니다. ^^
정성태

... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12663정성태6/9/202117672.NET Framework: 1065. Windows Forms - 속성 창의 디자인 설정 지원: 문자열 목록 내에서 항목을 선택하는 TypeConverter 제작파일 다운로드1
12662정성태6/8/202115411.NET Framework: 1064. C# COM 개체를 PIA(Primary Interop Assembly)로써 "Embed Interop Types" 참조하는 방법파일 다운로드1
12661정성태6/4/202127413.NET Framework: 1063. C# - MQTT를 이용한 클라이언트/서버(Broker) 통신 예제 [4]파일 다운로드1
12660정성태6/3/202118138.NET Framework: 1062. Windows Forms - 폼 내에서 발생하는 마우스 이벤트를 자식 컨트롤 영역에 상관없이 수신하는 방법 [1]파일 다운로드1
12659정성태6/2/202119029Linux: 40. 우분투 설치 후 MBR 디스크 드라이브 여유 공간이 인식되지 않은 경우 - Logical Volume Management
12658정성태6/2/202116813Windows: 194. Microsoft Store에 있는 구글의 공식 Youtube App
12657정성태6/2/202117616Windows: 193. 윈도우 패키지 관리자 - winget 설치
12656정성태6/1/202115932.NET Framework: 1061. 서버 유형의 COM+에 적용할 수 없는 Server GC
12655정성태6/1/202114587오류 유형: 722. windbg/sos - savemodule - Fail to read memory
12654정성태5/31/202115251오류 유형: 721. Hyper-V - Saved 상태의 VM을 시작 시 오류 발생
12653정성태5/31/202118505.NET Framework: 1060. 닷넷 GC에 새롭게 구현되는 DPAD(Dynamic Promotion And Demotion for GC)
12652정성태5/31/202115961VS.NET IDE: 164. Visual Studio - Web Deploy로 Publish 시 암호창이 매번 뜨는 문제
12651정성태5/31/202116159오류 유형: 720. PostgreSQL - ERROR: 22P02: malformed array literal: "..."
12650정성태5/17/202115481기타: 82. OpenTabletDriver의 버튼에 더블 클릭을 매핑 및 게임에서의 지원 방법
12649정성태5/16/202117683.NET Framework: 1059. 세대 별 GC(Garbage Collection) 방식에서 Card table의 사용 의미 [1]
12648정성태5/16/202116437사물인터넷: 66. PC -> FTDI -> NodeMCU v1 ESP8266 기기를 UART 핀을 연결해 직렬 통신하는 방법파일 다운로드1
12647정성태5/15/202116716.NET Framework: 1058. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용파일 다운로드1
12646정성태5/15/202115508사물인터넷: 65. C# - Arduino IDE의 Serial Monitor 기능 구현파일 다운로드1
12645정성태5/14/202115568사물인터넷: 64. NodeMCU v1 ESP8266 - LittleFS를 이용한 와이파이 접속 정보 업데이트파일 다운로드1
12644정성태5/14/202116834오류 유형: 719. 윈도우 - 제어판의 "프로그램 및 기능" / "Windows 기능 켜기/끄기" 오류 0x800736B3
12643정성태5/14/202116778오류 유형: 718. 서버 유형의 COM+ 사용 시 0x80080005(Server execution failed) 오류 발생
12642정성태5/14/202118501오류 유형: 717. The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
12641정성태5/13/202117310디버깅 기술: 179. 윈도우용 .NET Core 3 이상에서 Windbg의 sos 사용법
12640정성태5/13/202120902오류 유형: 716. RDP 연결 - Because of a protocol error (code: 0x112f), the remote session will be disconnected. [1]
12639정성태5/12/202117307오류 유형: 715. Arduino: Open Serial Monitor - The module '...\detection.node' was compiled against a different Node.js version using NODE_MODULE_VERSION
12638정성태5/12/202117555사물인터넷: 63. NodeMCU v1 ESP8266 - 펌웨어 내 파일 시스템(SPIFFS, LittleFS) 및 EEPROM 활용
... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...