一、代理的两种方式
正向代理
正向代理类似一个跳板机,代理访问外部资源,找完代理之后,还需要找服务器。
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了
作用:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器,只需要找代理,不需要找服务器。
作用:
(1)保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载
二、Nginx代理服务支持的协议
ngx_http_uwsgi_module | Python |
ngx_http_fastcgi_module | PHP |
ngx_http_scgi_module | Java |
ngx_http_v2_module | Golang |
ngx_http_proxy_module | HTTP |
三、实现简易反向代理
部署服务端web01(详细步骤可看之前的博客)
[root@web01 conf.d]# cat game5.conf server { listen 80; server_name test.mario.com; location / { root /code/html-mario; index index.html; } }
部署代理端lb01
① 编译安装nginx
# 下载Nginx源代码包 [root@lb01 ~]# wget https://nginx.org/download/nginx-1.20.2.tar.gz # 解压 [root@lb01 ~]# tar -xf nginx-1.20.2.tar.gz # 进入源代码目录 [root@lb01 ~]# cd nginx-1.20.2 # 安装依赖包 [root@lb01 nginx-1.20.2]# yum install openssl openssl-devel zlib zlib-devel -y # 设置编译参数 [root@lb01 nginx-1.20.2]# ./configure --with-http_gzip_static_module --with-stream --with-http_ssl_module # 编译 [root@lb01 nginx-1.20.2]# make # 安装 [root@lb01 nginx-1.20.2]# make install # 优化 [root@lb01 nginx]# mkdir /etc/nginx [root@lb01 nginx]# mv /usr/local/nginx/conf/* /etc/nginx/ [root@lb01 nginx]# mkdir /etc/nginx/conf.d [root@lb01 nginx]# groupadd www -g 666 [root@lb01 nginx]# useradd www -u 666 -g 666 -M -r -s /sbin/nologin [root@lb01 nginx]# vim /etc/nginx/nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user www; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { 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 /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80; listen [::]:80; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2; # listen [::]:443 ssl http2; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } } [root@lb01 nginx]# vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)" [Install] WantedBy=multi-user.target [root@lb01 sbin]# ln -s /etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf [root@lb01 sbin]# mv /usr/local/nginx/sbin/nginx /usr/sbin/ [root@lb01 sbin]# mkdir /var/log/nginx [root@lb01 sbin]# systemctl start nginx
② 编辑代理配置
[root@lb01 conf.d]# vim /etc/nginx/conf.d/game.conf server { listen 80; server_name _; # _代表本机公网和内网ip都可以登录 location / { proxy_pass http://172.16.1.7:80; # 服务端的ip } }
③ 重启nginx服务
[root@lb01 sbin]# systemctl start nginx
四、配置代理优化文件
① 编辑代理优化配置
[root@lb01 ~]# vim /etc/nginx/proxy_params proxy_set_header Host $http_host; # 用户请求的时候HOST的值是linux.proxy.com, 那么代理服务会像后端传递请求的还是linux.proxy.com proxy_set_header X-Real-IP $remote_addr; # 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址 proxy_connect_timeout 10s; #设置nginx代理与后端服务器连接超时时间(代理连接超时) proxy_read_timeout 10s; #设置nginx代理等待后端服务器的响应时间 proxy_send_timeout 10s; #设置后端服务器数据回传给nginx代理超时时间 proxy_buffering on; #开启缓冲区,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端 proxy_buffer_size 8k; #设置nginx代理保存用户头信息的缓冲区大小 proxy_buffers 8 8k; # 设置有几个缓冲区
② 在nginx配置文件中加载优化文件
[root@lb01 conf.d]# vim game.conf server { listen 80; server_name _; location / { proxy_pass http://172.16.1.7:80; include /etc/nginx/proxy_params; } }
可以在web01服务器中的访问日志中查看修改的信息,如果有便是加载成功了
五、负载均衡
简介
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
负载均衡的实现
实现负载均衡需要将后端服务打包成一个连接池,然后使用反向代理访问
连接池格式:
upstream [连接池名称] {
server [ip]:[port];
server [ip]:[port];
server [ip]:[port];
}
反向代理格式:
server {
listen 80;
server_name _;
location / {
proxy_pass http://[连接池];
}
}
实例:将三个web服务器作为后端服务,使用lb01当作代理访问
[root@lb01 conf.d]# vim game.conf upstream mario { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; } server { listen 80; server_name _; location / { proxy_pass http://mario; include /etc/nginx/proxy_params; } }
通过查看每一台后端服务器nginx的访问日志,我们可以发现每一台后端服务器上都会有该代理的访问的记录
tail -f /var/log/nginx/access.log
负载均衡给每台服务器分配的比例
负载均衡分配比例时有三种算法
① 轮询(Nginx负载均衡默认是轮询分配)
upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; }
② 权重 (Nginx中的权重分为0-100,数字越大,分配到的比例越大)
upstream supermarie { server 172.16.1.7:80 weight=20; server 172.16.1.8:80 weight=10; server 172.16.1.9:80 weight=5; }
③ ip_hash (每一个ip固定访问一个后端)
upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; ip_hash; }
负载均衡后端状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后, 服务暂停时间 |