Nginx理论笔记

我们总说,Nginx是反向代理服务器,包括你去找各个地方的资料,都告诉你Nginx是反向代理服务器,性能超高,c语言编写。但是什么是反向代理?什么是正向代理?这是Nginx学习的基础内容,我们就从这开始。

反向代理服务器与正向代理服务器

正常情况下,我们只需要向服务器的网址发请求,然后服务器会给我们一个反馈。

然后,现在多了一个代理服务器,你需要向代理服务器 发送你想访问的网址,这个代理服务器会帮你转到这个服务器上。这就是正向代理服务器。

现在,你不知道你要访问的服务器的具体网址,但是你知道你大概要访问的网址。比如我在百度搜索“如何学习Nginx”,他会转到哪个网站?你是不知道的,而且有些服务网址也不想让你知道,就需要一个代理服务器帮助你搜寻资源,然后整合后返回给你,这就叫做反向代理服务器

画个图理解一下:
在这里插入图片描述
在这里插入图片描述
二者的核心区别就是:正向代理你需要知道自己的目标服务器,反向代理是不需要知道 目标服务器的。

正向代理服务器,其实就是vpn的原理,细节不表,怕发不出去。我们只说Nginx反向代理服务器。

域名解析过程

我们平时输入的网址,并不能被服务器识别,域名会被域名系统(DNS)转换成真正的ip地址,之后才会被识别。

Nginx文件目录

在这里插入图片描述
执行命令:

./configure
make
make install
cd /usr/local/nginx

在这里插入图片描述
那么这几个目录是干啥的呢?

  • conf 配置文件目录
    • nginx.conf: 主要配置文件
    • nginx.conf.default: 默认模板
  • html 开始页
  • logs 一些日志信息(比如当前哪个端口开放的nginx)
  • sbin 二进制目录,启动,重新启动,读取配置文件等操作都在这里面进行。

nginx配置文件

在这里插入图片描述
行数2:定义工作的核心数,要小于计算机核心数。否则上下文切换性能降低。
行数4~6:日志目录与目录级别(notice, info)
行数8:nginx所在的pid

在这里插入图片描述
行数11~13:工作模式,每个nginx最大的连接数,最大连接数一般等于work_connections*worker_processes。如果nginx作为反向代理服务器,则需要计算work_connections*worker_processes/2,因为正反两个连接算是一个整体连接。linux上通常加一个use epoll,代表异步非阻塞,基于事件驱动,可以提升效率。

events {
	use epoll;
	work_connections 1024;
}

行数16~24:自定义模板,日志的格式形式
行数26:开启高效传输模式,后续会讲。
行数27:开启tcp分段,减少网络报文数量。
行数29~30:超时断开
行数32:文件压缩传输
在这里插入图片描述
行数34:虚拟主机配置
行数35~36:监听端口和域名,若有多个则用空格隔开。
行数42~47:路径拦截,可以定义多个location, /指的是拦截的路径名称。root是资源所在地,index是找的路径,按照顺序找,如果没找到返回错误页面。
行数51~54:遇见错误码返回的路径,location写法二者都对。
在这里插入图片描述
行数56~60:遇见.php结尾,转发到http://127.0.0.1;

以上就是主要配置,配置部分可以用的时候查,记住主要的几个就行。

nginx常用用法

异常数据兜底

假设用户非法操作或者后台报错,后台一定返回异常状态码,像500或者400,那么用户不希望看到这种操作,我们可以利用nginx拦截,之后返回200(成功状态码),利用弹窗或者其他方法给用户反馈相应的提示。
在这里插入图片描述

封禁恶意ip

即使利用nginx封禁ip,恶意ip依然会访问服务器,只是在网关这一层被淘汰。服务器依然会收到大量访问而崩溃。

用nginx的具体做法为:新建配置文件blacklist.conf,添加想要加入黑名单的ip地址:
在这里插入图片描述
然后在nginx.conf内,输入include blacklist.conf,层级位于server{},则是对ip进行全网页封禁,其无法访问所有服务;层级位于server{}内部,则是对ip进行单服务封禁。
在这里插入图片描述
全局封禁实例。

