此笔记是博主在学习nginx的时候进行详细记录的,笔记中涉及到Nginx的多项应用,例如:动静分离、反向代理、高可用等配置和使用。同时还对每一个配置项及模块都进行了详细的讲解,方便初学者进行初步学习,也方便学习过Nginx的小伙伴进行复习。

一、概述

  • 概念:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
  • 特点:占用内存少,并发能力强,安装简单、配置文件简洁。
  • 用户:百度、京东、新浪、网易、腾讯、淘宝等。

二、Nginx使用中常用的Linux命令

1、netsata -tnlp | grep 端口号:查看端口是否被占用
2、rpm -ql 包名:查看包内安装文件
3、kill -9 进程号:强制杀死进程
4、tail -f 文件名:动态查看文件内容
5、curl 发送请求 -i 查看响应头 -F 发送post请求
6、ss -tnl 查看端口监听信息
7、tcpdump -i 网卡 port 端口号 -A 抓包指令 示例:tcpdump -i ens33 port 80 -A
8、getenforce 查看SELinux的模式
9、setenforce 1/0 将 SELinux 在 Enforcing 与 permissive 之间切换与查看
10、修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启:永久关闭SELinux
三、Nginx变量
• TCP连接变量
1、remote_addr 客户端IP地址
 2、remote_port 客户端端口
 3、server_addr 服务器IP地址
 4、server_port 服务器端口
 5、server_protocol 服务端协议
 6、binary_remote_addr 二进制格式的客户端IP地址
 7、connection TCP连接的序号,递增
 8、connection_request TCP连接当前的请求数量
 9、proxy_protocol_addr 若使用了proxy_protocol协议 则返回协议中地址 否则返回空
 10、proxy_protocol_port 若使用了proxy_protocol协议 则返回协议中端口 否则返回空• HTTP请求变量
1、request 请求行信息
 2、uri 请求的URL,不包含参数
 3、request_uri 请求的URL,包含参数
 4、scheme 协议名,http或https
 5、request_method 请求方法
 6、request_length 全部请求的长度,包括请求行、请求头、请求体
 7、args 全部参数字符串
 8、arg_参数名 特定参数值
 9、is_args URL中有参数,则返回?;否则返回空
 10、query_string 与args相同
 11、remote_user 由HTTP Basic Authentication协议传入的用户名
 12、host 先看请求行,再看请求体,最后找server_name
 13、http_user_agent 用户浏览器
 14、http_referer 从哪些链接过来的请求
 15、http_via 经过一层代理服务器,添加对应代理服务器的信息
 16、http_x_forwarded_for 获取用户真实IP
 17、http_cookie 用户cookie
18、http_name 任意请求头字段• 处理HTTP请求变量
1、request_time 处理请求已耗费的时间
 2、request_completion 请求处理完成返回OK,否则返回空
 3、server_name 匹配上请求的server_name值
 4、https 若开启https,则返回on,否则返回空
 5、request_filename 磁盘文件系统待访问文件的完整路径
 6、document_root 由URL和root/alias规则生成的文件夹路径
 7、realpath_root 将document_root中的软链接换成真实路径
 8、limit_rate 返回响应时的速度上限值• 缓存
1、upstream_cache_status 保持访问响应缓存的状态• 状态
 “MISS”, “BYPASS”, “EXPIRED”, “STALE”, “UPDATING”, “REVALIDATED”, “HIT
