Computer/PHP

WINAPM Full 6메가 버전(php-4.2.1컴파일,테스트)

알찬돌삐 2005. 5. 19. 03:15
안녕하세요.
리사아빠입니다.

이 번에는 대부분의 파일을 추가 하여 작성하였습니다.
그래도 압축해서 6.15메가 밖에 안하는 강력 버전을 작성해 보았습니다.
그리고 최신 버전인 Zend Optimizer 1.3.1도 추가 되었습니다.
PHP 4.2.1 버전도 윈도우에서 안정적으로 작동하는 것같아
새 버전으로 컴파일하여 추가 하였습니다.

http://www.boreal-net.com/pub/winapm/winapm-1.1.exe
APACHE,OpenSSL,Mod_SSL,Mod_PHP,PERL,MySQL 지원

WinAPM 1.1은 제가 자주 사용하는데 필요한 것만 뽑아내서 정리한 파일을
재 컴파일하고 최적화해서 윈 2000 서버에서 스피드가 빠르고 안정적으로 작동이
되도록 만든 것입니다. 실질적으로 상용으로도 사용할 수 있을 정도의 퍼퍼먼스가
나오고 제 컴퓨터에서 한 달간 한번도 죽지 않고 계속해서 잘 작동 되고 있었고
아무런 문제가 없없습니다. 윈98/ME/XP에서도 잘 작동이 되고 있다는 소리도
들었는데 저는 이 부분에 대해서 전혀 테스트를 하지 않아 자신을 못합니다.
여기에서 작동되는 프로그램은 제로보드, 웨이보드(PHP/PERL), 테크노트등과
SOURCEFORGE.ORG에서 다운로드 한 대부분의 PHP/MySQL용으로
작성된 프로그램입니다. 그리고 레지스트리를 건드리는 프로그램을 제가 별로
좋아 하지 않아서 레지스트리를 건들지 않아도 정상 작동하도록 설정한 파일을
그냥 압축한 것입니다. 초보용으로 보일지 모르지만 실질적인 내용에 있어서는
어느 정도 중급자용이라고 생각이 되어 집니다.

내용은 아래와 같습니다.

<다운로드>
http://www.boreal-net.com/pub/winapm/winapm-1.1.exe
(WinRAR SelfExtraction Formated File 6.15M)

<설치>
winapm1.1.exe을 풀어서 C:\usr 에 설치합니다.
레지스트리를 하나도 건들지 않았기 때문에 SSL이 정상 작동 되려면
환경변수에다 C:\usr\bin 을 추가해 주어야 합니다.

<사용방법>
C:\usr 디렉토리에 있는 ApacheStart 클릭, MySQL Start 클릭 하고
http://127.0.01/ 와 SSL페이지 https://127.0.01/ 에 접속해서
작동을 확인합니다. 스피드를 특정해보고 싶으면 아파치의
C:\usr\bin\ab.exe로 테스트해 주시기 바랍니다.


버전: Apache 1.3.24
Apache사이트에서 배포하는 버전보다 최고 200배까지 빠른
스피드를 냅니다. 이것은 2.x버전에서는 채용된 MMAP기능이 들어가고
일부 어셈블러 코드로 수정하였기 때문입니다. 2.x 배포버전보다 15%정도
스피드가 떨어지는데 이것은 OpenSSL코드가 들어가고 EAPI 옵션이
추가 되었기 때문입니다. 2.x 배포버전에 OpenSSL코드와 EAPI 옵션을
추가 한다면 동등하리라고 생각됩니다.


버전: OpenSSL 0.9.6c
암호화 부분의 코드를 어셈블러로 콤파일하고 바이너리를 다시 수정하고
해서 사이즈를 최소한으로 줄였기 때문에 암호화 스피드가 상당히
빠릅니다. SSL페이지는 압호화하는데 시간이 걸리기때문에 스피드가
상당히 떨어지는데 MMAP기능과 프로그램 최적화로 인해 배포 버전의
일반 페이지 출력하는 것 보다도 빠르게 SSL페이지를 출력할 수 있습니다.