解决跨域问题

至于跨域问题是什么就不提了。这里只说怎么用nginx进行跨域配置。

location / {
     add_header 'Access-Control-Allow-Origin' '*';
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
     add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
     add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 200;
     }
}

Nginx配置websocket反向代理

location / {}里面添加:

proxy_set_header Upgrade $http_upgrade
proxy_set_header Connection $connection_upgrade

但是注意,如果nginx作为服务器配置了websocket,每隔一段时间服务会断掉。因此前端需要使用心跳机制来维持连接。

Nginx接口性能优化

缓存前置

传统的缓存都会放在服务端,一般通过了nginx到达数据库或者其他服务器缓存。但是这样的话链路比较长,依然会有部分性能问题。我们这时候可以将缓存放在nginx中,用户访问先经过nginx,nginx发现用户需求在nginx里有资源,直接用nginx资源给用户,无需经历大后端。

配置方法为:

  • 本地缓存地址,用于nginx本地缓存的存放位置
    • /root/cache
  • 二级目录:当所有资源全部放在/root/cache中,可能会影响缓存性能。因此开辟了二级目录。
    • levels = 1:2。指用一位和二位十六进制数表示目录名称。第一级用一位16进制命名,比如f,第二级用两位16进制命名,比如2a。
    • levels = 1:1:1表示三级目录,每级都有16个文件。
    • 在二级目录时,第一级用一个十六进制表示,因此是有16个目录。二级目录用两个16进制数表示,因此有1616=256个目录,所以二级目录可有16256=4096个目录。
  • 在共享内存里定义一块区域,存放元数据和key
    • keys_zone
  • 最大缓存空间,如果不设置会占满磁盘空间。然后按照最少使用原则删除cache
    • max_size = 1g
  • 最久未使用时间,超过这个时间的cache删除
    • inactive = 60m
  • use_temp_path = off。把缓存从临时文件夹转移到我们的缓存文件夹,文件多了拷贝,浪费时间,所以关掉
  • 统计缓存命中
    • add_header Nginx-Cache “$upstream_cache_status”
    • 一般有hit(命中),miss(未命中)
proxy_cache_path /root/cache levels=1:2 keys_zone=cache_10m max_size=1g inactive=60m use_temp_path=off

server {
	location / {
		...
		proxy_cache cache;
		proxy_cache_valid 200 304 10m;  #状态码缓存,10min
		proxy_cache_valid 404 1m;
		proxy_cache_key $host$uri$is_args$args;
		add_header Nginx-Cache "$upstream_cache_status"
	}
}

如果出现permission denied,我们需要修改nginx.conf第一行,user root。

LVS

一个虚拟的集群系统。就是将多台主机利用虚拟技术进行集群,对外展现出一个接口,但是实际上是许多主机共同的对外接口。如此,即使主机崩溃了一个或多个,仍然能够平稳运行。

LVS解决的核心问题是负载问题。而软件负载解决的核心问题是选谁做主节点,怎么转发。选谁做主节点暂时不考虑,问题是怎么转发。目前主流有三种转发方法:

  • NAT:数据进出都通过LVS。前端访问LVS,LVS将请求传给Nginx服务器,这是数据的流入;后端将数据处理完毕后传给LVS,LVS再将数据给前端,这是数据的流出。这种方法一旦LVS的主节点性能不高,就会成为整个系统的瓶颈。
  • DR:LVS只处理前端的请求,再将请求给后端。后端直接向前端给回应,速度最快,兼容性很强,略弱于NAT
  • Tunl:LVS只处理前端请求,再将请求给后端。后端直接向前端给回应只支持少数系统。

在这里插入图片描述
VIP: Virtual IP,虚拟的IP地址,可以代替两个不同的LVS。这两个LVS其中会有一个master,一个backup。VIP一半指向主节点,当主节点挂掉指向backup。

为什么Nginx快

因为用多进程+io多路复用实现了高并发。后续内容我会更新《锁机制》《netty网络大连接》《I/O五种多路复用模型》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值