Nginx代理服务
作者:互联网
Nginx代理服务概述
代理我们往往并不陌⽣, 该服务我们常常⽤到如(代理租房、代理收货等等)
火车票代售点、代购、第三方
那么在互联⽹请求⾥⾯, 客户端⽆法直接向服务端发起请求, 那么就需要⽤到代理服务, 来实现客户端和服务通信
Nginx 作为代理服务可以实现很多的协议代理, 我们主要以 http 代理为主
正向代理(内部上⽹) 客户端<–>代理->服务端
1、客户端知道代理服务器的存在
2、一般用于公司客户端上网
反向代理 客户端->代理<–>服务端
1、客户端不知道代理的存在
2、代理一般是由服务端设置,加快客户端的访问速度的
代理区别
区别在于代理的对象不⼀样
正向代理代理的对象是客户端
反向代理代理的对象是服务端
Nginx代理配置语法
1.Nginx 代理配置语法
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
http://localhost:8000/uri/
http://192.168.1.2:8000/uri/
http://unix:/tmp/backend.socket:/uri/
2.类似于 nopush 缓冲区
//尽可能收集所有头请求,
Syntax: proxy_buffering on | off;
Default:
proxy_buffering on;
Context: http, server, location
//扩展:
proxy_buffer_size
proxy_buffers
proxy_busy_buffer_size
3.跳转重定向
Syntax: proxy_redirect default;
proxy_redirect off;proxy_redirect redirect replacement;
Default: proxy_redirect default;
Context: http, server, location
NGINX的proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改。
以例子说明:
server {
listen 80;
server_name test.abc.com;
location / {
proxy_pass http://10.10.10.1:9080;
}
}
这段配置一般情况下都正常,但偶尔会出错, 错误在什么地方呢?
抓包发现服务器给客户端的跳转指令里加了端口号,如 Location: http://test.abc.com:9080/abc.html 。
因为nginx服务器侦听的是80端口,所以这样的URL给了客户端,必然会出错.针对这种情况, 加一条proxy_redirect指令: proxy_redirect http://test.abc.com:9080/ / ,把所有“http://test.abc.com:9080/”的内容替换成“/”再发给客户端,就解决了。
proxy_redirect http://test.abc.com:9080/ /
server {
listen 80;
server_name test.abc.com;
proxy_redirect http://test.abc.com:9080/ /;
location / {
proxy_pass http://10.10.10.1:9080;
}
}
4.头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
//扩展:
proxy_hide_header
proxy_set_body
客户端请求web服务,客户端:
ip:192.168.1.3
nginx作为反向代理服务器:
192.168.1.1
nginx作为后端web服务器:
192.168.1.2
proxy_set_header Host $host; $host就是nginx代理服务器,也就是客户端请求的host。
proxy_set_header Host $proxy_host; proxy_host就是代理服务器请求的host也就是后端服务器208
proxy_set_header X-Real-IP $remote_addr; $remote_addr的值为客户端的ip
proxy_set_header Host $host:$proxy_port; $host代表转发服务器,$proxy_port代表207转发服务器请求后端服务器的端口,也就是80
5.代理到后端的 TCP 连接超时
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
//扩展
proxy_read_timeout //以及建⽴
proxy_send_timeout //服务端请求完, 发送给客户端时间
演示:
实验环境:准备两台nginx服务武器和一台Linux客户机
代理 | 192.168.1.1 |
---|---|
服务器 | 192.168.1.2 |
客户机 | 192.168.1.3 |
代理:
vi /usr/local/nginx/conf/nginx.conf
location /zps {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.2:8081/zps;
}
systemctl restart nginx ##重启nginx服务
服务器:
vi /usr/local/nginx/conf/nginx.conf
listen 8081;
cd /usr/local/nginx/html/
mkdir zps
cp index.html zps/
systemctl restart nginx
客户机访问:
curl -I http://192.168.1.1/zps
显示端口8081
代理
vi /usr/local/nginx/conf/nginx.conf
proxy_redirect off;
systemctl restart nginx ##重启nginx服务
客户机再访问:
curl -I http://192.168.1.1/zps
Fiddler安装包点击下载
提取码: t9tj
打开Fiddler进行抓包
打开浏览器访问http://192.168.1.1/zps
客户机进行抓包:
curl -I http://192.168.1.1/zps
可以看到可以通过抓包知道我们访问的是代理服务器
我们看到访问http://192.168.1.1/zps/ 会直接跳转到http://192.168.1.2:8081/zps/
但是一般情况下是不允许别人抓到这些信息的
所以修改代理服务器上的nginx.conf配置文件
代理:
vi /usr/local/nginx/conf/nginx.conf
proxy_redirect http://192.168.1.2:8081/zps /zps;
客户端再抓包:
curl -I http://192.168.1.1/zps
服务器获取客户机真实ip
查看服务器的访问日志
cat /usr/local/nginx/logs/access.log
我们可以看到web服务器 只能获取 代理服务器的ip地址
实验步骤:
代理:
vi /usr/local/nginx/conf/nginx.conf
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
systemctl restart nginx ##重启nginx服务
服务器:
去掉注释
vi /usr/local/nginx/conf/nginx.conf
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# access_log logs/access.log main;
systemctl restart nginx ##重启nginx服务
客户机再访问
curl -I http://192.168.1.1/zps
查看服务器的访问日志我们可以看到成功获取到了客户机的真实ip
cat /usr/local/nginx/logs/access.log
Nginx正向代理示例
Nginx 正向代理配置实例:
配置服务器1.2访问限制,只允许代理1.1访问
在服务器1.2上配置就允许代理1.1访问图片
服务器:
vi /usr/local/nginx/conf/nginx.conf
listen 80;
location ~ .*\.(jpg|gif|png) {
allow 192.168.1.1;
deny all;
}
然后进入网页默认目录上传一张图片:
cd /usr/local/nginx/html/
yum -y install lrzsz
rz ##上传
vi index.html
<h1>192.168.1.2</h1>
<img src="1.jpg" />
systemctl restart nginx ##重启nginx服务
客户机访问 发现访问不了图片了
http://192.168.1.2
代理:
现在只有代理服务器可以访问服务器的图片
vi /usr/local/nginx/conf/nginx.conf
proxy_pass http://$http_host$request_uri;
#$http_host 是一个变量,指的是客户端请求的目标ip地址
#$request_uri 是客户端请求的目标资源
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
systemctl restart nginx ##重启nginx服务
客户机浏览器设置
打开ie浏览器:
设置代理服务器ip地址 再次访问1.2的80端口
客户机再次访问:
http://192.168.1.2
做完测试我们要把浏览器的代理及时去除 不然的话就访问不了其他网页了 就像这样:
因为我们这个测试的代理服务器是没有连接网络的
Nginx反向代理示例
反向代理配置
代理:
vi /usr/local/nginx/conf/nginx.conf
proxy_pass http://192.168.1.2:8080;
}
systemctl restart nginx ##重启nginx服务
服务器:
Web站点修改监听的端口号为8080
vi /usr/local/nginx/conf/nginx.conf
listen 8080;
systemctl restart nginx ##重启nginx服务
客户机:
访问测试:
http://192.168.1.1
http://192.168.1.2
2.Nginx负载均衡
提升吞吐率, 提升请求性能, 提⾼容灾
在nginx中用到了反向代理,不一定会用负载均衡
在nginx中用到了负载均衡,一定会用反向代理
真正实现反向代理的是,负载均衡算法
负载均衡按范围划分:GSLB全局负载均衡、SLB
Nginx 是⼀个典型的 SLB
负载均衡按层级划分: 分为四层(传输层)负载均衡和七层(应用层)负载均衡
Nginx 是⼀个典型的七层 SLB
LVS: 四层的负载均衡
Haproxy:既支持四层又支持七层
2.1Nginx负载均衡配置场景
Nginx 负载均衡模块upstream 需要跟nginx反向代理模块proxy_pass结合起来使用
Nginx 实现负载均衡⽤到了 proxy_pass 代理模块核⼼配置, 将客户端请求代理转发⾄⼀ 组 upstream 虚拟服务池
代理:
weight=1 他的意思就是那台服务器性能更好就可以在后面把weight的数值调高一些
比如:weight=5
vi /usr/local/nginx/conf/nginx.conf
upstream zps {
server 192.168.1.2:80 weight=5;
server 192.168.1.3:80 weight=5;
}
proxy_pass http://zps;
systemctl restart nginx ##重启nginx服务
服务器1.2和1.3上准备两个页面
cd /usr/local/nginx/html/
vi index.html
<html>
<title>nginx1</title>
<body bgcolor="red">
<h1>nginx1</h1>
</body>
</html>
vi index.html
<html>
<title>nginx2</title>
<body bgcolor="blue">
<h1>nginx2</h1>
</body>
</html>
使用浏览器访问:http://192.168.1.1
2.2Nginx负载均衡状态配置
后端服务器在负载均衡调度中的状态
测试 backup 以及 down 状态
比如:
server 192.168.1.2:80 weight=5 down; ##当前192.168.1.2服务器暂时不参与负载均衡
server 192.168.1.2:80 weight=5 backup; ##当前192.168.1.2服务器不参与负载均衡 充当备份的角色 只有另一台服务器坏掉时才会生效
server 192.168.1.2:80 weight=5 max_fails=2 fail_timeout=10s max_conns=5; ##允许请求失败两次 失败后暂停时间为10秒 最大连接数为5
2.3Nginx负载均衡调度策略
Nginx负载均衡权重轮询具体配置
upstream zps {
server 192.168.1.2:80 weight=1;
server 192.168.1.3:80 weight=5;
server 192.168.1.4:80;
}
Nginx负载均衡 ip_hash 具体配置
upstream zps {
ip_hash;
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.3:80;
}
Nginx负载均衡url_hash具体配置
upstream zps {
hash $request_uri;
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
}
3.Nginx动静分离
动静分离,通过中间件将动态请求和静态请求进⾏分离, 分离资源, 减少不必要的请求消耗, 减少请 求延时。
好处: 动静分离后,即使动态服务不可⽤, 但静态资源不会受到影响
通过中间件将动态请求和静态请求分离
Nginx动静分离应⽤案例
环境准备:
服务 | 地址 |
---|---|
proxy | 192.168.1.1 |
nginx | 192.168.1.2 |
tomcat | 192.168.1.3 |
代理:
vi /usr/local/nginx/conf/nginx.conf
upstream static {
server 192.168.1.2:80 weight=5;
}
upstream java {
server 192.168.1.3:8080 weight=5;
}
proxy_pass http://static;
}
location ~ .*\.(jsp|gif|png|css)$ {
proxy_pass http://java;
}
systemctl restart nginx ##重启nginx服务
客户机浏览器访问:
访问代理服务器的ip会跳到192.168.1.2web服务器的静态页面上
http://192.168.1.1
要想访问动态页面需要再代理服务器的ip后面加上(jsp|gif|png|css)等等后缀
比如:http://192.168.1.1/index.jsp
根据访问不同⽬录, 代理不同的服务器
默认动态,静态直接找设置的static,上传找upload
代理:
vi /usr/local/nginx/conf/nginx.conf
upstream static {
server 192.168.1.2:80 weight=5;
}
upstream java {
server 192.168.1.3:8080 weight=5;
}
location /zps {
root html;
index index.html index.htm;
proxy_pass http://static;
}
location /alex {
proxy_pass http://java;
}
systemctl restart nginx ##重启nginx服务
给nginx服务器1.2准备页面
cd /usr/local/nginx/html/
mkdir zps
echo "<h1>192.168.1.2</h1>" > zps/index.html
给tomcat服务器1.3准备页面
cd /usr/local/tomcat/webapps/ROOT/
mkdir /root/alex
mv /usr/local/tomcat/webapps/ROOT/* /root/alex/
mv /root/alex/ /usr/local/tomcat/webapps/ROOT/
客户机访问:
http://192.168.1.1/zps/
http://192.168.1.1/alex/
域名恶意绑定和防止
恶意绑定实验:
首先我们准备一个可以正常访问的web网站
修改我们客户机的hosts文件
拿浏览器访问www.zps.com就可以了
那我们在公司出现这种情况很危险的那怎么防止呢
很简单
代理:
vi /usr/local/nginx/conf/nginx.conf
拿浏览器再访问www.zps.com就可以了
标签:http,代理服务,1.2,nginx,192.168,Nginx,proxy,conf 来源: https://blog.csdn.net/zps66/article/details/117399801