欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Nginx】Nginx 反向代理

程序员文章站 2022-03-20 08:22:35
...

1. 正向代理

举一个例子:大家都知道,现在国内是访问不了国外的很多网站的,那么怎么才能访问国外的那些网站呢?我们又想,国外不是能访问 国外的那些网站吗(这不废话,肯定可以啊),如果我们电脑的对外公网 IP 地址能变成美国的 IP 地址,那不就可以访问那些网站了。

这里说的是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。

2. 反向代理

  • 反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
【Nginx】Nginx 反向代理
理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。

  • 总结起来还是一句话:正向代理代理客户端,反向代理代理服务器。

3. Nginx反向代理实操

3.1 反向代理实例一

访问 www.siyi.com 直接跳转到 服务器的8080端口。
首先,上面那个域名我没有 尴尬 所以我们可以设置自己电脑,使使用这个域名访问时相当于使用服务器的ip;
首先我们直接使用服务器ip访问8080端口
【Nginx】Nginx 反向代理
现在我们先通过修改本地 host 文件,将 www.siyi.com 映射到 服务器的ip
【Nginx】Nginx 反向代理
配置完成之后,我们便可以通过 www.123.com:8080 访问到第一步出现的 Tomcat 初始界面。
【Nginx】Nginx 反向代理
然后在 nginx.conf 配置文件中增加如下配置
【Nginx】Nginx 反向代理
如上配置,我们监听 80 端口,访问域名为 www.123.com,不加端口号时默认为 80 端口,故访问该域名时会跳转到 127.0.0.1:8080 路径上。
然后重新加载nginx服务
再次访问www.siyi.com
【Nginx】Nginx 反向代理

3.2 反向代理实例二

实现效果:使用 nginx 反向代理, 根据访问的路径跳转到不同端口的服务中nginx 监听端口为 9001,
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081

首先我们可以准备两个tomcat,一个端口为8080,一个端口为8081,然后在两个tomcat目录下的webapps目录中分别创建一个edu的文件夹和vod的文件夹,里面分别装一个a.html文件
【Nginx】Nginx 反向代理
配置nginx,添加一个server块

    server {
        listen      9001;
        server_name 192.168.0.101;
    
       location ~ /edu/ {
            root html;
            proxy_pass http://127.0.0.1:8080;
            index index.html index.htm;
        }  
    
        location ~ /vod/ {
            proxy_pass http://127.0.0.1:8081;
        }
    }

【Nginx】Nginx 反向代理
保存后重启nginx,
【Nginx】Nginx 反向代理

3. 相关指令介绍

3.1 listen

该指令用于配置网络监听。主要有如下三种配置语法结构:

  1. 配置监听的IP地址
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
    [accept_filter=filter] [bind] [ssl];
  1. 配置监听端口
listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ipv6only=on|off] [ssl];
  1. 配置 UNIX Domain Socket
listen unix:path [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ssl];

面的配置看似比较复杂,其实使用起来是比较简单的:

listen *:80 | *:8080 #监听所有80端口和8080端口
listen  IP_address:port   #监听指定的地址和端口号
listen  IP_address     #监听指定ip地址所有端口
listen port     #监听该端口的所有IP连接

下面分别解释每个选项的具体含义:

1. address:IP地址,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。
2. port:端口号,如果只定义了IP地址,没有定义端口号,那么就使用80端口。
3. path:socket文件路径,如 var/run/nginx.sock等。
4. default_server:标识符,将此虚拟主机设置为 address:port 的默认主机。(在 nginx-0.8.21 之前使用的是 default 指令)
5. setfib=number:Nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起作用,不常用。
6. backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在 FreeBSD 中默认为 -1,其他平台默认为511.
7. rcvbuf=size:设置监听socket接收缓存区大小。
8. sndbuf=size:设置监听socket发送缓存区大小。
9. deferred:标识符,将accept()设置为Deferred模式。
10. accept_filter=filter:设置监听端口对所有请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以设置为 dataready 或 httpready 。
11. bind:标识符,使用独立的bind() 处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,Nginx 服务器将只使用一个监听指令,并使用 bind() 处理端口相同的所有连接。
12. ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。

3.2 server_name

该指令用于虚拟主机的配置。通常分为以下两种:

  • 基于名称的虚拟主机配置
    语法格式如下:
server_name   name ...;
  1. 对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。
server_name siyi.com www.siyi.com
  1. 可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。
server_name *.siyi.com www.siyi.*
  1. 还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。
server_name ~^www\d+\.siyi\.com$;

该表达式“”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个09之间的数字,在紧跟“.siyi.co”,最后跟着“m”($表示结尾)

以上匹配的顺序优先级如下:

  1. 准确匹配 server_name
  2. 通配符在开始时匹配 server_name 成功
  3. 通配符在结尾时匹配 server_name 成功
  4. 正则表达式匹配 server_name 成功
  • 基于 IP 地址的虚拟主机配置
    语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。
server_name 192.168.0.104

3.3 location

该指令用于匹配 URL。
语法如下:

location [ = | ~ | ~* | ^~] uri {

}
1. = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2. ~:用于表示 uri 包含正则表达式,并且区分大小写。
3. ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4. ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

3.4 proxy_pass

该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。
语法结构如下:

proxy_pass URL;

URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。

proxy_pass  http://www.siyi.com/uri;

3.5 index

该指令用于设置网站的默认首页。
语法为:

index  filename ...;

后面的文件名称可以有多个,中间用空格隔开。

index  index.html index.jsp;

通常该指令有两个作用:第一个是用户在请求访问网站时,请求地址可以不写首页名称;第二个是可以对一个请求,根据请求内容而设置不同的首页。