四、Nginx信号
1、SIGHUP:kill -1 $PID 终端挂起或者控制进程终止
2、SIGQUIT:kill -3 $PID
3、SIGKILL:kill -9 $PID
4、SIGTERM:kill [-15] $PID
5、SIGCHLD:kill -17 $PID
五、热部署的过程
1、将旧的nginx文件替换成新的nginx文件
2、向master进程发送USR2信号
3、master进程修改pid文件,加后缀.oldbin
4、master进程用新的nginx文件启动新master进程
5、向旧的master进程发送WINCH信号,旧的worker子进程UI出
6、回滚情形:向旧master发送HUP信号,向新的master发送QUIT信号
六、Nginx安装配置及常用命令
安装配置:
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35 --with-http_image_filter_module --with-http_auth_request_module常用命令:
nginx -s reload            # 重新载入配置文件
nginx -s reopen            # 重启 Nginx
nginx -s stop              # 停止 Nginx
nginx -t                   # 检查nginx.conf语法是否正确七、虚拟主机分类
1、基于多IP的虚拟主机
2、基于多端口的虚拟主句
3、基于域名的虚拟主机
八、main段核心参数
1、user USERNAME【GROUP】
 解释:指定运行nginx的worker子进程的属主和属组,其中属组可以不指定
 示例:user www www2、pid DIR
 解释:指定运行nginx的master主进程的pid文件存放路径
 示例:pid /usr/local/webserver/nginx/logs/nginx.pid;3、worker_rlimit_nofile number
 解释:指定worker子进程可以打开的最大文件句柄数(并发量)
 示例:worker_rlimit_nofile 204804、worker_rlimit_core size
 解释:指定worker子进程异常终止后的core文件,用于记录分析问题
 示例:worker_rlimit_core 50M;
 working_directory /usr/local/webserver/nginx/tmp; # worker必须有权限5、worker_processes number | auto
 解释:指定nginx启动的worker子进程数量
 示例:worker_processes 4;
 worker_processes auto;6、worker_cpu_affinity cpumask1 cpumask2…
 解释:将每个worker子进程与我们的CPU物理核心绑定
 示例:worker_cpu_affinity 0001 0010 0100 1000;
 四个物理核心,4个worker子进程
 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; # 8个物理核心 8个worker子进程
 worker_cpu_affinity 01 10 01 10; # 两个物理核心,4个子进程
 备注:将每一个worker子进程与特定cpu物理核心绑定,优势在于:避免同一个 worker子进程在不同的CPU核心上切换,缓存失败,降低性能;其并不能真正的 避免进程切换7、worker_priority number
 解释:指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为负 值,以优先调用nginx
 示例:worker_priority -10;
 备注:Linux默认进程的优先级值是120,值越小越优先;nice设定范围为-20到 +198、worker_shutdown_timeout time
 解释:指定worker子进程优雅退出时的超时时间
 示例:worker_shutdown_timeout 5s;9、timer_resolution time
 解释:worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少 ,有利于性能提升;反之,系统调用越多,性能下降
 示例:worker_resolution 100ms;10、daemon on|off
 解释:设定nginx的运行方式,前台还是后台,前台用户调试,后台用于生产
 示例:daemon off;11、lock_file file
 解释:负载均衡互斥锁文件存放路径
 示例:lock_file logs/nginx.lock九、event段核心参数
1、use mehtod nginx使用何种事件驱动模型
 method可选值:select、poll、kqueue、epoll、/dev/poll、eventport
 默认配置:无
 推荐配置:不指定,让nginx自己选择2、worker_connections 1024 worker子进程能够处理的最大并发连接数
 默认配置:worker_connections 1024
 推荐配置:worker_connections 65535/worker_processes|655353、accept_mutex on|off 是否打开负载均衡互斥锁
 可选值:on、off
 默认配置:accept_mutex off
 推荐配置:accept_mutex on4、accept_mutex_delay time 新连接分配给worker子进程的超时时间
 默认配置:accept_mutex_delay 500ms;
 推荐配置:accept_mutex_delay 200ms;6、multi_accept on|off 如果禁用multi_accept,则辅助进程将一次接受一个新连接。否则,工作进程将一次接受所有新连接。
 可选值:on、off
 默认配置:multi_accept off
 推荐配置:multi_accept on十、root&alias
