概述
应用场景
- 高性能静态web服务器
- 反向代理服务器
- API服务(OpenResty)
主要特点
- 高并发,高性能
- 扩展性好(二次开发)
- 异步非阻塞的事件驱动模型
- 高可靠性(其本身几乎很少需要停机重启或宕机)
- 热部署,平滑升级
- BSD许可
占用内存少,并发能力强
安装部署
编译安装
项目内应用该方式。
流程
官网下载压缩包,传到服务器,然后解压。
进入解压后目录
./configure -help 可以看都可以设置哪些参数
依赖软件
yum install gcc
// 如果需要https ssl 模块
yum install openssl openssl-devel
// 如果需要 http_image_filter_module
yum install gd gd-devel -y
执行编译
./configure 后可以下边的一些参数
// 完事后编译
make
// 之后安装
make install
安装完 正常启动就行
如果无法访问,检查防火墙设置 关闭防火墙 systemctl stop firewalld systemctl disable firewalld
关闭 selinux vi /etc/sysconfig/selinux SELINUX=DISABLED
常用配置参数
参数 | 含义 |
---|---|
–prefix | 指定安装的目录(其他的路径不指定都默认放在这个路径下) |
–user | 运行nginx的worker子进程的属主 |
–group | 运行nginx的worker子进程的属组 |
–pid-path | 存放进程运行pid文件的路径 |
–conf-path | 配置文件nginx.conf的存放路径 |
–error-log-path | 错误日志error.log的存放路径 |
–http-log-path | 访问日志access.log的存放路径 |
–with-pcre | pcre库的存放路径,正则表达式会用到 |
–with-zlib | zlib库的存放路径,gzip模块会用到 |
内置参数默认规则
显示加上,默认不内置 –with
显示去掉,默认内置 –without
yum 方式
一般都是测试用,自己练手
可能默认的yum没有nginx源,可手动添加
yum install epel-release -y
安装
yum install nginx -y
默认安装到 /etc/nginx 默认配置文件 /etc/nginx/nginx.conf 默认日志文件在 /var/log/nginx
启动
/usr/sbin/nginx -c /配置文件路径
基础知识
进程结构
Master Process 主进程 管理工作进程,监控工作进程,如果某个工作进程宕机,则由主进程启动新的工作进程。
配置文件修改后,负责通知工作进程。
管理CM,CL。 CM = CacheManager 管理缓存
CL = CacheLoader 加载缓存
Worker Process 工作进程
进程间通过共享内存通信。
常用命令
/usr/sbin/nginx -s 后加 下列
reload 重新加载配置文件
reopen 重新打开配置文件
stop 进程完成当前工作后再停止,优雅关闭
quit 立即退出,不等待当前工作完成
/usr/sbin/nginx -V 可以看版本,启动配置,配置文件用的哪个
/usr/sbin/nginx -t 检查配置文件是否正确
热部署
0.备份原文件
1.将旧的nginx文件替换成新的nginx文件。前提是目录结构不能变。
2.向master进程发送USR2信号
kill -s SIGUSR2 {PID}
注意此时 新老nginx并存,同时处理用户请求
3.master进程修改pid文件,加后缀.old.bin
4.master进程用新nginx文件启动新master进程
5.向旧的master进程发送WINCH信号,旧的worker子进程退出
// 优雅停止老master的 work 子进程,不停止老master进程是方便回滚
kill -s SIGWINCH {老master的PID}
验证没问题了 再给 老master停掉
kill -s SIGQUIT {老master的PID}
6.回滚情形∶向旧master发送HUP,向新的master发送QUIT
// 给老的master 的 woker进程 重新创建起来
kill -s SIGHUP {老master的PID}
模块分类
核心模块:ngx_core,ngx_errlog,ngx_conf,ngx_events,ngx_epoll,ngx _regex,ngx_event
标准HTTP模块:ngx_http_core,ngx_http_charset等
可选HTTP模块:ngx_http_gzip,ngx_http_ssl
第三方服务模块:rds _json_nginx,lua_nginx
基础语法
配置文件
结构
main 段
全局设置
user nginx; 使用nginx用户启动 nginx,确保该用户存在
user username [GROUP] 指定运行nginx的worker子进程的属主和属组,其中属组可以不指定
pid DIR; 指定运行nginx的master主进程的pid文件存放路径
pid /opt/nginx/logs/nginx.pid;
worker_rlimit_nofile 指定worker子进程可以打开的最大文件句柄数
worker_rlimit_nofile 20480;
worker_rlimit_core {size} 指定worker子进程异常终止后的core文件,用于记录分析问题,便于排查问题。working_directory指定core文件存放目录,注意写权限。
worker_rlimit_core 50M;
working_directory /opt/nginx/tmp;
**worker_processes {number | auto}** 指定nginx启动的worker子进程数量,Linux最大系统可以支持道 65535 一共,所以可以用 65535/子进程数量来配置,但是其实也没必要这么麻烦,直接配置65535 也一样,反正超过最大值就可以。 |
worker_cpu_affinity 将每个worker子进程与我们的CPU物理核心绑定。绑定之后 某个子进程之后永远只能被 绑定的 CPU 调度,防止CPU缓存失效。
// 4个物理核心 4个worker子进程
worker_cpu_affinity 0001 0010 0100 1000;
// 8个物理核心 8个worker子进程
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
// 2个物理核心 4个worker子进程
worker_cpu_affinity 01 10 01 10;
worker_priority {number} 指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为负值,以优先调用nginx。
// 这样设置则 优先级变成 120 -10 = 110,比其他默认的要优先运行
worker_priority -10
Linux默认进程的优先级值是120,值越小越优先。
worker_shutdown_timeout {time} 指定worker了进程优雅退出时的超时时间。防止被恶意程序一直占着,不关闭。应对攻击。
worker_shutdown_timeout 5s;
timer_resolution {time} worker子进程内部使用的计时器精度,调整时间间隔越大系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。尽量减少用户态和内核态的切换。
timer_resolution 100ms;
**daemon {on | off}** 设定nginx的运行方式,前台还是后台,前台用户调试,后台用于生产。很少用。调试的时候可以开启。 |
lock_file {DIR} 负载均衡互斥锁文件存放路径,这个默认即可。默认是 logs下 nginx.lock 文件。
events 段
事件模块设置, 跟 main 同级别
例如:
events {
worker_connections 1024;
}
worker_connections 1024; 表示每个子进程,最多同时处理多少个连接。
use {method} nginx使用何种事件驱动模型。method可选值:select、poll、kqueue、epoll、/dev/polleventport。建议不指定,由nginx自动选择。
worker_connections {number} worker子进程能够处理的最大并发连接数
**accept_mutex on | off** 是否打开负载均衡互斥锁,推荐打开,默认是关闭的。 打开这个的话,当新的请求过来则master 只会找多个子进程中的一个处理,而不是挨个询问,问完了可能还争抢,有额外性能开销,负载均衡锁,会轮流的发给每一个子进程。 |
accept_mutex_delay {time} 新连接分配给worker子进程的超时时间,默认500ms。防止某个进程处理过多,可以适当调小,例如200ms。
**muti_accept on | off** worker子进程可以接收的新连接个数,默认关闭,可以打开,性能影响比较小。 |
http 模块
HTTP核心模块设置
limig_conn 模块
用于限制客户端并发连接数
默认编译进nginx,通过-without-http limit conn module禁用使用共享内存,
使用共享内存,对所有worker子进程生效
常用指令:
limit_conn_zone 设置根据什么确定唯一,可以设置为ip,也可以根据请求头设置。http段。
// 设置为ip 给这个zone 设置一个名称 是 addr, 占用10m 共享内存
limit_conn_zone $binary_remote_addr zone=addr:10m
limit_conn_status code; 限速发生时返回状态码,默认值503,适用上下文 http,server,location
limit_conn_log_level 可以设置日志级别,默认error,有info,notice,warn,error ,上下文 http,server,location
limit_conn {zonename 上边自定义的名称} number; 设置限速多少
limit_req 模块
用于限制客户端处理请求的平均速率,默认编译进nginx,通过一without-http_limit_req_module禁用。
限流算法:leaky_bucket 漏斗算法,强行降低突发流量,保持流量恒定。
limit_req_zone
语法:limit_req_zone key zone=name:size rate=rate
// rate=2r/m 每分钟两次请求,实际就是30秒内只允许1次
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m
limit_req_status code; 限流返回状态码
默认503
limit_req_log_level 日志等级, 可以设置日志级别,默认error,有info,notice,warn,error ,上下文 http,server,location
limit_req
语法: limit req zone=name [burst=number] [nodelay]];
burst=number 表示桶的大小
nodelay 表示立即处理桶内
delay 如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s)如果没有设置,则所有请求会依次等待排队
上下文: http、server、location
access 模块
限制特定IP或网段访问
allow 允许某些ip
语法结构 :allow address | 网段 | all; |
上下文 : http、server、location、limit except
deny 拒绝某些ip
如果有交叉,范围大的要放在下边,范围小的放在上边
auth_basic 模块
用户名密码验证
auth_basic
auth_basic 提示信息 | off 默认是 关闭的,设置成非off的提示信息就打开了。 |
auth_basic_user_file file; 账号密码文件存储位置。
账号密码可以用 httpd-tools 中的 htpasswd 工具生成。
生成新密码文件 htpasswd -bc encrypt pass jack 123456
添加新用户密码 htpasswd -b encrypt pass mike 123456
rewrite 模块
return
停止处理请求,直接返回响应码或重定向到其他URL,执行return指令后,location中后续指令将不会被执行。
上下文: server、location、if
rewrite
根据指定正则表达式匹配规则,重写URL
语法: rewrite regex replacement [flag]
上下文: server、location、if
server 模块
具体服务
server_name name1 name2 … 匹配服务
// 1 精确匹配
server_name www.nginx.com;
// 2 部分匹配,通配 左
server_name *.nginx.com;
// 3 部分匹配,通配 右
server_name www.nginx.*;
// 4 正则表达式匹配
server_name ~^www\.nginx\.*$;
server_name www.nginx.com *.nginx.com;
如果配置了多个server,且同一个域名满足多条匹配规则,则匹配优先级为 1 > 2 > 3 > 4 (上述序号)
listen 监听端口
location
**location {= | ~ | ~* | ^~ } uri {…}** |
序号 | 匹配规则 | 含义 |
---|---|---|
1 | = | 精准匹配,完全一样,不多不少 |
2 | ~ | 正则匹配,区分大小写 |
3 | ~* | 正则匹配,不区分大小写 |
4 | ^~ | 匹配到即停止搜索 |
5 | 不写 | 常见的前缀模糊匹配 |
同时匹配优先级:1 > 2 > 3 > 4 > 5
URI 结尾 反斜线
location /test {...}
location /test/
带反斜线:直接将 test 作为目录,找root目录下,test 文件夹是否存在,存在的话,找 index.html,如果不存在直接返回404。
不带反斜线:将 test 作为目录处理,找 root 目录下,有没有 test 文件夹,如果找到文件夹了,就去找有没有 index.html。如果找不到test文件夹的话,会尝试找 test 文件是否存在,如果存在,则直接将 test文件中的内容直接返回。
alias {path}; 将URI映射到磁盘文件。不叠加,只取定义路径。使用alias时,未尾一定加/ alias只能位于location块中。
location /picture {
alias /opt/nginx/html/picture/;
}
请求www.test.com/picture/1.jpg,对应磁盘映射 /opt/nginx/html/picture/1.jpg
通用指令
root {path}; path 对应主机上某一个目录,将URI映射到磁盘文件。会将定义路径与URI叠加。
上下文: http server location if
例如
location /picture {
root /opt/nginx/html/picture
}
客户端请求www.test.com/picture/1.jpg,则对应磁盘映射路径/opt/nginx/html/picture/picture/1.jpg
变量
TCP相关变量
名称 | 说明 |
---|---|
remote_addr | 客户端IP地址 |
remote_port | 客户端端口 |
server_addr | 服务端IP地址 |
server_port | 服务端端口 |
server_protocol | 服务端协议 |
binary_remote_addr | 二进制格式的客户端IP |
connection | TCP连接的序号,递增 |
connection_request | TCP连接当前的请求数量 |
proxy_protocol_addr | 若使用了proxy_protocol协议 则返回协议中地址 否则返回空 |
proxy_protocol_port | 若使用了proxy_protocol协议 则返回协议中端口 否则返回空 |
HTTP相关
名称 | 说明 |
---|---|
uri | 请求的url,不包含参数 |
request_uri | 请求的url,包含参数 |
scheme | 协议名, http 或https |
request_method | 请求方法(get,post…) |
request_length | 全部请求的长度。包括请求行、请求头、请求体 |
args | 全部参数字符串 |
arg_参数名 | 特定参数值 |
is_args | URL中有参数,则返回?,否则返回空 |
query_string | 与args相同 |
remote_user | 由HTTP Basic Authentication协议传入的用户名 |
场景应用
反向代理
隐藏真实的服务器,降低攻击可能性。服务器可以横向扩充。动静分离,提升系统健壮性。
upstream 模块
用于定义上游服务的相关信息,还有一部分负载均衡算法,那个看下一部分。
指令 | 说明 |
---|---|
upstream | 定义 |
server | 定义上游服务地址 |
zone | 定义共享内存,用于跨worker子进程 |
keepalive | 对上游服务启用长连接 |
keepalive_requests | 1个长连接最多请求个数 |
keepalive_timeout | 空闲情形下,一个长连接的超时时长 |
在http段中定义,与server 平级。
语法: upstream {name} {…}
server
上下文 upstream
语法:server {address} {parameters parameters parameters …};
parameters 可选值
参数 | 说明 |
---|---|
weight=number | 权重值,默认为1 |
max_conns=number | 上游服务器的最大并发连接数 |
fail_timeout=time | 服务器不可用的判定时间 |
max_fails=number | 服务器不可用的检查次数 |
backup | 备份服务器,仅当其他服务器都不可用时 |
down | 标记服务器长期不可用,离线维护 |
例如 fail_timeout = 10s max_fails = 3 ,意思是 10秒内,3次失败,则10秒内剩下的时间,都不分配给这台机器,10秒结束,再开始尝试。
keepalive
限制每个worker子进程与上游服务器空闲长连接的最大数量,复用系统资源,不要设置太大,16左右很好。
语法:keepalive connections_count
默认无
上下文:upstream
keepalive_requests
单个长连接可以处理的最多HTTP请求个数
语法: keepalive_requests number;
默认值: 100;
上下文:upstream
keepalive_timeout
空闲长连接的最长保持时间,默认60秒
上下文:upstream
proxy_pass
转发到哪里
上下文 location
结尾带反斜线:会将location 配置的 uri 给删掉,剩余的部分传给上游
结尾不带反斜线:nginx不会修改用户url,直接传给上游
location /test/ {
proxy_pass http://127.0.0.1:8090;
}
// 不带反斜线 相当于转到 http://127.0.0.1:8090/test/xxx/xx
// 带反斜线 相当于转到 http://127.0.0.1:8090/xxx/xx
client_max_body_size {size 例如 1M 之类的};
设置请求体最大大小,如果有上传图片的,可能会大一些
上下文 http、server、location
client_body_buffer_size
如果请求体小于 缓冲区大小,则直接存到内存里(否则存到磁盘里),提升性能。这个默认8k,可以设置稍微大点
负载均衡
upstream 中配置多个 server
哈希算法
哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值。
hash
语法 hash key [consistent] ;
上下文: upstream;
可以根据请求头等设置规则。
ip_hash 算法
语法:ip_hash
上下文: upstream;
根据IP,去分配后端服务器,IP不变就永远是固定的后端应用服务器。
最少连接数算法
会找一个建立连接数最少的服务器,转发请求。底层实际上是搞了一块共享内存,记录连接数。
zone
语法:zone {name} [size];
默认无,上下文 upstream;
https
// 证书文件 ssI_certificate /opt/nginx/https/kutian.edu.crt; // 私钥文件 ssl_certificate_key /opt/nginx/https/kutian.edu.key;
高可用
VRRP 协议
虚拟路由冗余协议
VIP,VMAC,对外提供虚拟IP,和MAC地址,绑定到某一个Nginx,如果某一个宕机了,则自动切换绑定。
优先级,抢占式,非抢占。
抢占式就是说,如果master优先级比较高,宕机后又启动后,会尝试抢占回VIP绑定,提供服务,非抢占,就是说baskup结点一直提供服务后续。
KeepAlived
实现了VRRP,提供了虚拟IP转移功能。
安装
yum install keepalived
每台nginx都安装 keepalived
配置文件路径 /etc/keepalived/keepalived.conf
启动 systemctl start keepalived
重启(修改配置) systemctl restart keepalived
日志路径 /var/log/messages
配置文件中
global_defs 是全局段,可以修改监控邮件
vrrp_strict 表示严格模式,一般可以注释。
vrrp_ 开头的也可以都注释掉。按需再设置。
vrrp_instance VI_1 段 VI_1 是名称,可修改,这段中主要定义实例信息,多台机器的同一个VIP,这个名字也要一样
state MASTER 表示主节点,BACKUP 表示备用结点
interface eth0 表示当前服务器绑定哪块网卡
virtual_router_id 相同 VIP 实例下 这个id 要保持一致
priority 优先级,值越大的 故障出现时,会优先顶替上去
virtual_ipaddress { 192.168.xxx.xxx } 虚拟IP地址,这是真正给外网,外部提供服务的IP地址
nopreempt 非抢占式,默认没配置
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
# nopreempt 配置了这个则非抢占式,注意非抢占式 多个服务器都要改成BACKUP结点状态,有MASTER 就会抢。
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.xxx.xxx
192.168.xxx.xxx
}
}
注意防火墙及selinux权限。
修改KeepAlievd 日志存放路径
vim /etc/sysconfig/keepalived 文件
编辑 KEEPALIVED_OPTIONS=”-D -d -S 0” 之后保存
vim /etc/rsyslog.conf
加一条,local0.* /var/log/keepalived/xx.log
systemctl restart rsyslog
systemctl restart restart