Nginx代理——正向、反向代理,动静分离和负载均衡(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Nginx代理——正向、反向代理,动静分离和负载均衡(上)

一、Nginx代理概述


(1)什么是正向代理和反向代理


代理就是客户端通过代理服务器去访问指定的服务器,例如去买房子,人门通过中介去买开发商的房子,中介就是代理


-正向代理:


  • 正向代理是面向客户端的。客户端想要访问一个web服务器,但是客户端的ip被web服务器禁止访问了,这个时候就可以通过代理服务器,客户端通过代理服务器去访问web服务器,web服务器只会知道是代理服务器的ip访问的它,而不知道是客户端


20210607101130736.png


  • 正向代理更多的用在公司内网,公司内员工的主机都通过一个代理服务器访问互联网,而互联网上被访问的服务器,只知道代理服务器的ip,不知道公司内员工的ip


-反向代理


反向代理是面向服务器的。通常客户端要访问web服务器,就得知道web服务器的真实ip,但这样对于公司来说就需要多个公网ip,并且web的真实ip被暴露在了互联网上,十分的不安全,这个时候只需要部署一个代理服务器即可,客户端访问代理服务器,代理服务器去访问公司内网的web服务器,然后调取数据后返回给客户端,这个过程客户端不知道web服务器的真实ip,而公司也不需要多个公网ip,只需要代理服务器一个公网ip即可


反向代理通常搭配负载均衡一起使用

20210607101145243.png


-反向代理和正向代理的区别


代理的对象不一样,正向代理是面向客户端的,而反向代理是面向服务器的


实际工作中使用最多的是反向代理


(2)配置代理


  • Nginx作为一个高性能的web服务器,同时也是一个优秀的代理服务器,可以使用Nginx来配置正向和反向代理


-Nginx代理配置语法


  1. Nginx代理配置:


语法:


proxy_pass URL


默认:


可配置区域: location,if in location,limit_except


URL即资源,就是用户访问proxy_pass URL所在的location时会跳转到指定的URL


  1. 类似于nopush缓冲区


语法:


proxy_buffering  on\off


默认: proxy_buffering on


可配置区域: http,server,location


扩展:


proxy_buffer_size , proxy_buffers , proxy_busy_buffer_size


  1. 跳转重定向


语法:


proxy_redirect default, proxy_redirect off, proxy_refirect redirect replacement


默认: proxy_redirect default


可配置区域: http , server ,location


Nginx中的proxy_redirect功能十分强大,它的作用时对发送客户端的URL进行修改,例如:

server {
       listen  80;
       server_name www.aaa.com;
       location /{
                proxy_pass http://1.1.1.1:8080;
       }
}
#这段配置虽然是正确的,但是在进行抓包后,发现的URL是这样的http://1.1.1.1:8080/这样不仅看的不舒服,并且还暴露的端口号,增加了风险,所以可以使用proxy_redirect进行重定向,加一条重定向proxy_redirect http://1.1.1.1:8080/ http://www.aaa.com/,这样在抓包时看到的就是http://www.aaa.com/,从而防止了暴露端口号等信息
server {
       listen  80;
       server_name www.aaa.com;
       location /{
                proxy_pass http://1.1.1.1:8080;
                proxy_redirect http://1.1.1.1:8080/ http://www.aaa.com/;
       }
}
  1. 修改头部信息


语法:


proxy_set_header field value


默认: proxy_set_header Host $proxy_host,proxy_set_header Connection close


可配置区域: http,server,location


例如:


客户端ip:100.1,反向代理服务器ip:100.2,后端web服务器ip:100.3

#客户端访问反向代理服务器,反向代理服务器访问后端服务器,后端服务器回应反向代理服务器然后返回给客户端
proxy_set_herder Host $host :Host为变量名称,$host为变量值。$host是一个内建变量,变量值为代理服务器请求的ip即100.3,这段配置的意思即修改头部信息加入Host变量的值,值为$host
proxy_set_header X-Real-IP $remote_addr:同理,X-Real-IP为变量名称,$remote_addr为变量值。$remote_addr也是一个内建变量,变量值为客户端的ip,即100.1,那么这段配置意思就是修改头部信息加入X-Real-IP的值
proxy_set_header Host $host:$proxy_port:同理Host为变量名称,$host:$proxy_port为变量值。$host:$proxy_port是两个内建变量,$host的值为代理服务器的ip100.2,$proxy_set_port的值为转发服务器(100.2)请求web服务器的端口,通常来说就是80,因为Nginx的端口默认为80,这段的意思就是修改头部信息加入Host的值


  1. 代理到后端的TCP连接超时


语法:


proxy_connect_timeout time


默认: proxy_connect_timeout 60s (默认超时时间为60秒)


可配置区域: http,server,location


扩展: proxy_read_timeout,proxy_send_timeout


超时过后会断开TCP连接,这个是基于长连接的,即长连接的超时时间


-配置正向代理


实验环境:


系统 主机名 ip地址 nginx版本 扮演角色
Centos7.4 rzy 192.168.100.202 Nginx-1.18.0 代理服务器
Centos7.4 rzy02 192.168.100.203 Nginx-1.18.0 web服务器


实验目的:


web服务器拒绝本机访问指定资源的图片,本机通过代理可以成功访问web服务器指定资源的图片


rzy—实验步骤:

******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname rzy
[root@Centos7 ~]# su
[root@rzy ~]# systemctl stop firewalld
[root@rzy ~]# setenforce 0
setenforce: SELinux is disabled
[root@rzy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
******(2)上传Nginx包,安装Nginx
[root@rzy ~]# ll
总用量 1020
-rw-------. 1 root root    1264 1月  12 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 1039530 4月  23 00:15 nginx-1.18.0.tar.gz
[root@rzy ~]# yum -y install zlib-devel pcre-devel #安装依赖包
。。。。。。
完毕!
[root@rzy ~]# tar xf nginx-1.18.0.tar.gz  -C /usr/src/
[root@rzy ~]# cd /usr/src/nginx-1.18.0/
[root@rzy nginx-1.18.0]# useradd -M -s /sbin/nologin  nginx
[root@rzy nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
[root@rzy nginx-1.18.0]# scp -r /usr/local/nginx root@192.168.100.203:/usr/local/nginx  #把配置文件直接传到rzy02中
The authenticity of host '192.168.100.203 (192.168.100.203)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.203' (ECDSA) to the list of known hosts.
root@192.168.100.203's password: 
。。。。。。(略)                                                                                               
[root@rzy nginx-1.18.0]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/ #优化执行路径
[root@rzy nginx-1.18.0]# vim /usr/lib/systemd/system/nginx.service #编写启动脚本
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#保存退出
[root@rzy nginx-1.18.0]# systemctl start nginx #开启nginx
[root@rzy nginx-1.18.0]# netstat -anpt | grep 80 #检查端口
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3706/nginx: master  
******(3)修改配置文件,配置正向代理
[root@rzy nginx-1.18.0]# cd /usr/local/nginx/conf/
[root@rzy conf]# cp nginx.conf nginx.conf.bak  #备份一份配置文件
[root@rzy conf]# sed -i '/#/d' nginx.conf  #删除注释和空行
[root@rzy conf]# sed -i '/^$/d' nginx.conf
[root@rzy conf]# vim nginx.conf
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             index  index.html index.htm;
 16             proxy_pass http://$http_host$request_uri;  #利用变量配置跳转,灵活一点
 17             proxy_set_header Host $http_host           
 18             proxy_set_header X-Real-IP $remote_addr;
 19             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #被访问的web服务器可以看到客户端的真实ip
 20         }
 21         }
 22 }
