php-fpm.conf文件

[global]
pid = /var/run/php-fpm.pid
error_log = /proc/self/fd/2
syslog.facility = daemon
syslog.ident = ${APP_ENV}
log_level = warning
emergency_restart_threshold = 30
emergency_restart_interval = 60s
process_control_timeout = 5s
process.max = 0
process.priority = -19
daemonize = no
rlimit_files = 51200
rlimit_core = 2
events.mechanism = epoll
include=etc/php-fpm.d/*.conf

pid = /var/run/php-fpm.pid;  php-fpm 进程 pid文件位置

emergency_restart_threshold = 30  :  

在指定时间内,如果失效的php-fpm子进程数超过这个数值,php-fpm主进程进行优雅重启

emergency_restart_interval = 60s    :  

设定emergency_restart_threshold设置采用的时间跨度
 

process_control_timeout = 5s 设置子进程接受主进程复用信号的超时时间。可用单位:s(秒)、m(分)、h(小时)或者 d(天)。默认单位:s(秒)。参数缺省是 0。
即reload的时候,如果有正在执行的请求进程便会等待该进程设置的时长。而其他进程直接就结束掉。等待正在执行的进程执行完或者是超过了设置的时间后fpm的master进程才开始生成新的fpm worker进程。

process.max = 0;master进程能够Fork的最大FPM进程数。默认不启用

daemonize = no; supervisor管理的进程前台运行

rlimit_files = 51200;  设置master进程最多能打开的文件,默认为系统的值。

events.mechanism = epoll  #事件处理机制,默认自动检测,可选值:select,poll,epoll(linux>=2.5.44),kqueue,/dev/poll,port

参考 Linux 中的 epoll 原理及使用

www.conf 文件

[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.backlog = 8192
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
process.priority = -19
pm = static
pm.max_children = ${PHP_FPM_MAX_CHILDREN}
pm.status_path = /php_status
ping.path = /ping
ping.response = pong
access.log = /dev/null
access.format = "{ \"type\": \"access\", \"time\": \"%t\", \"environment\": \"%{APP_ENV}e\", \"method\": \"%m\", \"request_uri\": \"%r%Q%q\", \"status_code\": \"%s\", \"cost_time\": %{mili}d, \"cpu_usage\": { \"user\" : %{user}C, \"system\": %{system}C, \"total\": %{total}C }, \"memory_usage\": %{bytes}M, \"remote_ip\": \"%R\", \"module\": \"php-fpm\", \"log_type\": \"access-log\" }"
slowlog = /proc/self/fd/2
request_slowlog_timeout = 1s
request_terminate_timeout = 2s
rlimit_files = 51200
rlimit_core = 2
catch_workers_output = yes
clear_env = no
request_slowlog_trace_depth = 5
security.limit_extensions = .php

listen.backlog = 8192;

高并发的业务,就必须要调整backlog。对于PHP而言,需要注意的有3方面:

1、操作系统 | sysctl

2、WEB前端 | 比如:Nginx

3、PHP后台 | 比如:php-fpm

操作系统以CentOS为例,可通过默认配置 /etc/sysctl.conf 文件进行调整。比如:

net.core.somaxconn = 1048576 # 默认为128

net.core.netdev_max_backlog = 1048576 # 默认为1000

net.ipv4.tcp_max_syn_backlog = 1048576 # 默认为1024

WEB前端以Nginx为例,可通过默认配置 /etc/nginx/nginx.conf 文件中的监听选项来调整。比如:

listen 80 backlog=8192; # 默认为511

PHP后台,以PHP-FPM为例,可以通过默认配置 /etc/php-fpm.d/www.conf 文件进行调整。比如:

listen.backlog = 8192 # 默认为-1(由系统决定)

大系统下,如上3处都应该进行调整。

值得注意的是:

PHP-FPM的配置文件中,关于listen.backlog选项的注释有些误导人:

; Set listen(2) backlog. A value of '-1' means unlimited.

; Default Value: -1

实际上如果使用默认值,很容易出现后端无法连接的问题,按老文档上的解释这个默认是200。建议此处不要留空,务必设置一个合适的值。

listen.owner = www-data

listen.group = www-data

listen.mode = 0660

access.log = /dev/null;   phpfpm访问日志记录位置以及访问日志的记录格式

access.format = "{ \"type\": \"access\", \"time\": \"%t\", \"environment\": \"%{APP_ENV}e\", \"method\": \"%m\", \"request_uri\": \"%r%Q%q\", \"status_code\": \"%s\", \"cost_time\": %{mili}d, \"cpu_usage\": { \"user\" : %{user}C, \"system\": %{system}C, \"total\": %{total}C }, \"memory_usage\": %{bytes}M, \"remote_ip\": \"%R\", \"module\": \"php-fpm\", \"log_type\": \"access-log\" }"

slowlog = /proc/self/fd/2;  慢日志的记录位置以及慢日志的标准,打印慢日志的堆栈层级

request_slowlog_timeout = 1s

request_slowlog_trace_depth = 5

request_terminate_timeout = 2s; 超过多长时间没有执行结束程序就中断

rlimit_files = 51200;文件描述符的数量

rlimit_core = 2;使用的cpu核数

catch_workers_output = yes;把worker进程的输出重定向到main进程

clear_env = no; 不清理环境变量

php.ini文件

[PHP]

engine = Off
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions = passthru,system,chroot,chgrp,chown,ini_alter,ini_restore,dl,readlink,symlink,popepassthru,stream_socket_server,popen
disable_classes =
realpath_cache_size = 5M
realpath_cache_ttl = 600
zend.enable_gc = Off
expose_php = Off
max_execution_time = 600
max_input_time = 60
memory_limit = 384M
max_input_nesting_level = 2
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 4096
error_log = /proc/self/fd/2
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 100M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 300M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[CLI Server]
cli_server.color = On

[Date]
date.timezone = Asia/Shanghai

realpath_cache_size = 5M ; php realpath 缓存,PHP的Realpath Cache

expose_php = Off; 不暴露服务端使用php语言

max_execution_time = 60;最大cli脚本执行时间

max_input_time = 60;最大处理输入数据的时间

memory_limit = 384M;单个php脚本消耗的内存

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT;错误上报,除了在未来版本不再支持的方法以及没有按照建议书写的代码不用上报之外

display_errors = Off

display_startup_errors = Off;在页面输出错误信息以及显示开始阶段的错误信息

log_errors = On;

log_errors_max_len = 4096;记录错误日志以及记录的错误日志最大长度

error_log = /proc/self/fd/2;记录错误日志存储的位置,docker中记录到容器输出日志中

track_errors = Off;生产环境不记录最近的错误输出

html_errors = On;用html友好的格式输出错误日志内容

post_max_size = 100M;post提交的数据最大字节数

file_uploads = On;是否接受文件上传

upload_max_filesize = 300M;最大接受上传文件的大小

max_file_uploads = 20;接受上传的文件数量

default_socket_timeout = 60;默认socket连接超时时间

date.timezone = Asia/Shanghai;设置php脚本的默认时区

nginx.conf

daemon off;

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;
pcre_jit on;
error_log /var/log/nginx/error.log  warn;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 51200;
	use epoll;
	multi_accept on;
}

http {

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	server_names_hash_bucket_size 128;
    client_header_buffer_size 10m;
    large_client_header_buffers 4 10m;
	server_tokens off;
	client_max_body_size 1024m;
	client_body_buffer_size 10m;
	keepalive_timeout 120;
    sendfile on;
	tcp_nodelay on;

	gzip on;
	gzip_buffers 16 8k;
	gzip_comp_level 9;
	gzip_http_version 1.1;
	gzip_min_length 256;
	gzip_proxied any;
	gzip_vary on;
	gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

	log_format main escape=json '{ "time_local": "$time_local", '
						'"type": "access", '
						'"module": "nginx", '
						'"log_type": "access-log", '
						'"remote_addr": "$remote_addr", '
						'"referer": "$http_referer", '
						'"request": "$request", '
						'"status": $status, '
						'"bytes": $body_bytes_sent, '
						'"agent": "$http_user_agent", '
						'"x_forwarded": "$http_x_forwarded_for", '
						'"up_addr": "$upstream_addr",'
						'"up_host": "$upstream_http_host",'
						'"request_time": $request_time,'
						'"request_body": "$request_body"'
	' }';

	access_log off;

	include /etc/nginx/conf.d/*.conf;
}

daemon off; 前台运行

worker_processes 1; worker进程数 1个或者和内核数量相同

worker_connections 51200;

连接数 设置,受内存和操作系统打开文件数限制,参照 Nginx核心要领五:worker_processes、worker_connections设置

use epoll; 

设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。

multi_accept on;

告诉nginx收到一个新连接通知后接受尽可能多的连接。

pid /var/run/nginx.pid; 进程文件位置

pcre_jit on;

正则解析加速 nginx编译时添加参数: --with-pcre=path_to_pcre8.20+ --with-pcre-jit

error_log /var/log/nginx/error.log warn;

警告级别以上的错误日志存储位置

server_names_hash_bucket_size 128; 

为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name,server_names_hash_bucket_size设置每个散列桶占用的内存大小。

client_header_buffer_size 10m; 

假设client_header_buffer_size的配置为1k,如果(请求行+请求头)的大小如果没超过1k,放行请求。如果(请求行+请求头)的大小如果超过1k,则以large_client_header_buffers配置为准

large_client_header_buffers 4 10m;

存储超大HTTP头部的内存buffer大小

server_tokens off;

server_tokens在打开的情况下会使404页面显示Nginx的当前版本号。这样做显然不安全,因为黑客会利用此信息尝试相应Nginx版本的漏洞。

client_max_body_size 1024m;

HTTP请求包体的最大值

client_body_buffer_size 10m;

存储HTTP包体的内存buffer大小

keepalive_timeout 120;

keepalive超时时间

sendfile on;

tcp_nopush on;

tcp_nodelay on;

参数sendfile on 用于开启文件高效传输模式,同时将tcp_nopush on 和tcp_nodelay on 两个指令设置为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率,参考 nginx优化开启高效文件传输模式sendfile on;

gzip on;

gzip_buffers 16 8k; 

该指令用于设置Gzip压缩文件使用缓存空间的大小 

指定Nginx服务器需要向系统申请缓存空间的个数。

指定每个缓存空间的大小

gzip_comp_level 9; 

压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。

gzip_http_version 1.1;

gzip_min_length 256;  低于256b的资源不压缩

gzip_proxied any;

gzip_vary on; 是否添加“Vary: Accept-Encoding”响应头

gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon;   需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.

gzip_disable "MSIE [1-6]\.(?!.*SV1)"; 置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持

参考 Nginx open_file_cache模块 文件描述符缓存

open_file_cache max=1000 inactive=20s;

在上述配置中,为1,000个元素定义了一个缓存。 inactive参数配置到期时间为20秒。 没有必要为该指令设置非活动时间段,默认情况下,非活动时间段为60秒。

open_file_cache_valid 30s;

NGINX的open_file_cache保存信息的快照。 由于信息在源处更改,快照可能在一段时间后无效。 open_file_ cache_valid指令定义时间段(以秒为单位),之后将重新验证open_file_cache中的元素。默认情况下,60秒后重新检查元素

open_file_cache_min_uses 2;

此指令可用于配置最小访问次数以将元素标记为活动使用。 默认情况下,最小访问次数设置为1次或更多次

open_file_cache_errors on;

对一些访问文件错误的信息是否进行缓存,默认是off的

        log_format main escape=json '{ "time_local": "$time_local", '
                            '"type": "access", '
                            '"module": "nginx", '
                            '"log_type": "access-log", '
                            '"remote_addr": "$remote_addr", '
                            '"referer": "$http_referer", '
                            '"request": "$request", '
                            '"status": $status, '
                            '"bytes": $body_bytes_sent, '
                            '"agent": "$http_user_agent", '
                            '"x_forwarded": "$http_x_forwarded_for", '
                            '"up_addr": "$upstream_addr",'
                            '"up_host": "$upstream_http_host",'
                            '"request_time": $request_time,'
                            '"request_body": "$request_body"'
        ' }';

 访问日志的记录格式 

access_log off; 不记录访问日志

default.conf文件

server {
    listen       80 default_server;
    server_name  _;
    root   /src;
    index  index.php index.html index.htm;

    add_header 'Access-Control-Allow-Origin' '*';
	add_header 'Access-Control-Allow-Headers' '*';
	add_header 'Access-Control-Allow-Methods' '*';
	if ($request_method = 'OPTIONS') {
			return 204;
	}


	location /stub_status {
        stub_status;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

	location ~ \.(jpg|jpeg|gif|png|css|js|ico|xml|swf)$ {
		etag           on;
		expires        max;
		access_log     off;
		log_not_found  off;
	}

    location ~ [^/]\.php(/|$) {
        try_files $uri =404; 
        include        fastcgi_params;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;   
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /src$fastcgi_script_name;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    location ~ \.php$ {
		return 404;
    }

}

add_header 'Access-Control-Allow-Origin' '*';

add_header 'Access-Control-Allow-Headers' '*';

add_header 'Access-Control-Allow-Methods' '*';

if ($request_method = 'OPTIONS') {

return 204;

}

允许跨域请求

location = /favicon.ico { access_log off; log_not_found off; }

location = /robots.txt { access_log off; log_not_found off; }

这两个位置不记录访问日志并且不标注找不到

 相关链接

手把手教你部署nginx+php

php和nginx镜像合并 && 代码打包到镜像 

nginx-php镜像安装常用软件 

yaf && yar微服务/hprose微服务 镜像初始化 

常用开发工具:php_codesniffer代码规范检查&修复、phpstan语法检查、phpunit单元测试 

.gitlab-ci.yaml自动镜像打包&&互联网企业规范化上线流程(上) 

kustomize/kubectl自动镜像部署&&互联网企业规范化上线流程(下) 

apisix网关、JMeter压测  

prometheus/grafana监控数据收集与展示 

k8s容器网络性能调优 

supervisor进程管理 

安装opcache和apcu 

APM性能监测工具skywalking 

链路跟踪工具zipkin

phpfpm和nginx配置

php整合apollo配置中心

php rdkafka操作kafka消息队列

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