超全Nginx反向代理服务器原理+实战篇

article/2025/8/22 7:54:52

文章目录

      • 1.Nginx简介和安装部署
        • 1.1.什么是Nginx
        • 1.2.Nginx的用途
        • 1.3.正向代理服务器
        • 1.4.反向代理服务器
        • 1.5.nginx安装部署
        • 1.6.线上访问服务器应用流程解析
        • 1.7.本地虚拟机配置宿主机域名映射
      • 2.Nginx核心基础知识
        • 2.1.Nginx目录结构
        • 2.2.Nginx核心配置文件
        • 2.3.Nginx搭建前端静态服务器
        • 2.4.Nginx搭建图片服务器
      • 3.Nginx挖掘accessLog日志
        • 3.1.Nginx访问日志简介
        • 3.2.Nginx统计站点访问量
      • 4.Nginx负载均衡策略
        • 4.1.负载均衡简介
        • 4.2.负载均衡的种类
        • 4.3.upstream负载均衡配置
        • 4.4.Nginx负载均衡策略
        • 4.5.Nginx后端节点可用性探测配置
      • 5.Nginx经典应用
        • 5.1.Nginx全局异常兜底数据返回
        • 5.2.Nginx封禁恶意IP
        • 5.3Nginx配置浏览器跨域
        • 5.4.Nginx的location路径匹配规则
        • 5.5.Nginx的rewrite重定向规则
        • 5.6.Nginx配置Websocket反向代理
        • 5.7.Nginx静态资源压缩
        • 5.8.Nginx业务接口性能优化
      • 7.Nginx配置HTTPS协议
        • 7.1.新一代传输协议https
        • 7.2.HTTPS传输流程
        • 7.3.阿里云HTTPS证书申请
        • 7.4.Nginx配置HTTPS证书
      • 8.Nginx整合OpenResty+Lua脚本
        • 8.1.OpenResty+Lua简介
        • 8.2.Nginx+OpenResty简单案例
        • 8.3.Nginx内置变量
        • 8.4.开发内网访问限制
        • 8.5.开发资源下载限速
        • 8.6.漏桶算法和令牌桶算法
      • 9.Nginx高可用LVS+Keepalived
        • 9.1.LVS+Keepalived架构
        • 9.2.什么是LVS
        • 9.3.什么是keepalived
        • 9.4.keepalived安装
        • 9.5.keepalived.conf核心配置
        • 9.6.启动keeplived验证
      • 10.Nginx基础架构模型剖析

1.Nginx简介和安装部署

1.1.什么是Nginx

  • 高性能的[HTTP]和反向代理的web服务器,用c语言编写,高性能支持单机千万级连接,强大的第三方库支持,负载均衡、静态文件服务器等。

1.2.Nginx的用途

  • 搭建前端静态资源服务器、文件服务器
  • 负载均衡Upstream配置实战、后端节点高可用性探测、全局异常兜底数据配置
  • Nginx封禁恶意IP、配置跨域、location和rewrite实战
  • Websocket配置、后端业务数据缓存前置、静态资源压缩
  • 阿里云ESC部署配置HTTPS证书
  • Nginx整合Openresty开发内网访问限制、文件资源下载限速实现原理
  • LVS+KeepAlived高可用配置

1.3.正向代理服务器

  • 客户端和目标服务器之间的服务器,客户端想代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器。
  • 核心:用户知道自己要访问的目标服务器
  • 场景:跳板机,访问原来无妨访问的网站

在这里插入图片描述

1.4.反向代理服务器

  • 客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真是的服务器。
  • 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真是的服务器进行请求。
  • 场景:域名映射

在这里插入图片描述

1.5.nginx安装部署

  • 安装依赖
    • yum -y install gcc zlib zlib-devel pcre-devel opensslopenssl-devel
  • 解压nginx.tar.gz压缩包
    • tar -xvf nginx-1.18.0.tar.gz
  • 执行命令
    • ./configure --prefix=/usr/local/nginx && make && make install
  • 阿里云开放网络安全组或者虚拟机开发80端口firewall-cmd --permanent --add-port=80/tcp
  • 启动nginx:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

