nginx详解(概念、Linux安装、配置、应用)

1.nginx是什么

百度百科

在这里插入图片描述

看百度百科的解释,第一句话就是错的。“Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器”,从语法来看,去掉形容词就是:Nginx是服务器,nginx怎么会是服务器呢,nginx只是一个工具,一个中间件,可以用来做反向代理,做什么反向代理?做web服务器的反向代理。这句话是有语病的,典型的句式杂糅(两个句子塞在一句话中表达,导致表述不清),会误导初学者。后面的解释也不准确(“Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器”),起码不够通俗,绕来绕去
基于此做一点补充:

Nginx是一个中间件。由一个俄罗斯人开发(2004年),开发背景是解决C10k问题(10000并发量),随着nginx的不断迭代,现在主要用来做反向代理和负载均衡,由于nginx配置简单、占用内存少、并发能力强等优点广受欢迎,据统计,世界范围内的web网站,平均2个就有一个使用了nginx,充分证明了nginx的优秀和重要。

2.概念

2.1.什么是正向代理?

理解反向代理不得不说正向代理,正向代理:通过代理服务器屏蔽用户信息的过程。其特点是:目标服务器不知道请求用户的信息,比如请求IP。
总结发现,通过简单分类,这里面涉及到三种类型的机器,分别是:用户机器、代理机器、目标服务机器

我们上网的一般过程是,客户端发出请求,服务器接收、处理请求并做出响应,客户端接收响应展示给用户。仿佛不需要代理了,这个理解是对的,那么什么场景会用到正向代理?

比如国内用户需要访问google,但是由于政策原因没有开通防火墙,国内用户访问不了google,这时还需要访问google的资源,怎样实现?可以通过在用户和google之间增加一台服务器,这台服务器开通google的防火墙,用它来接收用户的请求,并将请求转发给google,goolge接收请求响应给代理服务器,代理服务器再响应给用户。

这个过程中google不知道真实的用户信息,只知道代理服务器的请求信息(比如ip等),通过代理服务器屏蔽用户信息的过程就是正向代理

2.3.什么是反向代理?

理解了正向代理后,就好理解反向代理了。反向代理:通过代理屏蔽目标服务的过程。其特点是:用户不知道真实的目标服务。
反向代理的场景:

一个tomcat处理500个并发,这时并发量有5000,需要搭建10个tomcat集群。这10个集群就代表10个服务,用户通过访问代理服务器,代理服务器再把请求转发给10个服务中的某一个。

对用户来说,请求的是代理服务器,用户不知道代理服务器会将请求下发给集群中谁。通过代理服务器屏蔽服务的过程就是反向代理。

2.4.什么是负载均衡?

通过nginx反向代理了10个服务,高并发的用户请求按什么策略下发给这10服务。使每一台机器都能饱和工作的过程就是负载均衡。

nginx 负载均衡默认的策略是:轮询+权重
nginx除了默认的轮询策略,还有一种hash策略,使用hash的优点是可以保存用户请求session(实际应用中使用较少)
配置负载均衡一定会用到反向代理,用到反向代理不一定使用负载均衡

3.nginx的使用

3.1 安装nginx

直接下载nginx tar包,地址:https://nginx.org/en/download.html

tar -xvzf nginx-1.16.1.tar.gz
#重命名
mv nginx-1.16.1 nginx
cd nginx
#安装
make install
#查看安装目录
whereis nginx
#配置ssl模块,用于Https服务(可选),进入nginx下载后的解压目录(不是安装目录)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
启动、停止nginx
cd /usr/local/nginx/sbin/     #进入nginx解压目录
./nginx   #启动
./nginx -s stop    #停止(先查出nginx进程id再使用kill命令强制杀掉进程)
./nginx -s quit    #停止(待nginx进程处理任务完毕进行停止)
./nginx -s reload  #重新加载配置文件
./nginx -V #查看版本
./nginx -t #检查配置文件

3.2.Nginx配置

Nginx配置,在/usr/local/nginx/conf(nginx安装目录)下的nginx.conf

#Nginx用户及组:用户 组。window下不指定
#user nobody;
#工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
worker_processes 1;
#错误日志:存放路径。
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid(进程标识符):存放路径。
#pid logs/nginx.pid;

events {
	#每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但
	是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连  	 		接数为。worker_processes*worker_connections
	worker_connections 1024;
	#keepalive超时时间。
	keepalive_timeout 60;
}
#设定http服务器
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#默认编码
#charset utf-8;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on
sendfile on;
#开启目录列表访问,合适下载服务器,默认关闭。
autoindex on;
#该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率'
#tcp_nopush on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#开启gzip压缩输出
#gzip on;
#虚拟主机的配置,可配置多个
server {
	listen 80;
	#域名可以有多个,用空格隔开
	server_name localhost;
	location / {
		#可配置在 server与location中,基于ROOT路径+URL中路径去寻找指定文件。
		root html;
		index index.html index.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}

# server {
	# listen 8080;
	# 域名可以有多个,用空格隔开
	# server_name localhost;
	# location /tomcat {
		# root html;
		# index index.html index.htm;
		# }
	# }
}

