0%

Nginx-https优化

Nginx-https优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 不同 worker 绑定到不同核上,提高 CPU 缓存命中率,auto 根据 worker 数量自动绑定 CPU。
worker_cpu_affinity auto;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 60;

ssl_session_tickets on;
ssl_session_ticket_key ticket.key;

# 所有 worker 进程之间共享的缓存大小,1兆大约可以存储 4000 个会话,此处可存储 40000 个会话。
ssl_session_cache shared:SSL:10m;
# 会话超时时间
ssl_session_timeout 10m;

listen 80 reuseport backlog=8192; # reuseport linux > 3.9 CentOS >= 7.0

用于加密和解密TLS会话票据的密钥设置,生成 ticket 文件,必须含有80或48个字节的随机数据。

1
openssl rand 80> ticket.key

certbot 自动化脚本生成 Let’s Encrypt 免费证书。

1
2
3
yum install python2-certbot-nginx

certbot --nginx --nginx-server-root=/usr/local/nginx/conf/ -d test.codezm.com

域名 test.codezm.com 必须可访问。CA机构才能颁发证书。https://certbot.eff.org/docs/install.html

Tcp 优化

SYN_RCVD 状态
  • SYN - SYN_RECEIVED QUEUE
    • net.ipv4.tcp_max_syn_backlog=262144 接收 SYN 最大数量,半链接个数。SYN
      • 查看:cat /proc/sys/net/ipv4/tcp_max_syn_backlog
    • net.ipv4.tcp_synack_retries 被动建立连接时,发送 SYN/ACK 的重试次数。SYN+ACK
      • 查看:cat /proc/sys/net/ipv4/tcp_synack_retries
  • ACCEPT - ESTABLISHED QUEUE
    • net.core.somaxconn 系统级最大 backlog 队列长度。
    • nginx 端口限制 backlog 队列长度
      • listen 80 backlog=8192;
    • 如何查看 Accept queue 溢出?
      • netstat -s | grep LISTEN ,返回 SYNS to LISTEN sockets ignored 时。

防止 SYN 攻击,开启 net.ipv4.tcp_syncookies=1 ,在 SYN 队列满时,启用 cookie。

一切皆文件:句柄数的上限

操作系统全局
  • fs.file-max 操作系统可使用的最大句柄数

    1
    sysctl -a | grep file-max
- fs.file-nr 查看当前已分配(正使用)、待重新分配、上限
限制用户
  • /etc/security/limits.conf

    • root soft nofile 65535
    • root hard nofile 65535

    限制 root 用户,软、硬链接个数。

    hard 强制的、真实的链接,soft 软的限制,进程在运行时自动的修改软限制、但无法修改硬的,soft 一定要小于 hard

* - noproc 11000

  • * 代表针对所有用户

  • - 的意思为 softhard 全部限制。

  • nofile 代表最大文件打开数

  • noproc 代表最大进程数

限制进程

Syntax: worker_rlimit_nofile number;

Default: -

Context: main

限制一个 worker 进程最大能打开的文件句柄数。

活动连接数查看
  • ss -n | grep ESTAB | wc -l
Tcp Fast Open - TFO

image-20201230172342579

net.ipv4_tcp_fastopen 需 Client、Server 两端均支持 TFO。

  • 0:关闭
  • 1:作为客户端时可以使用TFO
  • 2:作为服务端时可以使用TFO
  • 3:无论作为客户端还是服务端,都可以使用TFO

Syntax: listen address[:port] [fastopen=number];

Default: listen *:80 | *:8000;

Context: server

fastopen=number 为防止带数据的 SYN 攻击,限制最大长度,指定 TFO 连接队列的最大长度。

worker 进程最大连接数量

包括 Nginx 与上游、下游间的连接。

Syntax: worker_connections numbers;

Default: worker_connections 512;

Context: events

参考