nginx学习
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。
- 高并发,高性能
- 扩展性好(模块化设计)
- 异步非阻塞的事件驱动模型
- 高可靠性
- yum install epel-release -y
- yum list all | grep nginx
- yum install nginx -y
- rpm -ql nginx 查看文件
- kill -l 命令显示
- 常用
- Master进程
- 监控worker进程 CHLD
- 管理worker进程
- 接收信号 TERM,INT QUIT HUP USR1 USR2 WINCH
- Worker进程
- 命令行
ps -ef | grep nginx 查看nginx启动了几个进程
- reload重载配置文件流程
- 向master进程发送HUP信号(reload命令)
- master进程检查配置语法是否正确
- master进程打开新的监听端口
- master进程使用新的配置文件启动新的worker子进程
- master进程向老的worker子进程发送QUIT信号
- 旧的worker进程关闭检查句柄,处理完当前连接后关闭进程
- 将旧的nginx文件替换成新的nginx文件
- 向master进程发送USR2信号
- master进程修改pid文件,加后缀.oldbin
- master进程用新nginx文件启动新master进程
- 向旧的master进程WINCH信号,旧的worker子进程退出
参考lesson1
- 全局段核心参数
- user USERNAME [GROUP]
- 解释:指定运行nginx的worker子进程的属主和属组,其中属组可以不指定
- 实例
user nginx nginx
- pid DIR
- 解释:指定运行nginx的master主进程的pid文件存放路径
- 示例
pid /opt/nginx/logs/nginx.pid;
- worker_rlimit_nofile number
- 解释:指定worker子进程可以打开的最大文件句柄数
- 示例:
worker_rlimit_nofile:20480;
- worker_rlimit_core size
- 解释:指定worker子进程异常终止后的core文件,用于记录分析问题
- 示例:
worker_rlimit_core 50M;
working_directory /opt/nginx/tmp;
- worker_processes number|auto
- 解释:指定nginx启动的worker子进程数量
- 示例:
worker_processes 4
worker_prcesses auto
- worker_cpu_affinity cpumask1 cpumask2...
- 解释:将每个worker子进程与我们的cpu无力核心绑定
- 示例:
备注:将每个worker子进程与特定cpu物理核心绑定,优势在于:避免同一个worker子进程在不同的cpu核心上切换,缓存失效,降低性能。其并不能真正的避免进程切换。worker_cpu_affinity 0001 0010 0100 1000;四个物理核心,四个worker子进程 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;八个物理核心,八个worker子进程 worker_cpu_affinity 01 10 01 10;两个物理核心,四个worker子进程
- worker_priority number
- 解释:指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为负值,以优先调用nginx
- 示例:
worker_priority -10
; - 备注:linux默认进程的优先级值是120,值越小越优先;nice设定范围为-20到+19
- worker_shutdown_timeout time
- 解释:指定worker子进程优雅退出时的超时时间
- 示例:
worker_shutdown_timeout 5s
- timer_resolution intcrval
- 解释:worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降
- 示例
timer_resolution 100ms
- daemon on|off
- 解释:设定nginx的运行方式,前台还是后台,前台用于调试,后台用于生产
- 示例:
daemon on
参考lesson1
- use-->nginx使用何种事件驱动模型
- 语法:use method
- method可选值: select,poll,kqueue,epoll,/dev/poll,eventport
- 默认配置:无
- 推荐配置:不指定,让nginx自己选择
- worker_connections-->worker子进程能够处理的最大并发连接数
- 语法:worker_connections 1024
- 推荐配置:worker_connections 65535/worker_procsses|65535
- accept_mutex-->是否打开负载均衡互斥锁
- 语法:accept_mutex on|off
- 可选值:on|off
- 默认配置:accept_mutex off;
- 推荐配置: accept_mutex on;
- accept_nutex_delay-->新连接分配给worker子进程的超时时间
- 语法:accept_mutex_delay time
- 默认配置:accept_mutex_delay 500ms
- 推荐配置:accept_mutex_delay 200ms
- lock_file-->负载均衡互斥锁文件存放路径
- 语法:lock_file file
- 默认配置 lock_file logs/nginx.lock
- muti_accept-->worker子进程可以接收的新连接个数
- 语法:muti_accept on|off
- 可选值:on|off
- 默认配置:muti_accept off;
- 推荐配置: muti_accept on;
参考lesson1
- 语法结构:server_name name1 name2 name3...;
- 示例: server_name www.nginx.com 精确匹配
- 示例: server_name *.nginx.org
- 示例: server_naem ~^www.imooc.*$
- 精确匹配最高
- 左侧通配符匹配
- 右侧通配符匹配
- 正则匹配最低
参考文件夹root&alias
-
语法结构:
- root:
- 语法:root path;
- 上下文:http server location if
- alias:
- 语法 alias path
- 上下文:location
- root:
-
相同点:URI到磁盘文件的映射
-
区别:root会将定义路径与URI叠加;alias则只取定义路径
-
示例1:
location /picture{
root /opt/nginx/html/picture;
}
客户端请求www.test.com/picture/1.jpg,则对应磁盘映射
路径/opt/nginx/html/picture/picture/1.jpg
- 示例2:
location /picture{
alias /opt/nginx/html/picture;
}
客户端请求www.test.com/picture/1.jpg,则对应磁盘映射
路径/opt/nginx/html/picture/1.jpg
- 注意 使用alias时,末尾一定要加/;alias只能位于location中
参考文件夹location
- 语法结构:location [=|
|*|^~] uri {...} - 上下文:server location
- 匹配规则及含义:
- = 精准匹配:location=/images/{...}
- ~ 正则匹配区分大小写:location ~ .(jpg|gif)${...}
- ~* 正则匹配不区分大小写:location ~* .(jpg|gif)${...}
- ^~ 匹配到即停止搜索:location ^~/images/{...}
- 不带任何符号:location / {...}
- =
- ^~
- ~
- ~*
- 不带任何字符
- 不带/:location /test{} -->找test文件夹,如果没有则视为test文件查找
- 带/:location /test/{} --》找test文件夹,没有则返回404
- 指令: stub_status;
- 低于1.5.7:stub_status on;
- 上下文:server location;
- 示例:
location /uri {stub_status}
- 效果示例
Active connections:2
server accepts handled requests
883 883 928
Reading: 0 Writing: 1 Waiting:1
- 状态项及含义
- Active connections:活跃的链接数量
- accepts 接受的客户端连接总数
- handled 处理的客户端连接总数
- requests 客户端总的请求数量
- Reading 读取客户端的连接数
- Writing 响应数据到客户端的连接数
- Waiting 空闲客户端请求连接数量
参考limit_conn文件夹
- 基本功能
- 用于限制客户端默认连接数
- 默认编译进nginx,通过
--without-http_limit_conn_module
禁用 - 使用共享内存,对所有worker子进程生效
- 常用指令
- limit_conn_zone-定义共享内存空间
- 语法:limit_conn_zone key zone = name.size
- 上下文:http
- 示例
limit_conn_zone $binary_remote_addr zone=limit_addr:10m;
- limit_conn_status-定义限制行为发生时返回给客户端的状态
- 语法:limit_conn_status code
- 默认值:limit_conn_status 503
- 上下文:http server location
- 示例:
limit_conn_status 503;
- limit_conn_log_level-定义限制行为发生时日子记录等级
- 语法:limit_conn_log_level info|notice|warn|error
- 默认值:limit_conn_log_level warn;
- 上下文:http server location
- limit_conn-真正定义限制客户端并发连接数
- 语法:limit_conn zone number
- 上下文:http server location
- limit_conn_zone-定义共享内存空间
参考limit_req文件夹
- 基本功能
- 常用指令
- limit_req_zone-定义共享内存空间
- 语法:limit_req_zone key zone = name.size rate=rate
- 上下文:http
- 示例
limit_req_zone $binary_remote_addr zone=limit_req:15m rate=12r/m;
- limit_req_status-定义限制行为发生时返回给客户端的状态
- 语法:limit_req_status code
- 默认值:limit_req_status 503
- 上下文:http server location
- 示例:
limit_req_status 503;
- limit_req_log_level-定义限制行为发生时日子记录等级
- 语法:limit_req_log_level info|notice|warn|error
- 默认值:limit_req_log_level error;
- 上下文:http server location
- limit_req-真正定义限制客户端并发连接数
- 语法:limit_req zone=name [burst=number] [nodelay|delay=number]
- 上下文:http server location
- 示例:
limit_req zone=limit_req;
- limit_req_zone-定义共享内存空间
参考access文件夹
- allow指令--放行
- 语法结构:allow address | CIDR | UNIX | all;
- 上下文:http server location limit_except
- 示例1:
allow 192.168.0.10
- deny指令--阻止
- 语法结构:deny address | CIDR | UNIX | all;
- 上下文:http server location limit_except
- 示例1:
deny 192.168.0.0/24
- 组合示例
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
参考auth_basic文件夹
- 基本功能
- 基于HTTP Basic Authentication协议进行用户名密码认证
- 默认编译进nginx,通过
--without-http_auth_basic_module
禁用
- 常用指令
- auth_basic--定义是否开启用户名密码验证功能
- 语法:auth_basic string|off
- 默认值:auth_basic off;
- 上下文:http server location limitz_except
- auth_basic_user_file--定义是存储用户名密码的文件
- 语法:auth_basic_user_file file
- 默认值:-
- 上下文:http server location limitz_except
- auth_basic--定义是否开启用户名密码验证功能
- 生成密码文件工具
- 可执行程序 htpasswd
- 所属软件包 httpd-tools
- 生成密码文件
htpasswd -bc encrypt_pass jack 12345
- 添加新用户密码
htpasswd -b encrypt_pass mike 12345
参考auth_request文件夹
- 功能及原理
- 启用禁用:默认未编译进nginx,通过
--with-http_auth_request_module
启用 - 常用指令
- auth_request --定义是否开启用模块
- 语法:auth_request uri|off
- 默认值:auth_request off
- 上下文:http server location
- auth_basic_set--定义是存储用户名密码的文件
- 语法:auth_basic_set $variable value
- 默认值:-
- 上下文:http server location
- auth_request --定义是否开启用模块
参考rewrite文件夹
参考rewrite文件夹中return.conf
-
return功能
- 停止处理请求,直接返回响应码或者重定向到其他URL
- 执行return指令后,location中后续指令将不会执行
- 示例
location / {.... return 404; ....}
-
return语法结构
- 语法: return code[text];return code URL;return URL;
- 默认值: -
- 上下文:server location if
-
HTTP状态码
- 1xx:消息类
- 2xx:成功
- 3xx:重定向
- 301:永久重定向
- 302:临时重定向
- 4xx: 客户端错误
- 5xx:服务器错误
参考rewrite文件夹中rewrite.conf
-
rewrite功能
- 根据指定正则表达式匹配规则,重写URL
-
rewrite语法结构
- 语法: rewrite regex replacement [flag];
- 默认值: -
- 上下文:server location if
- 示例:
rewrite /images/(.*\.jpg)$ /pic/$1
;
-
flag可选值及含义
- last 重写后的URL发起新请求,再此进入server段,重试location中的匹配
- break 直接使用重写后的URL,不再匹配其他location中语句
- redirect 返回302临时重定向
- permanent 返回301永久重定向
-
rewrite执行顺序
参考rewrite文件夹中if.conf
-
if 功能
- 对某些条件进行判断,根据变量值不同,对url进行不同处理
-
if 语法结构
- 语法: if (condition) {}
- 默认值: -
- 上下文:server location
- 示例:
if($http_user_agent~Chrome){rewrite /(.*)/browser/$1 break;}
;
-
condition用法
- $variable 仅为变量时,值为空或以0开头字符串都会被当做false处理
- = | != 相等或不等比较
- ~ | !~ 正则匹配或非正则匹配
- ~* 正则匹配,不区分大小写
- -f | !-f 检查文件存在或不存在
- -d | !-d 检查目录存在或不存在
- -e | !-e 检查文件,目录,符号链接等存在或不存在
- -x | !-x 检查文件可执行或不可执行
参考autoindex文件夹中
- 基本功能
- 用户请求以/结尾时,列出目录结构
- 常用指令
- autoindex--是否开启列出
- 语法:autoindex on|off
- 默认值:autoindex off
- 上下文:http server location
- autoindex_exact_size--是否显示文件大小(字节)
- 语法:autoindex_exact_size on|off
- 默认值:autoindex_exact_size on
- 上下文:http server location
- autoindex_format--返回目录结构以哪种形式
- 语法:autoindex_format html|xml|json|jsonp
- 默认值:autoindex_format html
- 上下文:http server location
- autoindex_localtime--返回目录结构时间格式
- 语法:autoindex_localtime on|off
- 默认值:autoindex_localtime off
- 上下文:http server location
- autoindex--是否开启列出
参考 var文件夹
- TCP连接产生的变量
- remote_addr 客户端IP地址
- remote_port 客户端端口
- server_addr 服务端IP地址
- server_port 服务端端口
- server_protocol 服务端协议
- connection TCP连接的序号,递增
- connection_request TCP连接当前的请求数量,对于keepalive连接有意义
- proxy_protocol_addr 如果使用proxy_protocol协议,则返回原始用户的地址,否则为空
- proxy_protocol_port 如果使用proxy_protocol协议,则返回原始用户的端口,否则为空
- binary_remote_addr 二进制格式的客户端IP地址
- HTTP请求过程中的常用变量
- uri 请求的url,不包含参数
- request_uri 请求的url,包含参数
- scheme 协议名,http或https
- request_method 请求方法
- request_length 全部请求的长度,包括请求行,请求头,和请求体
- args 全部参数字符串
- arg_参数名 特定参数值
- is_args URL中有参数则返回?;否则返回空
- query_string 与args相同
- remote_user 由HTTP Basic Authentiction协议传入的用户名
- HTTP请求过程中的特殊变量
- host 先看请求行,再看请求头,最后找server_name
- http_user_agent 用户浏览器
- http_referer 从哪些链接过来的请求
- http_via 经过一层代理服务器,添加对应代理服务器的信息
- http_x_forwarded_for 获取用户真实ip
- http_cookie 用户cookie
- Nginx处理HTTP请求产生的变量
- request_time 处理请求已消耗的时间
- request_completion 请求处理完成返回ok,否则返回空
- server_name 匹配上请求的server_name值
- https 若开启https,则返回on,否则返回空
- request_filename 磁盘文件系统待访问文件的完整路径
- document_root 由uri和root/alias规则生成的文件夹路径
- realpath_root 讲document_root中的软连接换成真实路径
- limit_rate 返回响应时的速度上限值
- Nginx返回响应的变量
- Nginx内部运行时的变量