上述配置中的events、http、server、location、upstream等属于配置项块。而
worker_processes 、worker_connections、include、listen 属于配置项块中的属性。其中server块嵌套于http块,其可以直接继承访问Http块当中的参数。

配置块名称开头用大口号包裹其对应属性
属性基于空格切分属性名与属性值,属性值可能有多个项,都以空格进行切分,如:access_log logs/host.access.log main
参数其配置在块名称与大括号间,其值如果有多个也是通过空格进行拆

注:如果配置项值中包括语法符号,比如空格符,那么需要使用单引号或双引号括住配置项值,否则Nginx会报语法错误。eg:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

4.ngin的应用

4.1.配置一个静态WEB服务

创建一个站点目录:mkdir -p /home/zyz/soft/web/app1
放入一个静态文件:index.html
配置nginx.conf

#添加一个server 或原有修改
server {
	listen 8081;
	server_name localhost;
	location /project1 {
		#alias 指定站点别名,基于alias 路径+ URL移除location前缀后的路径来寻找文件。
		alias /home/zyz/soft/web/app1;
		index index.html index.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}

访问规则如下:

URL:http://192.168.2.50:8081/project1/index.html
最终寻址:/home/zyz/soft/web/app1/index.html

or

server {
	listen 8081;
	server_name localhost;
	location /project1 {
		#可配置在 server与location中,基于ROOT路径+URL中路径去寻找指定文件。
		root /home/zyz/soft/web/app1;
		index index.html index.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}

防问规则如下:

URL:http://192.168.2.50:8081/project1/index.html
最终寻址:/home/zyz/soft/web/app1/project1/index.html

4.2.下载限速

location /download {
	limit_rate 1m; #限制每S下载速度
	limit_conn addr 1;#连接数量
	limit_rate_after 30m; #对30m上的数据限制
}

4.3 IP黑白名单

在配置文件目录下如:/usr/local/nginx/conf下创建黑名单文件ip.black
touch /usr/local/nginx/conf/ip.black
#在其中输入黑名单ip

eg:

allow 192.168.2.9;
deny 192.168.2.51;
#开放指定IP 段
allow 192.168.0.0/24;

在http模块中引入配置文件: include ip.black;

在这里插入图片描述

4.4 nginx配置负载均衡

通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个, 这个是时候可以通过upstream 模块实现负载均衡。

upstream backend {
	server 192.168.2.9:9990;
	server 192.168.2.9:9991;
}
server {
	listen 8083;
	#超过下述时间无响应自动转发到其他服务器
	proxy_connect_timeout 1;
	#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
	proxy_send_timeout 1;
	#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可
	以说是后端服务器处理请求的时间)
	proxy_read_timeout 1;
	server_name localhost;
	location / {
		proxy_pass http://backend;
	}
}

upstream 相关参数:
server 反向服务地址加端口
weight 权重
max_fails 失败多少次 认为主机已挂掉则,踢出
fail_timeout 踢出后重新探测时间,在单位周期为fail_timeout设置的时间,中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout)再一次去请求,判断是否连接是否成功。如果成功,将恢复之前的轮询方式,如果不可用将在下一个周期(fail_timeout)再试一次。
backup 备用服务,Nginx默认判断失败节点状态以connect refuse和timeout状态为准,不以HTTP错误状态进行判断失败,所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机。
max_conns 允许最大连接数
ll+weight: 轮询加权重 (默认)
ip_hash : 基于Hash 计算 ,用于保持session 一至性,不与backup一起使用
url_hash: 静态资源缓存,节约存储,加快速度(第三方)
least_conn :最少链接(第三方)
least_time :最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重(第三方)

eg:

upstream backend {
	server 192.168.2.9:9990 weight=1 max_fails=1 fail_timeout=5;
	server 192.168.2.9:9991 weight=2;
	server 192.168.2.9:9992 weight=1 backup;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab进阶绘图第8期—聚类/分类散点图

聚类/分类散点图是一种特殊的特征渲染散点图。 聚类/分类散点图通过一定的聚类、分类方法,将特征相近的离散点划分到同一个类别中,进而将每个离散点赋予类别标签,并利用不同的颜色对不同的类别进行区分。 本文使用Matlab自带的gscatter函数…

C语言变量和数据类型的使用

文章目录前言一、将变量输出打印到控制台1.整形变量的输出2.浮点型变量的输出1.flaot的输出2.doble的输出3.float和double输出的区别4.%f,%10.2f......二、数据类型的大小总结前言 上一篇文章我们学习了C语言变量和数据类型的基本概念那么今天我们就具体的来看看如何在代码中使…

css实现文字大小自适应

在页面编写中经常会碰到页面自适应的问题,也就是页面内部的元素会随着窗口的放大缩小而放大缩小,box可以通过calc 百分比的形式做到页面自适应,但是box内的字体却无法做到这点,往往box自适应大小了,内部的字体还是原来…

selenium(5)-------自动化测试脚本(python)

1)alert框的处理 前提:我们是不可以通过控制台直接定位元素的方式去选中这个alert框的,例如说xpath直接进行定位元素 1)先获得弹框的操作句柄:alertdriver.switch_to.alert 2)再次调用accept方法进行关闭弹窗:alert.accept() from selenium import webdriver import…

