Nginx

  • nginx如何去处理一个请求
  • Nginx可用性探测
  • Nginx搭建静态资源服务器
  • Nginx配置https服务
  • Nginx流量统计
  • Nginx黑白名单拦截
  • 异常兜底返回
  • OpenResty的学习
  • LVS + KeepLived了解

nginx如何去处理一个请求

How nginx processes a request
首先根据请求的域名向server节点寻找匹配的server_name,找到最匹配的server后,然后在此server节点中根据请求的url寻找一个最匹配的location,然后在location找到对应要访问的upstreamlocation中设定了可以携带的请求头,带着可以携带的请求头以upstream 中配置的策略访问节点
location中对的url匹配规则(寻找最精准的进行匹配)

location [ = | ~ | ~* | ^~ ]
= 精准匹配   location =/api {...}
~ 区分大小写匹配 location ~/api {...}
~* 不区分大小写匹配 location ~*/api {...}
^~ 以/aaa(区分大小写)为开头的都匹配 location ^~/aaa {...}location ^~*/aaa/bbb$ {...}  必须以三个/aaa开头,bbb结尾

nginx中可以使用哪些变量

名称                    说明
$arg_name            请求中的name参数
$args                请求中的参数
$content_length HTTP 请求信息里的"Content-Length"
$content_type        请求信息里的"Content-Type"
$host                请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名
$hostname            机器名使用 gethostname系统调用的值
$http_cookie         cookie 信息
$http_referer        引用地址
$http_user_agent    客户端代理信息
$http_via           最后一个访问服务器的Ip地址。
$http_x_forwarded_for   相当于网络访问路径
$is_args             如果请求行带有参数,返回“?”,否则返回空字符串
$limit_rate         对连接速率的限制
$nginx_version      当前运行的nginx版本号
$pid                worker进程的PID
$query_string       与$args相同
$remote_addr       客户端IP地址
$remote_port       客户端端口号
$request           用户请求
$request_method    请求的方法,比如"GET"、"POST"等
$request_uri        请求的URI,带参数
$scheme              所用的协议,比如http或者是https
$server_name       请求到达的服务器名
$server_port         请求到达的服务器端口号
$server_protocol    请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
$uri               请求的URI,可能和最初的值有不同,比如经过重定向之类的

简单使用如下

events { #在linux系统上使用这种模式会提高很大效率use epoll;#连接最大数为(worker_connections * worker_processes)worker_connections  1024;
}
​
server{...#5简单防爬配置if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") {return 403;}location / { # 1 允许代理节点获得请求头中的信息# 用户的真实ip,如果不配置此信息代理节点获得不到用户的ipproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#2 解决跨域配置#允许跨域请求的域,*和$http_origin 代表所有#不然会报No 'Access-Control-Allow-Origin' header is present on   #the requested resource. Origin 'null' is therefore not allowed access.add_header 'Access-Control-Allow-Origin' $http_origin;#允许带上cookie请求add_header 'Access-Control-Allow-Credentials' 'true';#允许携带哪些headeradd_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';#允许请求的方法,比如 GET/POST/PUT/DELETEadd_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
​#3 如果预检请求则返回成功,不需要转发到后端,节约资源if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 200;}#4 防盗链设置valid_referers none blocked www.lizhiyu.xyz;if ($invalid_referer) {#或者永久重定向本网站首页return 403;}#valid_referers: 指定资源访问是通过以下几种方式为合法,即白名单。#none:允许缺失的头部访问。#blocked:允许referer没有对应值的请求。#server_names:若referer站点域名与server_name中本机配的域名一样允许访问。}
}

Nginx可用性探测

Nginx可以配置一些策略,来实现反向代理,如果反向代理的节点不可用,Nginx则在固定间内不会再去访问这个节点
这个固定时间和定义代理节点不可用配置如下

proxy_next_upstream说明
max_fails,fail_timeout,backup, down说明

