常用
bash
1 | # 检查nginx配置语法是否正确 |
第一章、环境准备
- 确认关闭iptables规则(防火墙);
- 确认停用selinux(linux安全);
第二章、基础篇
一. nginx简介
二. nginx安装
- 方法一:下载安装解压编译安装,包下载地址:https://nginx.org/en/download.html;
- 方法二:设置yum关于nginx的安装源,然后用yum安装即可yum install nginx;(参考地址:https://nginx.org/en/linux_packages.html,看centos的安装步骤)
三. nginx安装目录
- 安装目录查看:rpm -ql nginx
- /etc/logrotate.d/nginx(配置文件):nginx日志轮转,用于logrotate服务的日志切割;
- /etc/nginx/nginx.conf(配置文件):自定义配置文件;
- /etc/nginx/conf.d/default.conf(配置文件):默认配置文件;
- /etc/nginx/mime.types(配置文件):设置http协议的Content-Type与拓展名对应关系;
- /usr/sbin/nginx(命令):nginx服务的启动管理的终端命令;
- /var/cache/nginx(目录):nginx的缓存目录;
- /var/log/nginx(目录):nginx的日志目录;
四. nginx配置语法
- nginx默认配置语法(/etc/nginx/nginx.conf)
- user 设置nginx服务的系统使用用户
- worker_processes 工作进程数(一般与内核数一致)
- error_log nginx的错误日志
- pid nginx 服务启动时候的pid
- events.worker_connections 每个进程允许的最大连接数
- event.use 使用哪种内核模型
- 检查nginx配置语法是否正确bash
1
nginx -t -c /etc/nginx/nginx.conf
五. nginx虚拟主机
- curl -v [url] 可以查看请求的request和response
- ip a 查看主机网卡
- 基于多主机多IP的方式:一个服务器对应多个ip
- 多网卡多IP的方式
- 单网卡多IP的方式:在网卡上添加IP,增加/etc/nginx/conf.d目录下的配置文件,listen字段添加特定ip
- 基于端口的配置方式:多个服务监听不同的端口
- 增加/etc/nginx/conf.d目录下的配置文件,listen字段改成不用的端口;
- 检查端口是否被占用:ss -luntp
- 检查nginx配置语法是否正确:nginx -tc /etc/nginx/nginx.conf
- 基于多个host名称的方式:一个主机对应多个域名
- 增加/etc/nginx/conf.d目录下的配置文件,server_name字段修改为对应的域名
六. nginx日志
- 类型:error_log, access_log
- log_format定义日志输出的格式
七. nginx模块
- 类型:nginx官方模块、第三方模块
- 官方模块_sub_status:
- 编译选项:–with-http_stub_status_module
- 作用:nginx的客户端状态
- 配置context: server, location(提供一个端口或者一个端口下的路径可以查看nginx的连接状态)
- 官方模块_surandom_index: 在访问目录下随机返回主页文件
- 官方模块_sub_module:
- 编译选项:–with-http_sub_module
- 作用:http内容替换
- 配置context: http, server, location
八. nginx的请求限制
- 请求限制:
- 连接频率限制:limit_conn_module
- 请求频率限制:limit_req_module
- http
- apache压测工具ab (apache bench)bash
1
ab -n 100 -c 10 http://www.shengshunyan.xyz
九. nginx的访问控制
- 类型
- 基于IP的访问控制(ip、网段):http_access_module
- 基于用户的信任登陆:http_auth_basic_module
- http_access_module的局限性
解决方法: - http_auth_basic_module的局限性
- 用户信息依赖文件方式
- 操作管理机械,效率低下
解决方法: - nginx结合LUA实现高效验证
- 利用nginx-auth-ldap模块
第三章、场景实践
一. nginx作为静态资源web服务
- 静态资源类型:非服务器动态运行生成的文件
- 静态资源服务场景-CDN
- 配置语法-文件读取
- syntax: sendfile on | off;
- default: sendfile off;
- context: http, server, location, if in location;
- 配置语法-tcp_nopush
- syntax: tcp_nopush on | off;
- default: tcp_nopush off;
- context: http, server, location, location;
- 作用:sendfile开启的情况下,提高网络包的传输效率;
- 配置语法-tcp_nodelay
- syntax: -tcp_nodelay on | off;
- default: -tcp_nodelay on;
- context: http, server, location, location;
- 作用:keepalive连接下,提高网络包的传输实时性;
- 配置语法-压缩
- syntax: gzip on | off;
- default: gzip off;
- context: http, server, location, location;
- 作用:压缩传输;
- 浏览器缓存:
- 跨站访问(Access-Control-Allow-Origin)
- Syntax: add_header name value [always];
- Default: -
- Context: http, server, location, if in location
- 防盗链
- 目的:防止资源被盗用,防止其他网站用本站的资源
- 根据请求头中的referer字段bash
1
2
3
4
5
6
7location ~ .*\.(jpg|gif|png)$ {
valid_referers none blocked 116.62.103.228;
if ($invalid_referer) {
return 403;
}
root /opt/app/images;
}
二. nginx作为代理服务
- 代理分类:
- nginx可支持的代理协议
常见的nginx作为反向代理支持协议
常见的nginx作为正向代理支持协议(不支持https) - 模块proxy_pass配置语法
- Syntax: proxy_pass URL;
- Default: -
- Context: location, if iin loacation, limit_except
- 其他配置语法-缓冲区
- Syntax: proxy_buffering on | off;
- Default: proxy_buffering on;
- Context: http, server, location
- 其他配置语法-跳转重定向
- Syntax: proxy_redirect default | off | replacement;
- Default: proxy_redirect default;
- Context: http, server, location
- 其他配置语法-头信息
- Syntax: proxy_set_header field value;
- Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
- Context: http, server, location
- 其他配置语法-超时
- Syntax: proxy_connect_timeout time;
- Default: proxy_connect_timeout 60s;
- Context: http, server, location
- 实践场景bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_vusy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
三. nginx作为缓存服务
- 缓存类型:客户端缓存、代理缓存、服务端缓存;
- 配置语法-proxy_cache_path
- Syntax: proxy_cache_path path [level=levels] …
- Default: -
- Context: http
- 配置语法-proxy_cache
- Syntax: proxy_cache zone | off;
- Default: proxy_cache off;
- Context: http, server, location
- 配置语法-缓存过期周期
- Syntax: proxy_cache——valid [code …] time;
- Default: -
- Context: http, server, location
- 配置语法-缓存的维度
- Syntax: proxy_cache_key string;
- Default: proxy_cache_key $scheme$proxy_host$request_uri;
- Context: http, server, location
- 实践场景
- 缓存命中分析
- 方法一:通过设置response的头信息Nginx-Cache,add_header Nginx-Cache “$upstream_cache_status”;
- 方法二:通过设置log_format,打印日志分析;
- 大文件分片请求-http_slice_module
- Syntax: slice size;
- Default: slice 0;
- Context: http, server, location
- 优势:每个子请求收到的数据都会形成一个独立文件,一个请求断了,其他请求不会受到影响;
四. Fastcgi
- 结构
- fastcgi代理配置
- Syntax: fastcgi_pass address;
- Default: -
- Context: location, if in location
- fastcgi缓存
- fastcgi缓存配置:
- fastcgi_cache_path(缓存路径)
- fastcgi_cache_key(缓存维度)
- fastcgi_cache(缓存对应的空间)
五、uwsgi
六、nginx作为负载均衡服务
- 按分布地域分,基于LVS的中间件架构:
- 按网络其层模型分
- 四层负载均衡:传输层,支持TCP/IP包的转发,性能快;
- 七层负载均衡(nginx是七层负载均衡):应用层,能改写http头部信息;
- nginx负载均衡结构
- 配置语法:upstream
- Syntax: upstream name {…}
- Default: -
- Context: http
- 后端服务器在负载均衡调度中的状态
- down: 当前的server暂时不参与负载均衡
- backup: 预留的备份服务器
- max_fails: 允许请求失败的次数
- fail_timeout: 经过max_fails次失败后,服务暂停的时间
- max_conns: 限制最大的接受接收的连接数bash
1
2
3
4
5upstream imooc {
server 116.62.103.228:8001 down;
server 116.62.103.228:8002 backup;
server 116.62.103.228:8003 max_fails=1 fail_timeout=10s;
}
- 轮询策略与加权轮询
- 轮询:按时间顺序逐一分配到不同的后端服务器
- 加权轮询:weight值越大,分配到的访问几率越高bash
1
2
3
4upstream imooc {
server 116.62.103.228:8001 weight=1;
server 116.62.103.228:8002 weight=2;
} - ip_hash:每个请求按访问的IP结果分配,这样来自同一个IP的固定访问一个后端服务器bash
1
2
3
4
5upstream imooc {
ip_hash;
server 116.62.103.228:8001;
server 116.62.103.228:8002;
} - url_hash:按照访问的URL的hash结果来分配请求,使每个URL定向到同一个后端服务器bash
1
2
3
4
5upstream imooc {
hash $request_uri;
server 116.62.103.228:8001;
server 116.62.103.228:8002;
} - least_conn:最少链接数,哪个机器连接数最少就分发
- hash关键数值:hash自定义key
第四章、深度学习篇
一、nginx动静分离
- 概念:通过中间件将动态请求和静态请求分离;
- 为什么:分离资源,减少不必要的请求消耗,减少请求延时;
二、nginx的rewrite规则
- 作用:实现url重写以及重定向,依赖正则匹配
- 场景:
- URL访问跳转,支持开发设计:页面跳转、兼容性支持、展示效果等
- SEO优化
- 维护:后台维护、流量转发等
- 安全
- 配置语法:rewrite
- Syntax: rewrite regex replacement [flag]
- Default: -
- Context: server, location, ifbash
1
2# 紧急维护页面
rewrite ^(.*)$ /pages/maintain.html break;
- 正则表达式
- \ 转义字符bash
1
rewrite index\.php$ /pages/maintain.html break;
- () 用于匹配括号之间的内容,通过$1、$2调用bash
1
2
3if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
- \ 转义字符
- flag
- last: 停止rewrite检测(服务重定向)
- break:停止rewirte检测(静态资源重定向)
- redirect:返回302临时重定向,地址栏会显示跳转后的地址
- permanent:返回301永久重定向(会缓存在浏览器本地),地址栏会现实跳转后的地址
- rewrite规则优先级
- 执行server块的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite
三、nginx进阶高级模块
- secure_link_module模块
- geoip_module模块
四、基于nginx的HTTPS服务
- 为什么需要HTTPS
- HTTP传输数据被中间人盗用、信息泄露
- 数据内容劫持、篡改
- 加密方式
- HTTPS协议的实现:对传输内容进行加密以及身份验证;
- HTTPS服务优化
- 激活keepalive长连接
- 设置ssl session缓存
五、nginx与LUA的开发
- Lua:一个简洁、轻量、可扩展的脚步语言;
- Nginx+Lua的优势:充分的结合Nginx的并发处理epoll优势和Lua的轻量实现简单的功能且高并发的场景;
- 示例:Nginx+Lua实现灰度发布(部分用户先体验新代码)
- nginx实现高并发、代理
- Lua脚本控制访问逻辑,根据用户信息(cookie或、ip等)判断是访问新版本还是旧版本;
第五章、nginx架构篇
一、匹配优先级
- 多个server_name中虚拟主机匹配的优先级:按照配置文件排序列表,先读取的优先级高;
- location匹配优先级
- = 进行普通字符精确匹配,匹配到就不会再继续向下查找
- ^~ 表示普通字符前缀匹配,匹配到就不会再继续向下查找
- ~ ~* 表示执行一个正则匹配,还会往下查找是否有更精确的
二、nginx常见问题
- nginx的try_files的使用:按顺序检查文件是否存在
- nginx的alias和root区别
- 用什么方法传递用户的真实IP:在第一级代理添加一个头字段存储用户真实IP
- nginx中常见的错误
- 413 Request Entity Too Large: 调整用户上传文件限制,client_max_body_size
- 502 bad gateway: 后端无响应
- 504 Gateway Time-out: 后端服务超时
三、nginx性能优化
- ab压测工具
- 安装:yum install httpd-tools
- 使用:ab -n 2000 -c 2 http://127.0.0.1/
- -n 总的请求数
- -c 并发数
- -k 是否开启长连接
- 网络、系统、服务、 程序、数据库、底层服务
- 文件句柄:
- linux\Unix一切皆文件,文件句柄就是一个索引
- 设置方式(/etc/security/limit.conf):系统全局性修改、用户局部性修改、进程局部性修改
- CPU的亲和:work绑定到CPU,减少切换的性能损耗
- nginx通用配置:https://coding.imooc.com/lesson/121.html#mid=6246
- 文件句柄:
四、nginx安全
- nginx的安全-常见的恶意行为:爬虫行为和恶意抓取、资源盗用
- 基础防盗功能
- secure_link_module对数据安全性提高加密验证和失效性,适合核心重要数据
- access_module-对后台、部分用户服务的数据提供IP防控
- nginx的安全-常见的攻击手段:
- 后台密码撞库,通过猜测密码字典不断对后台系统登录性尝试,获取后台登录密码
- 后台登陆密码复杂度
- access_module-对后台提供IP防控
- 预警机制(nginx+lua对某用户不断尝试登录进行报警)
- 文件上传漏洞-利用上传接口将恶意代码植入到服务器中,再去通过url去访问执行代码
- 在nginx配置文件中做判断
- SQL注入-利用未过滤用户输入的攻击方法,让应用运行本不应该运行的sql
- nginx+lua防火墙防sql注入:https://github.com/loveshell/ngx_lua_waf
- 后台密码撞库,通过猜测密码字典不断对后台系统登录性尝试,获取后台登录密码
五、nginx架构总结
- 定义nginx在服务体系中的角色
- 静态资源服务:浏览器缓存、类型分类、防盗链、流量限制、压缩
- 代理服务:协议类型、正向代理、反响代理、负载均衡、代理缓存、头信息处理、proxypass
- 动静分离
第六章、新特性篇
一、nginx平滑升级
- 平滑升级:不造成服务终中断,用户访问无感知;
- 升级注意:
- 新老版本Nginx安装目录结构一致
- 老版本备份:nginx -> nginx.old
- 重启进程采用reload的方式
- 升级步骤:
- 了解现有版本nginx的安装
- 按照原有的编译参数重新编译新版本
- reload服务