参考:Nginx+Php-fpm 运行原理详解,https://www.runoob.com/w3cnote/nginx-setup-intro.html 各缓冲含义:https://www.landui.com/help/show-5179.html Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 php-fpm即php-Fastcgi Process Manager.php-fpm是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
nginx配置: (1)主配置文件
user www www; //配置用户或者组,默认为nobody nobody。 worker_processes auto; //允许生成的进程数 worker_rlimit_nofile 65535; error_log /logs/error.log; //指定日志文件路径 pid var/run/tengine.pid; //指定nginx进程运行文件存放地址 events { worker_connections 65535; //最大连接数 use epoll; //事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport } http { charset utf-8; //字符集 client_header_buffer_size 8k; //假设client_header_buffer_size的配置为1k,如果(请求行+请求头)的大小如果没超过1k,放行请求。如果(请求行+请求头)的大小如果超过1k,则以large_client_header_buffers配置为准 client_max_body_size 50m; //client_max_body_size 默认 1M,表示 客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。 client_body_timeout 10s; //指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。 client_header_timeout 5s; //客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。 large_client_header_buffers 8 4k; //此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或连接转换到保持活动状态时,释放缓冲区。 server_tokens off; //隐藏版本号 server_name_in_redirect off; //如果server_name_in_redirect为off时,那么将会以当前服务器的IP地址进行拼接URL;如果该命令为on,那么首先查找server_name,如果没有找到,查找请求头的HOST字段,如果没有,则以当前服务器的IP进行拼接。 server_names_hash_bucket_size 128; //保存服务器名字的hash表的大小 include tengine.mime.types; //当web服务器收到静态的资源文件(如html)请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。 default_type application/octet-stream; log_format main '$http_x_real_ip - $http_host [$time_local] "$request" $request_length ' '$status $body_bytes_sent $request_time "$http_referer" ' '"$http_user_agent" $remote_addr "-" "-" '; sendfile on; //sendfile实际上是 Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用 sendfile这个系统调用。sendfile() 能减少网络传输的切换次数而且还能减少拷贝次数。 keepalive_timeout 65; //HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。 open_file_cache max=65535 inactive=20s; //open_file_cache 相关配置可以缓存静态文件的元信息,在这些静态文件被频繁访问时可以显着提升性能。max指定缓存数量 inactive是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s; //指多长时间检查一次缓存的有效信息。也就是说即使我一直访问这个文件,30s后会检查此文件的更改信息是否变化,发现变化就更新。 open_file_cache_min_uses 3; //指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件更改信息一直是在缓存中打开的。 fastcgi_connect_timeout 300; // fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 4k; fastcgi_buffers 256 4k; fastcgi_busy_buffers_size 8k; fastcgi_max_temp_file_size 0; //gzip配置的常用参数 gzip on; //是否开启gzip gzip_min_length 1k; //开始压缩的最小长度(再小就不要压缩了,意义不在) gzip_buffers 8 64k; //缓冲(压缩在内存中缓冲几块? 每块多大?) gzip_http_version 1.0; //开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议) gzip_comp_level 5; //压缩级别(级别越高,压的越小,越浪费CPU计算资源) gzip_types text/plain application/x-javascript text/css application/json application/xml application/x-shockwave-flash application/javascript image/svg+xml image/x-icon; //对哪些类型的文件用压缩 如txt,xml,html ,css gzip_vary on; //是否传输gzip压缩标志 add_header via $hostname always; include /*.conf; //包含进来各个服务的配置文件 }(2)各个服务的配置文件
server { listen 80; //监听端口 server_name www.example.com; //服务名 root www.example.com/public; //请求入口文件夹 access_log /logs/www.example.com-access_log main; //日志 error_log /logs/www.example.com-error_log; //错误日志 //uri匹配规则:https://www.cnblogs.com/jpfss/p/10232980.html if ( $uri ~* "^/healthcheck" ){ break; } location /index.php { include tengine.fastcgi_params; fastcgi_param SCRIPT_FILENAME "$document_root/index.php"; fastcgi_pass 127.0.0.1:17212; } location ~ /robots\.(txt|php) { include tengine.fastcgi_params; fastcgi_param SCRIPT_FILENAME "$document_root/robots.php"; fastcgi_pass 127.0.0.1:17212; } location ~* ^/healthcheck { access_log /data0/www/logs/healthcheck-access_log main; content_by_lua_file /usr/local/matrix/etc/healthcheck.lua; } location ~* "^/system/(.*)" { satisfy all; include /usr/local/matrix/etc/control/access_control.conf; } location @php { include tengine.fastcgi_params; fastcgi_param SCRIPT_FILENAME "$document_root/index.php"; fastcgi_pass 127.0.0.1:17212; } location / { try_files $uri @php; } }php-fpm配置:https://www.php.net/manual/zh/install.fpm.configuration.php
//#启动进程的用户和用户组,FPM 进程运行的Unix用户, 必须要设置。用户组,如果没有设置,则默认用户的组被使用。 user = www group = www listen = 127.0.0.1:9793 //fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置。如果nginx和php在不同的机器上,分布式处理,就设置ip这里就可以了。 listen.allowed_clients = 127.0.0.1 //允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接。 pm = dynamic //php-fpm进程启动模式,pm可以设置为static和dynamic和ondemand,如果选择static,则进程数就数固定的,由pm.max_children指定固定的子进程数。 pm.max_children = 512 //子进程最大数 pm.start_servers = 32 //启动时的进程数,默认值为: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 pm.min_spare_servers = 32 //保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程 pm.max_spare_servers = 64 //保证空闲进程数最大值,如果空闲进程大于此值,则进行清理 pm.max_requests = 1500 //设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0. pm.status_path = /matrix_monitor_page //FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到 slowlog = /data0/www/logs/$pool-slow_log //慢请求的记录日志,配合request_slowlog_timeout使用,默认关闭 request_slowlog_timeout = 3 //当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off' request_terminate_timeout = 20 //设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。 catch_workers_output = no //重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空. security.limit_extensions = "" ; BASE CONFIG env[IDC]=mars env[IPADDR]=10.26.33.126 env[HOSTNAME]=web60-test.mars.ljnode.com env[ENVTYPE]=test env[MATRIX_CACHE_DIR] = "/data0/www/cache/www.example.com/" env[MATRIX_PRIVDATA_DIR] = "/data0/www/privdata/www.example.com/" env[MATRIX_APPLOGS_DIR] = "/data0/www/applogs/www.example.com/" ; MYSQL CONFIG ; REDIS CONFIG