Nginx 核心知识 150 讲
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
61678 人已学习
新⼈⾸单¥98
课程目录
已完结/共 155 讲
第三章:详解HTTP模块 (40讲)
第四章:反向代理与负载均衡 (38讲)
Nginx 核心知识 150 讲
登录|注册
留言
12
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 89 | proxy模块中的proxy_pass指令
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程综述
02 | Nginx适用于哪些场景?
03 | Nginx出现的历史背景
04 | 为什么用Nginx:它的 5 个主要优点
05 | Nginx的四个主要组成部分
06 | Nginx的版本发布历史
07 | 选择哪一个Nginx发行版本?
08 | 编译出适合自己的Nginx
09 | Nginx配置文件的通用语法介绍
10 | Nginx命令行及演示:重载、热部署、日志切割
11 | 用Nginx搭建一个可用的静态资源Web服务器
12 | 用Nginx搭建一个具备缓存功能的反向代理服务
13 | 用GoAccess实现可视化并实时监控access日志
14 | 从网络原理来看SSL安全协议
15 | 对称加密与非对称加密各自的应用场景
16 | SSL证书的公信力是如何保证的?
17 | SSL协议握手时Nginx的性能瓶颈在哪里?
18 | 用免费SSL证书实现一个HTTPS站点
19 | 基于OpenResty用Lua语言实现简单服务
20 | Nginx的请求处理流程
21 | Nginx的进程结构
22 | Nginx的进程结构实例演示
23 | 使用信号管理Nginx的父子进程
24 | reload重载配置文件的真相
25 | 热升级的完整流程
26 | 优雅地关闭worker进程
27 | 网络收发与Nginx事件间的对应关系
28 | Nginx网络事件实例演示
29 | Nginx的事件驱动模型
30 | epoll的优劣及原理
31 | Nginx的请求切换
32 | 同步&异步、阻塞&非阻塞之间的区别
33 | Nginx的模块究竟是什么?
34 | Nginx模块的分类
35 | Nginx如何通过连接池处理网络请求
36 | 内存池对性能的影响
37 | 所有worker进程协同工作的关键:共享内存
38 | 用好共享内存的工具:Slab管理器
39 | 哈希表的max_size与bucket_size如何配置
40 | Nginx中最常用的容器:红黑树
41 | 使用动态模块来提升运维效率
42 | 第三章内容介绍
43 | 冲突的配置指令以谁为准?
44 | Listen指令的用法
45 | 处理HTTP请求头部的流程
46 | Nginx中的正则表达式
47 | 如何找到处理请求的server指令块
48 | 详解HTTP请求的11个阶段
49 | 11个阶段的顺序处理
50 | postread阶段:获取真实客户端地址的realip模块
51 | rewrite阶段的rewrite模块:return指令
52 | rewrite阶段的rewrite模块:重写URL
53 | rewrite阶段的rewrite模块:条件判断
54 | find_config阶段:找到处理请求的location指令块
55 | preaccess阶段:对连接做限制的limit_conn模块
56 | preaccess阶段:对请求做限制的limit_req模块
57 | access阶段:对ip做限制的access模块
58 | access阶段:对用户名密码做限制的auth_basic模块
59 | access阶段:使用第三方做权限控制的auth_request模块
60 | access阶段的satisfy指令
61 | precontent阶段:按序访问资源的try_files模块
62 | 实时拷贝流量:precontent阶段的mirror模块
63 | content阶段:详解root和alias指令
64 | static模块提供的3个变量
65 | static模块对url不以斜杠结尾却访问目录的做法
66 | index和autoindex模块的用法
67 | 提升多个小文件性能的concat模块
68 | access日志的详细用法
69 | HTTP过滤模块的调用流程
70 | 用过滤模块更改响应中的字符串:sub模块
71 | 用过滤模块在http响应的前后添加内容:addition模块
72 | Nginx变量的运行原理
73 | HTTP框架提供的请求相关的变量
74 | HTTP框架提供的其他变量
75 | 使用变量防盗链的referer模块
76 | 使用变量实现防盗链功能实践:secure_link模块
77 | 为复杂的业务生成新的变量:map模块
78 | 通过变量指定少量用户实现AB测试:split_client模块
79 | 根据IP地址范围的匹配生成新变量:geo模块
80 | 使用变量获得用户的地理位置:geoip模块
81 | 对客户端使用keepalive提升连接效率
82 | 反向代理与负载均衡原理
83 | 负载均衡策略:round-robin
84 | 负载均衡哈希算法:ip_hash与hash模块
85 | 一致性哈希算法:hash模块
86 | 最少连接算法以及如何跨worker进程生效
87 | upstream模块提供的变量
88 | proxy模块处理请求的流程
89 | proxy模块中的proxy_pass指令
90 | 根据指令修改发往上游的请求
91 | 接收用户请求包体的方式
92 | 与上游服务建立连接
93 | 接收上游的响应
94 | 处理上游的响应头部
95 | 上游出现失败时的容错方案
96 | 对上游使用SSL连接
97 | 用好浏览器的缓存
98 | Nginx决策浏览器过期缓存是否有效
99 | 缓存的基本用法
100 | 对客户端请求的缓存处理流程
101 | 接收上游响应的缓存处理流程
102 | 如何减轻缓存失效时上游服务的压力
103 | 及时清除缓存
104 | uwsgi、fastcgi、scgi指令的对照表
105 | memcached反向代理的用法
106 | 搭建websocket反向代理
107 | 用分片提升缓存效率
108 | open file cache提升系统性能
109 | HTTP/2协议介绍
110 | 搭建HTTP/2服务并推送资源
111 | gRPC反向代理
112 | stream四层反向代理的7个阶段及常用变量
113 | proxy protocol协议与realip模块
114 | 限并发连接、限IP、记日志
115 | stream四层反向代理处理SSL下游流量
116 | stream_preread模块取出SSL关键信息
117 | stream proxy四层反向代理的用法
118 | UDP反向代理
119 | 透传IP地址的3个方案
120 | 性能优化方法论
121 | 如何高效使用CPU
122 | 多核间的负载均衡
123 | 控制TCP三次握手参数
124 | 建立TCP连接的优化
125 | 滑动窗口与缓冲区
126 | 优化缓冲区与传输效率
127 | 慢启动与拥塞窗口
128 | TCP协议的keepalive功能
129 | 减少关闭连接时的time_wait端口数量
130 | lingering_close延迟关闭TCP连接
131 | 应用层协议的优化
132 | 磁盘IO的优化
133 | 减少磁盘读写次数
134 | 零拷贝与gzip_static模块
135 | 用tcmalloc优化内存分配
136 | 使用Google PerfTools分析Nginx
137 | 使用stub_status模块监控Nginx的状态
138 | 第三方模块源码的阅读
139 | Nginx的启动流程
140 | HTTP第三方模块的初始化
141 | if指令是邪恶的吗?
142 | 解读Nginx的核心转储文件
143 | 通过debug日志定位问题
144 | OpenResty概述
145 | OpenResty中的Nginx模块与Lua模块
146 | 如何在Nginx中嵌入Lua代码
147 | OpenResty中Lua与C代码交互的原理
148 | 获取、修改请求与响应的SDK
149 | 工具类型的SDK
150 | 同步且非阻塞的底层SDK:cosocket
151 | 基于协程的并发编程SDK
152 | 定时器及时间相关的SDK
153 | share.DICT基于共享内存的字典
154 | 子请求的使用方法
155 | 基于OpenResty的WAF防火墙&结课测试
本节摘要
登录 后留言