1、相同点:URL到磁盘文件的映射
2、不同点:root会将定义路径与URL叠加;alias则只取定义路径
十一、location基础用法
1、=:精确匹配 示例:location = /images/{…}
2、~:正则匹配,区分大小写 示例:location ~ \.(jpg|gif)${…}
3、^~:匹配到即停止搜索 示例:location ^~ /images/{…}
4、无任何符号 示例:location /{…}
5、优先级:= > ^~ > ~ > 无符号s
6、stub_status模块
 指定:stub_status;
 低于1.7.5版本:stub_status on;
 上下文:server location
 示例:location /uri {
	stub_status;
}ngx_http_limit_conn_module模块(限制客户端并发连接数)
1、limit_conn_zone 定义共享内存
 语法:limit_conn_zone key zone = name:size
 默认值:无
 上下文:http
 示例:limit_conn_zone $binary_remote_addr zone= addr:10m2、limit_conn_status 限制行为发生时回应客户端的状态
 语法:limit_conn_status code
 默认值:limit_conn_status 503
 上下文:http、server、location3、limit_conn_log_level 限制行为发生时记录日志的等级
 语法:limit_conn_log_level info|notice|warn|error
 默认值:limit_conn_log_level error
 上下文:http、server、location4、limit_conn 定义限制客户端并发连接数
 语法:limit_conn zone number
 默认值:无
 上下文:http、server、locationngx_http_limit_req_module模块(限制客户端请求的平均速率)
1、limit_req_zone 定义共享内存
 语法:limit_req_zone key zone = name:size rate=rate
 默认值:无
 上下文:http
 示例:limit_req_zone $binary_remote_addr zone= one:10m rate=2r/m2、limit_req_status 限制行为发生时回应客户端的状态
 语法:limit_req_status code
 默认值:limit_req_status 503
 上下文:http、server、location3、limit_req_log_level 限制行为发生时记录日志的等级
 语法:limit_req_log_level info|notice|warn|error
 默认值:limit_req_log_level error
 上下文:http、server、location4、limit_req 定义限制客户端并发连接数
 语法:limit_conn_ zone=name [burst=number][nodelay|delay=number]
 默认值:无
 上下文:http、server、location
 示例:limit_conn zone=one
 limit_conn zone=one burst=5 nodelayngx_http_access_module模块(限制特定IP或网段访问)
1、allow 设置允许访问
 语法结构:allow address | CIDR | UNIX | all
 默认值:无
 上下文:http、server、location、limit_except
 示例:allow 192.168.0.102、deny 设置拒绝访问
语法结构:deny address | CIDR | UNIX | all
 默认值:无
 上下文:http、server、location、limit_except
 示例:deny 192.168.0.0/24ngx_http_auth_basic_module模块(限制特定用户访问)
1、auth_basic 用户名密码验证功能
 语法:auth_basic string | off
 默认值:auth_basic off
 上下文:http、server、location、limit_except2、auth_basic_user_file 用户名密码秘钥文件
 语法:auth_basic_user_file file(绝对路径)
 默认值:-
 上下文:http、server、location、limit_except3、补充工具(生成密码文件工具)
 可执行程序 htpasswd
 所属软件包 httpd-tools
 生成新的密码文件 htpasswd -b -c 文件名 用户名 密码
 添加新用户密码 htpasswd -b 文件名 用户名 密码ngx_http_auth_request_module模块(根据子请求的结果实现客户端授权)
1、auth_request 根据子请求的结果启用授权,并设置将子请求发送到的URI
 语法:auth_request uri | off
 默认值:auth_request off
 上下文:http、server、location2、auth_request_set $variable value 授权请求完成后,将请求变量设置为给定值
 默认值:-
 上下文:http、server、location3、搭建鉴权服务器示例:
/config.d/auth_request.conf
server {
     listen 80;
     root html;
 
     location /OA/ {
         auth_request /auth;
         index login.html;
     }     
     location /auth {
         proxy_pass http://192.168.121.10:8080/auth.html;
     }
}/conf/nginx.conf
server {
 	listen 8080;
    server_name localhost;
    root html;
    location /auth.html {
    return 403 "Failed,give the Page of Auth Server Success\n";
   	}
}ngx_http_rewrite_module模块(更改请求URI)
1、return 停止处理并将指定的代码返回给客户端
 语法:return code 【text】
 return code URL
 return URL
 默认值:-
 上下文:server、location、if2、rewrite 根据指定正则表达式匹配规则,重写URL
 语法:rewrite regex replacement【flag】
 flag:redirect(302) permanent(302) break last
 默认值:-
 上下文:server、location、if
 示例:rewrite /images/(.*.jpg)$ /pic/$1;3、if 条件判断
 语法:if(condition){…}
 默认值:-
 上下文:server、location
 示例:if($http_user_agent ~ Chrome){
 rewrite /(.*) /browser/$1 break
 }ngx_http_autoindex_module模块(用户请求以/结尾时,列出目录结构)
