热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高流量站点NGINX与PHP-fpm配置优化

使用Nginx搭配PHP已有7年的经历,这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。

以下正是这方面的一些提示和建议:

1. 将TCP切换为UNIX域套接字

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

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
推荐阅读
  • Nginx简介Nginx(enginex)是一个高性能的HTTP和反向代理服务器,也是一个IMAPPOP3SMTP代理服务器。Nginx是由IgorSysoev为 ... [详细]
  • 新手指南何为PHP语言_PHP教程:PHP语言经过长时间的发展,很多用户都很了解PHP语言了,这里我发表一下个人理解,和大家讨论讨论。比较关注网络的朋友,特别是关注网站建设技术的朋 ... [详细]
  • CentOS8.4 安装PHP7.4.25
    1、下载官网:https:www.php.netdownloads#cdmydata#wgethttps:www.php.netdistributionsphp ... [详细]
  • lora物联网开发教程(物联网lora特点)
    长距离星型架构,由于长距离连接性,从而减少了电池寿命。这个协议采用了阿罗哈法。在一个网状网络或者一个异步网络中,例如蜂窝网,结点必须频繁的被唤醒,来同步网络和检查消息。这种同步,大 ... [详细]
  • 目录结构如下:Nginx基础知识NginxHTTP服务器的特色及优点Nginx的主要企业功能Nginx作为web服务器的主要应用场景包括:Nginx的安装安装环境 ... [详细]
  • Swoole是针对PHP的生产级异步编程框架。它是一种用纯C语言编写的PHP扩展,它使PHP开发人员能够在PHP中编写高性能,可扩展的并发TCP ... [详细]
  • linux 修改root密码_Linux强制用户首次登陆修改密码
    一个执着于技术的公众号地方前言Linux强制用户首次登陆修改密码,这应该是RHCE认证中用户管理部分,属于很基础的内容了。可是我忘记了,所 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 导读:今天编程笔记来给各位分享关于php动态扩展怎么加载的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: ... [详细]
  •  在使用PHP多年之后,我对PHP的优势和劣势已经非常清楚,与后起之秀Golang相比,两者已经不在一个重量级。 PHP更像是70kg级别的选手,脚本语言,极速开发,部署方便,性能 ... [详细]
  • 朋友们,过年好!目前想配置一台图片服务器,可实现类以下网站图片服务器功能https://car2.autoimg.cn/cardf即上传一张图片,可通过url中不同 ... [详细]
  • 高并发网站架构的核心原则其实就一句话“把所有的用户访问请求都尽量往前推“,即:能缓存在用户电脑本地的,就不要让他去访问CDN。能缓存CDN服务器上的,就不要让CDN去访问源(静态服 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
author-avatar
百万会员XTN_859
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有