简体   繁体   English

Nginx PHP始终比Apache 2.2慢

[英]Nginx PHP Consistently Slower than Apache 2.2

In doing load testing comparing Apache 2.2 and Nginx 1.2.6 running using fully stock packages on Ubuntu 13.04, I consistently see lower performance for Nginx PHP requests than for Apache PHP ones; 在比较使用Ubuntu 13.04上的完全库存包运行的Apache 2.2和Nginx 1.2.6的负载测试中,我一直看到Nginx PHP请求的性能低于Apache PHP的性能; I'm looking for guidance to get our Nginx performance above that of Apache under all circumstances, if possible . 如果可能的话,我正在寻找指导,以便在所有情况下使我们的Nginx性能高于Apache

Apache settings are fairly standard, but the Nginx settings were customized considerably; Apache 设置是相当标准的,但Nginx设置是相当自定义的; they are listed below the benchmark results . 它们列在基准测试结果下方

I used the benchmarking tool called Siege v3.0.2 ( http://www.joedog.org/siege-home/ ) to generate results for a single concurrent user (c1), 10 concurrent users (c10), and 100 concurrent users (c100); 我使用名为Siege v3.0.2( http://www.joedog.org/siege-home/ )的基准测试工具为单个并发用户(c1),10个并发用户(c10)和100个并发用户生成结果( C100); the results are as follows: 结果如下:

Apache Results: 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 Results: 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

The data I'm concerned about is from the c100 "PHP" and "Combined" results. 我关心的数据来自c100“PHP”和“Combined”结果。 Apache is quite a bit faster and I'm wondering how that's possible given all the benchmarks online that show the opposite. Apache的速度要快得多,我想知道如果在线显示相反的所有基准测试,这是多么可能。

Both servers are: 两台服务器都是:

  1. Running on a quad-core Xeon processor 在四核Xeon处理器上运行
  2. 8GB RAM 8GB RAM
  3. Connected to a MongoDB v2.2 database on the same network 连接到同一网络上的MongoDB v2.2数据库
  4. PHP-FPM is set to use 100 PHP processes PHP-FPM设置为使用100个PHP进程

Apache (settings are very close to stock): Apache (设置非常接近库存):

  1. Running on CentOS 5 在CentOS 5上运行
  2. Apache 2.2 Apache 2.2
  3. mod_php mod_php的

Nginx: Nginx的:

  1. Ubuntu 13.04 Ubuntu 13.04
  2. Nginx 1.2.6 Nginx 1.2.6
  3. PHP-FPM (FastCGI) with 100 PHP processes PHP-FPM(FastCGI),包含100个PHP进程

nginx.conf 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/*;
}

Virtual Host Config 虚拟主机配置

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;
    }
}

Any advice related to making Nginx faster would be greatly appreciated. 任何有关使Nginx更快的建议都将非常感激。 I'd like to avoid kernel and TCP/IP tuning if possible. 如果可能的话,我想避免内核和TCP / IP调优。

PHP performance between Apache and nginx should be fairly similar, as PHP is a much higher bottleneck than the server used. Apache和nginx之间的PHP性能应该非常相似,因为PHP比使用的服务器瓶颈要高得多。

In your case the performance looks identical when concurrency = 1, or concurrency = 10, only becoming slower on nginx/PHP-FPM when concurrency is 100. 在你的情况下,当concurrency = 1或concurrency = 10时,性能看起来相同,当并发性为100时,nginx / PHP-FPM上的性能变得更慢。

Despite what you may assume, running more PHP-FPM processes in parallel doesn't result in faster performance for many concurrent queries. 尽管您可以假设,并行运行更多PHP-FPM进程并不会导致许多并发查询的性能更快。 PHP doesn't heavily benefit from running in parallel after a certain point. 在某一点之后,PHP并没有从并行运行中获益。 After a point, more processes in parallel can reduce overall throughput due to additional context switching, more random contention for I/O access, higher memory use, etc. 在一点之后,并行的更多进程可能会因为额外的上下文切换,更多随机争用I / O访问,更高内存使用等而降低总体吞吐量。

In my testing, the sweet spot in terms of PHP-FPM processes was around 6 to 10 (I use 8). 在我的测试中,PHP-FPM过程中的最佳位置是大约6到10(我使用8)。 This gets me the highest performance even when testing with hundreds of concurrent connections. 即使在测试数百个并发连接时,这也使我获得了最高性能。 Adding more PHP-FPM processes after that started to slow it down. 之后添加更多PHP-FPM流程开始减慢速度。 Your mileage may vary, but 100 is unlikely to be the sweet spot on any server. 您的里程可能会有所不同,但100不太可能成为任何服务器的最佳选择。

Note that your number of PHP-FPM processes does not have to be equal to or greater than the number of concurrent connections you support. 请注意,您的PHP-FPM进程数不必等于或大于您支持的并发连接数。 To explain that better - having 8 PHP-FPM processes does not mean that you are limited to 8 concurrent connections. 为了解释这更好的-有8 PHP-FPM进程并不意味着你是有限的8个并发连接。 As long as your listen.backlog in PHP-FPM is sufficiently high your server (nginx) will still maintain many hundreds of concurrent connections but PHP-FPM will simply process them 8 at a time internally, rather than all at once. 只要PHP-FPM中的listen.backlog足够高,您的服务器(nginx)仍将保持数百个并发连接,但PHP-FPM将在内部一次处理8个,而不是一次性处理它们。 This means that each individual query will spend much less time actually being executed by PHP because it is in contention with fewer other processes. 这意味着每个单独的查询将花费更少的时间实际执行PHP,因为它与更少的其他进程争用。 The connections will still be held open concurrently and testing with hundreds of concurrent users will still see all requests served quickly and successfully. 这些连接仍将同时保持打开状态,并且对数百个并发用户进行测试仍然可以快速,成功地查看所有请求。

Note that I also found another way to speed up PHP on my nginx setup, and that was to increase the number/size of fastcgi_buffers. 请注意,我还发现了另一种在我的nginx设置上加速PHP的方法,那就是增加fastcgi_buffers的数量/大小。 Mine is currently set to fastcgi_buffers 32 16k; 我目前设置为fastcgi_buffers 32 16k; .

You have enabled gzip on-the-fly compression in nginx - very expensive operation, so what do you expect? 你已经在nginx中启用了gzip on-the-fly压缩 - 非常昂贵的操作,所以你期待什么? Even worse, you have configured 5th compression level, that make it even slower, slow as hell. 更糟糕的是,你已经配置了第五个压缩级别,这使得它更慢,更慢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM