【Nginx】Nginx 反向代理
【Nginx】Nginx 反向代理
1. 正向代理
举一个例子:大家都知道,现在国内是访问不了国外的很多网站的,那么怎么才能访问国外的那些网站呢?我们又想,国外不是能访问 国外的那些网站吗(这不废话,肯定可以啊),如果我们电脑的对外公网 IP 地址能变成美国的 IP 地址,那不就可以访问那些网站了。
这里说的是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。
2. 反向代理
- 反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。
- 总结起来还是一句话:正向代理代理客户端,反向代理代理服务器。
3. Nginx反向代理实操
3.1 反向代理实例一
访问 www.siyi.com 直接跳转到 服务器的8080端口。
首先,上面那个域名我没有 尴尬 所以我们可以设置自己电脑,使使用这个域名访问时相当于使用服务器的ip;
首先我们直接使用服务器ip访问8080端口
现在我们先通过修改本地 host 文件,将 www.siyi.com 映射到 服务器的ip
配置完成之后,我们便可以通过 www.123.com:8080 访问到第一步出现的 Tomcat 初始界面。
然后在 nginx.conf 配置文件中增加如下配置
如上配置,我们监听 80 端口,访问域名为 www.123.com,不加端口号时默认为 80 端口,故访问该域名时会跳转到 127.0.0.1:8080 路径上。
然后重新加载nginx服务
再次访问www.siyi.com
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,添加一个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,
3. 相关指令介绍
3.1 listen
该指令用于配置网络监听。主要有如下三种配置语法结构:
- 配置监听的IP地址
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
[accept_filter=filter] [bind] [ssl];
- 配置监听端口
listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter]
[deferred] [bind] [ipv6only=on|off] [ssl];
- 配置 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 ...;
- 对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。
server_name siyi.com www.siyi.com
- 可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。
server_name *.siyi.com www.siyi.*
- 还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。
server_name ~^www\d+\.siyi\.com$;
该表达式“”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个09之间的数字,在紧跟“.siyi.co”,最后跟着“m”($表示结尾)
以上匹配的顺序优先级如下:
- 准确匹配 server_name
- 通配符在开始时匹配 server_name 成功
- 通配符在结尾时匹配 server_name 成功
- 正则表达式匹配 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;
通常该指令有两个作用:第一个是用户在请求访问网站时,请求地址可以不写首页名称;第二个是可以对一个请求,根据请求内容而设置不同的首页。
上一篇: 什么是java bean组件
下一篇: mac使用命令切换jdk版本配置
推荐阅读
-
SpringBoot集成FastDFS+Nginx整合基于Token的防盗链的方法
-
Laravel 5.5官方推荐的Nginx配置学习教程
-
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
-
Nginx设置为Node.js的前端服务器方法总结
-
PHP-FPM和Nginx的通信机制详解
-
关于基于nginx+php组建的网站上传图片漏洞的修补方法
-
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
-
Python的Flask框架及Nginx实现静态文件访问限制功能
-
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
-
Vue项目部署的实现(阿里云+Nginx代理+PM2)