Nginx反向代理应用实例
1、Nginx中location应用实例
location主要用于对URL进行匹配。 location支持正则表达式匹配,也支持条件判断匹配。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /data/wwwroot/www.ixdba.net;
}
以下这段设置是将upload和html下的所有文件都交给nginx来处理,需要注意的是,upload和html目录是在/data/wwwroot/www.ixdba.net目录下的一个子目录。
location ~ ^/(upload|html)/ {
root /data/wwwroot/www.ixdba.net;
}
在下面这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
2、Nginx中location匹配优先级
Nginx中location的匹配优先级(从高到低):
1. = 前缀:表示精确匹配,只有当请求的URL完全等于 / 时才会匹配,如https://www.abc.com/,匹配根路径,不包含任何子路径(如/index.html或/about不会匹配)。在浏览器请求https://www.abc.com时它会默认为 / 。
location = / {
[config A]
}
2. ^~ 前缀:表示这是一个优先前缀匹配。Nginx会先检查请求的URI是否以指定的前缀(这里是/images/)开头。如果匹配,则不再检查后续的正则表达式location规则(即使正则表达式更具体)。匹配所有以/images/开头的URI路径(如/images/photo.jpg、/images/2023/avatar.png等)。
location ^~ /images/ {
[config B]
}
3. ~* 前缀:表示这是一个不区分大小写的正则表达式匹配(单独一个~为区分大小写)。Nginx会检查请求的URI是否匹配指定的正则表达式。
\.(gif|jpg|png|swf)$:正则表达式,匹配以.gif、.jpg、.png或.swf结尾的URI(例如/image.jpg、/animation.SWF等)。
\.:匹配字面的点号(.),因为点号在正则中有特殊含义。
(gif|jpg|png|swf):匹配括号内的任意一个选项(gif、jpg、png或swf)。
$:表示匹配必须出现在URI的末尾。
location ~* \.(gif|jpg|png|swf)$ {
[config C]
}
4. 普通前缀匹配:匹配最长前缀。
/abc/def:表示匹配所有以/abc/def开头的URI路径。
例如:/abc/def/page1、/abc/def/、/abc/def/image.jpg等。
不匹配/abc/defg或/abc/def123,因为这些路径不是以/abc/def开头(除非后续路径完全一致)。
location /abc/def {
[config D]
}
5. 普通前缀匹配:匹配最长前缀。
/abc:表示匹配所有以/abc开头的URI路径。
例如:/abc、/abc/、/abc/def、/abc/123等。
不匹配/abcd或/abcx,因为这些路径不是以/abc开头(除非后续路径完全一致)。
location /abc {
[config E]
}
6. 普通前缀匹配:匹配最长前缀。
又称默认匹配规则
/:表示匹配所有URI路径(包括根路径/和任何其他路径)。
例如:/、/abc、/abc/def、/index.html等。
这是最通用的前缀匹配,因为所有URI都以/开头。
location / {
[config F]
}
匹配顺序和优先级总结:
Nginx的location匹配顺序如下(从高到低):
- 精确匹配(
=
):仅匹配完全相同的URI。 - 优先前缀匹配(
^~
):跳过正则匹配,直接使用前缀匹配。 - 正则匹配(
~
或~*
):按配置文件中定义的顺序匹配(先到先得)。 - 普通前缀匹配(无修饰符):匹配最长前缀。
3、反向代理与正向代理
反向代理
反向代理(Reverse Proxy)方式是指通过代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并且将从内部网络服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。当一个代理服务器能够代理外部网络上的访问请求来访问内部网络时,这种代理服务的方式称为反向代理服务。
正向代理
客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代理服务器),这就是正向代理。
正向代理适用于:
①局域网的代理服务器
②访问某个受限网络的代理服务器,如教育网访问某些国外网站需要找代理
4、最简单的反向代理实例
实现反向代理功能的是一个叫做proxy_pass的模块
- 最简单的一个反向代理应用如下所示,这里仅列出整个配置中的server部分:
server {
listen 80;
server_name www.a.com;
location / {
proxy_pass http://172.16.213.18;
}
}
这个反向代理实现的功能是:当访问www.a.com的时候,所有访问请求都会转发到后端172.16.213.18这个服务器的80端口上。
- 一个典型的反向代理服务器配置如下所示,这里仅列出整个配置中的server部分:
server {
listen 80;
server_name www.b.com;
location / {
proxy_pass http://172.16.213.77:5601; # 将所有请求代理转发到指定的后端服务器
# 禁用代理重定向功能自动修改后端返回的 Location 和 Refresh 头。(避免后端返回的 3xx 重定向被修改)
proxy_redirect off;
# 设置转发给后端服务器的 HTTP 请求头
proxy_set_header Host $host; # 传递原始请求的 Host 头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端的真实 IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理链中的 IP 地址
# 定义代理连接的超时时间(单位:秒)
proxy_connect_timeout 90; # 与后端服务器建立连接的超时时间
proxy_send_timeout 90; # 发送请求到后端服务器的超时时间
proxy_read_timeout 90; # 从后端服务器读取响应的超时时间
# 配置代理缓冲区的参数
proxy_buffer_size 4k; # 单个请求头缓冲区大小
proxy_buffers 4 32k; # 缓冲区数量和大小(4 个 32KB 的缓冲区)
proxy_busy_buffers_size 64k; # 高负载时使用的缓冲区大小
proxy_temp_file_write_size 64k; # 临时文件写入大小(当响应过大时)
}
}
这个反向代理实现的功能是:当访问www.b.com的时候,所有访问请求都会转发到后端172.16.213.77这个服务器的5601端口上。与上面那个反向代理实例相比,此反向代理配置增加了一些反向代理属性,这些属性一般用于生产环境下对代理性能要求很高的环境中。
5、Nginx反向代理uri的用法
Nginx的这种反向代理用法,主要有如下两种情况,这里仅列出整个配置中的server部分
- 第一种情况请看如下配置:
server {
server_name www.abc.com;
location /uri/ {
proxy_pass http://192.168.99.100:8000;
}
}
nginx的proxy_pass对于此种情况的处理方式是:将location中的uri传递给后端服务器,也就是当客户端访问http://www.abc.com/uri/iivey.html 时,会被反向代理到http://192.168.99.100:8000/uri/iivey.html 进行访问。
- 第二种uri代理方式配置如下:
server {
server_name www.abc.com;
location /uri/ {
proxy_pass http://192.168.99.100:8000/new_uri/;
}
}
nginx的proxy_pass对于此种情况的处理方式是:替换成proxy_pass指令中URL中含有的uri,也就是当客户端访问http://www.abc.com/uri/iivey.html 时,会被反向代理到http://192.168.99.100:8000/new_uri/iivey.html 进行访问。
- 其实还有一种uri代理方式,配置如下:
server {
server_name www.abc.com;
location /uri/ {
proxy_pass http://192.168.99.100:8000/;
}
}
nginx的proxy_pass对于此种情况的处理方式是:替换成proxy_pass指令中URL中含有的uri,也就是当客户端访问http://www.abc.com/uri/iivey.html 时,会被反向代理到http://192.168.99.100:8000/iivey.html 进行访问。
这种反向代理方式其实是上面第二种uri代理方式的扩展,这里要重点注意下“proxy_pass http://192.168.99.100:8000/;” 这个url结尾有个“/"和没有”/"的区别。
关键区别总结
配置 | proxy_pass URL | 请求 http://example.com/api/user | 请求 http://example.com/api/ |
---|---|---|---|
http://backend_server/ | 以 / 结尾 | http://backend_server/user | http://backend_server/ |
http://backend_server | 不以 / 结尾 | http://backend_server/api/user | http://backend_server/api/ |