文章目录
- 一、Nginx 反向代理
- 1.1 nginx 文件结构
- 1.2 默认的nginx配置文件
- 1.3 实践中的 nginx.conf
- 二、Nginx 负载均衡
- 2.1 热备负载均衡
- 2.2 轮询负责均衡
- 2.3 加权轮询负载规则
- 2.4 ip_hash 负载均衡
- 2.5 对特定资源实现负载均衡
- 2.6 对不同域名实现负载均衡
- 2.7 实现带有URL重写的负载均衡
- 2.8 四层负载均衡
- 三、Nginx 缓存
- 3.1 nginx 的缓存机制
- 3.2 缓存实例
- 3.3 Nginx缓存的清除
- 3.4 Nginx设置资源不缓存
- 四、参考资料
一、Nginx 反向代理
正向代理代理的对象是客户端,反向代理代理的是服务端
在nginx安装包下,有 conf/nginx.conf 文件,这是nginx服务器的基础配置,默认的配置也存放在此。
1.1 nginx 文件结构
# 1.全局块,配置影响nginx全局的指令。
# 一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
... #全局块
# 2.配置影响nginx服务器或与用户的网络连接。
# 有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
events { #events块
...
}
# 3.可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
# 如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http #http块
{
... #http全局块
# 4.配置虚拟主机的相关参数,一个http中可以有多个server。
server #server块
{
... #server全局块
# 5.配置请求的路由,以及各种页面的处理情况。
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
1.2 默认的nginx配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
1.3 实践中的 nginx.conf
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
几个常见配置项:
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
二、Nginx 负载均衡
2.1 热备负载均衡
热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
server {
listen 8081; #监听端口
server_name 127.0.0.1; #监听地址
location /{
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
2.2 轮询负责均衡
轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
server {
listen 8081; #监听端口
server_name 127.0.0.1; #监听地址
location /{
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
2.3 加权轮询负载规则
加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
server {
listen 8081; #监听端口
server_name 127.0.0.1; #监听地址
location /{
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
2.4 ip_hash 负载均衡
ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
server {
listen 8081; #监听端口
server_name 127.0.0.1; #监听地址
location /{
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
2.5 对特定资源实现负载均衡
通过多个upstream分成多个服务器组,将不同的请求分流到不同的
upstream videomysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
upstream filemysvr {
server 192.3.2.1:7878 weight=1;
server 192.3.2.2:3333 weight=2;
}
server {
listen 8081; #监听端口
server_name 127.0.0.1; #监听地址
location /video/ {
proxy_pass http://videomysvr; #请求转向mysvr 定义的服务器列表
}
location /file/ {
proxy_pass http://filemysvr; #请求转向mysvr 定义的服务器列表
}
}
2.6 对不同域名实现负载均衡
upstream videomysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
upstream filemysvr {
server 192.3.2.1:7878 weight=1;
server 192.3.2.2:3333 weight=2;
}
server {
listen 8081; #监听端口
server_name www.ustc.edu.cn; #监听地址
location /video/ {
proxy_pass http://videomysvr; #请求转向mysvr 定义的服务器列表
}
}
server {
listen 8082; #监听端口
server_name www.ustc.sse.edu.cn; #监听地址
location /file/ {
proxy_pass http://filemysvr; #请求转向mysvr 定义的服务器列表
}
}
2.7 实现带有URL重写的负载均衡
upstream backend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 80;
server_name localhost;
location /file/ {
rewrite ^(/file/.*) /server/$1 last;
}
location / {
proxy_pass http://backend;
}
}
2.8 四层负载均衡
首先安装好redis和tomcat
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 缓存
nginx 缓存的好处
- 减轻服务器负载
- 提供网页响应效率
- 降低网络阻塞,增强网络可扩展性
3.1 nginx 的缓存机制
配置块 | 名称 | 名称 |
---|---|---|
http | proxy_cache_path | 指定缓冲区的路径 |
levels | 缓存目录级最高三层,每层1-2个字符表示,比如:1:1:2 三层 | |
keys_zone | 缓存块名称及内存块大小,比如:cache_item:500m表示声明一个名为cache_item大小为500m,超出大小后最早的被清除 | |
max_size | 缓存区硬盘的最大值,超出闲置数据将被清除 | |
inactive | 最长闲置时间,比如:10d ,表示一个数据被闲置10天则将被清除 | |
location | proxy_cache | 指定缓冲区,对应keys_zone中的设定的值 |
proxy_cache_key | 通过参数拼装参数key如:h o s t hosthosturii s a r g s is_argsisargsargs 则会已全部md5值作为key | |
proxy_cache_valid | 对不同的状态码设置缓存有效期 |
http模块:
- proxy_cache_path:该指定用于设置缓存文件的存放路径
- levels: 指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2如 :
levels=1:2
缓存空间有两层目录,第一次是1个字母,第二次是2个字母;levels=2:2:2
最终的存储路径为 /usr/local/proxy_cache/7d/10/e2 - keys_zone:用来为这个缓存区设置名称和指定大小,如:
keys_zone=ffideal:200m
缓存区的名称是ffideal,大小为200M,1M大概能存储8000个keys - inactive:指定缓存的数据多次时间未被访问就将被删除,如:
inactive=1d
,缓存数据在1天内没有被访问就会被删除 - max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:
max_size=20g
http{
# proxy_cache_path path [levels=number]
# keys_zone=zone_name:zone_size [inactive=time]\[max_size=size];
proxy_cache_path /usr/local/proxy_cache levels=1:2:1 keys_zone=ffideal:200m inactive=1d max_size=20g
}
location:
- proxy_cache
该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存。
语法 | proxy_cache zone_name|off; |
---|---|
默认值 | proxy_cache off; |
位置 | http、server、location |
zone_name:指定使用缓存区的名称
- proxy_cache_key
该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存。
语法 | proxy_cache_key key; |
---|---|
默认值 | proxy_cache_key $scheme$proxy_host$request_uri; |
位置 | http、server、location |
- proxy_cache_valid
该指令用来对不同返回状态码的URL设置不同的缓存时间
语法 | proxy_cache_valid [code …] time; |
---|---|
默认值 | — |
位置 | http、server、location |
如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
proxy_cache_valid any 1m;
对所有响应状态码的URL都设置1分钟缓存
- proxy_cache_min_uses
该指令用来设置资源被访问多少次后被缓存
语法 | proxy_cache_min_uses number; |
---|---|
默认值 | proxy_cache_min_uses 1; |
位置 | http、server、location |
- proxy_cache_methods
该指令用户设置缓存哪些HTTP方法
语法 | proxy_cache_methods GET|HEAD|POST; |
---|---|
默认值 | proxy_cache_methods GET HEAD; |
位置 | http、server、location |
默认缓存HTTP的GET和HEAD方法,不缓存POST方法。
3.2 缓存实例
Nginx的环境准备
(1)完成Nginx反向代理配置
http{
upstream backend{
server 192.168.200.146:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend/js/;
}
}
}
(2)完成Nginx缓存配置
4.添加缓存配置
http{
proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
upstream backend{
server 192.168.200.146:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_cache itcast;
proxy_cache_key itheima;
proxy_cache_min_uses 5;
proxy_cache_valid 200 5d;
proxy_cache_valid 404 30s;
proxy_cache_valid any 1m;
add_header nginx-cache "$upstream_cache_status";
proxy_pass http://backend/js/;
}
}
}
3.3 Nginx缓存的清除
方式一:删除对应的缓存目录
rm -rf /usr/local/proxy_cache/......
方式二:使用第三方扩展模块
ngx_cache_purge
(1)下载ngx_cache_purge模块对应的资源包,并上传到服务器上。
ngx_cache_purge-2.3.tar.gz
(2)对资源文件进行解压缩
tar -zxf ngx_cache_purge-2.3.tar.gz
(3)修改文件夹名称,方便后期配置
mv ngx_cache_purge-2.3 purge
(4)查询Nginx的配置参数
nginx -V
(5)进入Nginx的安装目录,使用./configure进行参数配置
./configure --add-module=/root/nginx/module/purge
(6)使用make进行编译
make
(7)将nginx安装目录的nginx二级制可执行文件备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
(8)将编译后的objs中的nginx拷贝到nginx的sbin目录下
cp objs/nginx /usr/local/nginx/sbin
(9)使用make进行升级
make upgrade
(10)在nginx配置文件中进行如下配置
server{
location ~/purge(/.*) {
proxy_cache_purge itcast itheima;
}
}
3.4 Nginx设置资源不缓存
前面咱们已经完成了Nginx作为web缓存服务器的使用。但是我们得思考一个问题就是不是所有的数据都适合进行缓存。比如说对于一些经常发生变化的数据。如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存。
Nginx也提供了这块的功能设置,需要使用到如下两个指令
proxy_no_cache
该指令是用来定义不将数据进行缓存的条件。
语法 | proxy_no_cache string …; |
---|---|
默认值 | — |
位置 | http、server、location |
配置实例
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass
该指令是用来设置不从缓存中获取数据的条件。
语法 | proxy_cache_bypass string …; |
---|---|
默认值 | — |
位置 | http、server、location |
配置实例
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
上述两个指令都有一个指定的条件,这个条件可以是多个,并且多个条件中至少有一个不为空且不等于"0",则条件满足成立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是$cookie_nocache、$arg_nocache、$arg_comment
$cookie_nocache、$arg_nocache、$arg_comment
这三个参数分别代表的含义是:
$cookie_nocache
指的是当前请求的cookie中键的名称为nocache对应的值
$arg_nocache和$arg_comment
指的是当前请求的参数中属性名为nocache和comment对应的属性值
案例演示下:
log_format params $cookie_nocache | $arg_nocache | $arg_comment;
server{
listen 8081;
server_name localhost;
location /{
access_log logs/access_params.log params;
add_header Set-Cookie 'nocache=999';
root html;
index index.html;
}
}
案例实现
设置不缓存资源的配置方案
server{
listen 8080;
server_name localhost;
location / {
if ($request_uri ~ /.*\.js$){
set $nocache 1;
}
proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
}
}
四、参考资料
https://www.runoob.com/w3cnote/nginx-setup-intro.html
https://www.runoob.com/w3cnote/nginx-proxy-balancing.html