nginx特点
处理速度快(异步非阻塞IO,零拷贝,mmap,缓存机制)
扩展性好(模块化设计)
内存性能好(模块化设计)
内存消耗低(异步非阻塞,多阶段处理)
具有很高的可靠性(无数次的生产验证,很多头部公司都在用)
热部署
高并发连接(事件驱动模型,多进程机制)
自由的DSD许可协议(可以自己修改代码后发布,包容性极强)
nginx模块
核心模块
标准HTTP模块
可选HTTP模块
邮件服务模块
第三方模块
nginx常见应用场景
反向代理
负载均衡
缓存
限流
黑/白名单
静态资源服务器
动静分离
防盗链
跨域
高可用
nginx.conf指令块
全局模块
events块
http块
server块
location块
upstream块
location 路由匹配规则(nginx根据用户请求的URI来匹配对应的location模块)
location配置语法:location [修饰符] pattern {…}
常见匹配规则如下:
修饰符 作用
空 无修饰符的前缀匹配,匹配前缀是 你配置的(比如说你配的是 /aaa) 的url
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ ^~类型的前缀匹配,类似于无修饰符前缀匹配,不同的是,如果匹配到了,那么就停止后续匹配
/ 通用匹配,任何请求都会匹配到(只要你域名对,所有请求通吃!)
关于location 匹配优先级
=(精确匹配) > ^~(前缀匹配) > 正则 > 无修饰符的前缀匹配 > /(通用匹配)
反向代理
通过upstream指令块来定义我们的上游服务(即被代理的服务)
通过location指令块中的 proxy_pass指令,指定该location要路由到哪个upstream(注意上边的 proxy_pass http://mybackendserver/ 后边这个斜线加的话不会拼接/backend , 而不加的话会拼接 /backend)
负载均衡
负载均衡就是从 upstream 模块定义的后端服务器列表中按照配置的负载策略选取一台服务器接受用户的请求。
nginx常用的负载策略:
负载策略 描述 特点
轮询 默认方式
weight 权重方式
ip_hash 依据ip的hash值来分配
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 依据URL分配方式
跨域
产生跨域问题的主要原因就在于同源策略。同源策略主要是指三点相同即:协议+域名+端口 相同的两个请求,则可以被看做是同源的,但如果其中任意一点存在不同,则代表是两个不同源的请求,同源策略会限制不同源之间的资源交互从而减少数据安全问题。
nginx解决跨域
解决跨越就得避免不同源,让前后端统一使用一个端口,一个server_name,server支持多个location配置呀(一个location处理前端,一个location转发后端)
缓存
nginx缓存配置参数
proxy_cache、proxy_cache_valid、proxy_cache_key、proxy_cache_path、proxy_cache_bypass、proxy_cache_min_uses、proxy_cache_use_stale、proxy_cache_lock、proxy_cache_lock_timeout、proxy_cache_methods、...,事实上,ngx_http_proxy_module模块中代理缓存proxy_cache相关的指令远不止这些。
黑白名单
nginx黑白名单比较简单,allow后配置你的白名单,deny后配置你的黑名单。
nginx限流
Nginx主要有两种限流方式:按并发连接数限流(ngx_http_limit_conn_module)、按请求速率限流(ngx_http_limit_req_module 使用的令牌桶算法)
其他一些比较常用的指令与说明
https配置
压缩
rewrite
if
nginx全局变量
auto_index
root&alias(指定静态资源root拼接根路径&alias不拼接)
upstream 中常用的几个指令
重试策略
关于backup
最后,贴出完整nginx.conf文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# log_format debug '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#
log_format debug ' $remote_user [$time_local] $http_x_Forwarded_for $remote_addr $request '
'$http_x_forwarded_for '
'$upstream_addr '
'ups_resp_time: $upstream_response_time '
'request_time: $request_time';
access_log /var/log/nginx/access.log debug;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
upstream mybackendserver {
server 172.30.128.64:8081 fail_timeout=60s max_fails=3; # 60秒内 如果请求某一个应用失败3次,则认为该应用宕机 时间到后再有请求进来继续尝试连接宕机应用且仅尝试 1 次,如果还是失败,则继续等待 60 秒...以此循环,直到恢复
server 172.30.128.64:8082;
server 172.30.128.64:8083 backup; # 设置8083位备机
}
# 开启/关闭 压缩机制
gzip on;
# 根据文件类型选择 是否开启压缩机制
gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/jpg image/gif image/png application/json;
# 设置压缩级别,越高资源消耗越大越耗时,但压缩效果越好
gzip_comp_level 9;
# 设置是否携带Vary:Accept-Encoding 的响应头
gzip_vary on;
# 处理压缩请求的 缓冲区数量和大小
gzip_buffers 32 64k;
# 对于不支持压缩功能的客户端请求 不开启压缩机制
gzip_disable "MSIE [1-6]\."; # 比如低版本的IE浏览器不支持压缩
# 设置压缩功能所支持的HTTP最低版本
gzip_http_version 1.1;
# 设置触发压缩的最小阈值
gzip_min_length 2k;
# off/any/expired/no-cache/no-store/private/no_last_modified/no_etag/auth 根据不同配置对后端服务器的响应结果进行压缩
gzip_proxied any;
# 指定缓存存放目录为/usr/local/nginx/test/nginx_cache_storage,并设置缓存名称为mycache,大小为64m, 1天未被访问过的缓存将自动清除,磁盘中缓存的最大容量为1gb
proxy_cache_path /usr/local/nginx/test/nginx_cache_storage levels=1:2 keys_zone=mycache:64m inactive=1d max_size=1g;
# 对请求速率限流
#limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=5r/s;
# 对请求连接数限流
limit_conn_zone $binary_remote_addr zone=myConnLimit:10m;
# --------------------HTTP 演示 配置---------------------
server {
listen 80 default;
charset utf-8;
server_name www.hzznb-xzll.xyz hzznb-xzll.xyz;
#location /static/ {
# root /usr/local/nginx/test; # /usr/local/nginx/test/static/xxx.jpg
#}
location /static { # 注意一般 alias的 url都不带后边的/
alias /usr/local/nginx/test/; # 使用alias时 这里的目录最后边一定要加/ 否则就404
}
# 测试autoindex效果
location /book/ {
root /usr/local/nginx/test;
autoindex on; # 打开 autoindex,,可选参数有 on | off
autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml
autoindex_exact_size on; # 修改为off,会以KB、MB、GB显示文件大小,默认为on以bytes显示出?件的确切??
autoindex_localtime off; # 显示?件时间 GMT格式
}
# 临时重定向
location /temp_redir {
rewrite ^/(.*) https://www.baidu.com redirect;
}
# 永久重定向
location /forever_redir {
rewrite ^/(.*) https://www.baidu.com permanent;
}
# rewrite last规则测试
location /1 {
rewrite /1/(.*) /2/$1 last;
}
location /2 {
rewrite /2/(.*) /3/$1 last;
}
location /3 {
alias '/usr/local/nginx/test/static/';
index location_last_test.html;
}
}
# --------------------HTTP配置---------------------
server {
listen 80;
charset utf-8;
#server_name www.xxxadminsystem.com;
server_name www.hzznbc-xzll.xyz hzznbc-xzll.xyz;
# 重定向,会显示跳转的地址server_name,如果访问的地址没有匹配会默认使用第一个,即www.likeong.icu
return 301 https://$server_name$request_uri;
# # 指定 username 参数中只要有字母 就不走nginx缓存
# if ($arg_username ~ [a-z]) {
# set $cache_name "no cache";
# }
# # 前端页面资源
# location /page {
# alias '/usr/local/nginx/test/static/';
# index index_page.html;
# allow all;
# }
# # 后端服务
# location /interface {
# proxy_pass http://mybackendserver/;
# # 使用名为 mycache 的缓存空间
# proxy_cache mycache;
# # 对于200 206 状态码的数据缓存2分钟
# proxy_cache_valid 200 206 1m;
# # 定义生成缓存键的规则(请求的url+参数作为缓存key)
# proxy_cache_key $host$uri$is_args$args;
# # 资源至少被重复访问2次后再加入缓存
# proxy_cache_min_uses 3;
# # 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取
# proxy_cache_lock on;
# # 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端
# proxy_cache_lock_timeout 4s;
# # 对于请求参数中有字母的 不走nginx缓存
# proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存
# # 在响应头中添加一个缓存是否命中的状态(便于调试)
# add_header Cache-status $upstream_cache_status;
# limit_conn myConnLimit 12;
# limit_req zone=myRateLimit burst=5 nodelay;
# limit_req_status 520;
# limit_req_log_level info;
#}
}
# --------------------HTTPS 配置---------------------
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name www.hzznb-xzll.xyz hzznb-xzll.xyz;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /usr/local/nginx/certificate/hzznb-xzll.xyz_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /usr/local/nginx/certificate/hzznb-xzll.xyz.key;
#停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
ssl_session_timeout 5m;
#服务器支持的TLS版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#开启由服务器决定采用的密码套件
ssl_prefer_server_ciphers on;
# 指定 username 参数中只要有字母 就不走nginx缓存
if ($arg_username ~ [a-z]) {
set $cache_name "no cache";
}
# 前端页面资源
location /page {
alias '/usr/local/nginx/test/static/';
index index_page.html;
allow all;
}
# 后端服务
location /interface {
proxy_pass http://mybackendserver/;
# 指定哪些错误状态才执行 重试
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;
# 使用名为 mycache 的缓存空间
proxy_cache mycache;
# 对于200 206 状态码的数据缓存2分钟
proxy_cache_valid 200 206 1m;
# 定义生成缓存键的规则(请求的url+参数作为缓存key)
proxy_cache_key $host$uri$is_args$args;
# 资源至少被重复访问2次后再加入缓存
proxy_cache_min_uses 3;
# 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取
proxy_cache_lock on;
# 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端
proxy_cache_lock_timeout 4s;
# 对于请求参数中有字母的 不走nginx缓存
proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存
# 在响应头中添加一个缓存是否命中的状态(便于调试)
add_header Cache-status $upstream_cache_status;
limit_conn myConnLimit 12;
# limit_req zone=myRateLimit burst=5 nodelay;
# limit_req_status 520;
# limit_req_log_level info;
}
# 后端服务
location /interface2 {
proxy_pass http://mybackendserver;
# 使用名为 mycache 的缓存空间
proxy_cache mycache;
# 对于200 206 状态码的数据缓存2分钟
proxy_cache_valid 200 206 1m;
# 定义生成缓存键的规则(请求的url+参数作为缓存key)
proxy_cache_key $host$uri$is_args$args;
# 资源至少被重复访问2次后再加入缓存
proxy_cache_min_uses 3;
# 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取
proxy_cache_lock on;
# 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端
proxy_cache_lock_timeout 4s;
# 对于请求参数中有字母的 不走nginx缓存
proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存
# 在响应头中添加一个缓存是否命中的状态(便于调试)
add_header Cache-status $upstream_cache_status;
limit_conn myConnLimit 12;
# limit_req zone=myRateLimit burst=5 nodelay;
# limit_req_status 520;
# limit_req_log_level info;
}
}
# include /etc/nginx/conf.d/*.conf;
}