버전: Perl 5.6.1
이 번에는 기본 펄 모쥴이 대부분 추가 되었습니다. 사이즈는 최적화하여
베포버전보다 상당이 작습니다. SSL서포트용 모드펄을 넣으려고 했으나
아파치 모쥴 관련이 상당량 추가되므로 CGI버전으로 대처했습니다.


버전: Php 4.2.1
SSL을 사용하기위해 EAPI옵션으로 콤파일 되었습니다.
모쥴은 바이너리 사이즈를 최적화하였습니다. 이 번에는
Php 4.2.1용 익스텐션 DLL이 전부 추가 되었습니다.


버전: MySQL3.23.49
스트링 처리부분은 일부 어셈블러로 콤파일되었습니다. 서버 작동에 필요한
파일만을 넣었습니다. 이 프로그램에서 사이즈를 가장 많이 차지합니다.
200k정도 배포버전의 파일보다 사이즈가 작습니다.
이 번에는 많이 쓰이는 mysql.exe도 추가 되었습니다.

모두 최신버전만을 채용하였고 프로그램 사이즈와 실행스피드에 역점을
두고 수정 하고 컴파일하였습니다. 윈도우98에서는 MMAP기능이
제대로 작동하지 않습니다. 그래서 이 프로그램은 윈도우2000용으로
최적화 되었습니다. 그외 어셈블러 코드가 많이 사용되었기 때문에
486이상의 인텔호환 CPU에서의 사용을 권합니다.

<사용된 툴과 컴파일러 정보>
Cygwin 1.3.10-1
VC++ 6.0(Service Pack 5) 엔터프라이즈 일본어 버전
CL.EXE(C/C++ 컴파일러) 12.0.8804.0
LINK.EXE(링커) 6.0.8447.0
ML.EXE(어셈블 컴파일러) 6.14.8444
MASM.EXE(MASM드라이버) 6.14.8444
MASM32(어셈블러 툴) V7
DMAKE(Perl 메이크용) 4.1



다음을 코맨드 프롬프트에서 실행하면 됩니다.

cd c:\usr\bin
openssl

위를 실행하면
OpenSSL>
화면으로 바뀝니다. 그러고 나서 다음을 순서대로 실행하면 됩니다.

OpenSSL> req -config C:\usr\bin\openssl.cnf -new -out my-server.csr
my-server 대신에 자신의 서버 명 예) www.xxx.co.kr
위의 코맨드를 치면 여러 입력정보를 재촉합니다.
그냥 엔터를 치든지 내용을 입력하면
privkey.pem 와 my-server.csr 가 만들어집니다.

그다음
OpenSSL> rsa -in privkey.pem -out my-server.key
Enter PEM pass phrase:
pass phrase를 입력하면 my-server.key가 만들어 집니다.

그다음
OpenSSL> x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 365
하면 my-server.cert 가 만들어 집니다.

그다음
OpenSSL> x509 -in my-server.cert -out my-server.der.crt -outform DER
하면 my-server.der.crt 가 만들어집니다.

그다음
OpenSSL> req -config C:\usr\bin\openssl.cnf -new -x509 -days 365 -key my-server.key -out my-server.crt
하면 처음과 같이 여러가지를 물어오는데 정보를 입력하면
my-server.crt 가 만들어집니다.

이걸로 CA관계 인증서가 작성됩니다.

그다음
OpenSSL> genrsa -des3 -out ca.key 1024
하면 pass phrase를 두번 물어 옵니다.
그리고 나면 ca.key가 작성이 됩니다.

마지막으로
OpenSSL> req -config C:\usr\bin\openssl.cnf -new -x509 -days 365 -key ca.key -out ca.crt
하면 처음과 같이 여러가지를 물어오는데 정보를 입력하면
ca.crt 가 작성이 됩니다.

그리고 난후 위에서 작성된 키를 모두
C:\usr\bin\conf\ssl 디렉토리에 넣어 주면 됩니다.

그다음
C:\usr\bin\conf 디렉토리의 httpd.conf 파일을 열어서
171/172 줄의 다음 정보를 만들어진 키 파일명과 같도록
수정하면 됩니다.
SSLCertificateFile "conf/ssl/my-server.cert"
SSLCertificateKeyFile "conf/ssl/my-server.key"