1、autoindex 启用或禁用目录列表输出
 语法:autoindex on|off
 默认值:autoindex off
 上下文:http、server、location2、autoindex_exact_size 对于HTML格式,指定是在目录列表中输出确切的文件大小,还是四舍五入为千字节,兆字节和千兆字节
 语法:autoindex_exact_size on|off 显示列出文件大小
 默认值:autoindex_exact_size on
 上下文:http、server、location3、autoindex_format 设置目录列表的格式
 语法:autoindex_format html|xml|json|jsonp
 默认值:autoindex_format html
 上下文:http、server、location4、autoindex_localtime 指定是在本地时区还是在UTC中输出目录列表中的时间
 语法:autoindex_localtime on|off
 默认值:autoindex_localtime off
 上下文:http、server、locationngx_http_upstream_module模块(定义上游服务的相关信息)
1、upstream 段名,以{开始,}结束,中间定义上游服务URL
 语法:upstream name{…}
 默认值:无
 上下文:http
 示例:upstream {
 …
 …
 }

2、server 定义上游服务地址
语法:server address【parameters】
默认值:无
上下文:upstream

  • 参数讲解
    weight=number 权重值,默认值为1
    max_conns=number 上游服务器的最大并发连接数
    fail_timeout=time 服务器不可用的判定时间
    max_fails=number 服务器不可用的检查次数
    backup 备份服务器,仅当其他服务器都不可用时
    down标记服务器长期不可用,离线维护

3、zone 定义共享内存,用于跨worker子进程
语法:zone name【size】
默认值:无
上下文:upstream

4、keepalive 限制每一个worker子进程与上有服务器空闲长连接的最大数量
语法:keepalive connections
默认值:无
上下文:upstream
示例:keepalive 16

5、keepalive_requests 单个长连接可以处理的最多HTTP请求个数
语法:keepalive_requests number
默认值:keepalive_requests 100
上下文:upstream

6、keepalive_timeout 空闲情形下,一个长连接的超时时长
语法:keepalive_timeout time
默认值:keepalive_timeout 60s
上下文:upstream

7、queue 所有上游服务器不可用时,请求会被放到队列中等待
语法:queue number【timeout=time】
默认值:无
上下文:upstream
示例:queue 100 timeout=30s

8、hash 哈希负载均衡算法
语法:hash key 【consistent】
默认值:无
上下文:upstream

9、ip_hash 依据IP进行哈希计算的负载均衡算法
语法:ip_hash
默认值:无
上下文:upstream

10、least_conn 最少连接负载均衡算法
语法:least_conn;
默认值:无
上下文:upstream

11、least_time 最短响应时间负载均衡算法

12、random 随机负载均衡算法

配置示例

upstream back_end{
	server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
	keepalive 32;
	keepalive_requests 50;
	keepalive_timeout 30s;
}

动静分离案例

  • 动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到应用服务器中。
  • 通过域名来区分动态资源服务器和静态资源服务器
    静态资源服务器域名定义为:static.ihome.com
    动态资源资源服务器域名定义为:www.ihome.com
###静态资源访问
###静态资源存放路径/usr/local/nginx/static/images
server {
  listen       80;
  server_name  static.ihome.com;
  location /static/images {
       root /usr/local/nginx; # 根路径
       index  index.html index.htm;
   }
}

###动态资源访问
 server {
  listen       80;
  server_name  www.ihome.com;
    
  location / {
    proxy_pass http://127.0.0.1:8080;
     index  index.html index.htm;
   }
}

