【Nginx】Nginx了解(基础)

文章目录

  • Nginx产生的原因
  • Nginx简介
  • Nginx的作用
    • 反向代理
    • 负载均衡策略
    • 动静分离
  • Nginx的
    • Windows下的安装
    • Linux下的安装
      • Nginx常用命令
  • 负载均衡功能演示

Nginx产生的原因

背景

一个公司的项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户

慢慢的,使用平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了

image-20231216212858916

于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求(由该代理服务器作负载均衡&&反向代理)

  • 希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上
  • 这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择,保证最佳体验,基于上述的需求,所以使用了Nginx。

Nginx简介

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器同时也提供了IMAP/POP3/SMTP服务
  • 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好
  • Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法=>可以理解为正则表达式 )、Bug非常少的服务,Nginx 启动容易,并且几乎可以做到7*24小时不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
  • Nginx底层是C语言实现的,官方数据测试表明能够支持高达 5w个并发连接数的响应

Nginx的作用

反向代理

  • 作为Http代理=>反向代理:作为web服务器最常用的功能之一

关于正向代理和反向代理

正向代理:用于代理客户端的请求(帮客户端请求外部资源),服务器只知道有客户端的请求到来,但是并不知道是哪个客户端请求的 (例如:VPN)

正向代理的工作方式

1.客户端配置网络设置,将请求发送给正向代理服务器

2.正向代理服务器接收到请求后,根据客户端请求的目标地址,代表客户端向目标服务器发送请求

3.目标服务器处理请求并发送响应

4.正向代理服务器接收到响应后,将其返回给客户端

正向代理的主要功能包括:

1.访问控制:正向代理可以根据特定的策略和规则,对客户端的请求进行访问控制,例如限制特定网站的访问或实施身份验证

2.隐私保护:正向代理可以隐藏客户端的真实身份和位置,提供一定的匿名性

3.缓存:正向代理可以缓存常用的内容,以减少网络流量和提高响应速度

4.加速访问:正向代理服务器可以通过压缩、缓存和优化网络连接等方式,加速客户端与目标服务器之间的通信


反向代理 :扮演服务器的角色,接收来自客户端的请求,并将其转发到后端服务器,对于用户是无感知的,客户发送请求,但是不知道哪个服务端收到了请求,客户端只和反向代理进行通信

  • 比如,百度的服务器是在不同的服务器上,但是我们只需要搜索baidu.com就行,该请求可能会被反向代理路由到离你物理位置最近的服务器,或者根据网络条件和负载均衡算法进行分配。这样做可以减少响应时间并提高搜索的效率

反向代理的工作方式

1.客户端向反向代理发送请求

2.反向代理接收到请求后,根据预先设置的规则,将请求转发到一个或多个后端服务器

3.后端服务器处理请求并发送响应

4.反向代理接收到响应后,将其返回给客户端

反向代理的主要功能包括

1.负载均衡反向代理可以将请求分发到多个后端服务器,以实现负载均衡,提高系统的性能和可扩展性

2.缓存:反向代理可以缓存静态内容减轻后端服务器的负载,提高响应速度

3.安全性:反向代理可以作为防火墙,保护后端服务器免受恶意请求和攻击

4.SSL 加密:反向代理可以终止 SSL 连接,解密传入的请求,并将其转发给后端服务器,提供安全的通信


负载均衡策略

Nginx提供的负载均衡策略有2种:内置策略和扩展策略

  • 内置策略:轮询加权轮询Ip hash

    • 轮询(Round Robin):默认的负载均衡策略,按照顺序将请求依次分发给后端服务器‘
    • IP 哈希(IP Hash):根据客户端的 IP 地址将请求分发给后端服务器,确保同一客户端的请求始终发送到同一台服务器,以保持会话的一致性
    • 最少连接(Least Connections):将请求发送给当前连接数最少的后端服务器,以实现负载均衡
    • 加权轮询(Weighted Round Robin):根据后端服务器的权重设置,按比例分配请求
    • 加权最少连接(Weighted Least Connections):根据后端服务器的权重和当前连接数,动态地分配请求
  • 扩展策略:天马行空,只有你想不到的没有他做不到的,可以在nginx的配置文件当中进行配置

方式1:普通轮询

每个服务器之间轮询处理请求,每台服务器处理请求的数量和概率都是相同的

方式2:加权轮询:因为可能不同服务器性能不一样,能接收的请求数量不同

方式3:IP Hash

对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端(IP相同)的请求分发给同一台服务器进行处理

例如:不能在每台服务器上都保存客户端的session信息,所以要么就保证同一个客户端的请求每次都发送给特定的服务器,要么就使用redis作为session信息共享


