nginx的理论知识

nginx隐藏版本号:

到存放编译安装的nginx包的路径下找--ngx_http_header_filter_module.c
#修改49行--定义响应报文的serevr字段信息后,重新编译安装

升级openssl版本

1、下载要升级的openssl压缩包到指定的文件夹并解压
2、停止nginx服务后,重新编译,添加新的openssl,--with-openssl=path
3、编译好启动服务,nginx -V查看升级后的openssl

nginx rewrite功能

1、ngx_http_rewrite_module模块
if指令:用于条件匹配判断结果选择不同的nginx配置,仅能做单次的判断
格式:
if (条件匹配--A) {
   actionB
}
如果A满足条件要求,则执行B,否则不执行
=:比较变量和字符串是否相等
~:区分大小写
~*:不区分大小写
-f:判断请求文件是否存在
-d:判断请求目录是否存在
-x:判断文件是否可执行
-e:判断请求的文件或目录是否存在
2、set指令:指定key并给其定义个变量,或者调用nginx的内置变量赋值给key,
set的定义格式:set $key value
例如:
location{
set $name mage;
echo $name;
}
3、break:中断当前相同作用域的中的其他nginx配置

return:用于完成对请求的处理并直接向客户端返回响应状态码,处于此指令后的
所有配置都将不被执行

例如:
location /{
return number;返回给客户端的状态码
return number[test];返回给客户端的状态码及响应报文的实体内容,可以使用变量
return number url;返回给客户端的url地址
}

rewrite_log:ngx_http_rewrite_module模块记录到error_log日志文件中(需要日志级别为notice)
location{
rewrite_log on;
set $name mage;
echo $name;
}
4、rwrite flog的使用:
flag:redirect(临时重定向302)permanent(永久重定向301)、break、last
跳转型:由客户端浏览器重新对新地址进行请求(redirect、redirect)
代理型:在WEB服务器内部实现跳转(break、last)
redirect;
#临时重定向,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后
的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,
不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
rewrite:域名永久重定向和临时重定向
域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳
转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。
rewrite案列:需要将www.magedu.com的请求永久重定向到www.magedu.org
location{
index index.html
rewrite /http://www.magedu.org permanent;
rewrite /http://www.magedu.org redirect;
}
rewrite案例:自动跳转 https
案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全

部自动跳转至 https,另外也可以实现部分 location 跳转
注意:如果没有加if条件判断,会导致死循坏

