使用Nginx搭配PHP已有7年的这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。
以下正是这方面的一些提示和建议:
1. 将TCP切换为UNIX域套接字
UNIX域套接字相比TCP套接字在loopback接口上能提供更好的性能(更少的数据拷贝和上下文切换)。
但有一点需要牢记:仅运行在同一台服务器上的程序可以访问UNIX域套接字(显然没有网络支持)。
upstream backend
{
# UNIX domain sockets
server unix:/var/run/fastcgi.sock;
# TCP sockets
# server 127.0.0.1:8080;
}
2. 调整工作进程数
现代计算机硬件是多处理器的,NGINX可以利用多物理或虚拟处理器。
多数情况下,你的Web服务器都不会配置为处理多种任务(比如作为Web服务器提供服务的同时也是一个打印服务器),你可以配置NGINX使用所有可用的处理器,NGINX工作进程并不是多线程的。
运行以下命令可以获知你的机器有多少个处理器:
Linux上 -
cat /proc/cpuinfo | grep processor
FreeBSD上 -
sysctl dev .cpu | grep location
将nginx.conf文件中work_processes的值设置为机器的处理器核数。
同时,增大worker_connections(每个处理器核心可以处理多少个连接)的值,以及将"multi_accept"设置为ON,如果你使用的是Linux,则也使用"epoll":
# We have 16 cores
worker_processes 16;
# connections per worker
events
{
worker_connections 4096;
multi_accept on;
}
3. 设置upstream负载均衡
以我们的经验来看,同一台机器上多个upstream后端相比单个upstream后端能够带来更高的吞吐量。
例如,如果你想支持最大1000个PHP-fpm子进程(children),可以将该数字平均分配到两个upstream后端,各自处理500个PHP-fpm子进程:
upstream backend {
server unix:/var/run/php5-fpm.sock1 weight=100 max_fails=5 fail_timeout=5;
server unix:/var/run/php5-fpm.sock2 weight=100 max_fails=5 fail_timeout=5;
}
以下是两个来自php-fpm.conf的进程池:
<section name="pool">
<value name="name">www1</value>
<value name="listen_address">/var/run/php5-fpm.sock1</value>
<value name="listen_options">
<value name="backlog">-1</value>
<value name="owner"></value>
<value name="group"></value>
<value name="mode">0666</value>
</value>
<value name="user">www</value>
<value name="group">www</value>
<value name="pm">
<value name="style">static</value>
<value name="max_children">500</value>
</value>
<value name="rlimit_files">50000</value>
<value name="rlimit_core">0</value>
<value name="request_slowlog_timeout">20s</value>
<value name="slowlog">/var/log/php-slow.log</value>
<value name="chroot"></value>
<value name="chdir"></value>
<value name="catch_workers_output">no</value>
<value name="max_requests">5000</value>
<value name="allowed_clients">127.0.0.1</value>
<value name="environment">
<value name="HOSTNAME">$HOSTNAME</value>
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
<value name="TMP">/usr/tmp</value>
<value name="TMPDIR">/usr/tmp</value>
<value name="TEMP">/usr/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</value>
<value name="MALLOC_CHECK_">2</value>
</value>
</section>
<section name="pool">
<value name="name">www2</value>
<value name="listen_address">/var/run/php5-fpm.sock2</value>
<value name="listen_options">
<value name="backlog">-1</value>
<value name="owner"></value>
<value name="group"></value>
<value name="mode">0666</value>
</value>
<value name="user">www</value>
<value name="group">www</value>
<value name="pm">
<value name="style">static</value>
<value name="max_children">500</value>
</value>
<value name="rlimit_files">50000</value>
<value name="rlimit_core">0</value>
<value name="request_slowlog_timeout">20s</value>
<value name="slowlog">/var/log/php-slow.log</value>
<value name="chroot"></value>
<value name="chdir"></value>
<value name="catch_workers_output">no</value>
<value name="max_requests">5000</value>
<value name="allowed_clients">127.0.0.1</value>
<value name="environment">
<value name="HOSTNAME">$HOSTNAME</value>
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
<value name="TMP">/usr/tmp</value>
<value name="TMPDIR">/usr/tmp</value>
<value name="TEMP">/usr/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</value>
<value name="MALLOC_CHECK_">2</value>
</value>
</section>
4. 禁用访问日志文件
这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的IO操作。
access_log off;
log_not_found off;
error_log /var/log/nginx-error.log warn;
若你不能关闭访问日志文件,至少应该使用缓冲:
access_log /var/log/nginx/access.log main buffer=16k;
5. 启用GZip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
6. 缓存被频繁访问的文件相关的信息
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
7. 调整客户端超时时间
client_max_body_size 500M;
client_body_buffer_size 1m;
client_body_timeout 15;
client_header_timeout 15;
keepalive_timeout 2 2;
send_timeout 15;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
8. 调整输出缓冲区大小
fastcgi_buffers 256 16k;
fastcgi_buffer_size 128k;
fastcgi_connect_timeout 3s;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;
reset_timedout_connection on;
server_names_hash_bucket_size 100;
9. /etc/sysctl.conf调优
# Recycle Zombie connections
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.maxtcptw=200000
# Increase number of files
kern.maxfiles=65535
kern.maxfilesperproc=16384
# Increase page share factor per process
vm.pmap.pv_entry_max=54272521
vm.pmap.shpgperproc=20000
# Increase number of connections
vfs.vmiodirenable=1
kern.ipc.somaxconn=3240000
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.restrict_rst=1
kern.ipc.maxsockbuf=2097152
kern.ipc.shmmax=268435456
# Host cache
net.inet.tcp.hostcache.hashsize=4096
net.inet.tcp.hostcache.cachelimit=131072
net.inet.tcp.hostcache.bucketlimit=120
# Increase number of ports
net.inet.ip.portrange.first=2000
net.inet.ip.portrange.last=100000
net.inet.ip.portrange.hifirst=2000
net.inet.ip.portrange.hilast=100000
kern.ipc.semvmx=131068
# Disable Ping-flood attacks
net.inet.tcp.msl=2000
net.inet.icmp.bmcastecho=1
net.inet.icmp.icmplim=1
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
10. 监控
持续监控打开连接的数目,空闲内存以及等待状态线程的数目。
设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似ServerDensity的东西。
确认安装了NGINX的stub_status模块。该模块默认并不会编译进NGINX,所以可能你需要重新编译NGINX -
./configure --with-http_ssl_module --with-http_stub_status_module --without-mail_pop3_module
--without-mail_imap_module --without-mail_smtp_module
make install BATCH=yes
转自:http://blog.xiayf.cn/2014/05/03/optimizing-nginx-and-php-fpm-for-high-traffic-sites/
相关推荐
- 配置Nginx以使用PHP-FPM处理PHP请求,编辑`/etc/nginx/nginx.conf`或相应的站点配置文件,添加类似以下内容: ``` location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_...
### 高流量站点NGINX与PHP的优化 随着互联网技术的发展,越来越多的网站面临着高流量带来的挑战。为了确保网站的稳定性和响应速度,在高流量环境下优化NGINX与PHP-fpm配置至关重要。本文将详细介绍如何针对高流量...
它采用了事件驱动的异步非阻塞模型,能够高效地处理大量并发连接,适用于高流量的网站。 **PHP简介** PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,主要用于Web开发,可嵌入到HTML中。PHP可以处理...
总的来说,"**Nginx-for-WordPress-Configurations-源码.zip**"中的配置文件和代码实例为优化Nginx与WordPress的集成提供了实用指导,通过灵活调整和优化这些配置,我们可以构建一个高效、安全的WordPress环境,满足...
Nginx的设计理念在于它的事件驱动、非阻塞I/O模型,这使得它在高流量环境中能保持低资源消耗和高效率。其核心特性包括: 1. **负载均衡**:Nginx可以通过反向代理功能将请求分发到不同的后端服务器,实现负载均衡,...
定期检查并优化配置,根据服务器负载调整资源分配,保持系统的最佳运行状态。 通过以上步骤,你可以构建一个高效且易于管理的PHP+Nginx环境。这个过程可能需要一定的技术知识和实践,但随着经验的积累,你会越来越...
六、安全与优化 1. SSL/TLS加密:Nginx支持HTTPS协议,通过ssl指令配置证书和密钥,确保数据传输的安全。 2. Gzip压缩:开启gzip压缩,减少网络传输的数据量,提高页面加载速度。 3. 日志管理:通过access_log和...
Nginx是一款由Igor Sysoev为高流量网站设计的Web服务器软件,以其高性能、稳定性著称,尤其适用于处理大量并发连接和静态文件请求。它在许多大型网站中被广泛应用,包括俄罗斯访问量第二的Rambler站点。Nginx的优势...
通过上述部署和配置,我们可以创建一个能够应对高并发、高可用性的Web站点。LVS的使用保证了服务的稳定和负载的均衡,而Varnish和Nginx的结合则优化了静态和动态内容的处理,提高了整个系统的效率。对于需要扩展和...
1. **直接支持 Rails 和 PHP 程序**:Nginx 可以通过 FastCGI 接口与 PHP-FPM 进行通信,从而实现对 PHP 应用的支持。 2. **作为 HTTP 反向代理服务器**:可以将客户端的请求转发到后端的服务器集群上,实现负载均衡...
在`/etc/nginx/fastcgi_params`或你的站点配置文件中找到并调整这个参数。 2. **调整超时设置**: 如描述中所述,有时是因为某些PHP脚本执行时间过长,超过了Nginx默认的超时时间。可以尝试增加`fastcgi_connect_...
3. **安装Nginx**:通过Ubuntu的包管理器`apt`来安装Nginx,配置Nginx的默认站点,测试Nginx服务是否正常启动。 4. **安装PHP**:同样通过`apt`安装PHP,包括必要的PHP扩展,例如php-fpm(FastCGI进程管理器),使...
1. 配置文件:Nginx的主配置文件通常为`nginx.conf`,包含多个服务器块(server block)来定义不同的站点或服务。 2. 模块化设计:Nginx允许通过添加或禁用模块来定制功能,如access_log模块记录访问日志,gzip模块...
LEMP是一个流行的服务器架构,它结合了高效的Linux操作系统、强大的Nginx Web服务器、可靠的MariaDB数据库系统以及功能丰富的PHP编程语言,以支持高流量和动态网站的运行。 首先,确保你的系统是最新的。在CentOS 8...
此外,还需要注意Nginx和Apache的优化配置,以提高整个集群的性能。这包括但不限于配置合适的worker进程数、内存使用限制、缓存大小等,以及对于静态文件的高效处理策略。 在PHP集群的部署上,还需要考虑到高可用性...
通过负载均衡技术,可以将流量分散到多个服务器上,如使用Nginx或Apache的反向代理功能。同时,考虑使用PHP-FPM(FastCGI Process Manager)来管理PHP进程,提高并发处理能力。 5. **资源管理**:合理管理文件系统...
此外,Nginx还能与其他技术结合,如与PHP-FPM配合处理PHP脚本,或与FastCGI、uWSGI等配合处理动态内容。 总的来说,Nginx因其高性能、灵活性和易管理性,在现代Web服务架构中扮演着不可或缺的角色。无论是简单的...