#######注释:
$http_host:这是一个Nginx的内建变量,变量值就是客户端请求的目标ip地址,例如,客户端已经指向了代理,然后访问1.1.1.1,那么这个变量的值就是.1.1.1,同理访问2.2.2.2那么这个变量值就是2.2.2.2
$request_uri:这是一个Nginx的内建变量,变量值就是客户端访问的资源,例如,客户端已经指向了代理,然后访问http://1.1.1.1/那么这个变量值就是/,同理访问http://1.1.1.1/aaa那么这个值就变成了/aaa
$http_host :Nginx的内建变量,值为请求客户端请求代理服务器的ip
$remote_addr:Nginx的内建变量,值为请求客户端的ip

rzy02——实验步骤

******(1)做基础配置
[root@Centos7 ~]# hostnamectl set-hostname rzy02
[root@Centos7 ~]# su               
[root@rzy02 ~]# systemctl stop firewalld
[root@rzy02 ~]# setenforce 0
setenforce: SELinux is disabled
[root@rzy02 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
******(2)优化Nginx
[root@rzy02 ~]# yum -y install zlib-devel pcre-devel  
。。。。。。
完毕!
[root@rzy02 ~]#  ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/
[root@rzy02 ~]# useradd -M -s /sbin/nologin nginx
[root@rzy02 ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#保存退出
[root@rzy02 ~]# systemctl start nginx
[root@rzy02 ~]# netstat -antp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14885/nginx: master 
******(3)修改配置文件
[root@rzy02 ~]# cd /usr/local/nginx/conf/
[root@rzy02 conf]# cp nginx.conf nginx.conf.bak
[root@rzy02 conf]# sed -i '/#/d' nginx.conf
[root@rzy02 conf]# sed -i '/^$/d' nginx.conf
[root@rzy02 conf]# vim nginx.conf  #修改
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  www.aaa.com;
 13         index  index.html index.htm;
 14         root   html;
 15         location ~ .*\.(jpg|gif|png)$ {  #匹配以.jpg、gif、png结尾的资源
 16                allow 192.168.100.202;
 17                deny all;
 18                root html;
 19         }
 20 }
 21 }
