nhinx php 调优,高流量站点NGINX与PHP-fpm配置优化

本文由LinuxProbe.Com团队成员岳国帅整理发布,原文来自:黑·白。

导读

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

8b4c8ecf9452705d8a158c9bfd118226.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?

我正在使用apscheduler使用脚本向调度程序添加作业。不幸的是,由于我没有启动调度程序,所以在使用脚本时没有正确安排作业。在scheduler self.getscheduler() # initializes and returns schedulerscheduler.add_job(triggertrigger, func function, j…

php rinit,PHP执行原理

一:PHP简介:PHP:Hypertext Preprocessor 也就是“超文本预处理器”,是一种通用的开源脚本语言。语法吸收了C语言,Java和Perl的特点,使用广泛,主要适用于Web开发领域。二:PHP的设计理…

php 放大镜,图片放大镜效果实战总结

摘要:本次实战主要完成了图片放大镜的效果,通过定义原始图片,放大镜,放大后的图片,然后设置放大后的图片为原始图片的3倍,通过鼠标移上显示放大后的图片,并通过位移计算当前放大镜的位置&#x…

oracle未授权sql查询,【oracle使用笔记3】sql查询遇到的若干问题总结

在整个开发过程当中,sql查询操做的频率比较高,在不一样的业务场景下会出现不一样的查询需求,如下是我在项目中遇到的查询需求,总结一下。sql【查询一】:取查询出的第一条数据oracleselect * from (select * from [ta…

linux内核mtd分区,linux-kernel – 在运行时调整MTD分区大小

我正在使用嵌入式设备,并希望能够通过Linux调整其MTD分区大小而无需重新启动.问题是我的Linux映像大小已经增加,它所在的当前MTD分区(mtd0)现在太小了.但是,它之后的分区(mtd1)是用于存储配置信息的JFFS2部分,因此重新调整大小不是一个选项,因为配置可能会丢失.我的目标是&…

linux 查看握手时间,实战:tcpdump抓包分析三次握手四次挥手

本文档以实战的形式介绍tcpdump抓包分析三次握手四次挥手的过程。执行tcpdump命令tcpdump -n -i ens32 host 192.168.10.10 and 42.186.113.26 >> /tmp/tcpdump.txtping game.campus.163.comcurl http://game.campus.163.comcurl http://game.campus.163.com结束后&#…

linux 高级i o函数,高级I/O函数

对于socket,最基本的输入输出函数就是,read和write。它们最基本,同样功能也是最少的。Unix中有几个函数是read/write的变种,在基本的输入输出功能上,还增加了一些非常使用的功能和特性,它们是:r…

调整linux块大小,Linux系统之更改默认块大小

查看操作系统块大小:#tune2fs -l /dev/sda1 |grep Block size ( tune2fs -l /dev/sda1可以查看更多相关文件系统的详细信息 )查看os系统页的大小: #getconf PAGESIZE查看某分区的block和inode的数量和大小,通常block比inode多tune2fs …

安装linux必不可少的一个分区,安装linux系统对硬盘分区时,必须有的两种分区类型是什么?...

安装Linux系统对硬盘分区时,必须有两种分区类型: 根分区和交换分区。根分区就是root分区,所有的东西都在这个分区内。 /swap分区是交换分区,是一定磁盘空间(分区或文件),用于将部分内存中的数据换下来,以腾…

ubuntu和linux服务器,Linux服务器系统CentOS和Ubuntu Server如何选择? | 偶乃秋辰

在秋辰看来,目前最优秀的服务器系统就是Linux,但是Linux并不能说是一套完整的操作系统,准确的说它只是系统的内核,否则也不会有那么多的发行版如:Red Hat、CentOS、Debian、Ubuntu、Fedora等。其实Linux发行版系统很多…

linux查看tcp络连接日志,Linux监控TCP连接数并触发日志记录

场景由于服务器经常半夜出现TCP连接数暴增,没办法及时查看处理,回头看记录又看不到现象,不好排查,故编写此脚本用于记录日志。脚本内容#!/bin/bash#任务计划设置此脚本每分钟执行一次即可,* * * * * sh /shell/tcp_sta…

linux cmake变量,linux – CMake错误:此项目中使用了以下变量,但它们设置为NOTFOUND...

我正在尝试使用tar文件whalebot-0.02.00.tar.gz配置whalebot爬虫.我已正确提取它:rootAdmin1:~/dls# tar xvzf whalebot-0.02.00.tar.gz之后我想配置它:rootAdmin1:~/dls/whalebot# ./configure它给了我错误:bash: ./configure: No such file…

linux命令history作用,Linux命令:history命令历史的管理及用法

bash可以保存的过去曾经执行过的命令。当某个用户登录到shell中,会读取该用户家目录中的~/.bash_history文件,并将历史命令列表保存到内存中。当用户退出当前shell时,会将内存中的历史命令列表覆盖至~/.bash_history文件。我们可以通过# hist…

aux 参数 linux,Linux下ps aux命令中STAT的参数含义(转)

$ ps auxUSER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMANDroot 11 100.0 0.0 0 16 ?? RL 4Dec09 98403:03.48 [idle: cpuroot 12 100.0 0.0 0 16 ?? RL 4Dec09 98430:12.35 [idle: cpust00…

linux系统nginx启动不了,nginx启动不了,求大神帮助!

服务器挂了,折腾半天Nginx都起不来,不知道咋回事,本人小白用户,求大神帮帮忙!# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/c…

linux 黑屏后死机,如何修复各种各样的黑屏死机

每次我们打开这些设备,我们都希望我们生活中的科技能发挥作用。当他们不能工作时,会让我们非常沮丧,尤其是当我们不知道如何解决问题时。所谓的“死亡黑屏”在操作系统之间很常见,当您打开机器,但屏幕空白。有时监视器…

c语言atof字母,C语言字符转换之atof()

现在看下强大的atof()函数,哇哈哈:/* Convert a string to a double. */doubleatof (const char *nptr){return strtod (nptr, (char **) NULL);}#if HAVE_CONFIG_H# include #endif#include #ifndef errnoextern int errno;#endif#include #if defined …

cmd文件 c语言的段,对于TMS320F2812的CMD文件的理解

1.COFF格式要谈CMD文件,首先不可避免的要谈下COFF格式,COFF格式是通用目标文件格式(Common Object FileFormat)的缩写,它是一种流行的二进制可执行文件格式,在DSP里二进制可执行文件包括库文件(.lib)、目标文件(.obj)和最终可执行…

w ndows7与XP哪个好,windows7和xp哪个好 windows7好用吗

经常可以在电脑百事各个QQ群中看到电脑爱好者朋友问各种各样的电脑问题,有的朋友问的问题特别搞笑,其实很多问题都问的等于没人能够被你满意答案,比如有人问过一些比较搞笑的问题,如谁能给介绍一个500G内存,800元的独立…

android点击事件的优先级,Android事件体系全面总结+实践分析,系列篇

前言在这一个月里,我利用闲余的时间看了下最近Android职业发展这块该怎么选择?这个问题各位大神的回答都非常透彻,相信对大家或多或少都在一定程度上有很大的帮助,今天在这里写这篇文章更多的是想以我开发十年的工作经历&#xff…