Nginx在代理服务器中扮演着十分重要的位置,目前从事前端工作的我,使用的比较少,但是一直觉得这是一个利器,因此准备深入学习下,本篇是开篇-高阶篇,主要总结下常见问题,性能优化和安全等。
常见问题
主要问题
- 相同server_name多个虚拟主机优先级访问
- location匹配优先级
- try_files使用
- Nginx的alias和root区别
- 用什么方法传递用户真实IP
多虚拟机主机优先级
具体如下
server {
listen 80;
server_name testserver1 ethan.com
}
server {
listen 80;
server_name testserver2 ethan.com
}
这种情况Nginx启动会有warning,但是并不会报错,而且可以启动成功
Nginx加载配置文件,优先加载最开始读到的文件
多location匹配
location匹配分类
- = 进行普通字符精确匹配,完全匹配
- ^~ 表示普通字符串,使用前缀匹配
- ~~ 表示执行一个正则匹配(波浪符区分大小写,波浪符+不区分大小写)
前两者优先级最高,一旦匹配,不在继续寻找。正则匹配在匹配后,后继续寻找是否有更完善的
try_files
按顺序检查文件是否存在,如果存在返回文件内容,如果不存在
location / {
try_files $uri $uri/ /index.php
}
alias & root
root指定程序目录
location /request_path/image {
root /local_path/image
}
如果我们访问,test.com/request_path/image/cat.png
,重点来了,实际访问的是:/local_path/image/request_path/image/cat.png
root指定程序目录
location /request_path/image {
alias /local_path/image
}
如果我们访问,test.com/request_path/image/cat.png
,重点来了,实际访问的是:/local_path/image/cat.png
真实IP
与第一级代理协商一个头信息,加上真实IP
set x_real_ip=$remote_addr
错误码
413 Request Entity Too Large:用户上传文件限制:client_max_body_size
502 bad gateway:后端服务无响应
504 Gateway Time-out:后端服务执行超时,nginx默认60s
性能优化
主要如下点:
- 性能优化考虑点
- 当前系统结构瓶颈,观察指标(top),压力测试
- 了解业务模式(接口业务类型,系统层次化结构)
- 性能和安全
- 压测工具ab
- 安装 yum install httpd-tools
- 使用
ab -n 2000 -c 2 http://127.0.0.1 # -n 总得请求数 # -c 并发数 # -k 是否开启长连接
- 系统与Nginx性能优化
- 网络(流量,丢包情况)
- 系统(磁盘损坏与速率,系统负载,内存使用率)
- 服务(连接优化,内核优化,HTTP服务优化)
- 程序
- 数据库、底层服务
性能优化具体点 - 句柄设置
- 文件句柄,一切皆文件,文件句柄就是一个索引
- 设置方式(系统全局性修改、用户局部性修改、进程局部性修改)
系统全局性修改/etc/security/limits.conf
root soft nofile 665535
root hard nofile 665535
* soft nofile 665535
* hard nofile 665535
针对nginx进程,在nginx.conf下配置
worker_rlimit_nofile 35535; # 小站点建议1w+,大站点根据符合判断
性能优化具体点 - CPU亲和配置
- 使nginx不同work的进程绑定到不同的CPU上,减少进程间切换的性能损耗
- 查看多少个物理CPU
cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l
- 查看CPU核心
cat /proc/cpuinfo|grep "cpu cores"|uniq
- 使用TOP查看CPU使用情况
配置nginx.conf
user nginx; # 配置成普通用户,为了安全考虑 work_processes 16; # 官方建议和CPU核心数保持一致 work_cpu_affinity: 000000000000001 # ... 配置具体CPU # work_cpu_affinity: auto; events { use epoll; # nginx优势之处 work_connections 10240; # 限制每一个work的最大连接数 } http { # charset charset utf-8; # access_log 根据实际情况选择打日志,毕竟日志涉及到IO # Core module sendfile on; #tcp_nopush on; #tcp_nodeny on; #Gzip module gzip on; gzip_disable "MSIE [1-6]\."; # 兼容 gzip_http_version 1.1; }
安全
常见的恶意行为:爬虫行为,恶意抓取,资源盗用
应用层攻击手段
- 后台密码撞库
- 文件上传漏洞
- SQL注入
- CC攻击
Nginx防攻击策略
- 基础防盗链功能
- secure_link_module
- access_module:IP访控
- 预警机制(Nginx + Lua)
- waf防火墙
Nginx服务体系角色
- 静态资源服务
- 类型分类
- 浏览器缓存
- 防盗链
- 流量限制
- 防资源盗用
- 压缩
- 代理服务
- 协议类型
- 正向代理
- 反向代理
- 负载均衡与策略
- 代理缓存
- 头信息处理
- 分片请求
- 动静分离
新特性
具体内容
- 平滑升级
- HTTP2.0协议
- GRPC应用网关
平滑升级
什么是平滑升级:服务版本升级时,对于用户体验无感知,不会造成服务中断
前提条件
- 新老版本Nginx安装目录结构一致
- 老版本备份
- 重启进程采用reload方式
平滑升级的步骤
- 了解现有版本nginx的安装
- 按照原有编译参数重新编译版本
- 安装基础包 gcc pcre-devel openssl-dev
- wget url 下载更新包
- 复制nginx -V的结果进行输出编译
- reload服务
如果通过yum安装nginx,可以通过rpm查看相关信息
- rpm -qa nginx 当前nginx的版本
- rpm -ql nginxx 安装rmp包在操作系统的内容和目录
升级完成后,nginx默认备份的老的版本,可以通过nginx.old -V查看
HTTP2.0协议
HTTP1.1 - 持久链接
HTTP2.0 - 多路复用
GRPC(远程调用)nginx 1.13.10支持
- Google主导开发的rpc框架
- 提供从客户端和服务端的整体解决方案
- 基础HTTP2.0协议