nginx-超详细配置及其优化

990 阅读3分钟

安装nginx

# MAC
brew install ngnix

# LINUX
yum install epel-release -y
# yum list all | grep nginx
yum install nginx -y

# DOCKER
docker pull nginx:1.17.6
docker run --name nginx -d -p 8080:80 nginx:1.17.6

# 查看安装目录
rpm -ql nginx

# 启动
nginx

# 查看启动参数
nginx -V

#重启
nginx -s reload

#停止
nginx -s stop

context:main的配置

# 指定nginx启动的worker子进程数量,auto表示你有几个cpu就开启几个worker进程
# 如果cpu开启了超线程,那么也会把超线程的数量算进去
worker_processes number | auto

# 将每个worker子进程与特定的cpu绑定,避免高速缓存失效
# 不考虑超线程,因为超线程还是共享一个cpu
# 4核cpu的配置方式
worker_cpu_affinity 0001 0010 0100 1000
# 8核cpu的配置方式
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

# worker子进程可以打开的最大文件句柄数
worker_rlimit_nofile 65535

# 指定worker子进程的优先级,让cpu优先调度nginx
# 进程的优先级默认是120,设置为-10表示worker进程的优先级为120+(-10)=110 
# 范围是[-20, 20]
worker_priority -10

# 指定worker子进程优雅退出的时间
worker_shutdown_timeout 2s

# worker子进程异常终止后的core文件,用于记录分析问题
worker_rlimit_core 10M
working_directory /opt/nginx/tmp

# worker子进程内部使用的计时器精度 时间间隔越大 系统调用越少 性能越好 
timer_resolution 100ms

context:event的配置

# worker子进程支持的最大并发数,默认512
# 如果设置了worker_rlimit_nofile,那么worker_connections的值不能超过worker_connections的值
worker_connections worker_rlimit_nofile/worker_processes

# 是否开启负载均衡锁,开启时worker进程将依次接受新的连接,防止抢占连接
accept_mutex on

# 多少时间拿不到锁就释放锁
accept_mutex_delay 200ms

服务器配置

# 修改服务器网卡能接收的最大连接数
sudo echo net.core.netdev_max_backlog=65535 | sudo tee -a /etc/sysctl.conf

# 修改tcp/ip协议栈SYN列队的最大长度
sudo echo net.ipv4.tcp_max_syn_backlog=65535 | sudo tee -a /etc/sysctl.conf

# nginx作为客户端,需要和上游服务器建立连接,发出syn包但是没有收到上游服务器返回的syn+ack(第二次握手失败),那么nginx会重传syn的次数;
# 因为tcp有超时重传机制,如果设置的重传次数太大肯定会影响性能
sudo echo net.ipv4.tcp_syn_retries=1 | sudo tee -a /etc/sysctl.conf

# nginx作为服务端,收到客户端发送过来的syn包同时会返回一个syn+ack,但是一直没有收到客户端回送的ack(第三次握手失败)时,那么nginx会重新发送syn+ack的次数,同样这个参数不能太大
sudo echo net.ipv4.tcp_synack_retries=1 | sudo tee -a /etc/sysctl.conf

# 修改tcp/ip协议栈ACCEPT列队的最大长度
# 查看操作系统的somaxconn值:sysctl -a |grep somaxconn
sudo echo net.core.somaxconn=65535 | sudo tee -a /etc/sysctl.conf

SYN 队列:半连接队列;ACCEPT 队列:全连接队列。

  • 半连接队列:服务端收到客户端的 SYN 包并且回复了 SYN+ACK,但是还没有收到客户端 ACK 情况下,会将连接信息放入半连接队列。
  • 全连接队列:保存服务端完成了三次握手,但是还未被操作系统调用accept()取走的连接。
# 开启tcp fastopen功能
sudo echo net.ipv4.tcp_syncookies=1 | sudo tee -a /etc/sysctl.conf
sudo echo net.ipv4.tcp_fastopen=3 | sudo tee -a /etc/sysctl.conf

# 生效修改的配置
sysctl -p

tcp fastopen对tcp三次握手进行了优化。1、在第三次握手的同时将请求数据传给服务端,减少了一个传输开销;2、在第一次握手的时候,服务端会生成一个cookie返回给客户端,当下次建立连接的时候直接带上该cookie和请求数据,无需再建立三次握手啦!

更多配置可参看官网

文章会持续更新,各位大佬有什么好的配置,文章里面没有提及到的可在下方留言,小弟感激不尽