1、 代理和nginx相关概念javascript
1. 代理类型php
正向代理:代理局域网对internet的链接请求css
反向代理:代理internet对局域网的链接请求html
2. Nginx反向代理(reverseproxy)的做用java
在必定程度上确保web服务器的安全(由于任何来自internet的请求都须要通过代理服务器)nginx
经过缓存功能加速web访问web
能够实现后端服务器的负载均衡算法
3. Nginx简介apache
1) 核心特色json
支持跨平台
配置简单
使用非阻塞模型、高并发链接(官测5W,实际2-3W)
事件驱动:通讯机制使用epoll模型(一个进程处理多个请求)
Master/worker结构:一个master进程,生成一个或多个woker进程
内存消耗小:进程开启数量影响内存占用,而nginx的一个进程能够处理多请求
内置健康检查功能
节省带宽:支持Gzip压缩
稳定性高
2) Nginx的master/worker结构详解
Master:维护worker队列
Worker:进行实际逻辑运算,并将结果返回给master
一个Master进程产生多个worker进程,而后每一个worker进程处理多个请求,一个worker进程中断后,不会影响其余worker进程,而且master会从新启动新的worker进程
3) 阻塞和非阻塞模型的区别
阻塞模式:当读写事件没有准备好时,只能等待,当前线程将被挂起
非阻塞模式:事件立刻返回,可是响应为事件还没准备好,过会再来,而后每隔一段时间就来检查一下事件,直到事件准备好,在这期间这个线程能够处理其余事情
4) Nginx使用的epoll非阻塞通讯机制的特色
Epoll工做机制也称为:异步非阻塞事件处理机制
Epoll存在一个队列事件,全部未完成的事件,将被放到epoll事件队列中,非阻塞模式须要在每一个未完成的事件之间进行切换,这样致使了cpu开销很大,而epoll模型的通讯机制不会,epoll模型只是在请求之间进行切换,并且切换也是由于异步事件未准备好,而主动让出的,因此这里的切换不须要任何代价,这样nginx实现了高并发和轻量级(只须要几个进程便可)
2、 主要知识点简介
1. nginx-sticky-module模块
主要实现会话保持,后面会介绍配置项
其余实现会话保持的方法:ip_hash
2. Nginx实现LB的调度方案
RR:轮询(默认)
Ip_hash:请求按访问IP的hash结果分配,能够有效解决session共享问题
Least_conn:请求被发送到当前活跃链接最少的后端服务器上,会考虑weight的值
url_hash:按照url的hash结果分配请求,须要nginx的hash包nginx_upstream_hash支持
fair:依据页面大小和加载时间长短智能地进行负载均衡,须要第三方nginx模块upstream_fair支持
3. 负载均衡与健康检查
nginx自带是没有针对负载均衡后端节点的健康检查的,可是能够经过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module 模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问
4. Nginx的proxy缓存
缓存也就是将js、css、image等静态文件从后端服务器缓存到nginx指定的缓存目录下,既能够减轻后端服务器负担,也能够加快访问速度,但这样缓存及时清理成为了一个问题,因此须要 ngx_cache_purge 这个模块来在过时时间未到以前,手动清理缓存。
3、 nginx反向缓存代理服务器搭建
实验环境
1. 后端web服务器的配置
1) 为了实验模拟的更为真实,咱们将两台后端服务器的域名改成同样的
2) 为了能够模拟负载均衡,咱们为两个后端服务器配置相同文件名,内容不一样的html文件
Web1(192.168.1.5)
Web2(192.168.1.6)
3) 分别在两台后端服务器上开启80端口例外
2. Nginx的安装
首先安装依赖包
Nginx的session和缓存清除功能都须要第三方模块的支持,在编译nginx的时候须要指定,因此咱们首先解压第三方模块
而后建立nginx运行时须要的用户
解压nginx而且进行编译安装
nginx默认自带的 ngx_http_proxy_module 模块 和ngx_http_upstream_module模块实现后端服务器的健康检查
使用第三方模块nginx-sticky-module扩展模块实现Cookie会话黏贴(保持会话)
使用第三方模块ngx_cache_purge实现更强大的缓存清除功能
安装完成后的优化及其处理
Nginx不支持动态加载模块,可是第三方模块能够在nginx安装后再次添加,添加方法是:
解压模块文件
解压nginx文件
./configure --add-module=第三方模块压缩文件位置
而后make,可是不make install
最后将新的nginx主程序替换旧的nginx主程序
cp objs/nginx /usr/local/nginx1.10/sbin/nginx
查看nignx安装的模块
4、 修改nginx配置文件实现:反向代理+负载均衡+健康检查
1. 配置文件总览
图片不太清晰,下面我直接将配置粘贴了过来
user www www;
worker_processes 2;
worker_cpu_affinity 01 10;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
worker_rlimit_nofile 10240;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 4096;
}
http {
include mime.types;
default_type application/octet-stream;
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;
server_tokens off;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#Compression Settings
gzip on;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 16 8k;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
#end gzip
# 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 off;
proxy_temp_path /usr/local/nginx1.10/proxy_temp;
proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2 keys_zone=my-cache:100m max_size=1000m inactive=600m max_size=2g;
#load balance Settings
upstream backend {
#sticky;
server 192.168.1.5:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.6:80 weight=1 max_fails=2 fail_timeout=10s;
}
#virtual host Settings
server {
listen 80;
server_name localhost;
charset utf-8;
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
proxy_cache_purge my-cache $host$1$is_args$args;
}
location / {
index index.php index.html index.htm;
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_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
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;
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.1.0/24;
deny all;
}
}
}
2. 分区解释:一
3. 分区解释:二
4. 分区解释:三
5. 分区解释:四
6. 分区解释:五
例:若是须要指定其余调度方法直接在这个配置区域中添加调度方法的配置项便可,如:使用IP_hash算法
7. 分区解释:六
8. 分区解释:七
要想修改代理服务器发送给后端服务器的头信息,实现后端服务器记录真实的客户机IP,只修改这里不行,还须要修改后端服务器的web配置文件
我使用的后端服务器是apache,下面是须要修改的参数,两台后端服务器都须要修改
9. 分区解释:八
10. 分区解释:九
5、 验证
1. 验证缓存
第一次访问
第二次访问
2. 验证缓存清除功能:清空在代理服务器上的缓存
3. 验证负载均衡功能
由于有会话保持和缓存功能,在此环境中体现不出负载均衡功能,因此先将这里两个参数注释掉不用
重启nginx使配置生效
第一次访问web页面
第二次访问web页面
4. 验证健康检查
首先关闭一台后端web服务器的web服务
验证
而后启动刚刚停掉的后端第一台web服务器的httpd服务
再次验证
5. 验证后端服务器日志记录的IP是否为真实客户端的IP
首先使用客户端访问web页面
而后在后端服务器上查看访问日志