APACHE+PHP vs NGINX+PHP 性能评测(译文)
鉴于论坛里有会员对NGINX、APACHE各自与各自的方式运行PHP的性能有疑问,我从国外转载并翻译一篇文章并在后面发表一点自己的看法,希望对大家有帮助。
原文: http://blog.a2o.si/2009/06/24/apache-mod_php-compared-to-nginx-php-fpm/
所 有的软件均从源码编译(详见如下)。压测工具使用APACHE的ApacheBench(ab),下面的结果是在同一台机器上测试的,所有伺服系统 (nginx、apache)均关闭了日志功能(防止对性能的影响),测试过程中keepalive配置的是一次启用、一次禁用,每样测试均测试5遍,然 后取得的平均值。测试的文件如下:
HelloWorld.php ? 简短的输出“Hello, World!” (13 bytes)的PHP脚本,用来代表PHP文件测试处理过程的开销,相比的静态文件在下面
HelloWorld.txt ? 一个静态文件,输出“Hello, World!” (同样13 bytes),用来代表静态文件测试处理过程的开销
100KB.txt ? 一个静态的100KB大小的文件
1MB.txt ? 一个静态的1MB 大小的文件
index.php ? 一个包含多重复杂的处理过程的PHP文件,包括数据库查询、文件缓存读取、模板[编译]处理。
硬件环境
硬件: HP DL380 G5
硬件CPU: 2x Intel Xeon E5420 (4 cores each, total of 8 cores)
硬件内存: 8GB of ECC RAM
硬件磁盘: Smart Array P400i RAID-1 with 2x 147GB SAS drives
操作系统: Slackware 12.2 with almost all software compiled from source
文件系统: ext3
Apache 版本: 2.2.11, php 由mod_php方式运行
Nginx 版本: 0.7.59, php 由 php-fpm (通过socket方式运行)
PHP 版本: 5.2.9
Eaccelerator 版本: 0.9.5.3 (for both, Apache and Nginx)
MySQL 版本: 5.0.77
OpenSSL 版本: 0.9.8k
服务日志、请求日志均已禁用
Apache编译选项:
./configure ?prefix=/usr/local/$PDESTDIR_HTTPD ?sysconfdir=/etc/httpd \
?enable-authn-file ?enable-authn-default \
?enable-authz-host ?disable-authz-groupfile ?enable-authz-user ?enable-authz-default \
?enable-auth-basic \
?disable-include ?disable-filter ?disable-charset-lite \
?enable-log-config \
?enable-env ?enable-setenvif \
?enable-ssl ?with-ssl=/usr/local/openssl-$PVERSION_OPENSSL \
?enable-http ?enable-mime ?enable-status \
?disable-autoindex ?disable-asis \
?enable-info \
?enable-cgi ?disable-cgid \
?enable-vhost-alias \
?disable-negotiation \
?enable-dir \
?disable-actions \
?disable-userdir \
?enable-info \
?enable-rewrite \
?enable-so \
?with-mpm=prefork
Nginx编译选项:
./configure ?prefix=/usr/local/$PDIR \
?conf-path=/etc/nginx/nginx.conf \
?error-log-path=/var/log/nginx/nginx_error.log \
?pid-path=/var/run/nginx.pid \
?lock-path=/var/run/nginx.lock \
?user=httpd \
?group=httpd \
?with-openssl=/usr/local/openssl-0.9.8k
PHP编译选项(与APACHE一起运行的MOD_PHP):
??[These lines are for PHP with Apache (mod_php)]?????-
./configure ?prefix=/usr/local/$PDESTDIR_HTTPD/$PDIR \
?with-apxs2=/usr/local/$PDESTDIR_HTTPD/bin/apxs ?enable-cli ?enable-cgi \
?with-config-file-path=/etc/php/httpd \
与NGINX一起运行的(php-fpm)
??[These lines are for PHP with Nginx (php-fpm)]?????-
./configure ?prefix=/usr/local/php-fpm \
?enable-cli ?enable-fastcgi ?enable-fpm \
?with-fpm-conf=/etc/php/php-fpm/php-fpm.conf \
?with-fpm-log=/var/log/php-fpm.log \
?with-fpm-pid=/var/run/php-fpm.pid \
?with-config-file-path=/etc/php/php-fpm \
PHP共同配置
??[These lines are common for both]?????-
?disable-short-tags \
?disable-ipv6 \
?disable-all \
\
?enable-libxml \
?with-openssl=/usr/local/openssl-$PVERSION_OPENSSL \
?with-pcre-regex \
?with-zlib \
?with-bz2 \
?with-curl ?with-curlwrappers \
?enable-dba=shared ?with-db4 ?enable-inifile ?enable-flatfile \
?enable-dom ?with-libxml-dir \
?enable-filter \
?enable-ftp \
?with-gd ?with-jpeg-dir ?with-png-dir ?with-freetype-dir \
?with-gettext \
?enable-hash ?with-mcrypt \
?with-iconv=/usr/local/lib ?with-iconv-dir=/usr/local/lib \
?with-imap=/usr/local/imap-$PVERSION_CYRUSIMAP ?with-imap-ssl \
?enable-json \
?enable-mbstring ?enable-mbregex ?enable-mbregex-backtrack \
?with-mysql=/usr/local/mysql-$PVERSION_MYSQL ?with-mysqli=/usr/local/mysql-$PVERSION_MYSQL/bin/mysql_config \
?enable-pdo ?with-pdo-mysql=/usr/local/mysql-$PVERSION_MYSQL ?with-pdo-sqlite ?enable-sqlite-utf8 \
?enable-reflection \
?enable-session ?with-mm \
?enable-shmop \
?enable-simplexml \
?enable-soap \
?enable-sockets \
?enable-spl \
?with-regex \
?enable-sysvmsg ?enable-sysvsem ?enable-sysvshm \
?enable-tokenizer \
?enable-xml ?enable-xmlreader ?with-xmlrpc ?enable-xmlwriter ?with-xsl \
?enable-zip \
\
?with-pear \
?enable-zend-multibyte
配置文档:
Apache mod_php: httpd.conf http://blog.a2o.si/wp-content/uploads/2009/06/httpd.conf.txt
Apache mod_php: php.ini http://blog.a2o.si/wp-content/uploads/2009/06/php.ini.txt
Nginx php-fpm: nginx.conf http://blog.a2o.si/wp-content/uploads/2009/06/nginx.conf.txt
Nginx php-fpm: php-fpm.conf http://blog.a2o.si/wp-content/uploads/2009/06/php-fpm.conf.txt
Nginx php-fpm: php.ini与mod_php方式相同
测试结果:
HelloWorld.php
在 这里你可以看到每个PHP请求施加的开销。有趣的的是一个事实是Apache在这个测试执行的更好而且好得多。这里的原因是,Apache的PHP“内 置”通过mod_php,并且模块处理。另一方面Nginx的代理PHP请求到另一个应用程序服务器(PHP-FPM)。 Nginx的性能在上面的图是大约为apache的一半,容易解释。这里的PHP只是简单输出字符串。
[font='Lucida Grande', Verdana, Arial, sans-serif]HelloWorld.txt
[font='Lucida Grande', Verdana, Arial, sans-serif]
[font='Lucida Grande', Verdana, Arial, sans-serif]
[font='Lucida Grande', Verdana, Arial, sans-serif]
在本次测试的Apache开始落后。 NGINX的性能超过了apache性能的两倍。这项测试是展示静态文件服务的开销。
[font='Lucida Grande', Verdana, Arial, sans-serif]100KB.txt
[font='Lucida Grande', Verdana, Arial, sans-serif]
[font='Lucida Grande', Verdana, Arial, sans-serif]
在 这里的测试已经接近生产应用中的静态文件了(100KB),而且,我们能够证明,Nginx 禁用keepalive后与Apache 启用KeepAlive压力发现NGINX仍优于APACHE约两倍。此次测试的吞吐量约为1.2GB/s,但是所有测试均未真正出因特网(测试是在局域 网进行的)。
[font='Lucida Grande', Verdana, Arial, sans-serif]1MB.txt
这次测试没所有伺服均未开启keep alive,每个请求都要新建立连接,但相比于数据传输,这新建连接的开销就无所谓了。
真正意义上的PHP程序:
或许你会惊奇地看到,apache跑真实的、复杂点的PHP程序的时候,性能不及NGINX。
但原文作者或许没有注意到,NGINX PHP这时执行的时候肯定有不少是弹了回错误了的(而且作者没开启日志,测试过后没查证)
作者在原文只是这样说到:
apache开启.htaccess(NGINX没有这个功能)过后,会导致连接数据库的性能有所下降。
后面还有两项测试(分别是比较APACHE自己处理静态与自己处理动态的能力和NGINX的能力。)我就不在这里翻译了。
总结:
APACHE处理静态的能力不及NGINX,但NGINX处理PHP的稳定性不及apache mod_php。
如果取长补短哩?
NGINX做前端,APACHE做后端。NGINX proxy_pass apache,然后两个伺服doc_root配成一致,并让静态文件直接让NGINX输出,只转发PHP的请求给后端apache处理。
有会员的疑问:两个伺服,根本是多此一举。
回答:我的目标是高承载能力 稳定同时兼顾。而不是舍一取一。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

세션 납치는 다음 단계를 통해 달성 할 수 있습니다. 1. 세션 ID를 얻으십시오. 2. 세션 ID 사용, 3. 세션을 활성 상태로 유지하십시오. PHP에서 세션 납치를 방지하는 방법에는 다음이 포함됩니다. 1. 세션 _regenerate_id () 함수를 사용하여 세션 ID를 재생산합니다. 2. 데이터베이스를 통해 세션 데이터를 저장하십시오.

PHP에는 4 가지 주요 오류 유형이 있습니다. 1. NOTICE : 가장 작은 것은 정의되지 않은 변수에 액세스하는 것과 같이 프로그램을 방해하지 않습니다. 2. 경고 : 심각한 통지는 파일을 포함하지 않는 것과 같은 프로그램을 종료하지 않습니다. 3. FatalError : 가장 심각한 것은 기능을 부르는 것과 같은 프로그램을 종료합니다. 4. parseerror : 구문 오류는 엔드 태그를 추가하는 것을 잊어 버리는 것과 같이 프로그램이 실행되는 것을 방지합니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP에서 Password_hash 및 Password_Verify 기능을 사용하여 보안 비밀번호 해싱을 구현해야하며 MD5 또는 SHA1을 사용해서는 안됩니다. 1) Password_hash는 보안을 향상시키기 위해 소금 값이 포함 된 해시를 생성합니다. 2) Password_verify 암호를 확인하고 해시 값을 비교하여 보안을 보장합니다. 3) MD5 및 SHA1은 취약하고 소금 값이 부족하며 현대 암호 보안에는 적합하지 않습니다.

HTTP 요청 방법에는 각각 리소스를 확보, 제출, 업데이트 및 삭제하는 데 사용되는 Get, Post, Put and Delete가 포함됩니다. 1. GET 방법은 리소스를 얻는 데 사용되며 읽기 작업에 적합합니다. 2. 게시물은 데이터를 제출하는 데 사용되며 종종 새로운 리소스를 만드는 데 사용됩니다. 3. PUT 방법은 리소스를 업데이트하는 데 사용되며 완전한 업데이트에 적합합니다. 4. 삭제 방법은 자원을 삭제하는 데 사용되며 삭제 작업에 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

화살표 기능은 PHP7.4에 도입되었으며 단순화 된 형태의 짧은 폐쇄입니다. 1) => 연산자를 사용하여 정의되어 기능을 생략하고 키워드를 사용합니다. 2) 화살표 기능은 사용 키워드없이 현재 스코프 변수를 자동으로 캡처합니다. 3) 종종 코드 단순성과 가독성을 향상시키기 위해 콜백 기능 및 짧은 계산에 사용됩니다.
