一、Nginx代理概述
(1)什么是正向代理和反向代理
代理就是客户端通过代理服务器去访问指定的服务器,例如去买房子,人门通过中介去买开发商的房子,中介就是代理
-正向代理:
- 正向代理是面向客户端的。客户端想要访问一个web服务器,但是客户端的ip被web服务器禁止访问了,这个时候就可以通过代理服务器,客户端通过代理服务器去访问web服务器,web服务器只会知道是代理服务器的ip访问的它,而不知道是客户端
正向代理更多的用在公司内网,公司内员工的主机都通过一个代理服务器访问互联网,而互联网上被访问的服务器,只知道代理服务器的ip,不知道公司内员工的ip
-反向代理
反向代理是面向服务器的。通常客户端要访问web服务器,就得知道web服务器的真实ip,但这样对于公司来说就需要多个公网ip,并且web的真实ip被暴露在了互联网上,十分的不安全,这个时候只需要部署一个代理服务器即可,客户端访问代理服务器,代理服务器去访问公司内网的web服务器,然后调取数据后返回给客户端,这个过程客户端不知道web服务器的真实ip,而公司也不需要多个公网ip,只需要代理服务器一个公网ip即可
反向代理通常搭配负载均衡一起使用
-反向代理和正向代理的区别
代理的对象不一样,正向代理是面向客户端的,而反向代理是面向服务器的
实际工作中使用最多的是反向代理
(2)配置代理
- Nginx作为一个高性能的web服务器,同时也是一个优秀的代理服务器,可以使用Nginx来配置正向和反向代理
-Nginx代理配置语法
- Nginx代理配置:
语法:
proxy_pass URL
默认: 无
可配置区域: location,if in location,limit_except
URL即资源,就是用户访问proxy_pass URL所在的location时会跳转到指定的URL
- 类似于nopush缓冲区
语法:
proxy_buffering on\off
默认: proxy_buffering on
可配置区域: http,server,location
扩展:
proxy_buffer_size , proxy_buffers , proxy_busy_buffer_size
- 跳转重定向
语法:
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/; } }
- 修改头部信息
语法:
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的值
- 代理到后端的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服务器的图片资源只允许代理服务器
添加代理,再次访问。注意:使用inetcpl.cpl只对ie浏览器和360浏览器生效,其他的浏览器配置文件不是这个
查看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"