Nginx是一款轻量级的web服务器/反向代理服务器。可以在各个系统中运行,由俄罗斯的工程师设计,特点是占用内存少,并发能力强(起初解决C10K问题),事实上Nginx的并发能力在同类型的网页服务器表现较好。
Nginx作为一个强大的web服务器软件,具有高性能,高并发性,低内存占用的特点,也可以提供强大的反向代理功能。
基于反向代理功能,Nginx作为负载均衡主要有以下几个理由:
正向代理:类似一个跳板机,代理访问外部资源。 向外部访问,最终请求到了互联网。
反向代理:实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发(分发)给内部网络上的服务器,并将从内部服务器得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。向内部访问,作为一个内网的入口,反向代理服务器是和内网一个频段。
反向代理的作用:
1、保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击。大型网站,通常将反向代理作为公网访问地址,web服务器就是内网。
2、负载均衡,通过反向代理服务器来优化网站的负载。
负载均衡:字面意思就是N台服务器平均分配负载。不会因为出现某台服务器负载高而宕机或者出现某台服务器闲置的情况。负载均衡前提需要2台以上服务器才能实现。
1、轮询:Round Robin 根据ngnix.conf配置文件中的顺序,依次把客户端的web请求分发到不同的后端服务器上。
2、最少连接 least_conn:当请求来时计算每台服务器的连接数,web请求会被转发到连接数最少的服务器上。
3、IP地址哈希 ip_hash:基于ip地址进行哈希,保证同一个客户端连续的web请求都会被分发到同一个服务器进行处理,维持同一个会话,因为服务器之间会话不共享,也可以使用其他方式比如数据库把会话信息存储下来。
4、基于权重 weight:基于权重,我们可以把更多的请求分发到配置高的服务器上,相对较少的请求分到低配服务器。
upstrean : 转发配置
注意点:
1、Nginx缺省配置默认就是轮询策略。
2、Nginx的支持的http和https协议,只需要修改proxy_pass后边的协议即可。
3、Nginx支持FastCGI、uwsgi、memcached的负载均衡,只需要将proxy_pass修改为fastcgi_pass、uwsgi_pass、memcached_pass即可。
4、此策略适合服务器配置相当,无状态且短平快的服务使用。
注意点:
1、IP哈希负载均衡使用 ip_hash指令定义。
2、nginx使用请求客户端的ip地址进行哈希计算,确保使用同一个服务器响应请求。
3、此策略适合有状态服务,比如session会话。
注意点:
1、最少连接负载均衡需要通过least_conn指令定义。
2、此负载均衡策略适合于请求处理时间长短不一造成服务器过载的情况。
注意点:
1、权重的负载均衡需要使用weight指令定义。
2、权重越高分配到需要处理的请求越多。
3、此策略可以和最少连接以及ip哈希策略结合使用。
4、此策略适合服务器的硬件配置差别很大的情况。
# 参考网址:https://www.cnblogs.com/xxoome/p/5866475.html
# 实际操作(可行)
-----------------------------------------------------------------------------------------
# 为了支持 rewrite 功能,我们需要安装 pcre
yum install pcre*
# nginx不仅支持http协议还支持https协议(在ssl协议上传输http)所以需要openssl包
yum install openssl*
# 需要安装gcc环境
yum install gcc-c++
# nginx使用zlib包进行gzip
yum install -y zlib zlib-devel
# nginx 下载地址:https://nginx.org/download/
# 解压文件
tar -zxvf nginx-1.19.0.tar.gz
# 进入nginx
cd nginx
# 配置
./configure --prefix=/usr/local/nginx
# make
make
make install
# 创建日志文件夹
mkdir logs
chmod 700 logs
# 启动
cd /usr/local/nginx/sbin
./nginx
# 设置开机启动
vim /etc/rc.d/rc.local
# 末尾加
/usr/local/nginx/sbin/nginx
# 测试安装结果
ps- ef | grep nginx
http://ip:port
nginx的http_proxy模块,可以实现类似于squid的缓存功能。
原理:Nginx会对客户已经访问过的内容在Nginx服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以缓存可以减少Nginx服务器与后端服务器之间的网络流量,减少网络阻塞,同时还能减少数据传输延迟,提高用户访问速度。而且当后端服务器宕机时,Nginx服务器上的副本资源还能够回应相关的用户请求,可以提高后端服务器的健壮性。
对于缓存,出现的问题?
1、缓存文件存在哪里?
2、如何指定哪些请求被缓存?
3、缓存的有效期是多久?
4、对于某些请求,是否可以不走缓存?
在http模块下 进行配置
proxy_cache_path : Nginx使用该参数指定缓存位置
proxy_cache: 该参数为之前指定的缓存名称
proxy_cache_path : 有俩个必填参数
1、Nginx默认会缓存所有的get 和 head 方法的请求结果,缓存的key默认使用请求字符串。
2、自定义key eg: proxy_cache_key h o s t host hostrequest_uri$cookie_user ;
3、指定请求至少被发送了多少次以上时才缓存,可以防止低频请求被缓存 ;eg:一分钟最少请求5次被缓存,proxy_min_uses 5 ;
4、指定哪些方法的请求被缓存 eg: proxy_cache_methods GET HEAD POST ;
默认情况下,缓存内容是长期保留的,除非缓存的总量超出限制,可以指定缓存的有效时间。
proxy_cache_bypass : 该指令指定响应来自原始服务器而不是缓存。
eg: proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment
如果任何一个参数值不为空,或者不等于0,nginx就不会查找缓存,直接进行代理转发。
网页的缓存是由HTTP消息头中的"Cache-control"来控制的。常见取值 private、no-cache、max-age等。默认private.
设置了no-cache, 这个参数$cookie_nocache就不会为 0 ,就不会走缓存。
max-age = xxx , 缓存的内容将在xxx秒后失效。
ngx_lua模块通过将lua解释器集成进Nginx,可以采用lua脚本实现业务逻辑。
lua模块具备以下特点:
1、高并发,非阻塞的处理各种请求。
2、Lua内建协程,这样就可以很好地将异步回调转换成顺序调用的形式。
3、每一个协程都有一个独立的全局环境(变量空间),继承于全局共享的、只读的“comman data”。
得益与协程的支持,ngx_lua在处理1W个并发请求时只需要很少的内存,根据测试ngx_lua处理每一个请求只需要2KB的内存,如果使用LuaJIT则会更少。
ngx_lua非常适合用于实现可扩展的、高并发的服务。
协程类似于一种多线程,与多线程的区别有:
1、协程并非OS线程,所以创建、上下文切换开销比线程少很多。
2、协程与线程一样有自己的栈,局部变量等,但是协程的栈是在用户进程模块模拟的,所以创建切换开销很小。
3、多线程程序是多个线程并发执行,也就是说在一瞬间有多个控制流在执行。但是协程强调的是一种多个协程间协作的关系,只有当一个协程主动放弃执行权,另一个协程才能获得执行权,所以在某一瞬间。多个协程间只有一个在运行。
4、由于多个协程时只有一个在运行,所以对于临界区的访问不需要加锁。但是在多线程的情况下必须加锁。
5、多线程程序是并发执行,有多个控制流,所以程序的行为不可控。但是多个协程的执行是有开发者定义的所以是可控的。
Nginx的每个worker进程都是在epoll或者kqueue这样的事件模型之上,封装成协程,每一个请求都有一个协程在处理。这正好与Lua内建协程的模型是一致的。所以及时ngx_lua需要执行lua,相对C有一定的开销,但依然可以保证高并发能力。
Nginx采用多进程模型 单Master – 多Worker, Master进程主要用来管理Worker进程。
Worker采用单线程、非阻塞的事件模型(Event Loop,事件循环)来实现端口的监听及客户端请求的处理和响应。同时Worker还要来处理来自Master的信号,Worker进程个数一般设置为CPU核数。
Mster进程主要是以下四个功能:
Nginx工作在网络七层模型之上,通常使用nginx来做http的负载均衡,反向代理,nginx在接收到请求后会进行处理。
一个HTTP请求,分阶段处理,十一个阶段
ngx_lua属于nginx的一部分,它的执行指令都包含在nginx的11个步骤之中,相应的处理阶段可以做插入式处理,即插拔式架构。不过nginx不是所有的阶段都会运行的,另外指令可以在http,server,server if ,location , location if 几个范围进行配置。
OpenResty 是一个基于Nginx与Lua的高性能web平台,其内部集成了大量精良的Lua库、第三方模块,以及大多数的依赖项,用于方便的搭建能够处理超高并发、扩展性极高的动态web应用、web 服务和动态网关。
OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效的变成一个强大的通用web应用平台。这样web开发人员可以使用lua脚本语言调动Nginx支持的各种C以及lua模块。快速构建出足以胜任10w乃至100w以上单机并发连接的高性能web应用系统。
OpenResty的目标是让你的web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型,不仅仅对HTTP客户端请求,甚至于对远程后端诸如Mysql、Memcached 以及 redis 等进行一致的高性能响应。
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
sudo yum check-update
sudo yum install openresty
# 目录 已经集成了nginx
cd /usr/local/openresty
./nginx/sbin/nginx -p /usr/local/openresty/documents -c conf/nginx_openresty_01.conf
# 进行测试
curl -i 127.0.0.1
基本语法:listen address:port
默认:listen 80 ;
作用:listen参数决定Nginx监听哪个端口,在listen后边可以加 IP地址,端口和主机名。
location是有顺序的,如果一个请求有可能被多个location匹配,实际上这个请求会被第一个location处理。
语法:evn VAR|VAR = VALUE
作用:用户可以直接设置操作系统上的环境变量
举例:evn TESTPATH = /tmp/
语法:include /path/file;
作用:可以把其他配置文件引入进来,路径可以是绝对路径也可以是相对路径。还可以含有通配符*
语法:pid path/file;
默认:pid logs/nginx.pid;
作用:保存master进程ID 的pid文件存放路径。当kill 掉master进程之后,worker进程也会被关掉。
语法:user username [groupname]
默认:user nobody nobody;
作用:master进程fork出的进程在哪个用户和用户组下边。
语法:worker_rlimit_nofile limit;
作用:设置一个worker可以打开的最大句柄数。
语法:worker_rlimit_sigpenging limit
作用:设置每个用户发往Nginx的信号队列的大小,也就是当某个用户的信号队列满了,这个用户再发送的信号量就会被丢掉。
语法:worker_processes number;
默认:worker_processes 1 ;
作用:在master_worker运行方式下,定义worker进程的个数。worker进程的数量会直接影响性能。每个worker都是单线程的进程,它会调用各个模块来实现各种功能,如果确定这些模块不会出现堵塞式调用,进程数可以设置为cpu个数。
语法:worker_cpu_affinity cpumask
作用:假设每一个worker都是很繁忙的,如果多个进程都在争取一个cpu,那么就是会同步问题。反之一个work线程独享一个cpu,就实现了完全的并发。
举例:worker_processes 4 ;
worker_cpu_affinity 1000 0100 0010 0001;
语法:ssl_engine device;
作用: 如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以用openSSL提供的命令来查看是否有SSL硬件加速设备:openssl engine -t
语法:worker_priority nice ;
语法:accept_mutex[on / off]
默认:accept_mutex on
作用:accept_mutex是Nginx的负载均衡锁。这把锁可以让多个worker进程轮流的,序列化的与新的客户端建立TCP连接,accept锁默认是打开的,如果关闭它建立tcp连接的时间会更短,但是不利于负载均衡,不建议关掉。
语法:accept_mutes_delay Nms;
默认:accept_mutes_delay 500ms;
作用:Nginx在使用accept锁之后,同一时间,只允许有一个worker进程能够获取到锁。这个accept锁不是阻塞锁,如果取不到锁便会立即返回,如果要再次尝试获取,必须等到配置的这个时间之后才能再次尝试。
语法:multi_accept [on / off]
默认:multi_accept off ;
作用:当事件模型有新连接时,尽可能的对本次调度中客户端发起的所有TCP请求都建立连接。
语法:use[kqueue|rtsug|epoll|poll|select]
默认:Nginx会选择最合适的事件模型
作用:对于linux系统,可以选择的事件驱动模型有poll \select\epoll ,一般epoll性能最高。
语法:worker_connections numbers;
作用:定义每一个worker进程可以同时处理的最大连接数。
epoll是Linux内核为处理大批量的文件描述而作了改进的poll,是linux下多路复用IO接口select/poll的增强版本。他可以显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
优点: