nginx反向代理
(1)proxy_pass命令
server {
listen 80;
server_name localhost;
location /{
#proxy_pass http://39.105.193.52; #不添加/则会拼接location后面的内容
proxy_pass http://39.105.193.52/; #添加/则不会拼接location后面的内容
}
}
server {
listen 80;
server_name localhost;
location /server{
#proxy_pass http://39.105.193.52; #不添加/则会拼接location后面的内容
proxy_pass http://39.105.193.52/; #添加/则不会拼接location后面的内容
}
}
#客户端访问http://localhost/server/index.html
#第一个proxy_pass http://localhost/server/index.html
#第二个proxy_pass http://localhost/index.html
(2)proxy_set_header命令
#被代理服务器
server {
listen 8080;
server_name localhost;
default_type text/plain;
return 200 "$http_username";
}
#代理服务器
server{
listen 8080;
server_name localhost;
location /{
proxy_pass http://39.105.193.52:8080/;
proxy_set_header username TOM;
}
}
(3)proxy_redirect命令
#被代理服务端[192.168.200.146]
server {
listen 8081;
server_name localhost;
if (!-f $request_filename){
return 302 http://192.168.200.146/;
}
}
#代理服务端[192.168.200.133]
server{
listen 8081;
server_name localhost;
location /{
proxy_pass http://192.168.200.146:8081/;
proxy_redirect http://192.168.200.146 http://192.168.200.133;
}
}
rewrite命令
#set命令
set $username liquanle;
#if(必须有空格)命令
if ($args){
return XXX;
}
#break命令(在当前location中找)
break;
#rewrite命令
rewrite ^/rewrite/url\w*$ https://www.baidu.com;
rewrite ^/rewrite/(test)\w*$ /$1;
rewrite ^/rewrite/(demo)\w*$ /$1;
rewrite案例
(1)域名跳转
server{
listen 80;
server_name http://www.itcast.com;
location /{
default_type text/plain;
return 200 "welcome";
}
}
server{
listen 80;
server_name www.itcast.cn www.itheima.com;
rewrite ^(.*) http://www.itcast.com$1;
}
(2)域名镜像------将部分模块进行映射
server{
listen 80;
server_name http://www.itcast.com;
location /{
default_type text/plain;
return 200 "welcome";
}
}
server{
listen 80;
server_name www.itcast.cn www.itheima.com;
location /user{
rewrite ^/user(.*) http://www.itcast.com$1;
}
location /emp{
default_type text/plain;
return 200 "hello emp";
}
}
(3)独立域名
server{
listen 8081;
server_name localhost;
rewrite ^(.*) http://39.105.193.52:80/server1$1;
}
server{
listen 8082;
server_name localhost;
rewrite ^(.*) http://39.105.193.52:80/server2$1;
}
server {
listen 80;
server_name localhost;
location /server1{
default_type text/plain;
return 200 "server1";
}
location /server2{
default_type text/plain;
return 200 "server2";
}
}
nginx负载均衡
七层(应用层)+ 四层(传输层)
#服务器----三个端口模拟三个服务器
server {
listen 9001;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.200.133 9001</h1>';
}
}
server {
listen 9002;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.200.133 9002</h1>';
}
}
server {
listen 9003;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.200.133 9003</h1>';
}
}
#代理服务器
http{
upstream backend{ #服务器组
server 192.168.200.133:9001;
server 192.168.200.133:9002;
server 192.168.200.133:9003;
}
server{
listen 8080;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
}
负载均衡状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后,服务暂停时间 |
max_conns | 限制最大的接收连接数 |
(1)down----不参与负载均衡
(2)backup----当服务器标记为备份服务器,当主服务器不可用时,用来传递请求
(3)max_conns----设置代理服务器同时活动链接的最大数量,默认0,表示不限制。防止后端服务器被压垮。
(4)max_fails----设置允许请求代理服务器失败的次数
(5)fail_timeout----设置失败后服务暂停的时间
http{
upstream backend{ #服务器组
server 192.168.200.133:9001 down;
server 192.168.200.133:9002 backup;
server 192.168.200.133:9003 max_fails=3 fail_timeout=15;
#9003服务器失败3次,15秒内不能访问
}
server{
listen 8080;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
}
负载均衡策略
算法名称 | 说明 |
---|---|
轮询(默认) | 默认方式 |
weight | 权重方式 |
ip_hash | 依据IP分配方式 |
least_conn | 依据最少链接方式 |
url_hash | 依据URL分配方式 |
fair | 依据相应时间方式 |
(1)weight加权
http{
upstream backend{ #服务器组
server 192.168.200.133:9001 weight=10;
server 192.168.200.133:9002 weight=5;
server 192.168.200.133:9003 weight=3;
#9003服务器失败3次,15秒内不能访问
}
server{
listen 8080;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
}
(2)ip_hash----没办法保持负载均衡(可用redis解决session不共享问题)
(3)least_conn----适合请求时间长短不一致造成服务器过载的情况
(4)url_hash
(5)fair
http{
upstream backend{ #服务器组
ip_hash;
#least_conn;方式(3)
#hash &request_uri;方式(4)
#fair;方式(5)
server 192.168.200.133:9001 weight=10;
server 192.168.200.133:9002 weight=5;
server 192.168.200.133:9003 weight=3;
#9003服务器失败3次,15秒内不能访问
}
server{
listen 8080;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
}
七层负载均衡案例
(1)对特定资源实现负载均衡
http{
upstream videobackend{ #服务器组
server 192.168.200.133:9001;
server 192.168.200.133:9002;
}
upstream filebackend{ #服务器组
server 192.168.200.133:9003;
server 192.168.200.133:9004;
}
server{
listen 8080;
server_name localhost;
location /video/{
proxy_pass http://videobackend;
}
location /file/{
proxy_pass http://filebackend;
}
}
}
(2)对不同域名实现负载均衡
http{
upstream butpbackend{ #服务器组
server 192.168.200.133:9001;
server 192.168.200.133:9002;
}
upstream upcbackend{ #服务器组
server 192.168.200.133:9003;
server 192.168.200.133:9004;
}
server{
listen 8080;
server_name www.butp.cn;
location /{
proxy_pass http://butpbackend;
}
}
server{
listen 8081;
server_name www.upc.cn;
location /{
proxy_pass http://upcbackend;
}
}
}
(3)实现带有url重写的负载均衡
http{
upstream backend{ #服务器组
server 192.168.200.133:9001;
server 192.168.200.133:9002;
server 192.168.200.133:9003;
}
server{
listen 8080;
server_name localhost;
location /file/{
rewriter ^(/file/.*) /server/&1 last;
}
location /server{
proxy_pass http://backend;
}
}
}
四层负载均衡
添加stream模块支持 --with-stream
stream与http同一级别
stream {
upstream redisbackend{
server 192.168.200.146:6379;
server 192.168.200.146:6378;
}
upstream tomcatbackend{
server 192.168.200.146:8080;
}
server{
listen 81;
proxy_pass redisbackend;
}
server{
listen 82;
proxy_pass tomcatbackend;
}
}
nginx缓存集成
(1)设置缓存
#proxy_cache_path 路径
#levels=2:1 目录两层,2个字母/1个字母
#keys_zone=itcast:200m 名称:大小
#inactive=1d 1天未使用缓存失效
#max_size=200g 缓存大小
http{
proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=200g;
upstream backend{
server 192.168.200.146:8080;
}
server{
listen 8080;
server_name localhost;
location /{
proxy_catch itcast;#缓存名称
proxy_catch_key $scheme$proxy_host$request_uri;#设置key为访问的url
proxy_catch_min_uses 5;#最少访问5次才缓存
proxy_catch_valid 200 5d;#200状态码缓存5天
proxy_catch_valid 404 30s;#404状态码缓存30秒
proxy_catch_valid any 1m;#其他状态码缓存1分钟
add_header nginx-cache "$upstream_cache_status";#在请求头中添加缓存是否命中
proxy_pass http://backend/js;
}
}
}