ocation /{ #针对全站跳转
  root /data/nginx/html/pc;
  if ($scheme http) {
     rewrite /https://hostname rewrite;
	 }
location /web {#针对特定的url进行跳转
  if ($scheme http) {
     rewrite /https://hostname rewrite;
	 }
}
rewrite 案例: 判断文件是否存在
案例:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页
location / {
root /data/nginx/html/pc;
index index.html;
if (!-e $request_filename) {
rewrite .* http://www.magedu.org/index.html; #实现客户端浏览器的302跳转
#rewrite .* /index.html; #web服务器内部跳转
}
}

location的相关用法

1、语法规则:
location [=、*、^~] uri
=:需要和请求字符串与uri精确匹配,如果匹配成功,就停止向下匹配
^~:对开头不区分大小写
~:区分大小写
~*:不区分大小写
$:以什么结尾的文件
\:转移符,可以将. *等转义为普通字符
=,^~,~|~*,/
匹配优先级:=, ^~, ~/~*,/
2、匹配的优先级从高到低
location优先级:(location =) > (location ^~ 路径) > (location ~,~* 正则顺序) >
(location 完整路径) > (location 部分起始路径) > (/)

通常使用的:=或者~ .(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$*

反向代理-----入门

1、uri没有使用正则表达式
location /web {
  index index.html 默认页面
  proxy_pass http://10.0.0.8:8080;
  或者
  proxy_pass http://10.0.0.8:8080/;
  }

注意:url后面加/和不加/区别较大

  • 当加斜杠时,当访问/web时,其实就是访问后端服务器http://10.0.0.8:8080/index.html的内容返回给客户端的
    访问的过程:client—http://nginx/web/index.html—http://10.0.0.8:8080/index.html
  • 当不加斜杠时,类似于别名,当访问/web时,就是访问后端服务器http://10.0.0.8:8080/web/index.html的内容返回给客户端的(访问的前提时后端服务器的必须有/web/index.html这个访问页面才可以访问)
    访问的过程:client—http://nginx/web/index.html—http://10.0.0.8:8080/web/index.html
    注意:我们通常proxy_pass 后面的url都是加/(前提是uri没有使用正则表达式
2、uri使用了正则表达式
erver_name HOSTNAME;
location ~|~* /uri/ {
  proxy_pass http://host:port;(此时uri后面一定不能加/)
  }

访问过程: http://hostname/uri/ ----http://host/uri/

反向代理的相关选项

1、proxy_hide_header :在nginx作为反向代理时,隐藏后端服务器相应头部的信息,可以设置在location,http,serevr块中
#示例: 隐藏后端服务 器ETag首部字段
location /web {
  index index.html;
   proxy_pass http://10.0.0.18:8080/;
   proxy_hide_header ETag;
}
2、proxy_pass_header:把后端服务器头部的部分信息传递给客户端
  • #示例:透传后端服务器的Server和Date首部,同时不再显示前端服务器的Server字段
    proxy_pass_header Server;
    proxy_pass_header Date;
    
    #可更改或添加客户端的请求头部信息内容转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的时候
    就要更改每一个的报文的头部
    proxy_set_header
    
    实例:
    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    proxy_set_header X-Real-IP $remote_addr;
    #添加HOST到报文头部,如果客户端为NAT上网那么其值为客户端的共用的公网IP地址,常用于在日之中记录
    客户端的真实IP地址。
    #在后端httpd服务器修改配置,添加日志记录X-Forwarded-For字段
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{XReal-IP}i\"" combined
    #在后端服务器查看日志6.1.1.2 实战案例: 反向代理单台 web 服务器
    要求:将用户对域 www.magedu.org 的请求转发值后端服务器处理
    
    [root@centos8 ~]#tail /var/log/httpd/access_log -f
    10.0.0.8 - - [09/Oct/2020:21:50:57 +0800] "HEAD /static/index.html HTTP/1.0" 200
    
    - "-" "curl/7.29.0" "10.0.0.7"
    
3、设置nginx服务器与后端服务器尝试建立的连接的超时时间,默认60s
proxy_connect_timeout time;
4、设置nginx服务器向后端服务器或服务器组发起读的请求后,等待超时的时间,默认60s
proxy_read_timeout time;
5、设置nginx服务器向后端服务器或服务器组发起写的请求后,等待超时的时间,默认60s
proxy_send_timeout time;
6、设置nginx提供代理服务的http协议的版本
proxy_http_version 1.0;

反向代理----缓存

1、nginx的缓存功能默认是关闭的状态
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
缓存的内容
proxy_cache_key value
缓存的路径
proxy_cache_path;
#调用缓存功能,需要定义在相应的配置段,如server或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓
缓存的实例:
root@centos8 ~]# vim /apps/nginx/conf/nginx.conf

proxy_cache_path /data/nginx/proxycache(缓存的路径) levels=1:1:1(缓存的目录层次) keys_zone=proxycache:20m(缓存内容的大小)
inactive=120s max_size=1g; #配置在nginx.conf http配置段
[root@centos8 ~]# vim /apps/nginx/conf/conf.d/pc.conf
location /static { #要缓存的URL 或者放在server配置项对所有URL都进行缓存
proxy_pass http://10.0.0.18:80; 代理服务器的IP
proxy_cache proxycache;
proxy_cache_key $request_uri; #缓存的键
#proxy_cache_key $host$uri$is_args$args; #缓存键的值
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 5m; #必须指定哪些响应码的缓存
proxy_set_header clientip $remote_addr;
}

反向代理-----高级

upstream的格式
upstream name{
  server host1IP:port;
  server host2IP:port;
}
server {
   listen 
   server_name http://hostname/uri/
   location / {
   index index.html
   root path
   proxy_pass name
   }
}
weight=number :设置权重,默认为1
max_conns=number:给当前serevr设置最大活动连接数,默认为0没有限制
max_fails=number:#对后端服务器连续监测失败多少次就标记为不可用,默认为1次,当客户端访问时,才
会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #对后端服务器的单次监测超时时间,默认为10s
backup:设置为备份服务器
down:标记为down状态
resolve:当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
实例:
upstream www.magedu.org {
server 10.0.0.101:80; weight=1 fail_timeout=5s max_fails=3;  #后端服务器状态监测
server 10.0.0.102:80;weight=1 fail_timeout=5s max_fails=3;
server 127.0.0.1:80 weight=1 fail_timeout=5s max_fails=3 backup;
}
server {
  listen 80;
  server_name www.magedu.org;
  location /web {
    index index.html;
    proxy_pass http://www.magedu.org;
  }
}

nginx的总结

1、工作原理 及功能
1.1工作原理
1、Nginx由内核和模块组成。Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件
将此次请求映射到一个location block,
2、而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。
通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。
3、handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。
1.2、功能
正向代理  反向代理  负载均衡  HTTP服务器(包含动静分离)
2、Nginx的模块从结构上分为
核心模块:HTTP模块、EVENT模块和MAIL模块
基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。
3、 Nginx的模块从功能上分为
Core    : 核心模块;构建nginx基础服务、管理其他模块。
Handlers: 处理器模块;此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
Filters : 过滤器模块;此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
Proxies : 代理类模块;此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
4、nginx的工作流程
Nginx的核心模块:主要负责建立nginx服务模型、管理网络层和应用层协议、以及启动针对特定应用的一系列候选模块。其他模块负责分配给web服务器的实际工作:
    (1) 当Nginx发送文件或者转发请求到其他服务器,由Handlers(处理模块)或Proxies(代理类模块)提供服务;
    (2) 当需要Nginx把输出压缩或者在服务端加一些东西,由Filters(过滤模块)提供服务。
5、Nginx模块处理流程
1.客户端发送HTTP请求
2.Nginx基于配置文件中的位置选择一个合适的处理模块
3.负载均衡模块选择一台后端服务器 (如果有)
4.处理模块进行处理并把输出缓冲放到第一个过滤模块上
5.第一个过滤模块处理后输出给第二个过滤模块 
6.然后第二个过滤模块又到第三个 
7.依此类推,最后把响应发给客户端。
6、 Nginx请求处理流程
1、Nginx在启动时会以daemon形式在后台运行,采用多进程+异步非阻塞IO事件模型来处理各种连接请求。
2、多进程模型包括一个master进程,多个worker进程,一般worker进程个数是根据服务器CPU核数来决定的。
3、master进程负责管理Nginx本身和其他worker进程。
1.操作系统提供的机制(例如 epoll, kqueue 等)产生相关的事件。
2.接收和处理这些事件,如是接收到数据,则产生更高层的 request 对象。
3.处理 request 的 header 和 body。
4.产生响应,并发送回客户端。
5.完成 request 的处理。
6.重新初始化定时器及其他事件。
7、Nginx进程模型
1、Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。
2、master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
3、worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。
nginx 的优化:
1、修改nginx的启动用户
2、隐藏nginx的版本号
3、优化nginx的进程和指定CPU和进程的绑定
(目的:避免nginx的工作进程在不同的cpu间切换,避免出现内存频繁的申请和回收带来的不必要资源消费) 
4、优化nginx的工作进程的连接数
5、优化日志内容和日志的类型
6、设置压缩的文件类型和压缩比
7、设置proxy反向代理的优化参数
8、设置客户端上传文件的大小和类型
9、配置基于域名访问的虚拟主机和location
10、设置防盗链功能
nginx的调度算法
1、round-robin(rr):轮训调度,默认的
2、ip-hash会话绑定
3、least-conn:最少会话链接
4、url-hash:缓存服务
5、权重
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值