1.6.线上访问服务器应用流程解析

  • 一个http请求基本流程
    • 客户端通过发起域名资源请求->DNS解析获取IP->寻找服务器获取资源
  • 域名和IP的关系,DNS作用
    • DNS:Domain Name Server域名服务器,域名虽然便于人们记忆,但网络中的计算机只能通过IP相互通信,他们之间的转换共做成为域名解析,域名解析需要由专门的与专门解析服务器完成,DNS就是进行域名解析的服务器。
  • 什么是a记录和cname
    • a记录
      • 用户可以在此设置域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器(lixiang.com->192.168.10.103)
    • cname
      • 别名指向,可以为一个主机设置别名。比如设置lixiang123.com,用来指向lixiang.com那么以后就可以用lixiang123.com代替lixiang.com来访问,相当于多了一条通道。

1.7.本地虚拟机配置宿主机域名映射

  • C:\Windows\System32\drivers\etc
  • 修改hosts文件

2.Nginx核心基础知识

2.1.Nginx目录结构

(1)源码安装指定安装路径

  • /usr/local/nginx

(2)目录核心介绍

在这里插入图片描述

conf #所有配置文件的目录nginx.conf #默认的主要配置文件nginx.conf.default #默认模板html #这是编译安装时Nginx的默认站点目录50x.html #错误页面index.html #默认首页logs #nginx默认的日志路径,包括错误日志以及访问日志error.log  #错误日志nginx.pid  #nginx启动后的进程idaccess.log #nginx访问日志sbin #nginx命令目录nginx #启动命令

(3)常见命令

./nginx #默认配置文件启动./nginx -s reload #重启,加载默认的配置文件,conf/nginx.conf./nginx -s stop #停止nginx./nginx -c /usr/local/nginx/conf/nginx.conf #指定配置文件启动#nginx进程有master process和worker process,关闭master进程即可,其他都被关掉

2.2.Nginx核心配置文件

  • 全局配置
  • server主机配置
  • location(URL匹配特定位置的设置)
#每个配置项有配置指令和指令参数够成 nginx配置文件全部用的相对路径
#user nobody; #指定nginx用户组worker_processes 1; #指定worker process进程的数量#error_log logs/error.log;  #错误日志存放的路径
#error_log logs/error.log notice; #告警日志 
#error_log logs/rttor/log info; #平常日志#pid logs/nginx.pid #nginx进程的启动PID#事件模块指令,用来指定Nginx的IO模型,Nginx支持的所有select、poll、kqueue、epoll等
#不同的是epoll用在linux平台上,而kqueue用在BSD系统上
events{use epoll;#指定每个worker进程的最大连接数,作为服务器来说,最大连接数为worker_connections * worker_processes#作为反向代理来说,最大连接数为worker_connections * worker_processes / 2worker_connections 1024;
}
#HTTP模块
http{#资源的媒体类型include mime.types; #默认为下载,浏览器访问到未定义的扩展名的时候,就默认为下载该文件default_type application/octet-stream; #自定义服务日志#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日志,main 日志定义的格式#access_log logs/access/log main;#是否开启高效传输模式 on开启,off关闭sendfile on; #减少网络报文段的数量#tcp_nopush on; #客户端连接保持活动的超时时间,超过这个时间服务器会自动关闭keepalive_timeout 65;#是否开启压缩#gzip on;#虚拟主机配置server {#虚拟主机的服务端口listen 80;#用来指定IP地址和域名,可以有多个用空格分开server_name localhost;#charset koi8-r;#access_log日志,main 日志定义的格式#access_log logs/host.access.log main;#URL地址配置location /{#服务默认启动目录root html;#默认访问文件,按照顺序找index index.html;}#URL地址配置location ~ \.php${#反向代理的地址proxy_pass http://127.0.0.1;}}server {....}
}