이것으로 인증서 작성과 설정은 끝입니다.

그 외의 정보는 인터넷에서 입수해 주시기바랍니다.

버전업은 1년에 한번씩 딸래미의 나이와 함께 업그레이드 됩니다.
아직 2.x버전의 EAPI/SSL등 추가 옵션의 기능이 너무 불안정
하고 버그가 많이 있어서 실용적인 단계는 내년이나 되어야
어느 정도 신뢰 할 수 있을 것 같군요.

스피드나 동시 접속자 테스트를 해보시면 많이 빠르다는 것을
아실겁니다. 심심하실때 한번 해보시기 바랍니다.

<방법>
먼저 C:\usr\www 디렉토리에 용량이 큰 임의의 webbench.jpg
코맨드 프롬프트에서
cd c:\usr\bin
ab -n 100 -c 10 http://127.0.0.1/webbench.jpg
혹은 파일로 출력할 때는
ab -n 200 -c 200 http://127.0.0.1/webbench.jpg >webbench.txt
하면 됩니다.
그리고 나서
http://www.apache.org/dist/httpd/binaries/win32/apache_1.3.24-win32-x86-no_src.exe
를 설치해서 같은 방법으로 테스트를 해보시면 얼마나 차이가
나는지 아실 수 있을겁니다.
테스트할 때는 서로 다른 아파치를 실행하는것 잊지마시구요...

제 환경(펜티엄II 350 메모리 516메가)에서는 최고 트랜스퍼 스피드가
200배까지 차이가 있었습니다. OS는 윈도우2000(NTFS) 서버 디벨롭퍼 영어 버전입니다.


105KB 이미지 출력
ab -n 100 -c 10 http://127.0.0.1/webbench.jpg

1.3.24(EAPI/MMAP) 8188 KB/SEC (php/ssl이 모듈도 로드된상태입니다.)
2.0.35(아파치 배포버전) 10804 KB/SEC (아무 모듈도 로드되지 않은 상태입니다.)
1.3.24(아파치 배포버전) 439 KB/SEC (아무 모듈도 로드되지 않은 상태입니다.)

위의 것은 이글을 쓰면서 테스트한 결과 입니다.

<매뉴얼>
이 프로그렘의 설명은 제로님이 작성한
http://nzeo.com/subFile/winapm.html
페이지를 참고 하면 이미지로 더욱 더 쉽게 설명되어 있습니다.

<기타>
C:\windows 혹은 C:\winnt
디렉토리에 이전에 설치했던 php.ini 나 my.ini 가 있으면 실행시
에러가 발생합니다. 이럴땐 다른 파일 이름으로 백업을 해 두던지
파일을 삭제하면 Apach 와 MySQL 의 실행 에러가 없어 집니다.

MySQL:
MySQL 패스워드를 변경하면 실행단축 아이콘인 MySQL STOP에서
오른쪽클릭해서 타겟을 변경해 주어야 MySQL을 Shutdown 시킬 수
있습니다. 그렇지 않으면 Shutdown 에러가 발생합니다.
예)
C:\usr\bin\myadmin.exe shutdown >>
C:\usr\bin\myadmin.exe --user=root --password=패스워드 shutdown
myadmin.exe은 원본의 mysqladmin.exe 와 같은 파일 입니다.

다른 윈도우용 APM을 설치 했다고 해도 WinAPM1.1을 실행하지
않은 상태라면 시스템에 아무 영향을 주지 않습니다. 제가 소프트를 만들때
다른 소프트에 영향을 주거나 문제를 일으키는 소프트는 절대로 만들 마음이
없기 때문에 이렇게 설정을 해놓은 것입니다. 그대신 이미 다른 APM이 설치되어
있으면 제가 작성한 WinAPM1.1은 기존 설치한 다른 APM에 영향을 받습니다.
영향을 받는 이유와 설명, 회피 방법은 다음과 같습니다,

