列表
常见故障
LNMP架构的502
优化
对于 linux 内核,主要影响nginx性能的主要指标在网络方面
work 进程
http 与 tcp
buffer 与 cache
压缩
日志 与 静态文件过期设置
ssl
LNMP架构的502
1. nginx配置文件中将php-fpm的监听地址(socket,ip)配置错误
2. php-fpm的资源不够用
3. php-fpm服务出现问题(比如,不能自动销毁老的进程)
情况1:若php-fpm的监听地址正确,但依然出现502,是因为nginx没有读取php-fpm的socket文件的权限,需要在php-fpm配置文件中修改监听socket文件权限(listen.mode=777)。
情况2,3:
对应8G内存的机器 pm.max_children = 300 # 子进程最大为300个 --> 解决情况 2 pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 35 pm.max_requests = 500 # 固定单个子进程最多处理 500 个请求,完成 500 个请求后自动销毁,防止某个进程假死。 --> 解决情况 3
若在出现故障,可以通过查阅nginx的日志,追踪问题。
Linux 内核关于 TCP 相关参数调整
序号 参数 说明 优化值 1 net.ipv4.tcp_max_tw_buckets tcp连接状态中,服务端与客户端通讯完毕后,状态变为timewait。
假如该服务器非常忙,连接数很多,导致timewait数量越来越大。因此设定一个值,当超过该值时,系统会自动删除最早的连接,保持一个数量级。
10000 2 net.ipv4.tcp_tw_recycle 对net.ipv4.tcp_max_tw_buckets删除的旧连接是否用于回收(该回收的意思是,在内存上不删除)
0 3 net.ipv4.tcp_tw_reuse 对net.ipv4.tcp_tw_recycle回收的旧链接,用于新的连接,可以节省重新申请内存的步骤。1为开启
1 4 net.ipv4.tcp_syncookies 在3次握手中,当服务端接收到客户端的第一个sync请求,服务端通过特定的算法把半开连接信息编码成“Cookie”,用作给客户端的消息编号(SequenceNum),
随SYN-ACK消息一同返回给连接发起方A,若A是真正客户则会返回ack,若是syn floor攻击则不会返回,从而判断客户端的真实性。1 表示开启。(建议开启)
优点:单纯的SYN攻击不会造成B的连接资源消耗。
缺点:不保存连接的半开状态,就丧失了重发SYN-ACK消息的能力,这一方面会降低正常用户的连接成功率,
另一方面会导致某些情况下正常通信的双方会对连接是否成功打开产生误解,导致其中一方认为连接成功。
参考:https://www.cnblogs.com/popduke/p/5823801.html
1 5 net.ipv4.tcp_max_syn_backlog 提高TCP端口连接容量(半连接状态),防御syn攻击。
30000 6 net.ipv4.tcp_synack_retries 用于服务端,定义发起syn+ack最大重试次数,防御syn攻击(减少半开状态下等待ACK消息的时间或者重试发送SYN-ACK消息的次数)
2 7 net.ipv4.tcp_syn_retries 适合客户端(单服务器角色转换为客户端时,如代理与后端服务器的关系)定义发起的syn最大重试次数,默认为6
2 8 net.ipv4.tcp_local_port_range 定义可以使用的端口范围。默认1-1024为系统保留端口(权限端口)
1025 61000 9 net.ipv4.tcp_fin_timeout FIN_WAIT_2状态的超时时长
6 10 net.ipv4.tcp_keepalive_time tcp的established状态下,设置服务端周期性(单位:秒)发一个探测包确认客户端是否在线。
30 11 net.ipv4.tcp_keepalive_intvl 在net.ipv4.tcp_keepalive_time的基础下,当第一次探测客户端不在线时,重试探测的间隔时间(单位:秒)。
3 12 net.ipv4.tcp_keepalive_probes 第10,11定义了周期及探测失败后的要多久再发起探测,该定义是探测多少次结束。
2
# 服务对客户端的健康检查
net.ipv4.tcp_keepalive_probes = 2
net.inpv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_keepalive_time = 30
# TCP 连接状态
net.ipv4.tcp_fin_timeout = 6
# syn的链接重试
net.ipv4.tcp_syn_retries = 2
# 端口使用范围
net.ipv4.tcp_local_port_range = 1025 61000
# 防御一般性的syn flood 攻击
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_syncookies = 1
# 连接的回收策略
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
Nginx 配置优化
woker进程相关参数
worker_processes 数值 # 表示启动多少个工作进程,一般与本机CPU核数保存一致,每一核cpu处理一个进程。 worker_rlimit_nofile 数值 #文件描述符,需要配合系统最大描述符 # vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 worker_connections 数值 # 每个工作进程最大处理的连接数。一般设置为1024。worker_connections * worker_processes 最大能处理多少个客户端请求。
http 和 TCP 相关参数
use epoll; # 使用epoll事件驱动模型,该模式是linux内核最优的网络方式 multi_accept on; # 每个worker进程可以同时处理抖个客户端请求 sendfile on; # 内核FD文件传输功能,减少内核用户态与内核态的切换。 tcp_nopush on; # 设置on,会调用tcp_cork进行数据传输。当应用程序产生数据时,内核不会马上封包,而是当积累一定量时才会封装,然后传输。 tcp_nodelay on; # 提高高频发送小数据报文的实时性 keepalive_timeout 30 ; # 定义长连接的超时时间。 keepalive_requests 50000; # 定义长链接的情况下,每个客户端可以最大请求多少次。 reset_timeoutd_connection on; # 当客户端不再向服务端发送请求时,则允许服务端关闭该连接。 client_body_timeout 10; # 在指定时间内没有加载body数据,则端口连接,单位秒 send_timeout 3; # nginx向客户端发送数据包的延迟时间。
buffer 和 cache 相关参数
针对单个 http 请求
client_body_buffer_size 128K; # 客户端post提交数据,会先写入该buffer中,若满了则写入临时文件里。 client_max_body_size 数值; # 用来判断报头content-length的大小,若超出该值,则返回413。如用户上传1G的文件,则返回413.设置 0 则禁用限制。需要根据生产环境设置。 client_header_buffer_size 4k; # 客户端header的buffer大小。 large_client_header_buffers 4 8K; # 当超过client_header_buffer_size将使用该buffer,4个8K的buffer。 open_file_cache max=102400 inactive=20s ; # max设定缓存的数量,inactive设定多长时间文件没有被请求后删除缓存。
## 该参数对 打开文件描述符的文件大小和修改时间信息 进行缓存
## 该参数对 存在的目录信息 进行缓存
## 该参数对 搜索文件的错误信息(文件不存在,无权限读取等信息) 进行缓存
open_file_cache_valid 30s; # 多长时间检查一次缓存的有效信息。 open_file_cache_min_uses 2; # 1表示文件在inactive时间内一次都没有被使用,它将被移除。
压缩相关参数
对纯文件内容,可以使用nginx的gzip压缩,由ngx_http_gzip_module支持
gzip on; # 开启gzip功能 gzip_min_length 1024; # 设置请求资源超过该数值才进行压缩,单位字节 gzip_buffers 16 8K; # 设置压缩使用的 buffer 大小,第一个数为数量,第二个为每个buffer大小 gzip_comp_level 4; # 设置压缩级别,访问1-9,9压缩最高,也最耗费cpu资源。 gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; # 指定那些类型文件需要压缩 gzip_disable "MSIE 6\."; # ie6浏览器不启用压缩。
日志相关参数
1 错误日志级别,尽量少记录无关日志,比如:crit 级别。
2 对于访问日志,如果不要记录日志,则关闭(静态资源的访问建议关闭)
静态文件设置过期
对静态文件,需要设置一个过期时间。
SSL
1 适当减少worker_processes 数量,因为ssl功能需要使用 cpu 资源
2 使用长连接,因为每次建立ssl 会话,都会消耗一定资源(比如加密,解密)
3 开启 ssl 缓存,简化服务端与客户端的握手过程。
ssl_session_cache shared:SSL:10m; # 缓存10M ssl_session_timeout 10m; #会话超时时间为10分钟