nginx 之 Module ngx_http_proxy_module 深入研究

# 以下只是自己总结,加深记忆

背景前提介绍:

工作需要,实现对二级nginx反向代理的备份请求;由于国内外网络不稳定原因。

拓扑:主站(北京BGP) 前端nginx,后端tomcat

自制CDN(nginx反向代理)

节点1: HK 香港

节点2:BM 北美

问题:BM nginx反向代理 到 北京BGP,由电信骨干网不稳定,时不时丢包与中断。

解决方案:在广州BGP 增加一个二级nginx反向代理,实现BM nginx反向代理故障,切换备份请求;从而变成了 三级nginx反向代理。

中间碰到问题:由于广州BGP节点,利用别的业务的资源。80端口被占用的情况,实现三级nginx不同端口之间的反向代理。如果使用同样的端口,部署没有什么问题与难度。

深入理解nginx server_name,proxy模块,nginx处理请求过程;变量:$hostname,$host,$http_host,$server_name,$server_port,$proxy_host,$proxy_port。

测试验证,增加nginx log配置信息,增加以上变量,用于观察:

log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent "$http_referer" ‘

‘"$http_user_agent" "$http_x_forwarded_for" "[$hostname $host $http_host $server_name $server_port $proxy_host $proxy_port]"‘;

配置命令:server_name

三种类型的server_name: 精确命名,通配符命名,正则表达式命名

通配符命名:只能以*开头或结尾,并在.的前面或后面

正则表达式命令:以~开头标记

匹配顺序:精确命名 -> *开头通配符命令 -> *结尾通配符命名 —> 正则表达式命名

默认匹配server,当没有以上三种类型匹配到后;第一个定义的server为默认匹配或定义的listen 80 default;为默认匹配。

基于域名与基于IP的虚拟服务:

基于IP的虚拟服务:处理请求时,是要根据HTTP包的进入IP(网卡)+ 端口进行 匹配,然后再根据 server_name进行匹配,否则使用默认匹配server。

基于域名与IP的虚拟服务,都是根据 HTTP包头中的 "host"字段进行区别

三级(多级)nginx 反向代理的原理,及实现不同端口反向代理。

BM nginx 80 端口:

upstrean testweb {

server test1.test.com:82;

}

server {

listen 80;

server_name test2.test.com;

location / {

proxy_redirect   off;

proxy_read_timeout 300;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_buffers    32 64k;

proxy_pass http://testweb;

expires epoch;

}

}

广州 nginx 82 端口:

upstrean testweb {

server www.test.com;

}

server {

listen 82;

server_name test1.test.com test2.test.com; 此处需要添加最前面反向代理的访问域名或者IP地址。

location / {

proxy_redirect   off;

proxy_read_timeout 300;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_buffers    32 64k;

proxy_pass http://testweb;

expires epoch;

}

}

北京BGP nginx 80 端口:

upstrean testweb {

server 127.0.0.1:8080;

}

server {

listen 80;

server_name *.test.com;

location / {

proxy_redirect   off;

proxy_read_timeout 300;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_buffers    32 64k;

proxy_pass http://testweb;

expires epoch;

}

}

nginx test2.test.com -> nginx test1.test.com:82 -> nginx www.test.com

如果 test1.test.com:82,不需要实现访问www.test.com,只需要中转代理的话,由于test2.test.com 与 www.test.com都是80端口, proxy_set_header Host $host;就可以了。否则应该设为:proxy_set_header Host $http_host;

非默认端口时,nginx 反向代理应该 传送给 tomcat服务 Host有端口,像这样:proxy_set_header Host $http_host;或 proxy_set_header Host $host:$server_port,还可以手动指定:proxy_set_header Host $host:82

变量:$hostname,$host,$http_host,$server_name,$server_port,$proxy_host,$proxy_port

$hostname: 本机的hostname的值

$host: http包头中的host值,默认不带端口;可以设置附加端口:proxy_set_header Host $http_host;

$http_host: client客户端请示地址+端口,一般为:域名:端口

$server_name:server中定义server_name的值

$server_port:server中定义listen的值

