nginx 优化与常见故障

列表

常见故障

    LNMP架构的502

优化

    对于 linux 内核,主要影响nginx性能的主要指标在网络方面

    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 相关参数调整

 

序号参数说明优化值
1net.ipv4.tcp_max_tw_buckets

 tcp连接状态中,服务端与客户端通讯完毕后,状态变为timewait。

假如该服务器非常忙,连接数很多,导致timewait数量越来越大。因此设定一个值,当超过该值时,系统会自动删除最早的连接,保持一个数量级。

 10000
2net.ipv4.tcp_tw_recycle

对net.ipv4.tcp_max_tw_buckets删除的旧连接是否用于回收(该回收的意思是,在内存上不删除)

0
3net.ipv4.tcp_tw_reuse

对net.ipv4.tcp_tw_recycle回收的旧链接,用于新的连接,可以节省重新申请内存的步骤。1为开启

1
4net.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
5net.ipv4.tcp_max_syn_backlog

提高TCP端口连接容量(半连接状态),防御syn攻击。

30000
6net.ipv4.tcp_synack_retries

用于服务端,定义发起syn+ack最大重试次数,防御syn攻击(减少半开状态下等待ACK消息的时间或者重试发送SYN-ACK消息的次数)

2
7net.ipv4.tcp_syn_retries

适合客户端(单服务器角色转换为客户端时,如代理与后端服务器的关系)定义发起的syn最大重试次数,默认为6

2
8net.ipv4.tcp_local_port_range

定义可以使用的端口范围。默认1-1024为系统保留端口(权限端口)

1025  61000
9net.ipv4.tcp_fin_timeout

FIN_WAIT_2状态的超时时长

6
10net.ipv4.tcp_keepalive_time

tcp的established状态下,设置服务端周期性(单位:秒)发一个探测包确认客户端是否在线。

30
11net.ipv4.tcp_keepalive_intvl

在net.ipv4.tcp_keepalive_time的基础下,当第一次探测客户端不在线时,重试探测的间隔时间(单位:秒)。

3
12net.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分钟

 

 

 

 

转载于:https://www.cnblogs.com/BoNuo/articles/10278571.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值