upstream test {#配置的代理节点#此节点如果访问max_fails次出错则在fail_timeout时间内不再访问#出现错误后过了fail_timeout会再次访问#max_fails如果配置成0则代表不管出现多少次错误都会访问server localhost:8080 max_fails=2 fail_timeout=60s;server localhost:8081 max_fails=2 fail_timeout=60s;
}
server{​location /api/ {proxy_pass http://test;#定义怎样才算次服务器不可用#当请求连接后台出错、连接响应出错、连接超时、http状态码#当fail_timeout时间内出现max_fails次此错误则代表此节点不可用proxy_next_upstream error timeout http_500 http_503 http_404;}
}

Nginx搭建静态资源服务器

1.jpg文件放到/software/img目录下
然后访问https://www.lizhiyu.xyz/img/1.jpg即可下载图片
配置文件如下

   location /img {alias /software/img/;}

Nginx配置https服务

安装依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
刪除安裝过的包,然后重新安装nginx(因为需要安装ssl模块)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install
配置文件如下

http {server {listen       80;server_name  localhost;location / {# 配置http 永久重定向到httpsrewrite ^/(.*)  https://www.lizhiyu.xyz/$1 permanent;}}# HTTPS serverserver {# https使用443端口,记得将开启端口listen       443 ssl;# 配置域名server_name  www.lizhiyu.xyz;#证书位置ssl_certificate      /usr/local/https/5148543_www.lizhiyu.xyz.pem;#密钥位置ssl_certificate_key  /usr/local/https/5148543_www.lizhiyu.xyz.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   html;index  index.html index.htm;}}
}

Nginx流量统计

access.log 日志记录格式如下
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' $request_time;
access日志记录格式选为为main
access_log logs/access.log main;
查看访问最频繁的前100个IP
awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100
统计访问最多的url 前20名
cat access.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条
cat access.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
​备注:$NF 表示最后一列, awk ‘{print $NF}’

Nginx黑白名单拦截

nginx.conf配置文件中配置如下
全局异常兜底数据返回

{#配置为引入黑名单配置include blacklist.conf;server {..}
}

nginx.confblacklist.conf在同级目录下,blacklist.conf配置如下

{#配置禁止访问的ip(再次访问会返回403状态码)deny 192.168.8.113;deny 106.121.65.84;
}

配置完成后执行./nginx.conf -s reload命令
执行完这个命令master进程会通知 worker进程执行完当前任务后关闭
master去加载完配置文件再创建新的 worker进程执行任务

异常兜底返回

为了防止后端出现错误返回错误信息,在nginx层面对错误信息进行拦截
配置信息如下

server{location /img {alias /software/img/;#异常返回兜底开启proxy_intercept_errors on;}#当后端返回状态码为 404 500 .... 会返回200的状态码error_page  404 500 502 503 504  =200  /default_api;#当出现错误码就会访问这个locationlocation = /default_api {#返回数据格式default_type application/json;#返回的数据信息return 200 '{"code":"-1","msg":"invoke fail, not found "}';}
}

OpenResty的学习

由于Nginx是用c语言编写,想要扩展Nginx就要书写c语言(不易于扩展),使用OpenResty可以对Nginx通过lua脚本进行扩展,例如lua脚本操作redis等
介绍: OpenResty中自带Nginx,同时提供了一些插件
安装
使用
openResty会分为多个阶段按顺序处理每一个请求,主要包括如下阶段
init_by_lua_file 初始化阶段
init_worker_by_lua_file 初始化worker阶段
rewrite_by_lua_file 重定向阶段
access_by_lua_file 访问控制阶段
content_by_lua_file内容生成阶段
简单的使用

查看版本
resty -V (能够查看到openresty版本 和 安装过的模块)
编辑:/usr/local/openresty/nginx/conf/nginx.conf
http{#生产环境要开启on,本地测试可以使用off达到时时刷新lua_code_cache off;# 虚拟机主机块server{# 监听端口listen 80;# 配置请求的路由location /{#指定格式为htmldefault_type text/html;#content_by_lua_block是openResty中接收请求的一个阶段#是生成内容的阶段content_by_lua_block{#输出一句话ngx.say("hello world");}}}
}#使用其他方式
http{#设置lua扩展库的位置 (位置就固定写这个)lua_package_path "$prefix/lualib/?.lua;;";#设置c扩展库的位置lua_package_cpath "$prefix/lualib/?.so;;";server{# 监听端口listen 80;# 配置请求的路由location /{#格式default_type text/html;#执行learn.lua脚本content_by_lua_file lua/learn.lua;}}
}
#限速使用例子location /download {#access_by_lua_block 是openResty接收请求的一个阶段#这个阶段用来控制访问access_by_lua_block {#limit_rate 是nginx中可以使用的变量(上面有说写)、#在openResty中可以通过ngx.var.variable使用此变量ngx.var.limit_rate = "300K"}alias /usr/local/software/app;}#黑名单使用例子
location / {#访问控制阶段access_by_lua_file lua/blackList.lua;proxy_pass http://upstreamName;
}
blackList.lua内容如下
local black_ips = {["127.0.0.1"]=true}
​
local ip = ngx.var.remote_addr
if true == black_ips[ip] then#返回一个403状态码ngx.exit(ngx.HTTP_FORBIDDEN)return;
end

停止
./nginx -s stop
启动
./nginx -c /usr/local/openresty/nginx/conf/nginx.conf
重新加载
./nginx -s reload

LVS + KeepLived了解

志宇-Nginx学习相关推荐

  1. 志宇-RabbitMQ学习

    RabbitMQ RabbitMQ安装 RabbitMQ使用 RabbitMQ发送消息步骤图 公平消费和消息可靠性传递 防止重复消费 有序消费 消息堆积怎么处理 spring集成RabbitMQ使用 ...

  2. 志宇-gitlib学习

    gitlib gitlib是什么 gitlib的部署 1.配置yum源 2.更新本地yum缓存 3.安装GitLab社区版 4.更新配置信息 1 修改内存配置 2 修改端口配置 3 修改邮箱配置 5. ...

  3. 志宇-RocketMQ学习

    RocketMQ RocketMQ安装 RocketMQ-console安装 RocketMQ简单使用 RabbitMQ核心概念 消息发送状态(返回对象中的枚举类型有4种) 重试次数 RocketMQ ...

  4. 志宇-Jenkins学习

    Jenkins 部署Jenkins 访问Jenkins Jenkins安装插件 Jenkins配置 配置JDK 配置MAVEN 配置Git 配置邮箱 Jenkins配置GitHub Jenkins授权 ...

  5. 志宇-nexus学习

    nexus /ˈneksəs/ 环境安装 nexus安装 nexus 使用 登录nexus 创建一个公司的私有仓库,然后添加到私服的中央仓库中 私服代理配置成阿里云镜像 maven加载setting文 ...

  6. Nginx 学习总结

    Nginx 学习总结 文章目录 Nginx 学习总结 简介 一.安装Nginx 二.端口域名映射配置 三.反向代理 正向代理和反向代理理解 四.负载均衡 简介 Nginx 是一款高性能的 http 服 ...

  7. Nginx学习4:负载均衡实例

    Nginx配置实例-负载均衡 目标 在浏览器地址栏输入地址 http://192.168.126.131:8080/edu/a.html,负载均衡效果,平均分配到 8080 和 8081 端口中 准备 ...

  8. Nginx 学习总结(2) —— 基本配置

    这是 Nginx 学习总结的第二篇,上一篇介绍到了 Nginx 学习总结(1) -- 概述,这一篇会对 Nginx 的基本配置做一些总结. Nginx 配置信息主要分为六大部分: main(全局设置) ...

  9. nginx学习总结五(nginx反向代理)

    nginx学习总结五(nginx反向代理)                             2011-02-28 12:59:33标签:反向代理nginx负载均衡            原创作 ...

最新文章

  1. Android-----application的学习
  2. Centos环境下部署游戏服务器-软件安装
  3. 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢
  4. 网络爬虫-获取网页中的数据加伪装头,伪装成浏览器多次访问,避免单次访问导致ip被封
  5. Java回调函数使用
  6. SQL Server的导出导入方式有
  7. javascript焦点图
  8. mysql+imx6+移植_imx6ulevk---MfgTool的使用心得
  9. himawari-8卫星叶绿素a产品、_海洋卫星眼中的台风quot;海神quot;
  10. 【转】Volatile 实现原理
  11. Hive实战—时间滑动窗口计算
  12. 使用阿里云Maven仓库
  13. ArcGIS转CAD坐标
  14. C99 designator ‘name’ outside aggregate initializer
  15. linux kde磁盘扫描,在KDE桌面中使用Krusader进行更好的文件管理 | MOS86
  16. 阿里云 - MaxCompute研究
  17. KMeans算法的K值以及初始类簇中心点的选取
  18. 网校搭建9:微信登录
  19. Hackcity 参赛必读
  20. 对于 idea 的一些处理笔记

热门文章

  1. 网络字体的中文用法(一)
  2. 《分销商开发、维护与管理》--王越老师
  3. 找回word文件的两种密码
  4. 用VS2005制作网页对IIS进行操作
  5. CF趁手外设选购指南【耳机、键盘篇】(转)
  6. 投资组合图形化:EAP.util.plot
  7. QYT多链路融合通信网关(应急通讯、车载通讯、视频传输)应用
  8. KMSmicro 4.0 激活方法的误区解读
  9. BJFU-Algorithm Design and Analysis-Experiment 7_string
  10. 华为摄像机搜索软件_华为安防:举智能之火 成燎原之势