全部留言(12)

  • 最新
  • 精选
伟忠
有个地方没讲,有个坑,proxy_pass后面接域名时候会DNS缓存,导致这个域名背后的机器负载不均衡,官方推荐的是使用变量解决。

作者回复: 谢谢提醒。 nginx为了提升性能,对于proxy_pass后的域名,不会每次连接都去做resolve,而是解决完一次后就把IP地址存储在内存中,导致如果基于DNS来做负载均衡,而不是nginx做负载均衡时,会有伟忠提出的这个问题。 使用变量,就用到了nginx的脚本,每个请求都会执行一次,虽然效率有下降,但能解这问题。

2018-12-29
2
14
leitiannet
问题1:proxy_buffering不管是on还是off,proxy_buffer_size都有使用,但proxy_buffering为on,proxy_buffers不会被使用,可以这么理解吗? 问题2:如果响应比较大,超过缓冲区大小和临时文件大小,如何处理?丢弃还是直接转发? 问题3:proxy_busy_buffers_size有什么作用?需要单独开辟缓冲区吗? 问题4:proxy_request_buffering为on,是使用client_body_buffer_size设置的缓冲区吗?有没有proxy_buffers? 问题5:proxy_intercept_errors on和proxy_next_upstream http_404会冲突吗? 问题6:定义server时第一个为默认主机,如果将server定义放在单独配置文件中,通过include导入,那默认主机如何判定?

作者回复: 1、对 2、直接转发 3、不开,用来改变发送响应的时刻。 4、不是,用proxy_buffers 5、是的,后者优先级更高 6、include指令属于核心模块ngx_conf_module的指令,先于HTTP模块执行,所以可按照include后的结果推断,仍然是第一个为默认主机 这些问题很有价值,希望后续的问题能分开来提问,这样可以方便其他同学一起参考,谢谢