영향을 받는 이유는 프로그램을 실행할때에 설정 파일을 로드하는 과정이
있기 때문입니다. 로드되는 과정은 일반적으로 우선도가 소프트에 따라
다르지만 대부분이 시스템 디렉토리 그리고 때에 따라서는 레지스트리가
우선됩니다. 시스템 디렉토리라함은 C:\windows와 C:\windows\system
그리고 NT/2000/XP계열은 C:\winnt와 C:\winnt\system32입니다. 혹은
자신이 따로 시스템 디렉토리를 다른 이름으로 설치한 경우에는 자신이
설정한 디렉토리가 됩니다. 그래서 현재 아파치와 MySQL은 일반적으로
C:\windows 와 C:\winnt에 php.ini와 my.ini 파일이 있는데 이것이
문제가 됩니다. 그리고 레지스트리는 서비스로 실행을 하기 위해서 필요한데
서비스로 실행하지 않으면 실행하는 데는 아무 상관이 없습니다. 단,
다른 윈도우용 APM을 서비스로 실행을 하고 있는 환경에서는 WinAPM1.0를
사용할 수 없습니다. 이때에는 서비스프로세스를 죽여야만 합니다.
위의 내용으로 인해 WinAPM1.1을 다른 APM을 사용하면서 테스트를 하는
경우에는 임시적으로C:\windows 와 C:\winnt에 있는 php.ini와 my.ini
파일이름을 php.ini.backup와 my.ini.backup 처럼 변경해 놓고 사용하거나
테스트를 해야합니다. 그리고 다른 APM을 다시 사용하고자 할때에는
위의 php.ini.backup와 my.ini.backup 파일이름을 php.ini와 my.ini로
다시 되돌려 주면 됩니다.

WinAPM 1.1에서 서비스로 아파치를 실행 하고자 할때에는 C:\usr\service
에서 install 단축아이콘을 클릭 해주고 리스타트 하면 됩니다. 제거할 때는
uninstall 단축아이콘을 클릭하면 됩니다. 그리고 MySQL을 기동과
동시에 자동으로 서비스처럼 운영하려면 C:\usr 아래의 MySQL Start
단축 아이콘을 시작메뉴의 프로그램 메뉴에 시작 프로그램이라고 있는데
이곳에 복사해서 넣어 주면 됩니다. 상테 바 프로파티 에서 고급을 선택 하면
프로그램 메뉴 디렉토릭를 볼 수 있습니다. 참고로 영어 윈2000 버전의 경우
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
에다 MySQL Start 단축 아이콘을 복사해 주고 재기동하면 서비스처럼
운영할 수 있습니다.

http://localhost/ 보다 http://127.0.0.1/ 을 더 권장합니다.
때에 따라서 세큐리티처리나 URL체크가 들어간 프로그램의 경우
http://localhost/는 에러가 날 가능 성이 있기 때문입니다.

리사파파 씀


PHP출력을 부라우저에다 뿌릴때...


에를 들어 아래와 갗은 헤더를 붙이면 JPEG을 부라우저에 출력할 수가 있습니다. 이것은 RFC에 자세하게 나와 있습니다. 웹 프로그래머는 반드시 이 RFC문서를 숙지하고 있기를 권합니다.

mb_http_output("pass") 에서 PHP가 바이너리데이터를 오인식해 코드를 변환하는 일이 없도록.
Content-Type 의 값
inline 의 지정
Content-Length 을 붙이는 것이 인식율이 높습니다.

다음과 같은 코드로 작성합니다.


[CODE]mb_http_output("pass"); header("Content-type: image/jpeg"); header("Content-Disposition: inline; filename=image.jpg"); header("Content-length: " . filesize("/tmp/image.jpg")); readfile("/tmp/image.jpg");[/CODE]


PHP출력을 다운로드로 할때...


에를들어 아래와 같은 헤더를 붙이면 JPEG파일을 부라우저로 다운로드 할 수 있습니다.

이것은 Content-Disposition에 attachment을 지정합니다.


[CODE]mb_http_output("pass"); header("Content-type: image/jpeg"); header("Content-Disposition: attachment; filename=image.jpg"); header("Content-length: " . filesize("/tmp/image.jpg")); readfile("/tmp/image.jpg"); [/CODE]
.