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

... 61  62  63  64  65  66  67  68  69  [70]  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12186정성태3/12/202017402오류 유형: 604. The SysVol Permissions for one or more GPOs on this domain controller and not in sync with the permissions for the GPOs on the Baseline domain controller.
12185정성태3/11/202018016오류 유형: 603. The browser service was unable to retrieve a list of servers from the browser master...
12184정성태3/11/202019941오류 유형: 602. Automatic certificate enrollment for local system failed (0x800706ba) The RPC server is unavailable. [3]
12183정성태3/11/202017734오류 유형: 601. Warning: DsGetDcName returned information for \\[...], when we were trying to reach [...].
12182정성태3/11/202019225.NET Framework: 901. C# Windows Forms - Vista/7 이후의 Progress Bar 업데이트가 느린 문제파일 다운로드1
12181정성태3/11/202019519기타: 76. 재현 가능한 최소한의 예제 프로젝트란? - 두 번째 예제파일 다운로드1
12180정성태3/10/202015975오류 유형: 600. "Docker Desktop for Windows" - EXPOSE 포트가 LISTENING 되지 않는 문제
12179정성태3/10/202027699개발 환경 구성: 481. docker - PostgreSQL 컨테이너 실행
12178정성태3/10/202019758개발 환경 구성: 480. Linux 운영체제의 docker를 위한 tcp 바인딩 추가 [1]
12177정성태3/9/202018981개발 환경 구성: 479. docker - MySQL 컨테이너 실행
12176정성태3/9/202018500개발 환경 구성: 478. 파일의 (sha256 등의) 해시 값(checksum) 확인하는 방법
12175정성태3/8/202018525개발 환경 구성: 477. "Docker Desktop for Windows"의 "Linux Container" 모드를 위한 tcp 바인딩 추가
12174정성태3/7/202017923개발 환경 구성: 476. DockerDesktopVM의 파일 시스템 접근 [3]
12173정성태3/7/202019247개발 환경 구성: 475. docker - SQL Server 2019 컨테이너 실행 [1]
12172정성태3/7/202023795개발 환경 구성: 474. docker - container에서 root 권한 명령어 실행(sudo)
12171정성태3/6/202018883VS.NET IDE: 143. Visual Studio - ASP.NET Core Web Application의 "Enable Docker Support" 옵션으로 달라지는 점 [1]
12170정성태3/6/202016913오류 유형: 599. "Docker Desktop is switching..." 메시지와 DockerDesktopVM CPU 소비 현상
12169정성태3/5/202019421개발 환경 구성: 473. Windows nanoserver에 대한 docker pull의 태그 사용 [1]
12168정성태3/5/202020626개발 환경 구성: 472. 윈도우 환경에서의 dockerd.exe("Docker Engine" 서비스)가 Linux의 것과 다른 점
12167정성태3/5/202019062개발 환경 구성: 471. C# - 닷넷 응용 프로그램에서 DB2 Express-C 데이터베이스 사용 (3) - ibmcom/db2express-c 컨테이너 사용
12166정성태3/4/202019460개발 환경 구성: 470. Windows Server 컨테이너 - DockerMsftProvider 모듈을 이용한 docker 설치
12165정성태3/2/202018455.NET Framework: 900. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 네 번째 이야기(Monitor.Enter 후킹)파일 다운로드1
12164정성태2/29/202019521오류 유형: 598. Surface Pro 6 - Windows Hello Face Software Device가 인식이 안 되는 문제
12163정성태2/27/202017850.NET Framework: 899. 익명 함수를 가리키는 delegate 필드에 대한 직렬화 문제
12162정성태2/26/202021697디버깅 기술: 166. C#에서 만든 COM 객체를 C/C++로 P/Invoke Interop 시 메모리 누수(Memory Leak) 발생 [6]파일 다운로드2
12161정성태2/26/202017697오류 유형: 597. manifest - The value "x64" of attribute "processorArchitecture" in element "assemblyIdentity" is invalid.
... 61  62  63  64  65  66  67  68  69  [70]  71  72  73  74  75  ...