nginx的各项代理在官网可以查到,在使用时可参考
一:反向代理语法
nginx反向代理模块指令都由ngx_http_proxy_module模块进行解析,改模块在安装nginx时已将安装
1.proxy-pass
该指令用来设置被代理服务器地址,可以是主机名,ip+端口,域名等形式
模块 | proxy_pass URL |
---|---|
默认值 | — |
位置 | location |
URL: 为要设置被代理的服务器地址,包括传输协议(http,https://),主机称或ip地址加端口号
举例:
proxy_pass http://www.baidu.com;
proxy_pass http://192.168.100.10:8080; #不加端口默认是80
在填写proxy_pass后面加不加 / 呢
当location后面加上一个名称后:
location /server {....}
访问:proxy_pass http://192.168.100.10; #当ip后面不加 / 时
其实访问的是 http://192.168.100.10/server/index.html
访问:proxy_pass http://192.168.100.10/; #当ip后面加上 / 时
其实访问的是 https://192.168.100.10/index.html
server {
listen 8080;
server_name lcoalhost;
location / {
proxy_pass http://172.16.0.168;
proxy_pass http://172.16.0.168/;
}
}
客户端访问后效果是一样的
server {
listen 8080;
server_name lcoalhost;
location /server {
proxy_pass http://172.16.0.168; #访问的是/usr/share/nginx/html/server/index.html 目录
proxy_pass http://172.16.0.168/; #访问的是/usr/share/nginx/html下的index.html 目录
}
}
综上所述:
当location后面是 / 时默认情况下访问的是/usr/share/nginx/html下的index.html 目录
当location后面 / 后加上一个名称后访问的是/usr/share/nginx/html/"名称"/index.html 目录
两台服务器:
公网ip 私网ip
ecs-f076-0001 116.63.97.132 172.16.0.168
ecs-f076-0002 122.9.92.224 172.16.0.6
将ecs-f076-0002作为反向代理服务器
添加proxy_pass内容
[root@ecs-f076-0002 ~]# vim /etc/nginx/nginx.conf
.......
#添加一个server块,设置proxy_pass代理
server {
listen 8080;
server_name lcoalhost;
location / {
proxy_pass http://172.16.0.168; #被代理主机ip默认80端口,如果这里是个自己未注册的域名还需在Windows上hosts文件映射
}
}
#保存退出
#刷新一下
[root@ecs-f076-0002 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ecs-f076-0002 ~]# nginx -s reload
通过浏览器访问ecs-f076-0002的ip+8080端口进行验证
可以看到我们访问的是ecs-f076-0002节点的ip却访问到了ecs-f076-0001节点的文件,这就实现了反向代理的配置
2.proxy_set_header
proxy_set_header就是可设置用户的请求头-并将新的头信息传递到服务器端,即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。
语法:
语法 | proxy_set_header | |
---|---|---|
默认值 | proxy_set_header Host $proxy_host | proxy_set_header Connection close |
位置 | http,server,localtion |
想要得到验证结果要现在被代理服务器上来获取头部信息
被代理服务器:
[root@ecs-f076-0001 html]# vi /etc/nginx/nginx.conf
...#添加一个server模块
server {
listen 8080;
server_name localhost;
default_type text/json;
return 200 $http_username; #获取http请求头部的username信息
}
代理服务器:
[root@ecs-f076-0002 html]# vi /etc/nginx/nginx.conf
server {
listen 8080;
server_name lcoalhost ;
location / {
proxy_pass http://172.16.0.168:8080;
proxy_set_header username TOM; #设置请求头部信息username信息为TOM
}
}
以上就是模拟了客户端请求代理服务器后将username信息改为TOM 后发送给被代理服务器,在被代理服务器上设置了return值返回的就是代理服务器新的请求头,这就很好解释了将用户的头部信息修改后传给被代理服务器
3.proxy_redirect
在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改!!在客户端发送的请求页面可能在服务器上并不存在,但我们还想把正确的页面发送给客户端,呢么就需要从定向。
语法 | proxy_redirect redirect replacement proxy_redirect default; proxy_redirect off; |
---|---|
默认值 | proxy_redirect default; |
位置 | http, server, location |
现在模拟客户端请求的是abc.html这个文件,但服务器上并不存在这个文件,接下来将客户端的这个请求重定向到正常的index.html文件
两台服务器:
公网ip 私网ip
ecs-f076-0001 116.63.97.132 172.16.0.168
ecs-f076-0002 116.63.57.34 172.16.0.94
被代理服务器:
[root@ecs-f076-0001 ~]# vi /etc/nginx/nginx.conf
server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html;
if ( !-f $request_filename ){
return 302 http://116.63.97.132:80/; #如果请求的没有这个网页,则转到这个地址
}
}
}
代理服务器:
[root@ecs-f076-0002 ~]# vi /etc/nginx/nginx.conf
......
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://172.16.0.168:8080/ ; #将请求转发到这个服务器
}
}
在浏览器查看效果
访问代理服务器ip+8080,如下图所示,我在浏览器输入的是代理服务器的ip+端口返回的确实被代理服务器的地址,这不就糟糕了嘛,我们本来用反向代理就是为了隐藏服务器的样一下就暴露了不就芭比Q了嘛
利用curl -i ip 查看详细请求信息
解决地址源服务器地址暴露的问题就要用到proxy_redirect来重定向了
用语法中有一个 proxy_redirect redirect replacement; 来设置
源服务器ip 重定向后的IP
修改代理服务器配置文件:
[root@ecs-f076-0002 ~]# vi /etc/nginx/nginx.conf
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://116.63.97.132:8080;
proxy_redirect http://116.63.97.132:8080 http://116.63.57.34/; #将132主机重定向为34主机,仅仅修改这个还不能成功,还要将下面的
#目录代理成被代理的主机
}
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://116.63.97.132:8080
}
这样就可以通过访问代理服务器的ip+8080端口到后端服务器的内容,而浏览器上显示的信息确实代理服务器的ip和端口