反向代理案例【动态生成随机数】

  • 首先需要准备两个服务器 这里声明为server1和server2都为nginx服务器
  • server1为代理服务器 server2为应用程序服务器
  • 在server2中定义create_random_number.sh脚本模拟动态服务
    create_random_number.sh
#!/bin/bash
#

DIR=/opt/nginx/html/app/proxy
FILE=proxy.html

while true;do
	echo "Application Server,This time create number: $RANDOM" > $DIR/$FILE
	sleep 1
done
  • 在server2中创建nginx子配置文件app_server.conf 并在主配置文件中声明
    app_server.conf
server {
	listen 8080;
	server_name localhost;

	location /proxy/ {
	    root /opt/nginx/html/app;
	    index proxy.html;
	}
}
  • 在server1中创建子配置文件proxy.conf 并在主配置文件中声明
    proxy.conf
upstream back_end {
	server 192.168.184.20:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
	keepalive 32;
	keepalive_requests 80;
	keepalive_timeout 20s;
} 

server {
	listen 80;
	server_name proxy.kutian.edu;

	location /proxy {
	    proxy_pass http://back_end/proxy;
	}
}

ngx_http_proxy_module模块(代理请求到另一台服务器)

代理场景下Nginx接收用户请求包体的处理方式

1、proxy_pass 设置代理服务器的协议和地址,以及应将位置映射到的可选URI
语法:proxy_pass URL
上下文:location、if、limit_except
示例1:proxy_pass http://127.0.0.1:8080
示例2:proxy_pass http://127.0.0.1:8080/proxy

2、proxy_request_buffering 启用或禁用客户端请求正文的缓冲
语法:proxy_request_buffering on|off
默认值:proxy_request_buffering on
上下文:http、server、location

3、client_max_body_size 设置客户端请求正文的最大允许大小,在“ Content-Length”请求标头字段中指定
语法:client_max_body_size size
默认值:client_max_body_size 1M
上下文:http、server、location

4、client_body_buffer_size 设置用于读取客户端请求正文的缓冲区大小
语法:client_body_buffer_size size
默认值:client_body_buffer_size 8k|16k
上下文:http、server、location

5、client_body_in_single_buffer 确定nginx是否应将整个客户端请求主体保存在单个缓冲区中 off 连续区间
语法:client_body_in_single_buffer on|off
默认值:client_body_in_single_buffer off
上下文:http、server、location

6、client_body_temp_path 定义用于存储包含客户端请求正文的临时文件的目录
语法:client_body_temp_path path【level1】【level2】【level3】
默认值:client_body_temp_path client_body_temp
上下文:http、server、location

7、client_body_in_file_only 确定nginx是否应将整个客户端请求主体保存到文件中。设置为on时,请求处理后不会删除临时文件。 值clean将导致删除请求处理后剩余的临时文件
语法:client_body_in_file_only on|clean|off
默认值:client_body_in_file_only off
上下文:http、server、location

8、client_body_timeout 定义读取客户端请求正文的超时
语法:client_body_timeout time
默认值:client_body_timeout 60s
上下文:http、server、location

代理场景下Nginx如何更改发往上游的用户请求

9、proxy_method 指定在转发给代理服务器的请求中使用的HTTP方法,而不是客户端请求中的方法
语法:proxy_method method
默认值:无
上下文:http、server、location

10、proxy_http_version 设置用于代理的HTTP协议版本
语法:proxy_http_version 1.0|1.1
默认值:proxy_http_version 1.0
上下文:http、server、location

11、proxy_set_header 允许在传递给代理服务器的请求标头中重新定义或附加字段
语法:proxy_set_header filed value
默认值:proxy_set_header Host $proxy_host
proxy_set_header Connection close
上下文:http、server、location

12、proxy_pass_request_header 是指示是否将原始请求的标头字段传递到代理服务器
语法:proxy_pass_request_header on|off
默认值:proxy_pass_request_header on
上下文:http、server、location

