我目前正在运行Nginx + PHP-FPM来在OpenX上投放广告。目前我的响应时间非常糟糕,即使在低负载时也是如此。但是,我的CPU和内存资源很好,所以我似乎无法弄清楚瓶颈是什么。
我目前对nginx和php-fpm的配置是:
worker_processes 20;
worker_rlimit_nofile 50000;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 15000;
multi_accept off;
use epoll;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush off;
keepalive_timeout 0;
#keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
# Default location
location / {
root /var/www;
index index.php;
}
## Parse all .php file in the /var/www directory
location ~ .php$ {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_ignore_client_abort off;
}
PHP-FPM:
rlimit_files = 50000
max_children = 500
我只包括我为PHP-FPM更改的PHP-FPM参数。
有没有人有关于如何优化它的任何提示,以便我可以提供更多请求?我现在看到了可怕的响应时间。
答案 0 :(得分:70)
首先,工人太多,限制设定得过高。单独的php-fpm的最大工作人员数量会使服务器停滞不前。在服务器上取消限制不一定会加快速度,但实际上可能产生相反的效果。
工人数:20如果你没有20台处理器/核心机器就没那么有意义,你实际上会造成负面影响,因为工人会有过多的内容交换。如果您正在运行双核处理器,那么2名工作人员就足够了。
工人连接:再一次,只是向天空施加限制并不能解决你的问题。如果你的ulimit -n输出大约是1024,那么你的工作者连接需要设置为1024或更少(甚至可能是768),你不太可能有2 x 1024个同时连接,特别是像PHP这样的东西。
根位置和PHP设置,请参考http://wiki.nginx.org/Pitfalls,如果将root指令放在服务器{}级别而不是位置级别,则效果最佳。一旦你这样做,你可以使用$ document_root $ fastcgi_script_name作为SCRIPT_FILENAME值,因为$ document_root将自动传播到它下面的位置块。
您可能希望直接处理静态文件,换句话说:
location ~* \.(ico|css|js|gif|jpe?g|png)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
使用PHP加速器,即APC(php.ini中的apc.enabled = 1)或XCache,并注意你的php设置,例如memory_limit。例如,如果你只有一个拥有2GB内存的系统,那么允许每个限制为128MB的500名工作人员是没有意义的。如果您还在服务器上运行其他服务,尤其如此。
答案 1 :(得分:6)
放置也很有用:
access_log off;
我想你并不真正关心这些请求的日志生成。
答案 2 :(得分:4)
你肯定应该减少工人数量,因为我怀疑你有20个核心/处理器。 另外,我会调查你的数据库服务器,很可能存在问题。
此外,您已将worker_rlimit_nofile
提升为50000
,我希望您知道操作系统通常将限制设置为1024(默认值),您可以尝试通过键入{来请求当前限制是什么{1}}
您可以通过在init.d或visit this other question on stackoverflow中执行此命令ulimit -n
来提高NOFILE的硬限制(打开文件数),以了解如何使用ulimit -n 50000
永久设置限制系统宽。
答案 3 :(得分:3)
使用nginx和php5-fpm将性能提升到最大值是一门艺术。它需要真正了解您所服务的内容。
例如,我没有在配置中看到任何try_files用法或任何类型的缓存。你知道nginx有内置的memcache支持吗?您可以缓存图像和html / css,以及php页面。如果您主要关注点击次数,那么即使不显示,也会计算这些点击次数。
将您的横幅放入tmpfs挂载,不要记录access_log或error_log,禁用php中不需要的模块,使用最新版本的mysql,使用innodb减少表锁定,使用innodb的刷新方法减少磁盘写入,增加mysql中的最大内存表,以减少在通过SQL请求连接时在磁盘上创建临时文件等。
Nginx只是一个非常大而复杂的公式的一部分。我甚至没有提到内核参数来优化TCP堆栈和网卡的性能,交换使用,内存使用或你可能通过OpenX服务的HTML / CSS的gzip压缩(如果你的话)。
是的,就像我上面提到的其他人一样,您的设置看起来过分,并且表明对基本优化概念缺乏了解。换句话说,聘请专业人士: - )
答案 4 :(得分:1)
答案 5 :(得分:0)
当然,工人们也可以提到。我个人更喜欢使用xcache而不是APC来进行php操作码缓存。你应该检查一下修改后的centmin auto bash shell中的配置nginx / php-fpm安装脚本http://vbtechsupport.com/796/
答案 6 :(得分:-2)
使服务器系统更快的最有效方法是使用Facebook的HipHop虚拟机(HHVM)而不是PHP(不必再安装PHP)。
HHVM使用CPU的上游a" Just in Time Compiler"并且通常PHP代码比PHP本身快5到10倍,它可以与较少数量的服务器或较小的服务器相处,并且基本上可以降低功耗。维基百科使用HHVM将CPU服务器负载降低了5倍: http://www.golem.de/news/php-facebooks-hhvm-macht-wikipedia-schneller-1501-111515.html
它可以作为Linux软件包与Nginx一起安装,并且非常容易与FastCGI类似地包含在Nginx中,几分钟之后它就可以通过一个小的“Hello World" PHP文件: https://github.com/facebook/hhvm/wiki/Getting-Started
根据基准测试,新的PHP7 PHPNG实际应该快30%。
感谢upvoting