注意:我首先在 StackOverflow 上提问,然后被发到这里。希望重复没有问题。
在 Ubuntu 13.04 上使用完整原始软件包对 Apache 2.2 和 Nginx 1.2.6 进行负载测试时,我始终看到 Nginx PHP 请求的性能低于 Apache PHP 请求的性能;我正在寻找指导,以便在任何情况下都能让我们的 Nginx 性能超过 Apache。
阿帕奇设置是相当标准的,但 Nginx 设置经过了大量定制;它们是下面列出了基准测试结果。
我使用了名为 Siege v3.0.2 的基准测试工具(http://www.joedog.org/siege-home/)分别生成单个并发用户(c1)、10 个并发用户(c10)、100 个并发用户(c100)的结果,结果如下:
Apache 结果:
Date & Time, Trans, Elap Time, Data Trans, Resp Time, Trans Rate, Throughput, Concurrent, OKAY, Failed
**** c1 Apache Static ****
2013-08-01 00:54:12, 5982, 59.23, 338, 0.01, 101.00, 5.71, 1.00, 5982, 0
**** c1 Apache PHP ****
2013-08-01 00:55:12, 549, 59.98, 88, 0.11, 9.15, 1.47, 1.00, 549, 0
**** c1 Apache Combined ****
2013-08-01 00:56:12, 1609, 59.98, 139, 0.04, 26.83, 2.32, 1.00, 1609, 0
**** c10 Apache Static ****
2013-08-01 00:57:12, 35983, 59.97, 2039, 0.02, 600.02, 34.00, 9.99, 35983, 0
**** c10 Apache PHP ****
2013-08-01 00:58:12, 3769, 59.98, 610, 0.16, 62.84, 10.17, 9.99, 3769, 0
**** c10 Apache Combined ****
2013-08-01 00:59:12, 10928, 59.98, 947, 0.05, 182.19, 15.79, 9.99, 10928, 0
**** c100 Apache Static ****
2013-08-01 01:00:12, 44581, 59.97, 2523, 0.13, 743.39, 42.07, 98.63, 44581, 0
**** c100 Apache PHP ****
2013-08-01 01:01:12, 4427, 59.98, 721, 1.32, 73.81, 12.02, 97.34, 4427, 1
**** c100 Apache Combined ****
2013-08-01 01:02:12, 12735, 59.98, 1125, 0.47, 212.32, 18.76, 99.68, 12735, 0
Nginx 结果:
Date & Time, Trans, Elap Time, Data Trans, Resp Time, Trans Rate, Throughput, Concurrent, OKAY, Failed
**** c1 Nginx Static ****
2013-08-01 02:36:13, 9040, 59.10, 274, 0.01, 152.96, 4.64, 1.00, 9040, 0
**** c1 Nginx PHP ****
2013-08-01 02:37:13, 581, 59.98, 18, 0.10, 9.69, 0.30, 1.00, 581, 0
**** c1 Nginx Combined ****
2013-08-01 02:38:13, 1786, 59.59, 55, 0.03, 29.97, 0.92, 1.00, 1786, 0
**** c10 Nginx Static ****
2013-08-01 02:39:13, 44557, 59.98, 1353, 0.01, 742.86, 22.56, 9.99, 44557, 0
**** c10 Nginx PHP ****
2013-08-01 02:40:13, 3766, 59.98, 120, 0.16, 62.79, 2.00, 9.98, 3766, 0
**** c10 Nginx Combined ****
2013-08-01 02:41:13, 10962, 59.98, 339, 0.05, 182.76, 5.65, 9.98, 10962, 0
**** c100 Nginx Static ****
2013-08-01 02:42:13, 54463, 59.98, 1642, 0.11, 908.02, 27.38, 99.70, 54463, 0
**** c100 Nginx PHP ****
2013-08-01 02:43:13, 3649, 59.98, 117, 1.62, 60.84, 1.95, 98.70, 3649, 0
**** c100 Nginx Combined ****
2013-08-01 02:44:13, 10802, 59.98, 334, 0.55, 180.09, 5.57, 98.63, 10802, 0
我关心的数据来自 c100 的“PHP”和“综合”结果。Apache 的速度要快得多,我很好奇这是怎么可能的,因为网上的所有基准测试都显示相反的结果。
两台服务器均是:
- 运行在四核 Xeon 处理器上
- 8GB 内存
- 连接到同一网络上的 MongoDB v2.2 数据库
- PHP-FPM 设置为使用 100 个 PHP 进程
阿帕奇(设置非常接近库存):
- 在 CentOS 5 上运行
- Apache 2.2
- mod_php
Nginx的:
- Ubuntu 13.04
- Nginx 1.2.6
- 带有 100 个 PHP 进程的 PHP-FPM (FastCGI)
nginx.conf
pid /run/nginx.pid;
user www-data;
worker_processes 4;
events {
worker_connections 1024;
}
http {
# APACHE BACKWARDS COMPATIBILITY ENVIRONMENT VARIABLES
map $request_uri $my_script_url {
default $request_uri;
~^(?<script_filename>.+\.(php))(.*)?$ $script_filename; #/test.php or /test.php?hello=world
~^(?<script_filename>.*)(\?.*)$ $script_filename; #/tos?hello=world
~^(?<script_filename>.*)(\?.*)?$ $script_filename; #/tos or /tos/hello/world or /tos/hello/world?omg=what
}
# BASE SETTINGS
charset utf-8;
default_type application/octet-stream;
include /etc/nginx/mime.types;
server_tokens off;
# CLIENT CACHING SETTINGS
add_header Last-Modified "";
expires 7d;
# CONNECTION SETTINGS
client_body_timeout 15s;
client_header_timeout 30s;
client_max_body_size 8m;
keepalive_requests 10000;
keepalive_timeout 30s;
reset_timedout_connection on;
resolver_timeout 5s;
send_timeout 15s;
tcp_nopush on;
# FASTCGI SETTINGS
# fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:10m max_size=1000m inactive=60m;
# FILE CACHING AND PERFORMANCE SETTINGS
open_file_cache max=10000 inactive=20s;
open_file_cache_errors off;
open_file_cache_min_uses 2;
open_file_cache_valid 30s;
sendfile on;
# GZIP SETTINGS
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_proxied any;
gzip_types
text/css
text/plain
text/javascript
application/javascript
application/json
application/x-javascript
application/xml
application/xml+rss
application/xhtml+xml
application/x-font-ttf
application/x-font-opentype
application/vnd.ms-fontobject
image/svg+xml
image/x-icon
application/rss+xml
application/atom_xml;
gzip_vary on;
# LOGGING SETTINGS
access_log /var/log/nginx/access.log combined buffer=16k;
error_log /var/log/nginx/error.log crit;
open_log_file_cache max=100 inactive=1m min_uses=1 valid=2m;
# SSL SETTINGS
# ssl_ciphers !aNULL:!eNULL:FIPS@STRENGTH;
# ssl_prefer_server_ciphers on;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 3m;
# OTHER GLOBAL CONFIGURATION FILES
include /etc/nginx/conf.d/*.conf;
# VIRTUAL HOST CONFIGS
include /etc/nginx/sites-enabled/*;
}
虚拟主机配置
server {
# BASE SETTINGS
listen 80;
root /var/www/tbi/example/htdocs;
# server_name local.example.com;
server_name www.example.com;
# LOG SETTINGS
access_log /var/log/nginx/www.example.com.access.log combined buffer=64k;
error_log /var/log/nginx/www.example.com.error.log crit;
# LOCATIONS
location / {
index index.php index.html;
try_files $uri @extensionless-php;
}
location ~ \.(ttf|otf|eot|woff)$ {
add_header Access-Control-Allow-Origin *;
}
# location /nginx_status {
# See a brief synopsis of real-time, instantaneous performance
# stub_status on;
# }
location ~ \.php$ {
expires off;
# FASTCGI SETTINGS
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
# FASTCGI CACHE SETTINGS
# fastcgi_cache microcache;
# fastcgi_cache_bypass $http_pragma;
# fastcgi_cache_key $scheme$host$request_uri$request_method;
# fastcgi_cache_methods GET HEAD;
# fastcgi_cache_use_stale updating error timeout invalid_header http_500;
# fastcgi_cache_valid any 1m;
# fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
# TBI ENVIRONMENT VARIABLES
fastcgi_param TBI_CONFIG /var/www/tbi/configs/;
fastcgi_param TBI_DOMAIN example.com;
# fastcgi_param TBI_ENV local;
fastcgi_param TBI_ENV www;
fastcgi_param TBI_RELEASETIME 0;
# APACHE BACKWARDS COMPATIBILITY ENVIRONMENT VARIABLES
fastcgi_param SCRIPT_URI $scheme://$http_host$my_script_url;
fastcgi_param SCRIPT_URL $my_script_url;
}
location @extensionless-php {
if (-f $request_filename.php) {
rewrite ^/(.*)$ /$1.php last;
}
rewrite ^/(.*)$ /index.php?$1 last;
}
}
任何有关加快 Nginx 速度的建议都将不胜感激。如果可能的话,我想避免内核和 TCP/IP 调整。
答案1
PHP 将生成 FastCGI 子进程来处理 NGINX 上的 PHP 请求,因此它受限于 PHP 处理器本身的速度。Nginx 不会更快地处理/加载 PHP 代码,因为它必须“等待”FactCGI 向其发送数据,然后 FastCGI 必须等待 php 处理器。
我强烈建议在 nginx 的后端为 PHP 使用操作码缓存(想到了 Eaccelerator)。
如果这是静态 HTML,你会看到 nginx 在内容速度方面胜过 apache。