13、proxy_set_body 允许重新定义传递给代理服务器的请求正文
语法:proxy_set_body value
默认值:无
上下文:http、server、location

14、proxy_pass_request_body 指示是否将原始请求正文传递到代理服务器
语法:proxy_pass_request_body on|off
默认值:proxy_pass_request_body on
上下文:http、server、location

代理场景下Nginx与上游服务建立连接细节

15、proxy_connect_timeout 定义用于与代理服务器建立连接的超时
语法:proxy_connect_timeout time
默认值:proxy_connect_timeout 60s
上下文:http、server、location

16、proxy_socket_keepalive 为与代理服务器的传出连接配置“ TCP保持活动”行为。默认情况下,操作系统的设置对套接字有效
语法:proxy_socket_keepalive on|off
默认值:proxy_socket_keepalive off
上下文:http、server、location

17、proxy_send_timeout 设置用于将请求传输到代理服务器的超时
语法:proxy_send_timeout time
默认值:proxy_send_timeout 60s
上下文:http、server、location

18、proxy_read_timeout 定义用于从代理服务器读取响应的超时
语法:proxy_read_timeout time
默认值:proxy_read_timeout 60s
上下文:http、server、location

19、proxy_ignore_client_abort 确定当客户端关闭连接而不等待响应时是否关闭与代理服务器的连接
语法:proxy_ignore_client_bort on|off
默认值:proxy_ignore_client_bort off
上下文:http、server、location

负载均衡场景下针对上游服务器返回异常时的容错机制

20、proxy_next_upstream 指定在哪种情况下将请求传递到下一个服务器
语法:proxy_next_upstream error|timeout|invalid_header|http_500|http_503
|http_504|http_403|http_404|http_429|noidempotent|off
默认值:proxy_nex_upstream error timeout
上下文:http、server、location

  • 参数讲解
    1、error 向上游服务器传输请求或读取响应头发生错误
    2、timeout 向上游服务器传输请求或读取响应头发生超时
    3、invalid_header 上游服务器返回无效的响应
    4、http_500:HTTP响应状态码为500时
    5、http_502:HTTP响应状态码为502时
    6、http_503:HTTP响应状态码为503时
    7、http_504:HTTP响应状态码为504时
    8、http_403:HTTP响应状态码为403时
    9、http_404:HTTP响应状态码为404时
    10、http_429:HTTP响应状态码为429时
    11、non_idempotent:非幂等请求失败时是否需要转发下一台上游服务器
    12、off:禁用请求失败转发功能

21、proxy_next_upstream_timeout 限制将请求传递到下一台服务器的时间
语法:proxy_next_upstream_timeout times
默认值:proxy_next_upstream_timeout 0
上下文:http、server、location

22、proxy_next_upstream_tries 限制将请求传递到下一个服务器的可能尝试次数
语法:proxy_next_upstream_tries number
默认值:proxy_next_upstream_tries 0
上下文:http、server、location

23、proxy_intercept_errors 确定代码大于或等于300的代理响应应该传递给客户端还是被拦截并重定向到nginx以使用error_page指令进行处理。
语法:proxy_intercept_errors on|off
默认值:proxy_intercept_errors off
上下文:http、server、location

开启Nginx缓存相关参数

24、proxy_cache 定义用于缓存的共享内存区域
语法:proxy_cache zone|off
默认值:proxy_cache off
上下文:http、server、location

25、proxy_cache_path 设置缓存的路径和其他参数
语法:proxy_cache_path path keys_zone=name:size
默认值:proxy_cache_path off
上下文:http

  • 参数讲解
    1、path:缓存文件的存放路径
    2、level:path的目录级别 目录字符串长度:目录层级
    3、use_temp_path:off使用path路径;on使用proxy_temp_path路径
    4、keys_zone:name是共享内存名称;size是共享内存大小
    5、inactive:在指定时间内没有被访问缓存会被清理;默认10分钟
    6、max_size:设定最大的缓存文件大小,超过将由CM清理
    7、manager_file:CM清理一次缓存文件,最大清理文件数;默认100
    8、manager_sleep:CM清理一次后进程的休眠时间;默认200毫秒
    9、manager_threshold:CM清理一次最长耗时;默认50毫秒
    10、loader_files:CL载入文件到共享内存,每批最多文件数;默认100
    11、loader_sleep:CL加载缓存文件到内存后,进程休眠时间;默认200毫秒
    12、loader_threshold:CL每次加载文件到共享内存的最大耗时;默认50毫秒

