共计 2625 个字符,预计需要花费 7 分钟才能阅读完成。
Nginx反向代理技术
Nginx 服务器的反向代理服务是其最常用的重要功能,由反向代理服务也可以衍生出很多与此相关的 Nginx 服务器重要功能,比如后面的负载均衡。
在设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。
代理又分为正向代理和反向代理。
正向代理
正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
正向代理在生活中非常常见,比如在访问国外某一网站时,由于某些原因,我们手上的计算机无法直接访问该网站,但自己手上还有一个可以正常访问目标网站的其它计算机,那么我们就可以通过将当前计算机访问目标网站的所有请求交给可以访问目标网站的计算机处理,在获取响应后,再由该计算机将响应返回给当前计算机。这一过程就是正向代理了,而用于转发请求和响应的计算机就称为代理服务器。我们科学上网的技术原理就是基于此实现的。
在这一过程中,正向代理代理的就是客户端,去和目标服务器进行交互。其优点就是:突破访问封锁技术、提高访问速度、隐藏客户端真实IP。
不过,目标服务器是可以知道代理服务器IP的,因此若目标服务器认为代理服务器会对自己造成损害,那么可以选择IP封锁,忽略来自代理服务器的所有请求,这样一来,代理服务器就不会在访问目标服务器上起到任何代理作用了。但无论怎样,使用该代理服务器的IP是会被隐藏的。
反向代理
反向代理则是和正向代理相反,它代理的是服务器,去和目标客户端进行交互。
反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理的优点就是:隐藏服务器真实IP、负载均衡、提高访问速度、提供安全保障。
Nginx反向代理设置
这里以一个简单的示例介绍:通过访问我们配置的静态网站域名:https://nginx.nnlsde.xyz,反代到https://baidu.com
http {
include mime.types;
server {
listen 443 ssl;
server_name nginx.nnlsde.xyz;
ssl_certificate nginx.nnlsde.xyz.cer;
ssl_certificate_key nginx.nnlsde.xyz.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://baidu.com;
index index.html;
}
}
}
events {}
在上述配置中,与之前的配置基本没有什么变化,唯一有区别的就是通过proxy_pass
进行了反代目标服务器的配置。配置完成后,使用nginx -s reload
重新加载Nginx服务器,然后访问https://nginx.nnlsde.xyz,就会发现自动跳转到了https://baidu.com
除了proxy_pass
这个参数外,还有其它相关的反代配置,如下:
http {
include mime.types;
server {
listen 443 ssl;
server_name nginx.nnlsde.xyz;
ssl_certificate nginx.nnlsde.xyz.cer;
ssl_certificate_key nginx.nnlsde.xyz.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
# 反代目标服务器
proxy_pass https://baidu.com;
index index.html;
}
#代理配置参数
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr;
}
}
events {}
Nginx的内置全局变量及其解释如下:
$args :这个变量等于请求行中的参数,同$query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$document_root : 当前请求在root指令中指定的值。
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$limit_rate : 这个变量可以限制连接速率。
$request_method : 客户端请求的动作,通常为GET或POST。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri : 与$uri相同。