动静分离

关于静态文件

在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件

让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,就可以根据静态资源的特点将其做缓存操作,提高资源响应的速度
在这里插入图片描述

通过使用Nginx进行动静分离,将动态请求转发给后端应用服务器(如PHP-FPM、Node.js等),而将静态请求直接由Nginx服务器处理

Nginx的

Windows下的安装

下载Nginx:http://nginx.org/en/download.html (建议下载稳定版本)

image-20231216214933976

解压完成后:

image-20231216215124106

启动Nginx

方法1:直接双击nginx.exe,双击后一个黑色的弹窗一闪而过

方法2:打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe ,回车即可

image-20231216215740227

检查Nginx是否启动成功

直接在浏览器地址栏输入网址 localhost:80回车,出现以下页面说明启动成功

image-20231216215616955

注意:此处我访问的是8084端口,可以在配置文件当中修改nginx监听的端口号

修改配置文件

nginx的配置文件是conf目录下的``nginx.conf`文件,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可

否则启动nginx的时候会出现类似下述的错误,此时只需要修改nginx监听的端口号即可

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)

image-20231216215830957

当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx只需要在cmd控制台当中执行命令 nginx -s reload 让改动生效

关闭Nginx

如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx

方法1:输入nginx命令

  • nginx -s stop(快速停止nginx)
  • nginx -s quit(完整有序的停止nginx)

方法2:使用taskkill 命令 (taskkill是用来终止进程的)

  • taskkill /f /t /im nginx.exe
  • 选项解释:/f是强制终止 /t是终止指定的进程和任何由此启动的子进程,/im是指定进程名称

注意:如果输入命令的时候出现拒绝访问等情况,可以尝试以管理员方式打开cmd控制台

Linux下的安装

前置准备

1)要确定有gcc环境

gcc -v  # 查看版本
yum install gcc-c++  # 如果没有的话就安装一下

2)PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库

nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库

yum install -y pcre pcre-devel

3)zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行解压,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

4)OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https,所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

5)在官网下载nginx压缩包,并上传到linux上
在这里插入图片描述

6)在Linux当中解压安装包

tar -zxvf nginx-1.20.1.tar.gz # 解压安装包
cd nginx-1.20.1/ # 进入目录,发现和windows没什么区别

7)进行自动配置

./configure

在这里插入图片描述

  • 执行make命令
  • 执行make install命令
  • 查看是否安装成功 =>whereis nginx

补充:whereis 是用于查找可执行文件、源代码文件和帮助文档位置的命令

[root@cVzhanshi nginx-1.20.1]# whereis nginx
nginx: /usr/local/nginx
  • 到安装目录去看看
    在这里插入图片描述
  • 进入sbin目录,执行可执行文件

在这里插入图片描述

  • 在浏览器看是否执行成功
    在这里插入图片描述

Nginx常用命令

首先需要进入到nginx可执行文件的文件夹当中

cd /usr/local/nginx/sbin/  #进入nginx可执行文件所在的路径
./nginx  #启动
./nginx -s stop  #强制停止
./nginx -s quit  #安全退出
./nginx -s reload  #重新加载配置文件  一旦改了配置文件就需要执行该指令才能生效
ps aux|grep nginx  #查看nginx进程

注意:如果nginx连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口

防火墙相关命令:

# 开启防火墙
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;

负载均衡功能演示

先进行配置文件的修改

#每一行配置的最后由分号结尾
http {
    ...
	upstream 任意名字Name{ #负载均衡配置  
        #服务器资源 (有哪些服务器)
        #服务器组包含两个服务器,分别是127.0.0.1:8082和127.0.0.1:8081,并且它们的权重都被设置为1
		server 127.0.0.1:8082/ weight=1;  #weight为服务器的权重
		server 127.0.0.1:8081/ weight=1;
	}

	#定义了一个虚拟主机(server),监听默认的80端口,并使用localhost作为服务器名
    server {
        #http默认端口号为80  https默认端口号为443
        listen       80;
        server_name  localhost;
		
        #代理转发
        #只要是80端口 根目录下的请求就代理到http://任意名字Name
        location / {
            #root指令指定了静态文件的根目录为html,index指令定义了默认的索引文件
            root   html;
            index  index.html index.htm;
            #proxy_pass指令将请求转发给之前定义的上游服务器组任意名字Name。这意味着当有请求到达根路径时,Nginx会将请求代理转发给上游服务器组中的服务器,实现负载均衡
			proxy_pass http://任意名字Name;
        }
        ...
}

image-20231205193103666

步骤1:启动两个端口的项目

在这里插入图片描述

步骤2:启动nginx

步骤3:进行测试
在这里插入图片描述


在这里插入图片描述

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

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

相关文章

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT,分为四个 part:leader election、log、persistence、log compaction。 实验环境 OS:WSL-Ubuntu-18.04 golang:go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

Datawhale 12月组队学习 leetcode基础 day3 递归

这是一个新的专栏,主要是一些算法的基础,对想要刷leedcode的同学会有一定的帮助,如果在算法学习中遇到了问题,也可以直接评论或者私信博主,一定倾囊相助 进入正题,今天咱们要说的是递归,递归是是…

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解:流程总结:条件匹配解释:其他解释: SpringBoot 自动装配原理 源码流程详解: 1、先看启动类,启动这个main方法,然后调用这个run方法。 2、把 启动类作…

牛客网 DP35 【模板】二维前缀和

代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { //…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

TrustGeo代码理解(一)main.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # -*- coding: utf-8 -*- import torch.nnfrom lib.utils import * import argparse, os import numpy as np import random from lib.model import * import copy from thop import profile imp…

devc++如何建立一个c++项目?devc++提示源文件未编译?

打开devc APP后是这样的界面&#xff1b; 点击文件-> 新建->项目&#xff0c;这一点应该不难&#xff0c;主要是最后这个选择什么&#xff1f; 这样即可。 devc提示源文件未编译&#xff1f; 点击工具->编译选项&#xff1b; 如果不能解决&#xff0c;那就是可能路径…

NNDL 循环神经网络-梯度爆炸实验 [HBU]

目录 6.2.1 梯度打印函数 6.2.2 复现梯度爆炸现象 6.2.3 使用梯度截断解决梯度爆炸问题 【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f; 总结 前言&#xff1a; 造成简单循环网络较难建模长程依赖问题的原因有两个&#xff1a;梯度爆炸和梯度消失。 循环…

代码随想录算法训练营第53天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

JAVA代码编写 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情…

软件测试面试八股文(答案解析+视频教程)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xf…

【华为数据之道学习笔记】3-10元数据管理架构及策略

元数据管理架构包括产生元数据、采集元数据、注册元数据和运 维元数据。 产生元数据&#xff1a; 制定元数据管理相关流程与规范的落地方案&#xff0c;在IT产品开发过程中实现业务元数据与技术元数据的连接。 采集元数据&#xff1a; 通过统一的元模型从各类IT系统中自动采集元…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

002.Java实现两数相加

题意 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示两数之和的新链表。 示例 输入&#xff1a;l1[2,4,3],l2[5,6,4] 输出…

【从零开始学习JVM | 第七篇】深入了解 堆回收

前言&#xff1a; Java堆作为内存管理中最核心的一部分&#xff0c;承担着对象实例的存储和管理任务。堆内存的高效使用对于保障程序的性能和稳定性至关重要。因此&#xff0c;深入理解Java堆回收的原理、机制和优化策略&#xff0c;对于Java开发人员具有重要的意义。 本文旨在…

springcloud-分布式缓存

文章目录 一.Redis持久化1.RDB持久化2.AOF持久化 二.Redis主从1.搭建主从架构2.全量同步3.增量同步 三.Redis哨兵1.哨兵的作用和原理2.搭建哨兵架构3.RedisTemplate的哨兵模式 四.Redis分片集群1.搭建分片集群2.散列插槽3.集群伸缩4.故障转移5.RedisTemplate访问分片集群 为什么…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用&#xff0c;导致密码忘记了&#xff0c;这可咋整&#xff1f; 第1步&#xff1a;取出SD卡 将树莓派关机&#xff0c;移除sd卡&#xff0c;使用读卡器&#xff0c;插入到你的电脑。 第2步&#xff1a;编辑 cmdline.txt 在PC上打开SD卡根目录&#xff0c;启动…

Kotlin ArrayList类型toTypedArray转换Array

Kotlin ArrayList类型toTypedArray转换Array data class Point(val x: Float, val y: Float)fun array_test(points: ArrayList<Array<Point>>) {points.forEachIndexed { idx, ap ->ap.forEach {print("$idx $it ")}println()} }fun main(args: Arra…

2697. 字典序最小回文串

2697. 字典序最小回文串 难度: 简单 来源: 每日一题 2023.12.13 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变…

RTX 40 SUPER发布时间定了!价格也有了

快科技12月16日消息&#xff0c;NVIDIA RTX 40 SUPER系列显卡基本确定将在2024年1月8日正式发布&#xff0c;也就是CES 2024大展期间&#xff0c;随后在1月中下旬陆续解禁上市。 RTX 4070 SUPER 1月16日解禁公版/原价丐版&#xff0c;1月17日解禁高价高配版&#xff0c;上市开…