nignx的学习和使用

基本概念

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

Nginx,专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率能够支持高达 50,000 个并发连接数的响应。

反向代理

正向代理:如果把局域网外的Intemet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。(例如:浏览器配置代理服务器访问谷歌)

反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。(例如:暴露nginx服务器访问地址给客服端。nignx把接受到的请求转发到实际的服务)

负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡,

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。卜

安装使用

docker 安装 nginx-1.18

先把自己要挂载的配置文件以及html docker cp出来。然后启动:

docker run -d -p 80:80 --name nginx-1.18 \
-v /home/dockers/nignx/html:/usr/share/nginx/html  \
-v /home/dockers/nignx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/dockers/nignx/logs:/var/log/nginx nginx:1.18

相关命令

./nginx -v

./nginx -s stop

./nginx

配置文件 nginx.conf的组成与使用:

......#全局块#worker processes 值越大,可以支持的并发处理最也越多
worker processes 1;
#events块
events{
#支持的最大连接数
worker connections 1024
...}
#http块
http{#http全局块.....#server块server{#server全局块......# 代理路径/  location块location / {#反向代理转发路径proxy_pass http://{host}:{port}.....}#location块location ~ /aaa/ { #反向代理转发路径proxy_pass http://{host2}:{port2}.....}}}

location:

1、= :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配, 如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、~:用于表示 uri包含正则表达式,并且区分大小写。

3、~ * 用于表示uri包含正则表达式,并且不区分大小写。

4、^~:用于不含正则表达式的uri前,要求NMginx服务器找到标识和请求字符串匹配度最高的 location后,立即使用此 location处理请

求,而不再使用location块中的正则uri和请求字符串做匹配。

注意:如果uri包含正则表达式,则必须要有或者*标识。

配置实例

负载均衡实例

......#全局块#worker processes 值越大,可以支持的并发处理最也越多
worker processes 1;
#events块
events{
#支持的最大连接数
worker connections 1024
...}
#http块
http{#http全局块.....#负载均衡服务配置upstream myserver{server 192.168.40.198:8080server 192.168.40.198:8081}#server块server{listen 80;server_name 192.168.40.198;......#server全局块# 代理路径/location / { #location块proxy_pass http://myserver#负载均衡服务名root html;index index.heml index.htm;.....}}
}

nignix负载均衡策略:

1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream myserver {
server 192.168.40.199;
server 192.168.40.198;
}

2、指定权重 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream myserver {
server 192.168.40.199 weight=8;
server 192.168.40.198 weight=10;
}

3、IP绑定 ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

(同一个客户端,第一次访问 server1.后面访问也是server1)

upstream myserver {
ip_hash;
server 192.168.40.199;
server 192.168.40.198;
}

4、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myserver {
server server1;
server server2;
fair;
}

5、url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream myserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

动静分离实例:

......#全局块
#worker processes 值越大,可以支持的并发处理最也越多
worker processes 1;
#events块
events{
#支持的最大连接数
worker connections 1024
...
}
#http块
http{#http全局块.....#server块server{#server全局块......# 代理路径/location /www/ {#静态资源路径root /data/proxy_pass http://{host}:{port}.....}location /image/ {#静态资源路径root /data/#列出当前目录atuoindex onproxy_pass http://{host}:{port}.....}}}

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种:

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。

通过location 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires来缓存〉,我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。

高可用

如果只有一台nignix.宕机影响使用

主备模式

主服务器(ip1)nignix宕机。备用服务器(IP2)切换为服务器(提供虚拟ip1).使用keepalived检测其状态。实现虚拟ip

安装keepalived

yum install keepalived -y
#查看安装是否成功
rpm -q -a keppalived

配置文件 /etc/keepalived/keepalived.conf

 #全局定义模块1 ! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc #邮件报警,可以不设置,后期nagios统一监控。}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeoutrouter_id LVS_DEVEL  #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_intervalvrrp_gna_interval}++++++++++++++++我是分隔符++++++++++++++++++++++#VRRP实例定义块 18vrrp_instance VI_1 {state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。interface eth0        lvs_sync_daemon_inteface eth0  #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。 22     virtual_router_id 51 #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。priority 100  #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。advert_int 1 #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。authentication {auth_type PASS  #验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,\auth_pass 1111   据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。}virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!192.168.200.100192.168.200.101192.168.200.102}}  ++++++++++++++++我是分隔符++++++++++++++++++++++vrrp_script chk http_port {#检测脚本路径script "/usr/local/src"#检测脚本执行间隔时间 interval 2#权重weight -20}#虚拟服务器定义块 35virtual_server  {   #虚拟IP,来源与上面的虚拟IP地址,后面加空格加端口号delay_loop 6  #健康检查间隔,单位为秒lb_algo rr    #负载均衡调度算法,一般用wrr、rr、wlclb_kind NAT   #负载均衡转发规则。一般包括DR,NAT,TUN 3种。persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了。protocol TCP  #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP。real_server  { #真实服务器,包括IP和端口号weight 1  #权重,数值越大,权重越高connect_timeout 3 #连接超时时间nb_get_retry 3 #重连次数delay_before_retry                       }}}

检测脚本 /usr/local/src

#!/bin/bash
nginx=/usr/local/nginx/sbin/nginx
read -ep "请输入要执行的命令(start/stop/status/reload):" sta
case $sta in#启动nginx选项start)#先检测nginx是否已经启动netstat -nlpt | grep nginx &> /dev/nullif [ $? -eq 0 ];thenecho "nginx已经启动!"elseecho "开始启动nginx!"$nginxfi;;#停止nginx运行stop)$nginx -s stop#判断nginx是否已经停止if [ $? -eq 0 ];thenecho "nginx已经停止运行!"elseecho "nginx停止失败,请重试!"fi;;#nginx的状态status)netstat -nlpt | grep nginx &> /dev/nullif [ $? -eq 0 ];thenecho "nginx已经启动!"elseecho "nginx没有运行!"fi;;#重载nginxreload)$nginx -s reloadif [ $? -eq 0 ];thenecho "nginx重载成功!"elseecho "nginx重载失败,请重试!"fi;;*)echo "请按提示正确输入!";;
esac
systemctl start keepalives.service

执行原理

(1)master进程和worker进程之间的关系图

(2)多个worker争抢client

一个master 多个worker的好处

首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

其次,采用独立的进程; 可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的新的worker进程。

当然,worker进程的异常退出,肯定是程序有 bug了,异常退出,会导致当 前worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个worker?

Nginx同redis,类似都采用了io多路复用机制,每个worker都是一个独立的进程,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。

所以 worker 数和服务器的cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

连接数worker_connection

这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx.能建立的最大连接数,应该是

worker_connections * worker_processes当然,这里说的是最大连接数, 对于 HTTP请求本地资源来说,能够支持的最大并发数量

worker_connections * worker_processes

如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker.processes 2

而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections *worker_processes/4

因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

一:发送请求,占用了woker的几个连接数?

答案:2或者4个·

二: nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?

普通的静态访问最大并发数是:worker_connections * worker_processes 2

反向代理数量应该是worker connections worker_processes/4

nignx的学习和使用相关推荐

  1. Nignx学习(二)

    Location 语法 location 有"定位"的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理 ...

  2. 仓储系统java_Java的最全最细的学习路线图,助你早日斩获心仪的Offer

    我是完全自学的,看完这条回答你就不用花钱学了.一千多的课程也就是基础课,并不会给你有多深入.如果要是学基础的话,看看下面的学习线路图以及相关的学习方法足够了.贴一个我之前自学的路径图和方法. 当你想系 ...

  3. Github上一个优秀的Python学习资源:AwesomePythonResource

    Github: GitHub - forrestcbb/AwesomePythonResource: Python学习导航 ,收录了一些优秀的python学习资源,包括教程,视频,网站,书籍等.并且每 ...

  4. 狂神docker学习笔记

    狂神docker(基础+进阶)-学习笔记 狂神说docker 三体:弱小和无知不是生存的障碍,傲慢才是. 从基础到进阶,每个视频都有认真看,做笔记和练习,以此篇分享整个学习过程 画图网页 docker ...

  5. Linux的入门学习

    原文链接:转载 Linux入门篇 1.1 Linux操作系统简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统 ...

  6. 边缘设备、系统及计算杂谈(16)——Apache学习

    缘起 今天介绍下Apache.如我去年所说,边缘侧的"操作系统"是集大成者,端侧,云侧技术如果只是照搬过来,绝对不好使.举个例子,有很多做机器人设备的,操作系统选的是ROS2,但又 ...

  7. 深圳Java学习:Docker

    深圳Java学习:Docker 1.思考 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器.然而微服务架构 ...

  8. 记微服务架构实战学习笔记

    架构演进和分布式系统基础知识 1.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive 1.单体应用:开发速度慢启动时间长依赖庞大等等 ...

  9. linux搭建h5学习日记

    linux系统搭建前端h5和jenkins一键部署的学习日志 前言 搭建流程 jenkins一键部署 Jenkins--H5前端部署自动化(Jenkins在Linux系统) Job工程配置及脚本 Ni ...

最新文章

  1. 不想被问年终奖?2018年春节自救攻略来了!
  2. 实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化
  3. 解惑:如何使用html+css+js实现旋转相册,立方体相册等动画效果
  4. boost::stl_interfaces::reverse_iterator相关的测试程序
  5. bilateral filter双边滤波器的通俗理解
  6. Jar 打包 EXE文件,可以脱离java环境运行 Jsmooth的使用
  7. 计算机无法找到组件c0000135,电脑显示没有找到dwmapi.dll组件怎么办?计算机丢失dwmapi.dll的处理方法...
  8. Bash常用快捷键及其作用
  9. docker-for-windows配置了阿里云镜像,仍然无法获得链接:(Client.Timeout exceeded while awaiting headers)
  10. 卫生间防水应注意哪些问题?
  11. C++ 使用引用捕获异常
  12. 基本sql语句--增删改查
  13. mysql 新建文件夹权限设置_MySQL文件及目录权限设置分析-爱可生
  14. RTU设备功能及选型
  15. 春节期间,哪些信用卡取现不用手续费?
  16. 中国大学慕课python答案 北京理工大学_中国大学慕课mooc_Python 语言程序设计_章节测验答案...
  17. Eclipse搭建第一个Spring boot项目
  18. Linux下通过NetLink获取网口信息
  19. arXiv每日推荐-3.2:计算机视觉/图像处理每日论文速递
  20. Linux快捷键及服务命令

热门文章

  1. [转]女人的感悟 震撼
  2. ThreadPool.QueueUserWorkItem的性能问题
  3. Android快速设置Quick Settings Tile
  4. windows+python+bleak+BLE低功耗蓝牙通讯连接
  5. uniapp关于this.$refs.xxx获取组件出现undefined的解决方法
  6. 使用Microsoft Speech Object Library自动朗读
  7. Mysql数据库的强制删除
  8. linux foreach用法,mybatis foreach用法
  9. 一次真实的东西方程序员访谈比较
  10. JVM之垃圾回收机制