章节
1 NGINX 的源码安装
2 NGINX 核心配置详解
3 NGINX 之 location 匹配优先级
4 NGINX 基础参数与功能
目录
1 配置文件说明
1.1 nginx 配置文件格式说明
1.2 Nginx 主配置文件的配置指令方式:
1.3 主配置文件结构:四部分
1.4 nginx 文件作用解释
1.5 配置文件说明
2 nginx-web应用
2.1 定义进程数以及进程绑定
2.2 定义进程优先级与文件打开上限
2.3 events块
2.4 实现 nginx 的高并发配置
2.4.1 文件描述符限制
2.4.2 为什么需要调整文件描述符限制
2.4.3 临时调整
2.4.4 永久调整
2.5 http 配置块
3 核心配置示例
1 配置文件说明
nginx 官方帮助文档:http://nginx.org/en/docs/
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
fastcgi, uwsgi,scgi 等协议相关的配置文件
mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某 种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动 使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
1.1 nginx 配置文件格式说明
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式
1.2 Nginx 主配置文件的配置指令方式:
directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name
1.3 主配置文件结构:四部分
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
1.4 nginx 文件作用解释
[root@www ~ ] # tree /application/nginx/
# <== 如果 tree 命令找不到需要 yum intall tree -y 安装
/application/nginx/
| -- client一body一temp
| -- conf # 这是 Nginx 所有配置文件的目录, 极其重要
| | -- fastcgi.conf # fastcgi 相关参数的配置文件
| | -- fastcgi.conf.default # fastcgi.conf 的原始备份
| | -- fastcgi_params # fastcgi 的参数文件
| | -- fastcgi_params.default
| | -- koi-utf
| | -- koi-win
| | -- mime.types # 媒体类型
| | -- mime.types.default
| | -- nginx.conf # 这是 Nginx 默认的主配置文件
| | -- nginx.conf.default
| | -- scgi_params # SCgi 相关参数文件 , 一般用不到
| | -- scgi_params.default
| | -- uwsgi_params # uwsgi 相关参数文件, 一般用不到
| | -- uwsgi_params.default
| | -- win-utf
| -- fastcgi_temp # fastcgi 临时数据目录
| -- html # 这是编译安装时 Nginx 的默认站点目录, 前面已说明,类似Apache的默认站 htdocs目录
| | -- 50x.html # 错误页面优雅替代显示文件,例如:出现502错误时会调用此页面
| # error_page 500 502 503 504 /50x.html;
| | -- index.html # 默认的首页文件, 在实际环境中,大家习惯用(注意不是必须)index.html、 index.php, | index.jsp 来做网站的首页件。
| -- logs # 这是 Nginx 默认的日志路径, 包括错误日志及访问曰志
| | -- access.log # 这是 Nginx 的默认访问曰志文件, 使用 tail -f 可以实时观看网站用户访问情况信息
| | -- error.log # 这是 Nginx 的错误日志文件, 如果 Nginx 出现启动故障等问题 ,查看错误日志
| | -- nginx.pid # Nginx 的 pid 文件, Nginx 进程启动后, 会把所有进程的ID号写到此文件
| -- proxy_temp # 临时目录
| -- sbin # 这是 Nginx 命令的目录, 如 Nginx 的启动命令 nginx
| | -- nginx # Nginx 的启动命令 nginx
| -- scgi_temp # 临时目录
| -- uwscgi_temp # 临时目录
9 directories, 21 files
1.5 配置文件说明
[root@RHEL-9 conf]# cat nginx.conf
worker_processes 1; ← worker 进程数量
events { ←事件区块
worker_connections 1024; ←每个worker进程可以处理的连接数
} ←事件区块结束
http { ← HTTP 区块
include mime.types; ←支持的媒体文件
default_type application/octet-stream; ←默认的媒体类型
sendfile on; ←高效传输模式
keepalive_timeout 65; ←超时时间
server { ← server 区块
listen 80; ←端口
server_name localhost; ←域名
location / { ←第一个location区块
root html; ←站点目录
index index.html index.htm; ←首页文件
} ←第一个location区块结束
error_page 500 502 503 504 /50x.html; ← 错误信息配置
location = /50x.html { 文件位置
root html; 在哪找:路径
}
} ← server 区块结束
} ← HTTP 区块结束
2 nginx-web应用
2.1 定义进程数以及进程绑定
worker_processes 与 worker_cpu_affinity
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
# 将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,
# 绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,
# 这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,
# 减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
#示例
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010;
2.2 定义进程优先级与文件打开上限
worker_priority 与 worker_rlimit_nofile
worker_priority 0; #工作进程优先级,-20~20(19)
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,
#包括:Nginx的所有连接(例如与代理服务器的连接等)
#而不仅仅是与客户端的连接
#另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制
#最好与ulimit -n 或者limits.conf的值保持一致,
2.3 events块
events {
worker_connections 65535; #设置单个工作进程的最大并发连接数
use epoll; #使用epoll事件驱动,
#Nginx支持众多的事件驱动,
#比如:select、poll、epoll,只能设置在events模块中设置
accept_mutex on; #on为同一时刻一个请求轮流由work进程处理,
#而防止被同时唤醒所有worker
#避免多个睡眠进程被唤醒的设置,默认为off
#新请求会唤醒所有worker进程,此过程也称为"惊群"
#因此nginx刚安装完以后要进行适当的优化。建议设置为on
multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接
#此指令默认为off,
#即默认为一个工作进程只能一次接受一个新的网络连接
#打开后几个同接受多个。建议设置为on
}
2.4 实现 nginx 的高并发配置
使用ab命令来对NGINX进行压力测试
2.4.1 文件描述符限制
文件描述符是用来标识打开文件的整数标识符。在Linux系统中,每个进程都有一个文件描述符表,用于跟踪进程打开的所有文件、套接字等资源。当进程达到其文件描述符的最大限制时,就无法再打开更多的文件或建立更多的网络连接,这可能会导致服务中断或性能下降。
2.4.2 为什么需要调整文件描述符限制
对于像NGINX这样的Web服务器,特别是在高并发环境下,可能需要同时处理大量的客户端连接。每个连接都会占用一个或多个文件描述符。因此,如果默认的文件描述符限制较低,NGINX可能会在高负载下达到限制,从而无法处理更多的连接请求。
2.4.3 临时调整
ulimit -n 100000
2.4.4 永久调整
[root@RHEL-9 ~]# vim /etc/security/limits.conf
nginx - nofile 10000000
[root@RHEL-9 ~]# sudo -u nginx ulimit -n
100000
[root@RHEL-9 ~]# sudo -u nginx ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 6723
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 100000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 6723
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
开放最大并发数为10000000
[root@RHEL-9 ~]# vim /usr/local/nginx/conf/nginx.conf
[root@RHEL-9 ~]# systemctl restart nginx
2.5 http 配置块
#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include /etc/nginx/mime.types;
default_type application/octet-stream; #除mime.types中的类型外
#指定其它文件的默认MIME类型,浏览
器一般会提示下载
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
创建子配置文件夹
3 核心配置示例
虚拟主机
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块
ngx_http_core_module实现。
新建一个 PC web 站点
root 与 alias
root #给定的路径对应于location中的/uri左侧的/
alias #给定的路径对应于location中的/uri的完整路径
[root@RHEL-9 ~]# mkdir -p /data/web
[root@RHEL-9 ~]# echo this is `hostname -I` > /data/web/index.html
[root@RHEL-9 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.shuyan.com;
index index.html;
location / {
root /data/web;
}
location /html {
root /data/web;
}
location /web {
alias /data/web/html;
}
}
[root@RHEL-9 ~]# vim /usr/local/nginx/conf.d/vhost.conf
[root@RHEL-9 ~]# systemctl reload nginx
[root@RHEL-9 ~]# mkdir /data/web/html
[root@RHEL-9 ~]# echo this is alias > /data/web/html/index.html
[root@RHEL-9 ~]# curl 192.168.239.20
this is 192.168.239.20
[root@RHEL-9 ~]# curl 192.168.239.20/web/
this is alias
[root@RHEL-9 ~]# curl 192.168.239.20/html/
this is alias