26、proxy_cache_key 定义用于缓存的密钥
语法:proxy_cache_key string
默认值:proxy_cache_key nginx proxy header 传递 nginx proxy_protocol_子进程proxy_host$request_uri
上下文:http、server、location

27、proxy_cache_valid 设置不同响应代码的缓存时间
语法:proxy_cache_valid 【code…】time
默认值:-
上下文:http、server、location
配置示例:proxy_cache_valid 60m; #只对200、301、302响应码缓存

28、proxy_no_cache 定义不将响应保存到缓存的条件 string为空不缓存,否则缓存
语法:proxy_no_cache string
默认值:-
上下文:http、server、location

29、proxy_cache_bypass 定义不从缓存获取响应的条件
语法:proxy_cache_bypass string
默认值:-
上下文:http、server、location

缓存失效降低上游压力机制–合并源请求

30、proxy_cache_lock 启用后,一次仅允许一个请求通过将请求传递到代理服务器来填充根据
语法:proxy_cache_lock on|off
默认值:proxy_cache_lock off
上下文:http、server、location

31、proxy_cache_lock_timeout proxy_cache_lock设置超时。时间到时,请求将被传递到代理服务器,但是不会缓存响应。
语法:proxy_cache_lock_timeout time
默认值:proxy_cache_lock 5s
上下文:http、server、location

32、proxy_cache_lock_age 如果传递给代理服务器的用于填充新缓存元素的最后一个请求在指定时间内尚未完成,则可以再将一个请求传递给代理服务器
语法:proxy_cache_lock_age time
默认值:proxy_cache_lock_age 5s
上下文:http、server、location

缓存失效降低上游压力机制–启用陈旧缓存

33、proxy_cache_use_stale 确定在什么情况下可以与代理服务器进行通信时使用陈旧的缓存响应
语法:proxy_cache_use_stale 【parameters】
默认值:proxy_cache_use_stale off
上下文:http、server、location

  • 参数讲解
    1、error 与上游建立连接、发送请求、读取响应出错时
    2、timeout 与上游建立连接、发送请求、读取响应超时时
    3、invalid_header:无效头部时
    4、updating:缓存过期,正在更新时
    5、http_500:HTTP响应状态码为500时
    6、http_502:HTTP响应状态码为502时
    7、http_503:HTTP响应状态码为503时
    8、http_504:HTTP响应状态码为504时
    9、http_403:HTTP响应状态码为403时
    10、http_404:HTTP响应状态码为404时
    11、http_429:HTTP响应状态码为429时

34、proxy_cache_background_update 允许启动后台子请求以更新过期的缓存项,同时将陈旧的缓存响应返回给客户端
语法:proxy_cache_background_update on|off
默认值:proxy_cache_background_update off
上下文:http、server、location

第三方清除缓存模块

1、proxy_cache_purge 根据接收的HTTP请求立即清除缓存
语法:proxy_cache_purge zone_name key
默认值:无
上下文:http、server、location

缓存配置

