Nginx详解
Nginx详解
作用
反向代理
我们将请求发送到反向代理服务器,由反向代理服务器选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
那么何为正向代理呢?
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问,就像我们翻墙访问谷歌一样….
负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器
动静分离
为了加快网站的解析速度,可以把动态页面(Jsp、Servlet)与静态页面(Html、Css、Js)由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力
安装
推荐docker安装,简单快速好用
docker pull nginx
创建Nginx配置文件
创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html
生成容器
docker run –name nginx -p 9001:80 -d nginx
将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/
创建Nginx容器并运行
docker ps -a
docker stop nginx
docker rm nginx
docker rm -f nginx
docker run -p 9002:80 –name nginx -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/usr/share/nginx/html -d nginx:latest
如果正常压缩包安装 进入到 usr/local/nginx/sbin
启动: ./nginx
查看版本号: ./nginx -v
关闭:./nginx -s stop
重新加载:./nginx -s reload
结果查看
curl 127.0.0.1:9002
测试
去挂载目录下/home/nginx/html/index.html 做个修改
重启容器 docker restart nginx 验证是否正确
防火墙 问题 记得开放端口
查看开放的端口号:firewall-cmd –list-all
设置开放的端口号:firewall-cmd –add-service=http -permanent
sudo firewall-cmd –add-port=80/tcp –permanent
- 重启防火墙:firewall-cmd –reload
常用命令
走的docker的话:docker exec -it nginx /bin/bash
- 查看版本号:nginx -version
- 停止:docker stop nginx
- 启动:docker start nginx
- 重启:docker restart nginx
配置文件
因为是挂载: vi /home/nginx/conf/nginx.conf
配置文件由三部分组成
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
比如:worker_processes auto,值越大可以支持的并发处理量越大
events块
涉及的指令主要影响Nginx服务器与用户的网络连接
比如:worker_connections 1024;支持的最大连接数
http块[重要]
这是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http块可以包括http全局块、server块
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上线等
server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
Nginx配置实例-反向代理
实现效果
打开浏览器,在浏览器地址输入www.123.com,跳转到linux系统tomcat主页
准备工作
- 在linux系统安装tomcat,使用默认端口8080
- 安装tomcat(docker安装)
- docker search tomcat
- docker pull tomcat
- docker run -d -p 8080:8080 tomcat
- 这时候在浏览器访问发现访问不了,因为新版tomcat把静态资源放到webapps.dist目录下了,webapps无内容
- 进入tomcat容器:docker exec -it 容器id /bin/bash
- ls webapps
- ls webapps.dist/
- rm -r webapps
- mv webapps.dist webapps
- 去浏览器访问,成功啦!
具体配置
- 在windows系统的host文件进行域名和ip对应关系的配置
- C:\Windows\System32\drivers\etc
- 找到HOSTS文件添加内容: ip地址 www.123.com
- 在nginx进行请求转发的配置(反向代理)
Nginx配置实例-反向代理实例2
实现效果
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001
访问http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080
访问http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081
准备工作
准备两个tomcat服务器 一个8080端口 一个8081端口
创建文件夹和测试页面
具体配置
- 找到nginx配置文件
重启ng
- 开放9001端口 往上参考
Nginx配置实例-负载均衡
实现效果
浏览器地址输入地址 http://192.168.19.80/edu/aaa.html,负载均衡效果,平均8080和8081端口中
准备工作
- 准备两台tomcat,一台8080,一台8081
- 在两台tomcat里面webapps目录,创建名称是edu文件夹,在edu文件夹里面创建页面aaa.html
- 在nginx的配置文件中进行负载均衡的配置
- 重新加载 ./nginx -s reload
负载均衡策略
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
weight(权重)
weight代表权重,默认为1,权重越高被分配的客户端越多
ip_hash
每个请求按照访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配
Nginx配置实例-动静分离
实现角度来看大致分为两种:
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上(主流)
- 动态跟静态文件混合在一起发布,通过nginx分开
通过location制定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。 具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此方法非常适合不经常变动的资源(若经常更新的文件,不建议使用Expires来缓存),比如我设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有发生变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器直接下载,返回200
准备工作
静态资源准备
在linux系统中准备静态资源,用于进行访问
cd /
mkdir data
mkdir image
mkdir www
放入 www一个html文件,image一个图片
nginx配置
重启ng,访问 192.168.19.80/www/a.html 与192.168.19.80/image/01.jpg
Nginx高可用
在上面的实例中,如果tomcat宕机了还有一个可用,但是nginx宕机了呢?
准备
两台nginx服务器 192.168.19.80、192.168.19.81
两台服务器安装keepalived (yum安装)
yum install keepalived -y
根目录 cd /etc/keepalived
操作配置文件keepalived.conf
需要虚拟ip
完成高可用配置(主从)
参考这篇文章吧,有些偏运维了,可以跳过,知道结合keepalived来实现nginx高可用即可
https://blog.csdn.net/weixin_44790046/article/details/106857369
nginx原理解析
master&worker
执行 ps- ef |grep nginx 命令, 我们发现有两个进程master和wroker
worker如何工作的
我们发送请求先到nginx的master,mater相当于得到一个任务之后,把任务给下面的worker,worker通过争抢机制得到任务,通过反向代理用tomcat完成具体操作,这是ng的最基本的流程,mater和worker的基本机制
一个master多个worker好处?
- 可以使用./nginx -s reload热部署,利用nginx进行热部署操作
- 每个worker是独立的进程,如果其中一个wroker出现问题,其他worker继续争抢,实现请求过程,不会造成服务中断。
设置多少worker合适呢?
Nginx同Redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等相等是最为适宜的。少了会浪费,多了会损耗。
连接数worker_connection
- 发送请求,占用了worker几个连接数?
答:2个或四个:访问静态资源2个,动态资源4个
- nginx有1个master,4个worker,每个worker支持最大连接数1024,支持的最大并发数?
若是静态资源:worker_connection(每个worker的最大连接数)*worker_processes(几个worker进程)/2
如果是http作为反向代理:worker_connection(每个worker的最大连接数)*worker_processes(几个worker进程)/4
完结
到这里基本就结束了,作为后端人员,不说精通,懂nginx原理 反向代理,负载均衡怎么做在日常工作中就没啥大问题了。