简介
整个笔记的内容都是笔者通过学习 CSDN 学院的课程 《高并发下的Nginx性能优化实践》记录的,便于以后使用的时候可以快速查阅。
概述
- 一个高性能的、轻量级的 HTTP 和反向代理 web 服务器
- 提供了 IMAP/POP3/SMTP 服务
- 发布于2004年10月4日(第一个公开版本0.1.0)
- nginx 的1.4.0稳定版于2013年4月24日发布
- C 语言编写
- nginx 是一个跨平台服务器
- nginx 有自己的函数库,除了 zlib、PCRE 和 OpenSSL 之外,标准模块只使用系统 C 库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库
优点
- 占有内存少(在 3W 并发连接中,开启的10个 nginx 进程消耗内存大约150M)
- 高并发能力强(官方测试能够支撑 5W 并发连接,在实际生产环境中能到 2-3W 并发连接数)
- 简单(配置文件通俗易懂)
- 价格(免费、开源)
- 支持 Rewriter 重写(能够根据域名、URL 的不同,将 HTTP 请求分到不同的后端服务器群组)
- 内置健康检查(如果 nginx 后端有几个服务宕机了,不会影响前端访问,能自动检测服务状态)
- 节省带宽(支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头)
- 稳定性高,反向代理,很少宕机
- 中国大陆很多使用 nginx 的大厂:百度、京东、新浪、网易、腾讯、淘宝
应用场景
安装
# 安装依赖
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
# 下载解压
wget http://nginx.org/download/nginx-1.17.8.tar.gz
tar -zxvf nginx-1.17.8.tar.gz
# 编译安装
cd nginx-1.17.8
./configure --prefix=/opt/nginx
make
make install
命令
- 启动:
./sbin/nginx
- 立刻关闭:
./sbin/nginx -s stop
- 待nginx进程处理任务结束后关闭:
./sbin/nginx -s quit
- 重启:
./sbin/nginx -s reload
目录
- *_temp 目录:共有5个 temp 结尾的目录,用于存放 nginx 运行时产生的临时文件。
- conf 目录:存放配置文件的目录,包含主配置文件 nginx.conf ,是我们经常修改的配置文件
- html 目录:默认存放了 nginx 的错误页面和欢迎页面等
- logs 目录:默认存放了访问日志和错误日志文件
- sbin 目录:默认存放了 nginx 的二进制命令,常用于 nginx 服务的启动、停止等管理工作
配置文件
-
核心模块
- HTTP 模块(代理、缓存、日志定义和第三方模块)
- EVENTS 模块(网络连接)
- 全局模块(全局指令,日志路径、PID路径、用户信息等)
-
基础模块
- HTTP 全局模块
- HTTP FastCGI 模块
- HTTP Gzip 模块
- HTTP server 模块(虚拟主机,一个 http,可以有多个 server)
- HTTP location 模块(请求的路由,各种页面的处理)
- HTTP Rewriter 模块
-
第三方模块
- HTTP Upstream Request Hash 模块
- Notice 模块
- HTTP Access Key 模块
集群搭建
- 配置文件
nginx.conf 添加以下内容:http { # 集群机器配置 upstream flask_uwsgi{ server 192.168.1.1:8888; server 192.168.1.2:8888; server 192.168.1.3:8888; } server { listen 80; server_name www.ichilson.com; # 访问 ip:port/ 时通过代理转发到集群服务器 location / { proxy_pass http://flask_uwsgi; } } }
- 负载均衡策略
-
轮询法
每次请求轮询转发到集群的每台服务器http { # 集群机器配置 upstream flask_uwsgi{ server 192.168.1.1:8888 weight=1; server 192.168.1.2:8888 weight=1; server 192.168.1.3:8888 weight=1; } }
-
加权轮询法
按每台服务器的权重按比例转发到对应的服务器上http { # 集群机器配置 upstream flask_uwsgi{ server 192.168.1.1:8888 weight=10; server 192.168.1.2:8888 weight=3; server 192.168.1.3:8888 weight=1; } }
-
IP 地址哈希法
根据 IP 使用哈希函数取值,同一个IP访问同一服务器,解决 session 问题http { # 集群机器配置 upstream flask_uwsgi{ ip_hash; ...... } }
-
最小连接数法
根据后端服务器当前连接情况,动态地选取其中当前挤压连接数最少的一台服务器来处理当前的请求,尽可能的提高后端服务器的利用率。http { # 集群机器配置 upstream flask_uwsgi{ least_conn; ...... } }
-
第三方模块策略
Fair:
安装方式如下:
url_hash:
安装方式如下:
日志配置管理
- 日志配置
- 日志切割
- 写一个定时切割脚本 split_log.sh
#! /bin/bash # 设置日志文件存放目录 LOG_HOME="/opt/service/nginx/logs/" # 备份文件 LOG_PATH_BACK="$(date -d yesterday +%Y%m%d)".access.log # 重命名日志文件 mv ${LOG_HOME}/access.log ${LOG_HOME}/${LOG_PATH_BACK} # 向nginx主进程发信号重新打开日志 # -HUP 是让进程挂起,动态更新服务配置 kill -HUP `cat /opt/service/nginx/logs/nginx.pid`
- 配置定时任务
crontab -e 0 0 * * * sh /opt/service/nginx/split_log.sh killall crond crond restart
高并发限流
三种方式:limit_conn_zone、limit_req_zone、ngx_http_upstream_module(前两种只能对客户端,即单一ip限流)
-
测试工具 ab
yum install httpd-tools -y # 模拟10个用户发1000个请求 ab -c 10 -n 1000 http://www.xxx.com/
-
limit_conn_zone
可限制 server,也可限制单个 locationhttp { limit_conn_zone $binary_remote_addr zone=one:10m; server { ...... # 客户端的并发连接只能是10个 limit_conn one 10; ...... } }
-
limit_req_zone
可限制 server,也可限制单个 locationhttp { # rate=1r/s 表示每秒处理一个请求 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { ...... # burst 指令牌桶容量,burst 爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。 limit_req zone=one burst=5; ...... } }
-
ngx_http_upstream_module
提供后端限流功能,参数 max_conns 可以对服务进行限流,1.11.5 以后可用upstream xxx { server 192.168.1.1:8888 max_conns=10; }
安全配置
- 版本安全
http { # 隐藏nginx版本 server_tokens off; }
- IP安全
server { location / { deny 127.0.0.1; allow all; } }
- 文件安全
location /logs { # 展示目录 autoindex on; root /opt/service/nginx/; } location ^/logs~*\.(log|txt) { add_header Content-Type text/plain; root /opt/nginx; }
- 连接安全
HTTPS 开启
高并发下的主要配置
- worker 进程数和一个 worker 并发数
# 进程数 worker_processes 4; # 调整到与CPU数量一致 events { # 每个worker最大并发连接数 worker_connection 4096; # 每个worker最大并发连接数(一般是1024*进程数) }
- 系统 优化
永久性修改需要修改文件:/etc/security/limits.confulimit -a ulimit -Hn 100000 # 临时设置硬限制 ulimit -Sn 100000 # 临时设置软限制
* soft nofile 100001 * hard nofile 100002
长连接
想要做到长连接,必须做到两点:
1. 从 client 到 nginx 是长连接
2. 从 nginx 到 server 是长连接
配置:
1. client发送过来的请求携带 keep-alive header
2. nginx设置支持 keep-alive(events 模块和 http 模块设置 keepalive_timeout )
压缩
gzip:可以设置在 http, server 和 location 模块下
作用:将响应报文发送至客户端之前可以启用压缩功能,能够有效节约带宽,提高响应至客户端的速度,压缩会消耗 nginx 的 cpu 性能
状态监控
需要安装插件:./configure --prefix=/opt/nginx --with-http_stub_status_module
# 设定 nginx 状态访问地址
location /NginxStatus {
stub_status on;
access_log off;
}