2019-01-27
9
张营
你好老师,使用ngx.location.capture然后用proxy_pass的方式访问第三方服务,有没有可能第三方服务可用,但是capture返回的状态是504,如果有的话,是什么原因,应该怎么解决?

作者回复: 超时的话,会返回504。默认的超时时间应该是一分钟,考虑增大超时时间是一个方案。或者定位下,第三方服务处理一个请求耗时一分钟以上,并不正常。

2019-01-28
1
拉勾
老师你好,在前后端分离情况下,请求通过nginx1转发到nginx2,其中静态文件和接口转发都在nginx2中,nginx1应该如何配置可以将所有请求都转发到nginx2中,不改前端代码的情况下

作者回复: 用location /可以匹配所有请求(参见第54课),然后在用proxy_pass转发。

2019-12-17
2
小汤哥
老师您好,想请教一下proxy_paas 后面的域名端口号想通过读取环境变量的方式获取,这种动态参数如何传递呢?

作者回复: 环境变量由Nginx框架使用,用户不能直接使用,“By default, nginx removes all environment variables inherited from its parent process except the TZ variable. ”以及“The NGINX environment variable is used internally by nginx and should not be set directly by the user. ”,因为master/worker进程通讯常通过环境变量,如果引入自定义环境变量非常难以维护。建议通过其他方式传递可变参数。

2019-06-05
码农Kevin亮
请教老师,我实战中遇到这样一个问题:我想通过ngx作为反向代理来请求第三方网站的资源,该网站用https协议。最初我是只需要简单设置proxy_pass就能实现;后来发现这招不灵了。 于是我特意用postman验证了一下,单纯用普通网址是可以访问的,比如https://domain/xxx.css;但如果我换成ngx的反向代理服务,比如127.0.0.1/xxx.css,就会返回403错误。 是不是上游服务做了什么校验,从而判定了我的ngx所转发的请求无效?而我可以怎么设置来应对呢?

作者回复: 1、先抓包对比,看看二者HTTP请求的区别;这里涉及到TLS/SSL的抓包,你也可以参考打开nginx debug日志,从日志上找HTTP头部。 2、决定修改、隐藏、新增哪个HTTP头部,后续课程的指令都能做到。 不熟悉Wireshark+tcpdump抓包的话,可以参看我的《Web协议详解与抓包实战》课程

2019-05-13
3
leitiannet
6、include指令属于核心模块ngx_conf_module的指令,先于HTTP模块执行,所以可按照include后的结果推断,仍然是第一个为默认主机 ----如何知道include执行的结果呢?如果相同目录下根据文件名顺序吗

作者回复: 你是用通配符了吗?这样的话,最好不要隐式的使用default server,即第一个就是default server,而要显式的在listen指令中写明谁是default server(参见第47课)。 另外,对于通配符Linux是使用glob函数来查找文件的,其查找出的文件名顺序比较复杂,请参考它的最新man文件:http://man7.org/linux/man-pages/man7/glob.7.html

2019-01-31
张营
 你好老师,使用ngx.location.capture然后用proxy_pass的方式访问第三方服务,有没有可能第三方服务可用,但是capture返回的状态是504, 我配置的超时时间是1秒,有没有可能第三方服务可用,然后因为nginx本身的原因导致504?

作者回复: 504就是超时导致的。1秒太短了,改大点试试看,网络或者服务器波动下,很容易就超时了

2019-01-29
张营
你好老师,使用ngx.location.capture然后用proxy_pass的方式访问第三方服务,有没有可能第三方服务可用,但是capture返回的状态是504,如果有的话,是什么原因,应该怎么解决?

作者回复: 504就是超时,请把nginx的超时时间加大,或者让上游服务更快一点。

2019-01-28
旺旺
upstream main { server web1.local:443; server web2.local:443; server web3.local:443; } server { listen 80; server_name example.com; location / { proxy_pass https://main; proxy_set_header Host $proxy_host; } } 老师有个问题,因为上游的web1.local、web2.local、web3.local的https服务都是监听到这个域名过来的请求才会响应, proxy_pass转过去之后,都变为DNS解析之后的ip地址了,那么如果不用proxy_set_header Host 设置为转过去的域名, 那么就会返回404,有什么办法能取到解析之前的upstream里面的域名吗? 找了很久没有办法,只好用下面这样的办法: split_clients $request_uri $my_upstream { 33% web1.local:443; 33% web2.local:443; * web3.local:443; } server { listen 80; server_name example.com; location / { resolver 127.0.0.1; proxy_pass https://$my_upstream; proxy_set_header Host $Host; } }
2020-04-11
收起评论