[root@rzy02 conf]# systemctl restart nginx
******(4)编写页面
[root@rzy02 html]# vim index.html 
aaaaaa
<img src="1.png"\>
[root@rzy02 html]# rz  #上传照片
z waiting to receive.**B0100000023be50
[root@rzy02 html]# ls
50x.html  index.html  iron_man-006.jpg
[root@rzy02 html]# mv iron_man-006.jpg  1.png

使用本机或者开一台win7虚拟机进行访问,正常是无法看到图片的,因为web服务器的图片资源只允许代理服务器

2021060710121726.png

添加代理,再次访问。注意:使用inetcpl.cpl只对ie浏览器和360浏览器生效,其他的浏览器配置文件不是这个

2021060710123473.png

20210607101245688.png


image.png

查看web服务器的日志

 ******(1)rzy02修改配置文件
[root@rzy02 html]# vim /usr/local/nginx/conf/nginx.conf
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 11     '$status $body_bytes_sent "$http_referer" '
 12     '"$http_user_agent" "$http_x_forwarded_for"';  #让rzy02支持显示真实ip
 13 
 14     access_log  logs/access.log  main;
 15     server {
 16         listen       80;
 17         server_name  www.aaa.com;
 18         index  index.html index.htm;
 19         root   html;
 20         location ~ .*\.(jpg|gif|png)$ {
 21                allow 192.168.100.202;
 22                deny all;
 23                root html;
 24         }
 25 }
 26 }
[root@rzy02 html]# systemctl restart nginx
******(2)再次使用浏览器访问,然后查看日志
[root@rzy02 html]# tail -1 /usr/local/nginx/logs/access.log  #成功显示真实客户端的ip
192.168.100.202 - - [23/Apr/2021:03:45:13 +0800] "GET /1.png HTTP/1.0" 304 0 "http://192.168.100.203/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)" "192.168.100.222"
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
27天前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
112 59
|
5天前
|
存储 负载均衡 中间件
Nginx反向代理配置详解,图文全面总结,建议收藏
Nginx 是大型架构必备中间件,也是大厂喜欢考察的内容,必知必会。本篇全面详解 Nginx 反向代理及配置,建议收藏。
Nginx反向代理配置详解,图文全面总结,建议收藏
|
18天前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
nginx配置反向代理404问题
|
22天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
26 3
|
27天前
|
负载均衡 监控 应用服务中间件
除了 Nginx,还有以下一些常见的负载均衡工具
【10月更文挑战第17天】这些负载均衡工具各有特点和优势,在不同的应用场景中发挥着重要作用。选择合适的负载均衡工具需要综合考虑性能、功能、稳定性、成本等因素。
|
1月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
4月前
|
前端开发 应用服务中间件 nginx
网页设计,若依项目修改(It must be done)01----若依打包位置,nginx代理前端静态资源和后端接口,就是怎样设置转载,访问固定端口,让他访问其他资料的配置文件,访问/,给你那些
网页设计,若依项目修改(It must be done)01----若依打包位置,nginx代理前端静态资源和后端接口,就是怎样设置转载,访问固定端口,让他访问其他资料的配置文件,访问/,给你那些
|
6月前
|
Ubuntu 应用服务中间件 Linux
nginx 配置代理ip访问https的域名配置
nginx 配置代理ip访问https的域名配置
1169 2
|
应用服务中间件 API nginx
在内网开发中使用Nginx代理来访问钉钉新版服务端API
在内网开发中使用Nginx代理来访问钉钉新版服务端API
739 1
|
JavaScript 前端开发 应用服务中间件
VUE配置打包部署服务器Nginx代理访问配置域名
VUE配置打包部署服务器Nginx代理访问配置域名,解决vue路由在Nginx中刷新404的问题,解决打包后找不到 js、静态文件的问题
4588 0