强化学习分类与汇总介绍

1.强化学习(Reinforcement Learning, RL) 强化学习把学习看作试探评价过程,Agent选择一个动作用于环境,环境接受该动作后状态发生变化,同时产生一个强化信号(奖或惩)反馈给Agent,Agent根据强化信号和环境当…

【python刷题】leecode官方提示“->“,“:“这些符号是什么意思?什么是Type Hints?

作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于海外某世界知名高校就读计算机相关专业。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。…

JavaSE基础总结

JDK与JRE JDK,全称Java Development Kit,Java开发工具包 JRE,全称Java Runntime Environment,Java运行环境 JDK包含后者JRE。 JDK也可以说是Java SDK(Software Development kit,软件开发工具包)…

JVM高频面试题

1、项目中什么情况下会内存溢出,怎么解决? (1)误用固定大小线程池导致内存溢出 Excutors.newFixedThreadPool内最大线程数是21亿(2) 误用带缓冲线程池导致内存溢出最大线程数是21亿(3)一次查询太多的数据,导致内存占用…

基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)

摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注、记录和保存病害位置和类型,辅助作物病害防治以增加产值。本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介绍算法原理的同时&#…

百度的文心一言 ,没有想像中那么差

robin 的演示 我们用 robin 的演示例子来对比一下 文心一言和 ChatGPT 的真实表现(毕竟发布会上是录的)。 注意,我使用的 GPT 版本是 4.0 文学创作 1 三体的作者是哪里人? 文心一言: ChatGPT: 嗯&a…

C++ STL:vector的使用方法及模拟实现

目录 一. vector概述 二. vector接口函数的使用方法和模拟实现 2.1 vector类模板的成员变量 2.2 构造函数的使用和模拟实现 2.2.1 构造函数的使用方法 2.2.2 构造函数的模拟实现 2.3 析构函数的模拟实现 2.4 赋值运算符重载函数的使用和模拟实现 2.4.1 函数的使用 2.…

MybatisPlus------MyBatisX插件:快速生成代码以及快速生成CRUD(十二)

MybatisPlus------MyBatisX插件(十二) MyBatisX插件是IDEA插件,如果想要使用它,那么首先需要在IDEA中进行安装。 安装插件 搜索"MyBatisX",点击Install,之后重启IDEA即可。 插件基本用途&…

蓝桥杯嵌入式第四课--定时器

前言蓝桥杯对于定时器这部分的考察主要集中在定时器中断、PWM输出以及输入捕获三个方面,本节课着眼于应用,介绍一下定时器的使用。定时器中断一、基础概念对没接触过定时器的新手来说,如果想要快速上手定时器的使用,首先要先对定时…

Python每日一练(20230318)

目录 1. 排序链表 ★★ 2. 最长连续序列 ★★ 3. 扰乱字符串 ★★★ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序链表 给你链表的头结点 head ,请将其按 升序 …

卷积神经网络CNN识别MNIST数据集

这次我们将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提升到99%,读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容。 程序的开头是导入TensorFlow: import tensorflow as tf from tensorflow.examples.tutor…

C语言老题新解16-20 用命令行打印一些图案

文章目录11 打印字母C12 输出国际象棋棋盘。13 打印楼梯,同时在楼梯上方打印两个笑脸。14 输出9*9 口诀。15 有一道题要输出一个图形,然后Very Beautiful。11 打印字母C 11 用*号输出字母C的图案。 讲道理这绝对不该是个新人能整出来的活儿&#xff0c…

TCP/IP协议栈之数据包如何穿越各层协议(绝对干货)

所有互联网服务,均依赖于TCP/IP协议栈。懂得数据是如何在协议栈传输的,将会帮助你提升互联网程序的性能和解决TCP相关问题的能力。 我们讲述在Linux场景下数据包是如何在协议层传输的。 1、发送数据 应用层发送数据的过程大致如下: 我们把…

蓝桥杯嵌入式第五课--输入捕获

前言输入捕获的考题十分明确,就是测量输入脉冲波形的占空比和频率,对我们的板子而言,就是检测板载的两个信号发生器产生的信号:具体来说就是使用PA15和PB4来做输入捕获。输入捕获原理简介输入捕获能够对输入信号的上升沿和下降沿进…

WorkTool企微机器人接入智能问答

一、前言 最新版的企微机器人已经集成 Chat ,无需开发可快速搭建智能对话机器人。 从官方介绍看目前集成版本使用模型为 3.5-turbo。 二、入门 创建 WorkTool 机器人 你可以通过这篇快速入门教程,来快速配置一个自己的企微机器人。 实现的流程如图&…

Windows与Linux端口占用、查看的方法总结

Windows与Linux端口占用、查看的方法总结 文章目录Windows与Linux端口占用、查看的方法总结一、Windows1.1Windows查看所有的端口1.2查询指定的端口占用1.3查询PID对应的进程1.4查杀死/结束/终止进程二、Linux2.1lsof命令2.2netstat命令一、Windows 1.1Windows查看所有的端口 …