Nginx代理配置详解

一、什么是代理

1、正向代理(forward proxy)

正向代理,简单的说就像是一个跳板,它隐藏了真实的请求客户端(IP),服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器来代替请求。

举个例子来说:众所周知,国内的用户无法访问谷歌,但是因为某些原因,我们必须要访问谷歌,这个时候我们会有一个“梯子”,既然我们无法直接访问谷歌,我们就麻烦“梯子”帮助我们访问谷歌。
事实上我们还是没法访问谷歌,只是这个“梯子”能够访问,它只是将访问结果返回给我们而已。这里的“梯子”就是一个正向代理,它是帮助客户端也就是我们用户来代理的。

正向代理对象是客户端,客户端转发给代理客户端,由代理客户端去真正访问服务器,正向代理隐藏了真实客户端的身份(IP)。

客户端<==转发==>代理客户端的服务器<----------->服务器

当正向代理出现多个请求客户端时,如图所示:

Nginx代理配置详解_第1张图片

简单来说,正向代理指的是一对一或者多对一,服务端不知道发送请求的客户端是哪些人。

2、反向代理(reverse proxy)

反向代理恰好跟正向代理相反。反向代理指的是一对多或者多对多,客户端不知道响应请求的服务端是哪些服务。

反向代理对象是服务端,客户端真正访问的是代理服务器,反向代理隐藏了真实的服务端的身份(IP)。

客户端<----------->代理服务器的服务器<==转发==>服务器

Nginx代理配置详解_第2张图片

反向代理一般是负载均衡(Load Balance)的一个原理。代理服务器会将大量的请求分摊给多台提供相同服务的服务器或集群。
负载均衡的策略跟 nginx使用的负载均衡算法有关,默认使用轮询算法,nginx还提供各种参数给负载均衡调优。

3、反向代理和正向代理的区别

两者根本的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。
总而言之:

  • 正向代理为客户端服务,对服务端是透明的。
  • 反向代理为服务端服务,对客户端是透明的。
  • 梯子的原理就是正向代理,负载均衡的原理就是反向代理。

二、Nginx实现反向代理

1、Tomcat实战

实现效果:打开浏览器,在浏览器的地址栏中输入www.proxy123.com,回车之后就会访问 Linux系统中运行的 Tomcat服务器的主页面。

1.1 安装启动Tomcat

Tomcat依赖JDK。Linux 安装JDK详细步骤:https://blog.csdn.net/qq_42402854/article/details/108164936

然后在 Linux中安装 Tomcat,Tomcat使用端口号8080。一次执行下面命令:

# 下载Tomcat
wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.105/bin/apache-tomcat-7.0.105.tar.gz

# 解压即安装
tar -zxvf apache-tomcat-7.0.105.tar.gz

# 移动到local目录下
mv apache-tomcat-7.0.105 /usr/local/tomcat

# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
  • 如果需要关闭防火墙:systemctl stop firewalld
  • 如果需要关闭tomcat:/usr/local/tomcat/bin/startup.sh

浏览器直接访问 Tomcat服务器,192.168.xxx.xxx:8080

Nginx代理配置详解_第3张图片

1.2 修改 Windows中的 hosts域名映射

打开 C:\Windows\System32\drivers\etc\,在该目录下有一个hosts文件,将该文件进行拷贝备份,避免修改后不知道怎么改回去,打开hosts文件,添加以下配置代码:

#虚拟机域名          映射的网址
192.168.xxx.xxx    www.proxy123.com

1.3 修改Nginx的配置文件并启动Nginx

第一步:编辑nginx.conf

编辑内容如下:vi /usr/local/nginx/conf/nginx.conf

server {
	listen       80; # 指定虚拟主机的服务端口
	server_name  192.168.xxx.xxx;   # 指定虚拟主机的IP,或者外网域名

	# URL匹配
	location / {
 		root  html #定位localtion匹配的url资源路径
		proxy_pass http://127.0.0.1:8080;  # 代理转发
		index  index.html index.htm;  # 定义页面显示html
	}
}

配置文件不熟悉的,可查看文章:https://blog.csdn.net/qq_42402854/article/details/132843413

第二步:Nginx启动

编辑完成之后保存退出,启动Nginx命令:/usr/local/nginx/sbin/nginx

如果Nginx已经启动,那么就使用重新加载配置文件的命令:/usr/local/nginx/sbin/nginx -s reload

[root@centos7 jdk]# /usr/local/nginx/sbin/nginx
nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
[root@centos7 sbin]# mkdir /var/run/nginx/
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx
[root@centos7 sbin]#

Nginx启动报错如下:nginx启动报错:nginx: [error] open() “/var/run/nginx/nginx.pid“ failed (2: No such file or directory) 的解决:https://blog.csdn.net/qq_39244882/article/details/120058404

第三步:浏览器访问OK

启动 Nginx和 Tomcat之后,在浏览器通过 www.proxy123.com就可以通过 nginx代理访问 Tomcat服务的界面啦。

Nginx代理配置详解_第4张图片

第四步:关闭服务

关闭Tomcat命令:/usr/local/tomcat/bin/shutdown.sh

关闭Nginx命令:/usr/local/nginx/sbin/nginx -s stop

三、Nginx反向代理相关指令

1、listen指令

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

1.1 配置监听的IP地址

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
    [accept_filter=filter] [bind] [ssl];

1.2 配置监听端口

listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ipv6only=on|off] [ssl];

1.3 配置 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 服务有关。

2、server_name指令

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

2.1 基于名称的虚拟主机配置

语法格式如下:server_name name …;

1)对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。

server_name   123.com www.123.com

2)也可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。

server_name   *.123.com www.123.*

3)还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。

server_name   ~^www\d+\.123\.com$;

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

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

1、准确匹配 server_name
2、通配符在开始时匹配 server_name 成功
3、通配符在结尾时匹配 server_name 成功
4、正则表达式匹配 server_name 成功

2.2 基于 IP 地址的虚拟主机配置

语法格式如下:server_name 192.168.1.1

语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。

3、location指令

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

1 location [ = | ~ | ~* | ^~] uri {
2 
3 }

URL匹配通配符:

  • /:通用匹配,任何请求都可以匹配
  • :开头表示精确匹配
  • =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  • ~:用于表示uri包含正则表达式,并且区分大小写。
  • ~*:用于表示uri包含正则表达式,并且不区分大小写。
  • ^~:用于不包含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri与请求字符串做匹配。
  • !~和!~*:分别表示区分大小写不匹配和不区分大小写不匹配的正则
    优先级:= --> ^~ --> /* #当有多个包含/进行正则匹配时,选择正则表达式最长的location配置执行。

多个location配置的情况下匹配顺序为: 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

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

4、proxy_pass指令

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

语法结构如下:proxy_pass URL;

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

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

5、index指令

该指令用于设置网站的默认首页。

语法结构如下:index filename …;

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

index  index.html index.jsp;

通常该指令有两个作用:

  • 一个是用户在请求访问网站时,请求地址可以不写首页名称;
  • 一个是可以对一个请求,根据请求内容而设置不同的首页。

– 求知若饥,虚心若愚。

你可能感兴趣的:(#,Nginx,Nginx代理配置详解)