Nginx多Server优先级
在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中的每个server_name进行匹配,以此决定到底由哪一个server来处理这个请求,但nginx如何配置多个相同的server_name,会导致server_name出现优先级访问冲突。
配置如下
[root@web01 conf.d]# cat server1.conf server { listen 80; server_name localhost test1.com; location / { root /code/test1; index index.html; } } [root@web01 conf.d]# cat server2.conf server { listen 80; server_name localhost test2.com; location / { root /code/test2; index index.html; } } [root@web01 conf.d]# cat server3.conf server { listen 80; server_name localhost test3.com; location / { root /code/test3; index index.html; } }
源代码目录
[root@web01 conf.d]# mkdir /code/test{1..3} [root@web01 conf.d]# echo test1 > /code/test1/index.html [root@web01 conf.d]# echo test2 > /code/test2/index.html [root@web01 conf.d]# echo test3 > /code/test3/index.html
重启nginx
因为有两个配置文件都监听80 会冲突,但不会影响nginx运行。
[root@web01 conf.d]# nginx -t nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@web01 conf.d]# nginx -s reload nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
测试
#根据ip访问 #1. 用户第一次访问,读取server1.conf配置返回结果 [root@lb01 ~]# curl 10.0.0.5 test1 #2. 此时将server1.conf修改为server4.conf重启nginx [root@lb01 conf.d]# mv server1.conf server4.conf [root@lb01 conf.d]# nginx -s reload #3. 再次访问时,读取server2.conf配置返回结果 [root@lb01 conf.d]# curl 10.0.0.5 test2
多server_name 优先级总结
再开始处理一个HTTP请求时,Nginx会读取header(请求头)中的host,与每个server中的server_name进行匹配,来决定用哪一个server标签来完成处理这个请求,有可能一个Host与多个server中的server_name都匹配,这个时候就会根据匹配优先级来选择实际处理的server。优先级匹配结果如下:
1.首先选择所有的字符串完全匹配的server_name。(完全匹配)
2.选择通配符在前面的server_name,如*.oldboy.com www.oldboy.com
3.选择通配符在后面的server_name,如oldboy.* oldboy.com oldboy.cn
4.最后选择使用正则表达式匹配的server_name
5.如果全部都没有匹配到,那么将选择在listen配置项后加入[default_server]的server块
6.如果没写,那么就找到匹配listen端口的第一个Server块的配置文件
注意:当出现多个相同的server_name情况下,配置文件排序优先使用则会被调用,所以建议配置相同端口,不同域名,这样不会出现域名访问冲突。
Nginx禁止IP直接访问
当用户通过访问IP或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500,目前国内很多机房都要求网站关闭空主机头,防止未备案的域名指向过来造成麻烦
Nginx 禁止ip 访问
[root@lb01 conf.d]# cat server4.conf server { listen 80 default_server; #默认优先返回; server_name _; #空主机头或者IP; return 500; #直接返回500错误; }
ip 跳转 域名
[root@lb01 conf.d]# cat server4.conf server { listen 80 default_server; server_name _; return 302 https://www.lvxinjie.cn; }
Nginx包含文件Include
一台服务器配置多个网站,如果配置都写在nginx.conf主配置文件中,会导致nginx.conf主配置文件变得非常庞大而且可读性非常的差。那么后期的维护就变得麻烦。假设现在希望快速的关闭一个站点,该怎么办?1.如果是写在nginx.conf中,则需要手动注释,比较麻烦 2.如果是include的方式,那么仅需修改配置文件的扩展名,即可完成注释 Include包含的作用是为了简化主配置文件,便于人类可读。
inlcude /etc/nginx/online/*.conf #线上使用的配置 /etc/nginx/offline #保留配置,不启用(下次使用在移动到online中)
Nginx路径root与alias
root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。
root的处理结果是:root路径+location路径alias的处理结果是:使用alias定义的路径
使用root时,用户访问http://image.com/picture/1.jpg时,实际上Nginx会到/code/picture/目录下找1.jpg文件
[root@lb01 conf.d]# cat image.conf server { listen 80; server_name image.com; location /picture { root /code; } }
使用alias时,用户访问http://image.com/picture/1.jpg时,实际上Nginx会到/code/目录下找1.jpg文件
[root@lb01 conf.d]# cat image.conf server { listen 80; server_name image.com; location /picture { alias /code; } }
线上配置
server { listen 80; server_name image.oldboy.com; location / { root /code; } location ~* ^.*\.(png|jpg|gif)$ { alias /code/images/; } }
Nginx调整上传文件大小
在nginx使用上传文件的过程中,通常需要设置保存大小限制,避免出现413 Request Entity Too Large
# 语法 Syntax: client_max_body_size size; Default: client_max_body_size 1m; Context: http, server, location
案例
server { listen 80; server_name _; client_max_body_size 200m; }
Nginx优雅显示错误页面
访问错误跳转其他网站
#error_page配置的是http这种的网络地址 [root@lb01 conf.d]# cat error.conf server { listen 80; server_name www.test.com; root /code; #error_page 404 http://www.baidu.com; location / { index index.html; error_page 404 http://www.baidu.com; } }
访问错误跳转本地地址
[root@lb01 conf.d]# cat error.conf server { listen 80; server_name error.test.com; root /code; location / { index index.html; } #error_page 403 404 /404.jpg; error_page 403 404 /404.html; location = /404.html { root /code; index index.html; } }
Nginx 性能优化
硬件 代理(CPU) 静态(磁盘IO) 动态(cpu、内存)
网络 带宽、丢包、延迟
系统 文件描述符(文件句柄数)
应用 服务与服务保持长连接 http1.1
服务 静态资源服务优化
压力测试
yum install httpd-tools -y
[root@web01 ~]# ab -n 200 -c 2 http://127.0.0.1/ #-n 要执行的请求数 #-c 请求的并发数 #-k 是否开启长连接 [root@web01 conf.d]# ab ab: wrong number of arguments Usage: ab [options] [http[s]://]hostname[:port]/path
配置静态网站与动态网站
#配置nginx [root@lb01 conf.d]# cat try.conf server { listen 80; server_name try.test.com; location / { root /code; try_files $uri $uri/ @java; index index.jsp index.html; } location @java { proxy_pass http://172.16.1.8:8080; } } #配置nginx使用的静态页面 [root@lb01 conf.d]# echo "nginx ab" > /code/ab.html #配置tomcat使用的静态页面 [root@web02 ~]# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.16/bin/apache-tomcat-9.0.16.tar.gz [root@web02 ~]# tar xf apache-tomcat-9.0.16.tar.gz [root@web02 ~]# cd /usr/share/tomcat/webapps/ROOT [root@web02 ROOT]# echo "oldboy_tomcat" > tomcat.html #压测工具测试nginx处理静态资源 [root@lb01 conf.d]# ab -n 10000 -c 200 http://try.test.com/ab.html Server Software: nginx/1.14.2 Server Hostname: try.test.com Server Port: 80 Document Path: /ab.html Document Length: 9 bytes Concurrency Level: 200 Time taken for tests: 1.078 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 2380000 bytes HTML transferred: 90000 bytes Requests per second: 9272.58 [#/sec] (mean) Time per request: 21.569 [ms] (mean) Time per request: 0.108 [ms] (mean, across all concurrent requests) Transfer rate: 2155.15 [Kbytes/sec] received #压测工具测试tomcat处理静态资源 [root@lb01 conf.d]# ab -n 10000 -c 200 http://try.test.com/tomcat.html Server Software: nginx/1.14.2 Server Hostname: try.test.com Server Port: 80 Document Path: /tomcat.html Document Length: 13 bytes Concurrency Level: 200 Time taken for tests: 4.956 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 2510000 bytes HTML transferred: 130000 bytes Requests per second: 2017.78 [#/sec] (mean) Time per request: 99.119 [ms] (mean) Time per request: 0.496 [ms] (mean, across all concurrent requests) Transfer rate: 494.59 [Kbytes/sec] received
系统性能优化
文件句柄的设置方式:
1、系统全局性修改。
2、用户局部性修改。
3、进程局部性修改。
[root@lb01 ~]# vim /etc/security/limits.conf 1、系统全局性修改。 # * 代表所有用户 * soft nofile 25535 * hard nofile 25535 2.用户局部性修改 #针对root用户,soft仅提醒,hard限制,nofile打开最大文件数 root soft nofile 65535 root hard nofile 65535 3.进程局部性修改 #针对nginx进程,nginx自带配置 worker_rlimit_nofile 30000 4.调整内核参数:让time_wait状态重用(端口重用)[flag] [root@web01 ROOT]# vim /etc/sysctl.conf net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_timestamps = 1 [root@web01 ROOT]# sysctl -p #可以查看我们添加的内核参数 [root@web01 ROOT]# sysctl -a #可以查看所有内核参数
在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。我来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。
为什么我们要关注这个高并发短连接呢?有两个方面需要注意:
1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
2. 在这个场景中,短连接表示业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间的连接。
这里有个相对长短的概念,比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的(占着茅坑不拉翔)。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:num+,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高。
代理服务优化
通常nginx作为代理服务,负责转发用户的请求,那么在转发的过程中建议开启HTTP长连接,用于减少握手次数,降低服务器损耗。
长连接语法
Syntax: keepalive connection; Default: - Context: upstream upstream http_backend { server 127.0.0.1:8080; keepalive 16; #长连接 } server { ... location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; #对于http协议应该指定为1.1 proxy_set_header Connection ""; #清除“connection”头字段 proxy_next_upstream error timeout http_500 http_502 http_503 http_504; #平滑过渡 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30s; # 代理连接web超时时间 proxy_read_timeout 60s; # 代理等待web响应超时时间 proxy_send_timeout 60s; # web回传数据至代理超时时间 proxy_buffering on; # 开启代理缓冲区,web回传数据至缓冲区,代理边收边传返回给客户端 proxy_buffer_size 32k; # 代理接收web响应的头信息的缓冲区大小 proxy_buffers 4 128k; # 缓冲代理接收单个长连接内包含的web响应的数量和大小 ... }
对于fastcgi服务器,需要设置fastcgi_keep_conn以便保持长连接[flag]
upstream fastcgi_backend { server 127.0.0.1:9000; keepalive 8; } server { ... location /fastcgi/ { fastcgi_pass fastcgi_backend; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_keep_conn on; fastcgi_connect_timeout 60s; include fastcgi_params; ... } }
注意:
1.scgi和uwsgi协议没有保持连接的概念。2.但无论是proxy、fastcgi、uwsgi协议都有cache缓存的功能,开启后可加速网站访问的效率。(取决硬件)
CPU亲和配置
CPU亲和(affinity)减少进程之间不断频繁切换,减少性能损耗,其实现原理是建jiCPU核心和Nginx工作进程绑定方式,把每个worker进程固定到对应的cpu上执行,减少切换CPU的cache miss,获得更好的性能。
查看当前CPU物理状态
[root@tomcat01 ~]$ lscpu | grep "CPU(s)" CPU(s): 8 On-line CPU(s) list: 0-7 NUMA node0 CPU(s): 0-7 #以上服务器有一颗物理CPU,上面有8个核心
将nginx worker进程绑定至不通的核心上,官方建议与CPU的核心保持一致
# 第一种绑定组合方式(不推荐) worker_processes 12; worker_cpu_affinity 000000000001 000000000010 000000000100 000000001000 000000010000 000000100000 000001000000 000010000000 000100000000 001000000000 010000000000 10000000000; # 第二种方式(使用较少) worker_processes 2; worker_cpu_affinity 101010101010 010101010101; # 第三种最佳绑定方式,修改nginx启动的work进程为自动。 worker_processes auto; worker_cpu_affinity auto;
查看nginx worker进程绑定至对应cpu
[root@web01 ~]# ps -eo pid,args,psr|grep [n]ginx 1242 nginx: master process /usr/ 2 1243 nginx: worker process 0 1244 nginx: worker process 1 1245 nginx: worker process 2 1246 nginx: worker process 3
通用优化配置
nginx优化总结,nginx通用优化配置文件 [root@nginx ~]# cat nginx.conf user www; # nginx进程启动用户 worker_processes auto; #与cpu核心一致即可 worker_cpu_affinity auto; # cpu亲和 error_log /var/log/nginx/error.log warn; # 错误日志 pid /run/nginx.pid; worker_rlimit_nofile 35535; #每个work能打开的文件描述符,调整至1w以上,负荷较高建议2-3w events { use epoll; # 使用epoll高效网络模型 worker_connections 10240; # 限制每个进程能处理多少个连接,10240x[cpu核心] } http { include mime.types; default_type application/octet-stream; charset utf-8; # 统一使用utf-8字符集 # 定义日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #定义json日志格式 log_format json_access '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"domain":"$host",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"status":"$status"}'; access_log /var/log/nginx/access.log main; # 访问日志 server_tokens off; # 禁止浏览器显示nginx版本号 client_max_body_size 200m; # 文件上传大小限制调整 # 文件高效传输,静态资源服务器建议打开 sendfile on; tcp_nopush on; # 文件实时传输,动态资源服务建议打开,需要打开keepalive tcp_nodelay on; keepalive_timeout 65; # Gzip 压缩 gzip on; gzip_disable "MSIE [1-6]\."; #针对IE浏览器不进行压缩 gzip_http_version 1.1; gzip_comp_level 2; #压缩级别 gzip_buffers 16 8k; #压缩的缓冲区 gzip_min_length 1024; #文件大于1024字节才进行压缩,默认值20 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg; # 虚拟主机 include /etc/nginx/conf.d/*.conf; }
Nginx安全与优化总结
1、CPU亲和、worker进程数、调整每个worker进程打开的文件数
2、使用额pool网络模型、调整每个worker进程的最大连接数
3、文件的高效读取sendfile、no铺设
4、文件的传输实时性、nodealy
5、开启tcp长连接,以及长连接超时时间keepalived
6、开启文件传输压缩gzip
7、开启静态文件expires缓存
8、异常nginx版本号
9、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问
10、配置防盗链、以及跨域访问
11、防DDOS、cc攻击,限制单IP并发连接,以及http请求
12、优雅限制nginx错误页面
13、nginx加密传输https优化
14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 缓存,第三方工具(squid、varnish)
PHP 服务优化
php程序配置管理文件/etc/php.ini,主要调整日志、文件上传、禁止危险函数、关闭版本号显示等
#;;;;;;;;;;;;;;;;; # Error logging ; #错误日志设置 #;;;;;;;;;;;;;;;;; expose_php = Off # 关闭php版本信息 display_error = Off # 屏幕不显示错误日志 error_reporting = E_ALL # 记录PHP的每个错误 log_errors = On # 开启错误日志 error_log = /var/log/php_error.log # 错误日志写入的位置 date.timezone = Asia/Shanghai # 调整时区,默认PRC #;;;;;;;;;;;;;;; # File Uploads ; #文件上传设置 #;;;;;;;;;;;;;;; file_uploads = On # 允许文件上传 upload_max_filesize = 300M # 允许上传文件的最大大小 post_max_size = 300M # 允许客户端单个POST请求发送的最大数据 max_file_uploads = 20 # 允许同时上传的文件的最大数量 memory_limit = 128M # 每个脚本执行最大内存 [Session] #会话共享 session.save_handler = redis session.save_path = "tcp://172.16.1.51:6379" #php禁止危险函数执行(取决于实际情况,需要和开发沟通) disable_functions = chown,chmod,pfsockopen,phpinfo
禁用php的危险函数
phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec()。 危险等级:高 exec() 功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。 危险等级:高 system() 功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。 危险等级:高 chroot() 功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式 PHP 时才能工作,且该函数不适用于 Windows 系统。 危险等级:高 scandir() 功能描述:列出指定路径中的文件和目录。 危险等级:中 chgrp() 功能描述:改变文件或目录所属的用户组。 危险等级:高 chown() 功能描述:改变文件或目录的所有者。 危险等级:高 shell_exec() 功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。 危险等级:高 proc_open() 功能描述:执行一个命令并打开文件指针用于读取以及写入。 危险等级:高 proc_get_status() 功能描述:获取使用 proc_open() 所打开进程的信息。 危险等级:高 error_log() 功能描述:将错误信息发送到指定位置(文件)。 安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode, 执行任意命令。 危险等级:低 ini_alter() 功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。 具体参见 ini_set()。 危险等级:高 ini_set() 功能描述:可用于修改、设置 PHP 环境配置参数。 危险等级:高 ini_restore() 功能描述:可用于恢复 PHP 环境配置参数到其初始值。 危险等级:高 dl() 功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。 危险等级:高 pfsockopen() 功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。 危险等级:高 syslog() 功能描述:可调用 UNIX 系统的系统层 syslog() 函数。 危险等级:中 readlink() 功能描述:返回符号连接指向的目标文件内容。 危险等级:中 symlink() 功能描述:在 UNIX 系统中建立一个符号链接。 危险等级:高 popen() 功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。 危险等级:高 stream_socket_server() 功能描述:建立一个 Internet 或 UNIX 服务器连接。 危险等级:中 putenv() 功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数 修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。 危险等级:高 禁用方法如下: 打开/etc/php.ini文件, 查找到 disable_functions ,添加需禁用的函数名,如下: phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
编写配置文件测试优化参数
[root@web01 conf.d]# cat php.conf server { listen 80; server_name php.oldboy.com; root /code; location / { index index.php index.html; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } [root@web01 conf.d]# cat /code/index.php <?php phpinfo(); ?>
php-fpm进程管理配置文件/etc/php-fpm.conf
#第一部分,fpm配置 ;include=etc/fpm.d/*.conf #第二部分,全局配置 [global] ;pid = /var/log/php-fpm/php-fpm.pid #pid文件存放的位置 ;error_log = /var/log/php-fpm/php-fpm.log #错误日志存放的位置 ;log_level = error #日志级别, alert, error, warning, notice, debug rlimit_files = 65535 #php-fpm进程能打开的文件数 ;events.mechanism = epoll #使用epoll事件模型处理请求 #第三部分,进程池定义 [www] #池名称 user = www #进程运行的用户 group = www #进程运行的组 ;listen = /dev/shm/php-fpm.sock #监听在本地socket文件 listen = 127.0.0.1:9000 #监听在本地tcp的9000端口 ;listen.allowed_clients = 127.0.0.1 #允许访问FastCGI进程的IP,any不限制 pm = dynamic #动态调节php-fpm的进程数 pm.max_children = 512 #最大启动的php-fpm进程数 pm.start_servers = 32 #初始启动的php-fpm进程数 pm.min_spare_servers = 32 #最少的空闲php-fpm进程数 pm.max_spare_servers = 64 #最大的空闲php-fpm进程数 pm.max_requests = 1500 #每一个进程能响应的请求数 pm.process_idle_timeout = 15s; pm.status_path = /phpfpm_status #开启php的状态页面 #第四部分,日志相关 php_flag[display_errors] = off php_admin_value[error_log] = /var/log/phpfpm_error.log php_admin_flag[log_errors] = on #慢日志 request_slowlog_timeout = 5s #php脚本执行超过5s的文件 slowlog = /var/log/php_slow.log #记录至该文件中 #慢日志示例 [21-Nov-2013 14:30:38] [pool www] pid 11877 script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php [0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2 php-fpm监控模块 用于监控php-fpm状态使用 #修改php-fpm配置 [root@web01 ~]# vim /etc/php-fpm.d/www.conf pm.status_path = /phpfpm_status #修改nginx配置 server { listen 80; server_name php.oldboy.com; root /code; location / { index index.php index.html; } location /phpfpm_status { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } [root@nginx ~]# curl http://php.oldboy.com/phpfpm_status pool: www #fpm池名称,大多数为www process manager: dynamic #动态管理phpfpm进程 start time: 20/Jan/2018:00:00:09 +0800 #启动时间,如果重启会发生变化 start since: 409 #php-fpm运行时间 accepted conn: 22 #当前池接受的连接数 listen queue: 0 #请求等待队列,如果这个值不为0,那么需要增加FPM的进程数量 max listen queue: 0 #请求等待队列最高的数量 listen queue len: 128 #请求等待队列的长度 idle processes: 4 #php-fpm空闲的进程数量 active processes: 1 #php-fpm活跃的进程数量 total processes: 5 #php-fpm总的进程数量 max active processes: 2 #php-fpm最大活跃的进程数量(FPM启动开始计算) max children reached: 0 #进程最大数量限制的次数,如果数量不为0,则说明phpfpm最大进程数量过小,可以适当调整。 使用ab压测 [root@web01 code]# ab -n100000 -c200 http://php.oldboy.com/index.php [root@web01 code]# ab -k -n100000 -c200 http://php.oldboy.com/index.php
PHP-FPM配置文件 4核16G、4核32G
[root@nginx ~]# cat /etc/php-fpm.d/www.conf [global] pid = /var/run/php-fpm.pid error_log = /var/log/php-fpm.log log_level = warning rlimit_files = 655350 events.mechanism = epoll [www] user = nginx group = nginx listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 512 pm.start_servers = 32 pm.min_spare_servers = 32 pm.max_spare_servers = 64 pm.process_idle_timeout = 15s; pm.max_requests = 2048 pm.status_path = /phpfpm_status #php-www模块错误日志 php_flag[display_errors] = off php_admin_value[error_log] = /var/log/php/php-www.log php_admin_flag[log_errors] = on #php慢查询日志 request_slowlog_timeout = 5s slowlog = /var/log/php-slow.log