前言
正向代理: 用于代理内部网络对 Internet 的连接请求(如 VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标 Web 服务器的 HTTP 请求先发送到代理服务器上
, 然后由代理服务器去访问 Web 服务器, 并将 Web 服务器的 Response 回传给客户端。
反向代理: 与正向代理相反,如果局域网向 Internet 提供资源,并让 Internet 上的其他用户可以
访问局域网内资源, 也可以设置一个代理服务器, 它提供的服务就是反向代理. 反向代理服 务器接受来自 Internet 的连接,然后将请求转发给内部网络上的服务器
,并将 Response 回传给Internet 上请求连接的客户端。
nginx反向代理:web服务器的调度器
从上图可以看出:反向代理服务器代理网站 Web 服务器接收 Http 请求,对请求进行转发。 而且nginx作为反向代理服务器可以根据用户请求的内容把请求转发给后端不同的web服务 器
,例如静动分离,再例如在 nginx 上创建多个虚拟主机,这样就成功的做到了在浏览器中输入不同域名(url)的时候访问后端的不同 web 服务器或 web 群集。
反向代理的作用
- 保护网站安全:任何来自 Internet 的请求都必须先`经过代理服务器;
- 通过配置缓存功能加速 Web 请求:可以缓存真实 Web 服务器上的某些静态资源,减轻真实 Web 服务器的负载压力;
- 实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;
Nginx+apache 构筑 Web 服务器集群的负载均衡
目的:配置 nginx 作为反向代理和负载均衡,同时利用其缓存功能,将静态页面在 nginx 缓存,以达到降低后端服务器连接数的目的并检查后端 web 服务器的健康状况。
分析:
结合 proxy 和 upstream 模块实现后端 web 负载均衡
使用 proxy 模块实现静态文件缓存
使用 nginx-sticky-module
扩展模块实现 Cookie 会话黏贴(保持会话)
使用 ngx_cache_purge
实现更强大的缓存清除功能
注:(上面提到的 2 个模块都属于第三方扩展模块,需要提前下好源码,然后编译时通过
–add-moudle=src_path 一起安装)
环境:
OS: centos7.2
nginx:192.168.10.2
apache1:192.168.10.1
apache2:192.168.10.5
nginx编译如下:
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module --add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42
其中,nginx-goodies-nginx-sticky-module-ng-08a395c66e42源码包是:https://pan.baidu.com/s/1eO2_RbxaxVJ01TXDtk9ulA
提取码:oj99
ngx_cache_purge-2.3源码包是:https://pan.baidu.com/s/16rbzuyzs2dCAHFp8iX1mxg
提取码:243t
注:如果你想在已安装好的 nginx 上添加第三方模块,依然需要重新编译,但为了不覆盖你原有的配置,请不要 make install,而是直接拷贝可执行文件
# nginx –V
[root@www nginx-1.14.2]./configure --add-module=…… #你的第三方模块
[root@www nginx-1.14.2] make 后不要 make install,改为手动拷贝,先备份
[root@www nginx-1.14.2] cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
[root@www nginx-1.10.2] cp objs/nginx /usr/local/nginx/sbin/nginx
nginx-sticky-module 模块:
这个模块的作用是通过 cookie 黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理
,这样一定程度上可以解决多backend servers 的 session 同步的问题。nginx-sticky-module 的 cookie 过期时间,默认浏览器关闭就过期。这个模块并不合适不支持 Cookie 或手动禁用了 cookie 的浏览器,此时默认 sticky 就会切换成 rr(轮询)。配置如下:
例如:
upstream backend {
server 192.168.10.1:80 weight=1;
server 192.168.10.5:80 weight=1;
sticky;
}
配置起来超级简单,一般来说一个 sticky 指令就够了。相关信息可以查看官方文档 https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng
实现负载均衡配置
严格来说,nginx 自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的 ngx_http_proxy_module
模块和
ngx_http_upstream_module
模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问。
{ http
......
upstream backend { #建立负载群集名为backend
sticky; #与sticky模块一起用,开启黏连
server 192.168.10.1:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.10.5:80 weight=1 max_fails=2 fail_timeout=10s;
......
}
}
server{
......
location / {
proxy_pass http://backend; #backend里的主机将被代理,也可以接URL地址
}
......
}
max_fails
:允许请求失败的次数,默认为 1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout
: 有两层含义,一是在 10s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,10s 时间内不分配请求到这台服务器。
nginx 的 proxy 缓存使用:
缓存也就是将 js、css、image 等静态文件从后端服务器缓存到 nginx 指定的缓存目录下,既可以减轻后端服务器负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要 ngx_cache_purge 这个模块来在过期时间未到之前,手动清理缓存。
nginx 的 web 缓存功能的主要是由 proxy_cache、fastcgi_cache 指令集和关指令收集完成。proxy_cache 指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache 主要用来处理FastCGI 动态进程缓存
http {
#$upstream_cache_status 记录缓存命中率
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$upstream_cache_status"'; #记录缓存状态
access_log logs/access.log main; #开启接入日志
# http_proxy Settings 代理设置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_buffering on; #代理的时候,开启或关闭缓冲后端服务器的响应
proxy_temp_path /usr/local/nginx/proxy_temp; # 缓存临时目录
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m #设置缓存目录,目录里的文件名是 cache_key 的 MD5 值。
inactive=600m max_size=2g;
server {
listen 80;
server_name localhost;
root html;
index index.php index.html index.htm;
#ngx_cache_purge 实现缓存清除,需要时去掉注释
location ~/purge(/.*) {
allow 127.0.0.1; #只允许本机和192.168.10.0网段可以清除缓存
allow 192.168.10.0/24;
deny all;
proxy_cache_purge my-cache $host$1$is_args$args;
}
location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {
proxy_pass http://backend;
proxy_redirect off; #关闭代理重定向
proxy_set_header Host $host; #设置代理主机头部信息
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504;
proxy_cache my-cache; #缓存区名称
add_header Nginx-Cache $upstream_cache_status; #add_header 指令来设置 response header
proxy_cache_valid 200 304 301 302 8h; #为不同的响应状态码设置不同的缓存时间
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args; #定义如何生成缓存的键
expires 30d; #返回给客户端的浏览器缓存失效时间
}
location /nginx_status {
stub_status on; #开启状态统计信息
access_log off; #关闭此模式下的日志功能
allow 192.168.10.0/24;
deny all;
}
配置完要记得重启nginx服务
[root@localhost ~]# service nginx restart
Nginx service stop success.
Nginx service start success.
web服务器建立测试页:
[root@localhost ~]# echo '<h1>web1:192.168.10.5</h1>' >> /var/www/html/index.html
[root@localhost ~]#
[root@localhost ~]# echo '<h1>web2:192.168.10.1</h1>' > /var/www/html/index.html
验证:nginx 反向代理的缓存功能、负载均衡
如果在缓存时间之内需要更新被缓存的静态文件怎么办呢,这时候就需要手动来清除缓存了。访问:http://192.168.10.2,如下图:用一台测试机访问192.168.10.2时,调度到web服务器上。刷新再看,连接状态信息是304缓存连接成功。
清除缓存
上 述 配 置 的 proxy_cache_purge 指令用于方便的清除缓存,但必须按 照 第 三 方 的ngx_cache_purge 模块才能使用
使用 ngx_cache_purge 模块清除缓存(直接删除缓存目录下的文件也算一种办法):
即使用配置文件中的 location ~ /purge(/.*)(配置文件里去掉注释即可)
浏览器访问 http://192.168.10.2/purge/your/may/path 来清除缓存
缓存清除成功。
备注:
(1)purge 是 ngx_cache_pure 模块指令
(2)your/may/path 是要清除的缓存文件 URL 路径
)若只有一台客户端要验证负载均衡和健康检查可以先关掉缓存功能和保持 session 会话即可。
#proxy_buffering off;
#sticky