2.3.Nginx搭建前端静态服务器

(1)什么是虚拟主机

  • 指在一台物理主机上划分出多个磁盘空间,每个磁盘空间都是有一个虚拟主机,每台虚拟主机都可以对外提供Web服务,并且互不干扰,类似虚拟机
  • 利用虚拟主机把多个不同域名的网站部署在同一台服务器上,节省了服务器硬件成本和相关的维护费用

在这里插入图片描述

(2)Nginx虚拟主机配置

#use nobody;
worker_processes 1;events{use epoll;worker_connections 1024;
}
http{server{listen 80; #监听的端口server_name www.nginx.com #请求的域名location /{root /usr/local/software/nginx/html #目录index index.html #跳转的页面}}server{listen 80;server_name www.lixiang.com #请求的域名location /{root /usr/local/software/nginx/html #目录index lixiang.html}}
}

重启nginx : ./nginx -s reload

在这里插入图片描述

2.4.Nginx搭建图片服务器

(1)图片服务器

  • 学javaweb、node、或者其他基础web项目,基本都是图片上传到项目本身,这个是很少用的
  • 公司一般都会使用图片服务器或者云厂商提供CDN

(2)访问流程:前端提交图片->后端处理->存储到数据库->拼接好访问路径保存到数据库,存储到文件服务器

在这里插入图片描述

(3)配置虚拟主机

server { listen 

http://chatgpt.dhexx.cn/article/SVY28IDf.shtml

相关文章

什么是反向代理服务器

我们常会看到‘反向代理服务器’这个名词,例如常看到文章上说 nginx 是一个反向代理服务器、varnish 是一个反向代理服务器 …… 下面就了解下这个概念 含义 ‘反向代理服务器’ 有两个概念,一是‘代理服务器’,二是‘反向’ ‘代理服务器’比…

入门Nginx反向代理服务器

前言 博主最近学习了Nginx,故想通过撰写博客的方式加强对知识的认识和记忆,所涉及知识浅薄,如有错误,敬请指正 一.Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器;其特点是占有内存少&#xff0…

推导大O阶方法

1、用常数1取代运行时间中的所有加法常数; 2、只保留最高阶项; 3、去除最高阶项的常数; 常数阶是O(1); 线性阶是O(n); 对数阶是O(logn); 平方阶是O&…

大O算法复杂度表示

序言:算法的时间复杂度和空间复杂度都是用“ 大O表示法” 来表示的。其中O是个常量。 常见的 排序算法的时间复杂度: 冒泡排序、插入排序、希尔排序、选择排序的时间复杂度是O(n^2); 快速排序的时间复杂度是 O&#…

数据结构学习笔记:算法复杂度的度量之“大O记号”

分析算法复杂度的非常重要的方法:大O记号!! 下面来让我们看一下到底什么是大O记号 举个例子: 用一个直尺去评价算法复杂度,上面的刻度就相当于大O记号,我们不一定要一味的强调刻度的精细程度,没…

算法复杂度渐进符号(大O、Ω和θ)的个人理解

做软考习题时,碰到了这样的一道题: 关于算法复杂度渐进符号(O、Ω、θ),详细解释可参考: 【双语字幕】什么是算法复杂度渐进符号?阿布老师算法课11 这里节选总结了视频的重点内容,…

数据结构考研:大O表示法最浅显易懂且详细深入的解释及与小o表示法的区别(十分钟必懂)

大O表示法的背景 作为软件工程专业的学生,在我们学习数据结构的时候,总是会碰见对各种算法时间复杂度和空间复杂度的大O表示法的描述。我们只是将信将疑的用着,并不知道大O表示法的准确含义,今天博主李同学在查阅各方资料后进行详…

算法的时间复杂度(大O表示法)

首先我们先来看个例子, 我想找个1~100的数字,你的目标是以最少的次数猜到这个数字。你每次猜测后,我会说小了、大了或对了。下面我们来看下两种简单的方法(方法有很多种),再来引入算法的运行时间&#xff0…

算法时间复杂度分析——大O、大Ω、大θ、小o,小ω

最近开始转战传统算法分析的研究工作了,重新拾起以前学过的一些内容。 目录 一、概述 二、对常见的Ο和Ω进行分析 2.1 大O表示法 2.2 大Ω表示法 三、P问题,NP问题,NP-hard问题,NPC问题 3.1 P问题和NP问题 3.2 NPC问题和N…

复杂度分析(大O表示法)

复杂度分析 前文提要 本文完完全全引用极客时间的文章《数据结构与算法之美》,作者王争。 数据结构是作为程序猿绕不过的一道坎,所以萌生了学习的想法,试读了几篇文章后发现讲的很好,也有很多人订阅,于是不回头的走…

big O notation - 大 O 表示法

big O notation - 大 O 表示法 Big O notation (with a capital letter O, not a zero), also called Landau’s symbol. 大 O 表示法 (大写字母 O,不为零),也称为 Landau’s symbol。 Big O notation is a mathematical notation that describes the l…

算法分析:大O符号/大Ω符号/大Θ符号/小o符号/小w符号

感谢作者分享,原文链接:http://blog.csdn.net/u012816041/article/details/49888631 大O,渐进表示法,接下来我尝试用最简单的方式进行说明。 学习算法我经常听到这个词汇,我一开始很难理解,什么鬼&#xff…

算法分析—大O、大Ω、大θ

前言 在算法的学习中,最开始便是要学习算法的分析。学习算法分析时,我们便会接触到这么几个符号:大O、大Ω、大θ,常常让人难以理解。 在通常的算法分析时,我们可以明白,在输入规模较小,各种算…

算法分析——大O标记法

目录 一. 运行时间 二. 大O 表示法 2.1 示例 三. 总结 五. 扩展 一. 运行时间 每次介绍算法时,我们都将讨论其运行时间。一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。 可是,如果代码都还没有运行&a…

Oracle数据库查询语句

1 oracle数据库查询表的所有数据–select * from 表名;(* 代表所有) 2 oracle数据库查询表中指定字段的值–select 字段名1,字段名2,……from 表名; 3 oracle数据库往表中添加数据信息–(添加信息使用inser…

Access数据库的查询

内容很简单,我搭建access数据库就是为了简单测试access语句的对错,以及学习access数据库的语法。 1.打开access数据库。 2.主页->空数据库 3.创建数据 4.创建->查询设计 5.【显示表】中的【表】【查询】【两者都有】,都可以。点击添加…

数据库查询语句SQL中like、%、-的区别

数据库查询语句SQL中like、%、-的区别 数据库查询语句SQL中like、%、-的区别 %百分号通配符:表示任何字符出现任意次数(可以是0次) SQL 语句选取 name 以字母 "k" 结尾的所有客户: SELECT * FROM Websites WHERE name LIKE %k; 执行输出结果: 下划线通配符:表示…

使用oracle数据库分页查询语句,各种数据库的分页查询语句

各种数据库的分页查询语句 1.oracle数据库分页select * from (select a.*,rownum rc from 表名 where rownum=endrow) a where a.rc=startrow2.DB2数据库分页Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as 各种数据库的分页…

解决数据库查询语句where条件为空查询全部数据,不为空按照条件查询

问题:在用查询语句查询电影类型,电影年代,电影区域的时候,要返回全部的数据,就是where条件为空,返回所有的数据 解决:select * from 表 where (字段条件 or 条件‘’) 代码: const …

数据库内外联接查询语句

建立如下表并插入数据: create table s(sid varchar2(10) primary key,sname varchar2(50),sage number(30));insert into s values(111,小红,20);insert into s values(222,小红,20);insert into s values(333,小红,20);insert into s values(555,小红,20);create…