专栏首页运维录Nginx Porxy反向代理

Nginx Porxy反向代理


什么时候需要使用反向代理?

我这里有个例子,早期的WEB服务器使用的是HTTP/1.0协议,是不支持keep-alive功能的,为了解决这个问题当时主流的解决方案是使用nginx做反向代理(支持HTTP/1.1当时优势之一),为客户端浏览器链接HTTP/1.1,并为后端WEB服务器链接HTTP/1.0,经过nginx代理后就可以愉快的使用keep-alive功能了。

让我们顺便八卦下

,说说为什么HTTP/1.1协议中的keep-alive功能这么重要(HTTP/2笑而不语),这是因为HTTP/1.0开销很大而速度又很慢,HTTP/1.0为每一个请求/响应都打开一个TCP连接,打开一个TCP连接需要多次往返消息传递因此速度较慢。HTTP/1.1引入了持久连接(俗称长连接)的概念: 底层的TCP连接可以通过Connection头部来被部分控制。使得对于同一个服务器的请求可以继续在该连接上完成后续请求。(一图胜千言)

八卦完HTTP/1.0协议,让我们回到nginx反向代理上,由于时间太过久远找不到当时的nginx代理配置文件,下面的示例是以一个python项目来讲解nginx如何配置反向代理。两个案例功能类似都是反向代理后端服务器,所以能够说明问题。

说明下项目环境,这个python项目是基于django框架开发的,django框架内置web服务可以直接运行项目,不过django官方明确内置的web服务适用于开发环境,不建议直接用于生产环境,更不用说nginx静态文件处理能力是"这些框架"内置web服务所望尘莫及的。

所以这里增加了nginx用于反向代理django内置web服务,拓扑图如下。


配置文件


示例配置文件中,使用proxy_set_header指令设置Http头部,最后使用proxy_pass指令转发请求到后端服务器。

X-Forwarded-For

用来记录代理服务器的地址,每经过一个代理该字段会追加上一个记录。例如:6.6.6.6, 8.8.8.8。

X-Real-IP

同样用来记录代理服务器的地址,但是和上面的不同它不把记录追加到尾部,而是直接替换掉。

Host

为后端服务器重新设定Host主机头,$host变量的值在请求包含"Host"请求头时为"Host"字段的值,在请求未携带"Host"请求头时为虚拟主机的主域名。

remote_addr

表示客户端地址,_**注意**_如果存在代理服务器,则是最后的代理服务器地址,而非真正的客户端地址。

proxy_pass

经过调整/封装Http头部信息后将请求转发到后端的服务器。

proxy_set_header 指令


语法: proxy_set_header field value 默认值: proxy_set_header Host $proxy_host; proxy_set_header Connection close; 使用字段: http, server, location字段。 功能: 这个指令允许重新定义或者添加发往后端服务器的请求头。 value可以包含文本、变量或者它们的组合。

proxy_pass 指令


语法: proxy_pass URL 默认值: none 使用字段: location, location中的if字段。 功能: 这个指令设置被代理服务器的地址和被映射的URI。 地址可以使用主机名或IP加端口号的形式。 proxy_pass http://localhost:8000/uri/; 或者unix socket,路径在unix关键字的后面指定,位于两个冒号之间。 proxy_pass http://unix:/tmp/backend.socket:/uri/;

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx 缓存服务器(番外)动态 upstream

    在更新应用镜像(图中的App1)版本后,部分静态资源抛出HTTP 502状态码。先来看下 nginx缓存服务器日志,重点在"Host is unreachabl...

    用户1560186
  • Django容器(上): 自定义基础镜像

    某个 Python 项目,基于 Python:3.6 与 Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工...

    用户1560186
  • Nginx Proxy 知识点解析

    区别只在于proxy_pass转发的路径后是否带 “/”, - 针对不带/, 假如我们访问的url=http://www.abc.com/testa/test....

    用户1560186
  • HTTP是什么

    HTP全称为 Hypertext Transfer Protocol,被译为超文本传输协议,是互联网上应用最为广泛的一种网络协议。 HTTP协议是在Web上进行...

    Dreamy.TZK
  • Web 应用安全性: HTTP简介

    正如我们在前一篇文章中看到的,浏览器通过HTTP协议与web应用程序交互,这是我们深入研究这个主题的主要原因。如果用户在网站上输入他们的信用卡信息,攻击者就能在...

    前端小智@大迁世界
  • 【RL-TCPnet网络教程】第41章 HTTP超文本传输协议基础知识

    本章节为大家讲解HTTP(HyperText Transfer Protocol,超文本传输协议),从本章节开始,正式进入嵌入式Web的设计和学习。

    armfly
  • 1·HTTP 概述

    本文是《HTTP 权威指南》的第一章节 HTTP 概述的 读书笔记,我会尝试站在 HTTP 设计者 的角度上将知识点编辑成串,所以阅读本文您将收获 HTTP 宏...

    幺鹿
  • 《计算机网络:自顶向下方法》笔记(2):应用层

    运输层提供了 TCP 和 UDP 两种运输服务。TCP 是面向连接的,并提供了可靠的数据传输服务。UDP 不是面向连接的,切不提供可靠数据传输服务。

    sickworm
  • 如何在Ubuntu 16.04上部署支持HTTP/2的Nginx

    NGINX 是一个快速可靠的开源Web服务器。由于其内存占用空间小,可扩展性高,易于配置,并支持绝大多数协议,因此受到欢迎。 本教程将帮助您部署一个支持HTTP...

    疯狂的技术宅
  • 伪分布式下Hadoop3.0打不开localhost:50070

    伪分布式下Hadoop打不开localhost:50070,可以打开localhost:8088

    庞小明

扫码关注云+社区

领取腾讯云代金券