Nginx与PHP优化实例

it2025-07-30  11

目录

前言一、Nginx优化1.1 查看日志1.2 查看文件最大打开数1.3 Nginx的FastCGI连接时间太短 二、PHP优化2.1 查看PHP日志2.2 PHP参数优化 总结

前言

目前大部分企业都是使用LNMP或者LAMP来做企业的网站服务器架构,这两种网站的服务架构,我们都是比较熟悉的服务架构,其实不管是什么服务架构,Nginx的优点都是比较明显的,基于nginx的性能要优于Apache,现阶段的很多公司,都是逐渐把Apache替换成了nginx,毕竟nginx的自带的高可用配置、反向代理、负载均衡等等功能相当突出。而其中很多服务都是需要优化的,本次来谈谈PHP的优化方案。

问题描述:有时候,我们会遇到后台服务访问非常慢,甚至出现502、504的错误状态码。其实第一想到的是网络延迟问题,其次就是网站服务架构的未做相关优化而导致的问题。如果不是网络延迟原因的话,那基本上就是服务器优化方面的问题。下面介绍Nginx与PHP一些比较常见的优化思路。

一、Nginx优化

1.1 查看日志

(1)查看Nginx的错误日志

看看是否有错误信息。

[root@zrs ~]# cat /usr/local/nginx/logs/error.log | grep error

(2)查看Nginx的访问日志

[root@zrs logs]# cat /usr/local/nginx/logs/access.log | grep error

如果错误日志没问题,那么在后台域名访问日志中可能就会报错。如果是在后台域名访问日志中出现错误,那么可以从以下几个方面来优化Nginx服务。

1.2 查看文件最大打开数

(1) Nginx打开文件数限制所导致

Nginx未做优化前的文件最大打开数。

思路: 增加Nginx的打开文件数(在配置文件nginx.conf中修改)

[root@zrs ~]# vim /usr/local/nginx/conf/nginx.conf

(2) Linux系统文件限制

改了nginx的打开文件配置,不一定有用,我们需要看一下系统的限制的打开文件数。

[root@zrs conf]# ulimit -n 1024

可以看到Linux系统文件打开数也被限制, 接下来,我们更改一下系统的打开文件数,并配置永久生效。

[root@zrs conf]# vim /etc/security/limits.conf # 修改如下。系统限制可以随便改,我只要比nginx的打开文件数大就好。 * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535

1.3 Nginx的FastCGI连接时间太短

一般Nginx响应php,都是通过FastCGI接口来调用,所以FastCGI参数配置很重要,当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器,而很多php的网页都是采用动态程序。所以FastCGI的配置,也起的至关重要的作用,因此这是一个优化不可缺少的一部分。

进入 nginx.conf 配置文件。

[root@zrs ~]# vim /usr/local/nginx/conf/nginx.conf

到此Nginx基本优化已经完成,这时可重新访问一下URL,虽然可以稳定加载页面,不过访问还是有些缓慢。接下来就该优化我们的PHP了。

二、PHP优化

2.1 查看PHP日志

同样,我们也是需要查看一下PHP的日志文件。

[root@zrs ~]# tail -n 100 /usr/local/php/var/log/php-fpm.log

在PHP日志里可能会出现各种警告,这时可根据告警提示去解决问题。比如说出现类似这种警告:

WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

出现上述警告如何处理?接下来看一下PHP的几个参数。

参数功能pm=dynamic表示php启用的动态模式。pm.max_children表示静态下最大线程数。pm.start_servers表示动态下启动时的线程数(该参数大于pm.min_spare_servers,小于pm.max_spare_servers)。pm.min_spare_servers表示动态下最小空闲线程数。pm.max_spare_servers表示动态下最大空闲线程数。

php有动态(Dynamic)和静态(Static)两种工作模式,默认是动态模式。

静态模式(Static) 当工作模式设置为静态后,就只有pm.max_children项有效,即表示php-fpm工作时一直保持的线程数。动态模式(Dynamic) 动态模式下,与他相关的参数有pm.start_servers、pm.min_spare_servers 、pm.max_spare_servers,分别表示开启的php进程数,最小的进程数、与最大的进程数。

两种工作模式比较

静态模式(Static) 静态模式比较适合一些内存比较大一点的服务器(8G及以上的),因为对于比较大内存的服务器来说,设置为静态的话会提高效率。动态模式(Dynamic) 动态模式比较适合小内存机器,灵活分配进程,省内存。可以让php自动增加和减少进程数,不过动态创建回收进程对服务器也是一种消耗。

2.2 PHP参数优化

(1)设置php-fpm最大进程数

[root@zrs ~]# vim /etc/php-fpm.conf [global] ... ; 动态方式下开启的php-fpm进程的最大数量 process.max = 2048 ; 设置 fpm 在后台运行 daemonize = yes ; 设置进程可以打开的文件描述符数量 rlimit_files = 65535 ; 设置FPM 的事件处理机制 events.mechanism = epoll ; 加载pool 配置 include = /etc/fpm.d/*.conf

(2)设置进程池

[root@zrs ~]# vim /etc/php-fpm.d/www.conf [www] ... ; 设置动态dynamic进程池/静态static进程池 pm = dynamic ; 设置每个进程可处理的请求数,当进程达到这个请求数量后会自动释放在重新生成新的进程。避免内存泄漏等情况 pm.max_requests = 1500 ; 终止请求超时时间。一个请求若处理大于20s ,则会自动kill掉。避免进程堆积 request_terminate_timeout = 20 ; 限制 FPM 允许解析的脚本扩展名. 这里不限制,FPM可以解析任何扩展名的文件 security.limit_extensions = ""

(3)修改php上传文件的大小

[root@zrs ~]# vim /etc/php.ini max_execution_time = 0 #默认的该脚本最久执行时间为30秒.就是说超过30秒,该脚本就停止执行,0为不限制时间 post_max_size = 150M #默认POST数据大小为8M,可以按实际情况修改 upload_max_filesize = 100M #默认上传文件最大为2M,可以按实际情况修改。 #注:另外要说明的是,post_max_size 大于 upload_max_filesize 为佳

一般来说开始的时候一个php-fpm进程只占用3M左右内存,但是运行一段时间后就会上升到20-40M,所以php的最大的进程数大概是本地内存1/40,当然也 要考虑系统占用内存的这种情况,故不能直接把除处理的结果,当成的最大进程数。

比如服务器是8G内存的,所以按理来说是,最大的php进程数是200左右。此时可采用静态模式,最大进程数pm.max_children设为125-150之间,再重新加载一下PHP。最后使用netstat查看一下进程数:

[root@zrs ~]# netstat -anpo | grep php-fpm | wc -l

总结

工作中出现的问题得根据报错的实际情况去解决,但最基本的服务器优化得提前做好,否则后期会很麻烦;从上述案例不难看出日志在排错中的重要性,基本上我们都可以通过日志文件内容信息解决出现的各种问题;知识是永远学不完的,需要不断努力、多交流,学会借鉴别人解决问题的方法和经验。
最新回复(0)