Nginx介绍
是什么?
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3) 代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实 上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站 用户有:百度、京东、新浪、网易、腾讯、淘宝等。是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004 年10月4日。
特点
更快:单次请求响应更快,高并发可以更快的处理响应
高拓展性:设计极具扩展性,由多个不同功能、不同层次、不同类型且耦合度极低的模块组成
高可靠性:很多高流量网站都在核心服务器上大规模使用 Nginx
低内存消耗:一般1万个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗2.5MB内存
高并发:单机支持10万以上的并发连接
热部署:master 管理进程与 worker工作进程的分离设计,使得 Nginx 能够支持热部署
开源协议:使用 BSD 许可协议,免费使用,且可修改源码
应用场景
一、HTTP服务器 Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。 二、静态服务器 静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取 三、反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 四、负载均衡 负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
负载均衡通过upstream指令来实现。 五、动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
Nginx原理
nginx目录介绍
基本运行原理
Master进程: 读取并验证配置文件nginx.conf;管理worker进程。
Worker进程: 每个worker进程都维护一个线程(避免线程切换),处理连接和请求;注意worker进程的个数由配置文件决定,一般和cpu个数相关,配置几个就有几个worker进程
注意: 1)nginx怎么做到热部署的? 执行命令 ./sbin/nginx -s reload
修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置处理请求,而且新的请求必须交给新的worker进程,至于老的worker进程,等把以前的请求处理完成以后,kill掉就行了。
2) nginx如何做到高并发下高效处理 nginx采用linux的epoll模型,epoll模型基于事件驱动机制,可以监控多个事件是否准备完毕,如果可以,就放入epoll队列,这个过程是异步的。worker进程只需要从epoll队列循环处理即可。
3)什么是epoll
epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。下图是epoll调用过程
Nginx最小配置解析
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1)worker_processes 1; 默认为1,表示开启一个业务进程
2)worker_connections 1024; 单个业务进程可接受连接数
3)include mime.types; 引入http mime类型 告诉浏览器怎么渲染nginx返回的数据
4) default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
5)sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
6)keepalive_timeout 65; 保持连接的超时时间
7) server 模块 虚拟主机 vhost
- listen 80; 当前主机监控端口
- server_name localhost; 当前主机的域名
-
location / { //指定是uri
root html;//相对路径
index index.html index.htm;
}
-
error_page 500 502 503 504 /50x.html;//错误页
-
location = /50x.html {
root html;
}
虚拟主机与域名解析
1)虚拟主机:原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
2)域名解析:将域名解析成服务器的ip
3)servername匹配规则
- 完整匹配 同一servername中匹配多个域名
- 通配符匹配
- 通配符结束匹配
- 正则匹配
反向代理
网关 正向代理 反向代理
网关:一个网络到另一个网络的关口,将不通网络间进行访问控制,转换,交接等 正向代理:用户利用代理服务器访问目标服务器。代理服务器的代理对象是用户。简单的说可以让我们访问我们不能直接访问的资源服务
反向代理:代理对象是服务器,服务端使用代理服务器为用户提供服务
简单配置
负载均衡
策略 默认轮询 轮询
权重 权重越高分配到需要处理的请求越多。 此策略可以与least_conn和ip_hash结合使用。 此策略比较适合服务器的硬件配置差别比较大的情况。
down :表示这个机器不参与负载均衡,已下线
backup :表示这台机器作为备用,其他的都挂掉之后,这个会起作用
ip_hash 负载均衡器按照客户端IP地址的分配方式,可以确保相同客户端的请求一直发送到相同的服务器。这样每个访客都固定访问一个后端服务器。
upstream foo {
ip_hash;
server localhost:8001 weight=2;
server localhost:8002;
server localhost:8003 down;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
注意: 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。 ip_hash不能与backup同时使用。 此策略适合有状态服务,比如session。 当有服务器需要剔除,必须手动down掉。
least_conn 把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果
upstream foo {
least_conn;
server localhost:8001 weight=2;
server localhost:8002;
server localhost:8003 backup;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
注意: 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。 除了上面这些调度策略之后,还有一些第三方的调度策略可以集成到nginx中。
在实际运用中,需要根据不同的场景选择不同的策略,大多是多种策略结合使用以达到实际需求的性能。
下面两种均衡策略是第三方策略,第三方的负载均衡策略的实现需要安装第三方插件。
url_hash 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
#动态服务器组
upstream dynamic_zuoyu {
hash $request_uri; #实现每个url定向到同一个后端服务器
server localhost:8080; #tomcat 7.0
server localhost:8081; #tomcat 8.0
server localhost:8082; #tomcat 8.5
server localhost:8083; #tomcat 9.0
}
fair 按照服务器端的响应时间来分配请求,响应时间短的优先分配。
#动态服务器组
upstream dynamic_zuoyu {
server localhost:8080; #tomcat 7.0
server localhost:8081; #tomcat 8.0
server localhost:8082; #tomcat 8.5
server localhost:8083; #tomcat 9.0
fair; #实现响应时间短的优先分配
}
动静分离
动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
简单点来说,就是用户在请求的时候,如果只是简单的访问图片,html等静态的请求时,nginx直接返回,如果是发送动态请求时候,需要程序进行就由nginx把请求发送给程序,进行动态处理。
#拦截静态请求
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/data;
}
下面解析一下上述配置中的匹配规则:
~:表示匹配时区分大小写。
.:. 表示匹配除换行符 \n 之外的任何单字符, 表示零次或多次,所以 .* 表示任意字符出现零次或多次。
.:表示匹配字符 .。
urlRewrite
rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持 rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。
语法: rewrite [flag]; flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
需求 前端输入 http://ip/2.html 跳转到 http://ip/index.php?pageNum=2
防盗链
两个网站 A 和 B, B网站引用了A网站上的图片,这种行为就叫做盗链。 防盗链,就是要防止B引用A的图片 HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。 假设网站域名是 www.yy100.com。
location ~* .(gif|png|jpg|bmp|swf|flv)$ {
valid_referers none blocked www.php100.com php100.com;
if ($invalid_referer) {
return 403;
}
}
以上的例子可以实现扩展名为 gif,png,jpg,bmp,swf,flv的url防止被盗链
Nginx高可用
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
故障转移机制 Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。 在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
VRRP协议与工作原理 在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。
Keepalvied的工作原理 Keepalived对服务器运行状态和故障隔离的工作原理: Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层): 网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
keepalived.conf: 主机配置
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface enp0s3# 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ip addr查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.0.127 # 定义虚拟ip(VIP),可多设,每行一个
}
}
virtual_ipaddress 里面可以配置vip,在线上通过vip来访问服务。
interface需要根据服务器网卡进行设置通常查看方式ip addr
authentication配置授权访问后备机也需要相同配置
备机配置
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔)
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ip addr查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 99 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.0.127 # 定义虚拟ip(VIP),可多设,每行一个
}
}
检测j脚本
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx
systemctl start nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
Nginx配置Https
- 准备https证书
- Nginx的ssl模块安装
进入 nginx 解压目录: 执行:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
然后编译,切记不要执行make install,否则会重新安装nginx
make
上述操作执行完成以后,你的目录下会出现objs文件夹,文件夹内存在nginx文件,如图
将此目录的 nginx 文件 替换安装目录sbin下的nginx
cp /usr/local/nginx-1.21.6/objs/nginx /usr/local/nginx/sbin/
查看是否安装成功
/usr/local/nginx/sbin/nginx -V
表示安装成功
注意:
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
解决:yum -y install openssl openssl-devel
- 配置 ssl证书
在Nginx的安装目录下创建cert目录,并且将“server.key”和“server.crt”拷贝到nginx的“card”目录下。
在nginx 安装目录下配置 nginx.conf 文件
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
#监听443端口
listen 443;
#你的域名
server_name huddd.top;
ssl on;
#ssl证书的pem文件路径
ssl_certificate /root/card/huiblog.top.pem;
#ssl证书的key文件路径
ssl_certificate_key /root/card/huiblog.top.key;
location / {
proxy_pass http://公网地址:项目端口号;
}
}
server {
listen 80;
server_name huiblog.top;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
}
检验配置是否准群
./sbin/ningx -t
- 重启
./sbin/nginx -s reload
|