http {
	proxy_cache_path /usr/local/webserver/nginx/cache_temp
	levels=2:2 keys_zone=cache_zone:30m max_size=32g 		inactive=60m use_temp_path=off;
	
	# 缓存的条件
	if ($request_uri ~ \.(txt|text)$ )
	{
		set $cokkie_name "no cache";
	}
	# 第三方清除缓存模块
	location ~ /cache_purge(/.*){
		proxy_cache_purge cache_zone $host$1
	}
	
	upstream cache_server {
		server 192.168.121.20:1010;
		server 192.168.121.20:1020;
	}
	server {
		listen 80;
		server_name cache.kutian.edu;
		# 是否缓存
		proxy_no_cache $cookie_name;
		location / {
			proxy_cache cache_zone;
			proxy_cache_valid 200 5m;
			add_header Nginx-Cache-Status 	
			"$upstream_cache_status";
			# 缓存失效降低上游压力机制--合并源请求
			proxy_pass http://cache_server;
			proxy_cache_lock on;
			proxy_cache_lock_timeout 5s;
			proxy_cache_lock_age 5s;
			# 缓存失效降低上游压力机制--启用陈旧缓存
			proxy_cache_use_stale error timeout updating
			proxy_cache_background_update on;
		}
	}
}

负载均衡策略

1、rr算法【默认策略】:轮循负载均衡策略

# 不能保证每个用户的请求都能在同一台服务器上处理
upstream demo_server {
	server 192.168.121.10:10020;
	server 192.168.121.10:10010;
}

2、哈希算法:哈希负载均衡策略

# 保证url地址相同的访问都能在同一台服务器上处理
upstream demo_server {
	hash $request_uri;
	server 192.168.121.10:10020;
	server 192.168.121.10:10010;
}

3、ip_哈希算法:ip哈希负载均衡策略

# 保证客户端ip相同的访问都能在同一台服务器上处理
upstream demo_server {
	ip_hash;
	server 192.168.121.10:10020;
	server 192.168.121.10:10010;
}

4、最少连接算法:最少连接负载均衡

# 保证上游服务器接收请求的个数上达到平衡
upstream demo_server {
	# 定义上游服务器状态详细的共享内容
	zone test 10M;
	least_conn;
	server 192.168.121.10:10020;
	server 192.168.121.10:10010;
}

https相关内容

1、原理:https = http + TLS/SSL

2、加密算法

  • 对称加密:DES、AES、3DES
  • 非对称加密:RSA、DSA、ECC

VRRP原理

1、核心概念

  • 虚拟网关 有一个Master和多个Backup组成
  • Master网关 实际承载报文转发的节点,主节点
  • Backup网关 主节点故障后转移节点,备用节点
  • 虚拟IP地址 虚拟网关对外提供服务的IP地址
  • IP地址拥有者 真实提供服务的节点,通常为主节点
  • 虚拟MAC地址 回应ARP请求时使用的虚拟MAC地址

2、原理图

nginx proxy header 传递 nginx proxy_protocol_linux_02

配置KeepAlived+Nginx高可用

1、高可用脚本

ps -ef | grep nginx | grep -v grep &> /dev/null
if [ $? -ne 0 ];then
	killall keepalived
fi

2、KeepAlived自动检测脚本配置

vrrp_script chk_http_port {
	script "/usr/local/src/nginx_check.sh"
	interval 2 #(检测脚本执行的间隔)
	weight 2
}

提升Nginx利用CPU的效率

1、指定worker子进程个数
worker_processes auto

2、将worker子进程与每个CPU绑定
worker_cpu_affinity 01 10 01 10

3、提高worker子进程的进程优先级
worker_priority -20

4、延迟处理新连接
listen 80 deferred

TCP建立连接优化

1、永久修改Linux内核参数配置文件 /etc/sysctl.conf

2、net.ipv4.tcp_syn_retries number Nginx和上游服务器连接的尝试次数

3、net.ipv4.tcp_synack_retries number Nginx响应客户端连接的尝试次数

4、net.ipv4.tcp_syncookies_retries 防止客户端伪造大量连接请求,设置并验证cookie信息

5、net.core.netdev_max_backlog 设置在网卡上滞留数据的大小

6、net.ipv4.max_syn_backlog 设置内核协议栈中SYN队列的长度

7、net.core.somaxconn 设置系统级别的ACCEPT(已建立TCP连接的队列)连接队列长度

8、net.ipv4.tcp_fastopen 0 全部关闭 3全部打开 在第一次建立连接后客户端保存服务器端生成的cookie信息;第二次连接不需要三次握手,只需要验证cookie即可