Nginx知识总结

概述

应用场景

  • 高性能静态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-pcrepcre库的存放路径,正则表达式会用到
–with-zlibzlib库的存放路径,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
connectionTCP连接的序号,递增
connection_requestTCP连接当前的请求数量
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_argsURL中有参数,则返回?,否则返回空
query_string与args相同
remote_user由HTTP Basic Authentication协议传入的用户名

场景应用

反向代理

隐藏真实的服务器,降低攻击可能性。服务器可以横向扩充。动静分离,提升系统健壮性。

upstream 模块

用于定义上游服务的相关信息,还有一部分负载均衡算法,那个看下一部分。

指令说明
upstream定义
server定义上游服务地址
zone定义共享内存,用于跨worker子进程
keepalive对上游服务启用长连接
keepalive_requests1个长连接最多请求个数
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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
CentOS 7.6 是一款流行的 Linux 操作系统,大多数用户都希望使用 Nginx 作为其 Web 服务器和反向代理服务器。虽然可以通过 yum 安装 nginx,但源码安装可以为用户提供更多的灵活性和自定义选项。 以下是在 CentOS 7.6 上源码安装 nginx 的步骤: 准备环境: 首先,需要下载最新版本的 Nginx 源代码,并且将其解压到一个目录,然后需要安装一些依赖项: sudo yum install gcc-c++ pcre-devel openssl-devel 安装 Nginx: 进入 Nginx 源码目录,运行以下命令来编译和安装 nginx: ./configure --prefix=/usr/local/nginx --with-http_ssl_module make && sudo make install 此命令将会将 nginx 安装到 /usr/local/nginx 目录下,并且启用了 HTTPS。 配置 Nginx: 接下来,需要编辑 Nginx 配置文件,该文件位于 /usr/local/nginx/conf/nginx.conf: sudo vi /usr/local/nginx/conf/nginx.conf 根据自己的需要进行修改,保存并退出该文件。 启动 Nginx: 最后,启动 Nginx: sudo /usr/local/nginx/sbin/nginx 查看 Nginx 是否成功运行,可以使用以下命令: sudo ps aux | grep nginx 如果看到有多个 Nginx 进程运行,则说明 Nginx 已成功启动。 总结: 源码安装 Nginx 可以为用户提供更多的自定义选项和灵活性。用户只需要准备好环境,下载源代码,进行编译,配置和启动即可。此过程需要一定的技术知识和经验,因此建议用户了解 Nginx 的基本原理并遵循最佳实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值