$proxy_host: proxy_pass(proxy_pass http://testweb;)中testweb值

$proxy_port:proxy_pass(proxy_pass http://testweb;)中端口值,默认端口为80;如果把端口定义在upstearm中,$proxy_port的值也是80。$proxy_port取值只取值proxy_pass指令后的端口值,不取upstream中的端口值。

nginx反向代理请求原理与过程:

示意:test2.test.com -(nginx反向代理)-> test1.test.com:82 -(nginx反向代理)-> www.test.com -(nginx反向代理)-> tomcat:8080

请求包头处理过程:

用户通过浏览器,访问test2.test.com;通过nginx匹配(通$host test2.test.com 匹配server段)后,通过反向代理模块,请求test1.test.com:82,并把用户的请求HTTP包转发给test1.test.com:82的nginx。

test1.test.com:82的nginx(通$host test2.test.com 匹配server段),进行处理。 接着test1.test.com:82对应的server段,通过反向代理模块,请求www.test.com,并把用户的请求HTTP包转发给www.test.com的nginx。

www.test.com的nginx,通过nginx匹配(通$host test2.test.com 匹配server段) 后,通过反向代理模块,请求tomcat:8080,并把用户的请求HTTP包转发给tomcat:8080处理。

tomcat:8080的网站程序,通过$host进行URL地址端口的取值,并构建对应资源URL地址(无端口值时,默认设置80)。由于test2.test.com与www.test.com使用的是默认80端口;proxy_set_header Host $host;用户http请求包头,可以不传送端口值;否则,一定要传送端口值(proxy_set_header Host $http_host;或 proxy_set_header Host $host:$server_por)。

响应包头处理过程:

tomcat:8080处理用户HTTP请求包后,返回HTTP响应包,给www.test.com的nginx;它们之间通过tcp链接通讯。

然后,www.test.com的nginx,把HTTP响应包,返回给test1.test.com的nginx;它们之间通过tcp链接通讯(先前请求时,建立的TCP链接通道)。

然后,test1.test.com的nginx,把HTTP响应包,返回给test2.test.com的nginx;它们之间通过tcp链接通讯(先前请求时,建立的TCP链接通道)。

最后,test2.test.com的nginx,把HTTP响应包,返回给用户请求HTTP的客户端;它们之间通过tcp链接通讯(先前请求时,建立的TCP链接通道)。

     How nginx processes a request

http://nginx.org/en/docs/http/request_processing.html

时间: 2024-10-28 22:05:43

nginx 之 Module ngx_http_proxy_module 深入研究的相关文章

Nginx - SSI Module

SSI, for Server Side Includes, is actually a sort of server-side programming language interpreted by Nginx. Its name is based on the fact that the most used functionality of the language is the include command. Back in the 1990s, such languages were

转:使用 Nginx Upload Module 实现上传文件功能

普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦.Nginx有一个Upload模块,可以非常简单的实现文件上传功能.此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面.下面和大家具体介绍一下. 一.编译安装Nginx 为了使用Nginx Upload Module,需要编译安装Nginx,将upload module编译进去.upload module的代码可以去Gith

Nginx - Events Module

The Events module comes with directives that allow you to configure network mechanisms. Some of the parameters have an important impact on the application's performance. All of the directives listed in the following table must be placed in the events

高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式

通过<高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景>一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率是相当高的.那么: 1. 如果不命中呢? 我们可以到相应的数据服务器上读取数据,然后将它缓存到Nginx服务器上,然后再将该数据返回给客户端.这样,对于该资源,只有穿透 Memcached的第一次请求是需要到数据服务器读取的,之后在缓存过期时间之内的所有请求,都是读取Nginx本地的.不过Nginx的 pro

nginx上传模块—nginx upload module-

一. nginx upload module原理 官方文档: http://www.grid.net.ru/nginx/upload.en.html Nginx upload module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下.这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新组装好上传参数,交由upload_pass指定的段处理,从而允许处理任意上传文件.每个上传文件中的file字段值被一系列的uplo

Nginx Upload Module 上传模块

传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java.PHP.Python.Ruby等.今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面. GitHub: https://github.com/vkholodkov/nginx-upload-module/tree/2.2 Site: http://wiki.nginx.or

Nginx - Rewrite Module

Initially, the purpose of this module (as the name suggests) is to perform URL rewriting. This mechanism allows you to get rid of ugly URLs containing multiple parameters, for instance, http://example.com/article. php?id=1234&comment=32 — such URLs b

Nginx - Core Module Directives

The following is the list of directives made available by the Core module. Most of these directives must be placed at the root of the configuration file and can only be used once. However, some of them are valid in multiple contexts. If that is the c

Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)

1.此文章主要介绍内容 本文主要介绍怎样利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将全部訪问本地Nginx的请求加上OSS 签名转发给OSS,实现本地Nginx无缝衔接阿里云OSS,存储空间无限扩展,存储成本无限下降,数据安全%99.99-- . 2.本篇文章使用到的一些工具技术及怎样学习和获取 1.lua 本文用到的都是一些主要的lua,基本上花半小时阅读下lua的语法就能够轻松理解本文内容 2.N