在实际的生产环境中遇到了实际需要解决的问题,需要把服务部署的方式梳理出来,在同一个服务器中部署多个PHP环境,架构图如下:
PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,用于管理 PHP 进程池、接收和处理 Web 服务器的请求。PHP-FPM 会创建一个主进程,控制何时以及如何把 HTTP 请求转发给一个或多个子进程处理。
php日志中有一条超时的日志,但是我request_terminate_timeout中设置的是0,理论上应该没有超时时间才对。
PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。
游戏后端代码采用Nginx+PHP-FPM的方式部署。放问游戏的时候偶尔会出现502错误。
1,curl进程运行了一个api查询接口,curl的时候设置了超时时间 --connect-timeout 1000 2,operation timed out after 1000 milliseconds with 0 bytes received 3,connect() timed out!
Status Code 499、500、502、504也是后端Http服务经常返回的状态码,试想一下,对于每个状态码,如果你能通过一些修改或配置来人为复现它,是不是会更利于你去掌握它呢?本文就是通过制造它们的方式来学习它们。
一、nginx配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 user nobody nobody; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/
就在安心养神的时候, 同事转给了我一条nginx 502的报警, 赶紧去线上一顿排查。
第一步:启动php5.2 /usr/local/lnmp/php/sbin/php-fpm start 第二步:启动php5.5 约定几个目录 /usr/local/lnmp/php-5.5/sbin/php-fpm /usr/local/lnmp/php-5.5/etc/php-fpm.conf /usr/local/lnmp/php/etc/php.ini php-fpm的启动参数 #测试php-fpm配置 /usr/local/lnmp/php-5.5/sbin/php-fpm -t /usr/local/lnmp/php-5.5/sbin/php-fpm -c /usr/local/lnmp/php/etc/php.ini -y /usr/local/lnmp/php-5.5/etc/php-fpm.conf -t #启动php-fpm /usr/local/lnmp/php-5.5/sbin/php-fpm /usr/local/lnmp/php-5.5/sbin/php-fpm -c /usr/local/lnmp/php/etc/php.ini -y /usr/local/lnmp/php-5.5/etc/php-fpm.conf #关闭php-fpm kill -INT `cat /usr/local/lnmp/php-5.5/var/run/php-fpm.pid` #重启php-fpm kill -USR2 `cat /usr/local/lnmp/php-5.5/var/run/php-fpm.pid`
这些地方都需要考虑超时的设定,但是PHP中的超时都是分门别类,各个处理方式和策略都不同,为了系统的描述,我总结了PHP中常用的超时处理的总结。
CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。 FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。
这两台机器实际上目前请求的只有一台机器,由于阿里云有限制,不能使用keepalived来做nginx的高可用,所以所有的请求均由其中一台机器承担,这台机器目前是由192.168.111.26来工作,上面有nginx,php,redis等服务
在 php.ini 中,有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时:
502 和 php-fpm.conf 1.php-cgi进程数不够用。php执行时间长,导致没有空闲进程处理新请求。 2.php-cgi进程死掉。php-fpm超时时间短,当前进程执行超时关闭连接。 实例: 1.request_terminate_timeout引起的资源问题 request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。 php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,request_term
在很多业务需求中,我们都可能需要先让php给浏览器输出,然后在后台慢慢处理其他不用输出耗时的业务.
Nginx报504 gateway timeout错误引起,一个是文件配置问题,另一个是相关处理时长了,最后也有可能是资源不足导致了,下面我们一起来看看。
近期收到某友方 SRC 发来的邮件,反馈站点中存在可被 Dos 的风险, 复测后发现确实存在此类风险。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6
PHP 支持多进程而不支持多线程;PHP-FPM 在进程池中运行多个子进程并发处理所有连接请求。通过 ps 查看PHP-FPM进程池(pm.start_servers = 2)状态如下:
php.ini是php运行核心配置文件,下面是一些常用配置 extension_dir="" 设置PHP的扩展库路径 expose_php = Off 避免PHP信息暴露在http头中 display_errors = Off 避免暴露php调用mysql的错误信息 log_errors = On 在关闭display_errors后开启PHP错误日志(路径在php-fpm.conf中配置) zend_extension=opcache.so extension=mysqli.so
Nginx 与 php-fpm 的结合 在 Linux 上,nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。 tcp socket 的优点是可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式。 Unix socket 又叫 IPC (inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx 配置文件中填写 php-fpm 的 socket 文件位置。
其中time_out表示客户端闲置多少秒后,就断开连接。函数连接成功返回true,失败返回false:
如果有需要补充的安装模块可以根据当前Nginx版本到官方去下载源码包根据当前版本增量编译追加的模块即可
通常部署完php环境后会进行一些安全设置,除了熟悉各种php漏洞外,还可以通过配置php.ini来加固PHP的运行环境,PHP官方也曾经多次修改php.ini的默认设置。 下面对php.ini中一些安全相关参数的配置进行说明 register_globals 当register_globals = ON时,PHP不知道变量从何而来,也容易出现一些变量覆盖的问题。因此从最佳实践的角度,强烈建议设置 register_globals = OFF,这也是PHP新版本中的默认设置。 open_basedirope
FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。比方说: 支持平滑停止/启动的高级进程管理功能、文件上传优化支持、stdout 和 stderr 日志记录等等,更多请移步官网 https://www.php.net/manual/zh/install.fpm.php
– step1:client发起http请求 – step2:dns服务器解析域名得到主机ip – step3:默认端口为80,通过ip+port建立tcp/ip链接 – step4:建立连接的tcp/ip三次握手,建立成功发送数据包 – step5:nginx匹配请求
用了这么久了PHP+Nginx了,你了解他们之间的通信原理吗?这一次做一回真正的PHPer(在上一篇文章里边已经全面介绍了CGI、FastCGI、PHP-FPM,所以本文对于这些概念不再介绍的那么详细)
需要使用ngx_http_stub_status_module模块,提供对基本状态信息的访问默认情况下不构建此模块,编译安装应使用--with-http_stub_status_module配置参数启用它.采用yum和apt安装nginx 无需手动添加ngx_http_stub_status_module模块
笔者所在公司技术栈为 Golang + PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。
Nginx作为一个流行、轻量、高性能、稳定的web服务器,是应用运维日常最常接触的web服务器,更多的时候它是用于web代理服务,今天要说的是日常维护Nginx中最常遇到的两个HTTP状态码502和504
本文实例讲述了PHP-FPM 设置多pool及配置文件重写操作。分享给大家供大家参考,具体如下:
http://blog.csdn.net/hguisu/article/details/8930668 (排名100多bolg写的很好)
今天看了下Nginx的日志,发现里面的错误信息upstream timed out (110: Connection timed out) while reading response header from upstream,upstream: "fastcgi://127.0.0.1:9000",大概的意思是等待时间过长,在网上查了很多资料,大意是修改 nginx 配置文件,延长 fastcgi 等待时间,但不能解决根本问题。下面就来给大家解决一下这种问题。
先来看一段日志(此日志来自于 var/log/php-fpm.log ): [13-Aug-2017 03:30:03] NOTICE: fpm is running, pid 28263 [13-Aug-2017 03:30:03] NOTICE: ready to handle connections [13-Aug-2017 10:11:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or p
最大的问题是 blog 访问时不时地出现 “502 bad gateway”,即便不出现,latency 也能达到接近三十秒。
pid = run/php-fpm.pid pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
PHP 项目使用 Nginx 时,一般通过 php-fpm Nginx+PHP-FPM 形式访问交互,本文将详细解读 Nginx 配置文件、PHP-FPM、PHP-CGI 和 fastCGI 的概念。
Varnish是一个功能强大且灵活的缓存HTTP反向代理。它可以安装在任何Web服务器的前方来缓存其内容,这将提高速度并减少服务器负载。当客户端请求网页时,Varnish首先尝试从缓存中发送它。如果页面未缓存,Varnish会将请求转发到后端服务器,获取响应,将其存储在缓存中,然后将其传递给客户端。
1 使用魔法函数__call结合call_user_func来实现 2 使用魔法函数__call结合call_user_func_array来实现
linux centos8 安装php7 nginx1.4 mysql8 ,运行php网站,各个模块从零开始配置
一、NGINX 502错误排查 NGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多。将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手: 1.FastCGI进程是否已经启动 2.FastCGI worker进程数是否不够 运行 netstat -anpo | grep “php-cgi” | wc -l 判断是否接近FastCGI进程,接近配置文件中设置的数值,表明worker进程数设置太少 3.FastCGI执行时间过长 根据实际情况调高以下参数值 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; 4.FastCGI Buffer不够 nginx和apache一样,有前端缓冲限制,可以调整缓冲参数 fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; 5.Proxy Buffer不够 如果你用了Proxying,调整 proxy_buffer_size 16k; proxy_buffers 4 16k; 参见:http://www.server110.com 6.https转发配置错误 正确的配置方法 server_name www.mydomain.com; location /myproj/repos { set $fixed_destination $http_destination; if ( $http_destination ~* ^https(.*)$ ) { set $fixed_destination http$1; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Destination $fixed_destination; proxy_pass http://subversion_hosts; } 当然,还要看你后端用的是哪种类型的FastCGI,我用过的有php-fpm,流量约为单台机器40万PV(动态页面), 现在基本上没有碰到502。
最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出牛顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个G的Swap,观察了一段时间后发现再大的Swap也被慢慢地“吃掉”了!
自己挖的坑自己填吧,今天咱就简单地利用swoole(实际上用我撸的那个沙雕一样的ti-rpc,上手会快一些)去实现这种【大量耗时数据导出】需求。但是,我还是偷了两点儿懒:
webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构,提供超高性能可扩展的HTTP服务。你可以用webman开发网站,也可以开发HTTP接口或者微服务。
在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。
这次我们来讲讲对象池、连接池的意义,在此之前我们先了解学习一些其他的基础知识,以便我们结合理解池的意义。
领取专属 10元无门槛券
手把手带您无忧上云