Nginx 拓展&优化

本文涉及的产品
.cn 域名,1个 12个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: Nginx 拓展&优化

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
相关文章
|
8月前
|
应用服务中间件 nginx
nginx优化:URI过长或request header过大导致400或414报错
当出现URI过长或请求头过大导致400或414报错时,可以通过以下方式对Nginx进行优化: 1. 调整client_max_body_size参数:该参数用于限制请求体的大小。默认情况下,Nginx的client_max_body_size参数设置为1M。如果请求体超过这个大小,Nginx会返回400错误。您可以根据实际需求适当增加这个值,例如设置为10M或更大。 ``` http { client_max_body_size 10M; } ``` 2. 调整large_client_header_buffers参数:该参数用于调整请求头缓冲区的大
1523 0
|
8月前
|
应用服务中间件 Linux PHP
深入理解Nginx工作原理及优化技巧(上)
深入理解Nginx工作原理及优化技巧
深入理解Nginx工作原理及优化技巧(上)
|
9月前
|
缓存 安全 应用服务中间件
百度搜索:蓝易云【Nginx的搭建和优化详细教程。】
通过以上步骤,你已经成功搭建和优化了Nginx服务器。你可以根据自己的需求进行进一步的配置和调整,以满足你的网站的性能和安全需求。
270 3
|
17天前
|
监控 前端开发 应用服务中间件
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽(2)
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽
34 1
|
17天前
|
负载均衡 前端开发 应用服务中间件
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽(1)
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽
38 1
|
2月前
|
缓存 负载均衡 安全
深入探索Nginx高性能Web服务器配置与优化
【5月更文挑战第7天】本文深入探讨了Nginx的配置与优化,重点介绍了基础配置参数如`worker_processes`、`worker_connections`和`keepalive_timeout`,以及优化策略,包括使用epoll事件驱动模型、开启gzip压缩、启用缓存、负载均衡和安全配置。此外,还提到了性能调优工具,如ab、nginx-stats和nmon,以助于提升Nginx的性能和稳定性。
|
2月前
|
安全 应用服务中间件 Linux
高并发下Nginx优化(一)
【4月更文挑战第15天】高并发下Nginx优化
51 0
|
2月前
|
运维 Java 应用服务中间件
Nginx+Tomcat动静分离及Nginx优化(企业案例)
Nginx+Tomcat动静分离及Nginx优化(企业案例)
|
2月前
|
前端开发 应用服务中间件 nginx
使用nginx-http-concat资源请求合并功能 优化网站响应
使用nginx-http-concat资源请求合并功能 优化网站响应
25 0
|
2月前
|
JavaScript 前端开发 应用服务中间件
vue项目加载慢,Nginx页面优化
vue项目加载慢,Nginx页面优化
135 0