目录
一、Nginx相关配置
1、nginx配置文件
2、nginx模块
二、nginx全局配置
1、关闭版本或修改版本
1.1 关闭版本
1.2 修改版本
2、修改nginx启动的子进程数
3、cpu与worker进程绑定
4、PID路径
5、nginx进程的优先级
6、调试worker进程打开文件的个数
7、nginx服务运行方式(前台或者后台)
8、仅有master进程没有worker进程
三、event模块配置
四、httpd模块配置
1、MIME
2、server模块用法
2.1 设置root用法
2.2 server块搭建虚拟主机过程
2.3 设置alias别名用法
2.4 location模块匹配
2.4.1 location模块基本语法
2.4.2 匹配优先级
2.4.3 access模块
2.4.4 验证模块(需要输入用户名和密码)
2.5 自定义错误页面
2.5.1 访问到404直接跳转至主页面
2.5.2 精确跳转的页面
2.5.3 指定状态码,防止被劫持
2.6 日志位置存放
2.6.1 分离不同网站的日志
2.6.2 自定义错误日志位置
2.7 检测文件是否存在
2.8 持久连接
2.9 作为下载服务器配置
2.10 用户上传资料至服务器
2.11 其他设置
一、Nginx相关配置
1、nginx配置文件
nginx 官方配置的帮助文档:nginx documentationhttp://nginx.org/en/docs/
一般配置文件由指令和指令块构成:
①每条指令以分号(;)结尾,指令与值之间以空格符号分隔
②指令已{ }达括号将多条指令组织在一起且可以嵌套指令块
③include语句允许组合多个配置文件以提升可维护性
④#号注释
⑤$使用变量
⑥部分支持正则
⑦自定义变量:由用户使用set命令定义,格式: set variable_name value
nginx配置文件:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置 同步
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {负载均衡
...
}
2、nginx模块
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
①核心模块:core module
②标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
③第三方模块
nginx常用模块:
ngx_http_core_module 核心模块 ngx_http_access_module 访问控制模块 ngx_http_auth_basic_module 身份验证模块 ngx_http_gzip_module 压缩模块 ngx_http_log_module 日志模块 ngx_http_proxy_module 代理模块 ngx_http_rewrite_module 重写模块 ngx_http_stub_status_module 状态页 ngx_http_upstream_module 反向代理模块
二、nginx全局配置
前提:需要编译安装的nginx,还要关闭防火墙和核心防护,以及开启nginx服务
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#systemctl start nginx
1、关闭版本或修改版本
1.1 关闭版本
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
server_tokens off;
[root@localhost ~]#nginx -s reload
nginx服务器配置:
客户端检测:
服务器配置之前,客户端检测:
服务器配置之后,客户端检测:
1.2 修改版本
nginx服务器配置:
①修改/data/nginx-1.18.0/src/core/nginx.h文件
#nginx服务器配置
[root@localhost ~]#systemctl stop nginx
[root@localhost ~]#cd /data/nginx-1.18.0/src/core
[root@localhost core]#vim nginx.h
#define NGINX_VERSION "1314"
#define NGINX_VER "dh/" NGINX_VERSION
②修改/data/nginx-1.18.0/src/http/ngx_http_header_filter_module.c文件
#nginx服务器配置
[root@localhost core]#vim /data/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: cloud" CRLF;
③重新编译安装
#修改完上述两个文件后,需重新编译
[root@localhost core]#cd /data/nginx-1.18.0/
[root@localhost nginx-1.18.0]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@localhost nginx-1.18.0]#make -j2 &&make install
[root@localhost nginx-1.18.0]#systemctl start nginx
[root@localhost nginx-1.18.0]#systemctl restart nginx
客户端检测:
情况一:当服务器配置server_tokens off时
情况二:当服务器没有配置server_tokens off时
2、修改nginx启动的子进程数
nginx服务器配置:
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
worker_processes 2;
[root@localhost ~]#nginx -s reload
nginx服务器测试:
[root@localhost ~]#pstree -p | grep nginx
根据CPU数量开启nginx子进程数,如果你有四个CPU,相对应的开启四个子进程
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
worker_processes auto;
[root@localhost ~]#nginx -s reload
nginx服务器配置:
nginx服务器测试:
[root@localhost ~]#pstree -p | grep nginx
[root@localhost ~]#lscpu
3、cpu与worker进程绑定
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能
默认Nginx是不进行进程绑定的,运行在几号CPU完全是随机的
[root@localhost ~]#ps axo pid,cmd,psr | grep nginx
现在服务器进行配置实现cpu与work进程绑定,使进程可以一直运行在同一个CPU上
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
worker_cpu_affinity 00000001 00000010 00000100 00001000;
[root@localhost ~]#nginx -s reload
[root@localhost ~]#ps axo pid,cmd,psr | grep nginx
4、PID路径
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
#pid logs/nginx.pid;
[root@localhost ~]#nginx -s reload
[root@localhost ~]#cat /apps/nginx/logs/nginx.pid
5、nginx进程的优先级
PRI值不能修改,一般通过修改NI值来调整进程的优先级。
PRI值+NI值=数值,通过比较数值大小来确定优先级,数值越小进程优先级越大
[root@localhost ~]#ps -elf #查看当前系统进程详细信息
[root@localhost ~]#ps -elf|grep nginx #查看nginx进程详细信息
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
worker_priority -20; #工作进程NI优先级,-20~19
[root@localhost ~]#nginx -s reload
[root@localhost ~]#ps -elf|grep nginx
[root@localhost ~]#ps axo pid,cmd,psr,pri,ni|grep nginx|sort -n
6、调试worker进程打开文件的个数
所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制。最好与ulimit -n 或者limits.conf的值保持一致
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
worker_rlimit_nofile 100000;
[root@localhost ~]#nginx -s reload
[root@localhost ~]#vim /etc/security/limits.conf #还有修改pam认证文件
* - nofile 100000
#重启后生效
7、nginx服务运行方式(前台或者后台)
一般nginx服务都是后台运行,前台运行通常用于调试或者开发环境,因为在前台运行可以更方便地查看日志输出
在生产环境中,通常会将 daemon
设置为 on
,以便 Nginx 以守护进程的方式在后台运行
daemon off; #设置nginx在前台运行
8、仅有master进程没有worker进程
用于控制 Nginx 是否以主进程的方式运行。如果设置为 off
,Nginx 将以单进程的方式运行,这意味着 Nginx 将不会创建主进程和工作进程。如果设置为 on
,Nginx 将以主进程和工作进程的方式运行,这意味着 Nginx 将创建一个主进程和多个工作进程
master_process off|on;
#是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on
三、event模块配置
event模块主要用于配置nginx的事件处理机制,包括连接处理、定时器处理
events {
worker_connections 65536;
#设置单个工作进程的最大并发连接数
#需要和master配合,否则无效
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
}
问:一台服务器最多能接受多少客户端访问?
一台服务器能接受的最大客户端访问数量取决于多个因素,包括硬件资源(如CPU、内存、网络带宽等)、操作系统的配置(如最大文件描述符数量、最大并发连接数等)、以及服务器软件(如Nginx、Apache等)的配置
在Nginx中,worker_connections
指令用于设置每个工作进程可以同时处理的最大连接数。默认情况下,这个值是512
。如果你的服务器硬件资源充足,你可以增大这个值来提高服务器的并发处理能力
在Linux系统中,/proc/sys/fs/file-max
文件中的值表示系统级别的最大文件描述符数量。这个值也会影响到服务器能接受的最大客户端访问数量
总的来说,一台服务器能接受的最大客户端访问数量是一个动态的值,需要根据具体的硬件资源、操作系统和服务器软件的配置来确定
四、httpd模块配置
1、MIME
MIME : Multipurpose Internet Mail Extensions 多用途互联网邮件扩展
文件:/data/nginx-1.18.0/conf/mime.types ,来自于编译安装包
此项为支持的文件格式,如果不支持的格式会自动帮你下载,如果支持就会显示在网页上
#MIME格式
type/subtype 主要类型/次要类型
[root@localhost ~]#systemctl start nginx
[root@localhost ~]#cd /apps/nginx/html
[root@localhost html]#touch dh17.xz
[root@localhost html]#grep dh17 /data/nginx-1.18.0/conf/mime.types
[root@localhost html]#grep jpg /data/nginx-1.18.0/conf/mime.types
2、server模块用法
2.1 设置root用法
root指定了主页文件的位置
当nginx接收到一个请求时,它会根据请求的URI和root
指令的值来确定请求的文件路径
如果root
指令的值是/apps/nginx/html
,并且请求的URI是/index.html
,那么nginx会尝试读取apps/nginx/html/index.html
文件来响应这个请求
2.2 server块搭建虚拟主机过程
虚拟主机是一种技术,允许在单个物理服务器上托管多个域名和网站。每个虚拟主机都有自己的配置,包括根目录、日志文件、错误页面等
虚拟主机的配置通常在server
块中完成。每个server
块代表一个虚拟主机,它可以监听一个或多个端口,也可以监听一个或多个域名
要求:在同一个nginx服务器:172.16.12.10上构建不同的虚拟主机:PC端和手机端
nginx服务器配置:
①首先为一般不在主配置文件修改,而是通过在主配置文件里定义子配置文件路径,然后新建子配置文件去进行修改
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf.d/*.conf;
[root@localhost ~]#nginx -s reload
②编写PC端页面
[root@localhost ~]#mkdir /apps/nginx/conf.d
[root@localhost ~]#cd /apps/nginx/conf.d
[root@localhost conf.d]#vim pc.conf
server {
listen 80;
server_name www.pc.com;
root /opt/;
}
③编写手机端页面
[root@localhost conf.d]#vim m.conf
server {
listen 80;
server_name www.m.com;
root /mnt/;
}
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#echo "pc pc pc pc" > /opt/index.html
[root@localhost conf.d]#echo "m m m m" > /mnt/index.html
客户端测试:
[root@localhost ~]#vim /etc/hosts
[root@localhost ~]#curl www.pc.com
[root@localhost ~]#curl www.m.com
2.3 设置alias别名用法
server
下的alias
指令用于创建一个别名,它可以将请求的URI映射到文件系统中的另一个位置。这在处理URL重写和文件系统结构调整时非常有用
[root@localhost conf.d]#vim pc.conf
server {
listen 80;
server_name www.pc.com;
location /html {
root /opt/;
#root相当于追加,将文件夹html追加到/opt/html/
}
location /data {
alias /mnt/;
#相当于替换,访问/data就是访问/mnt/
}
}
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#echo "/opt/html/" > /opt/html/index.html
[root@localhost conf.d]#echo "/mnt" > /mnt/index.html
[root@localhost conf.d]#echo "/data" > /data/index.html
客户端测试:
2.4 location模块匹配
2.4.1 location模块基本语法
Nginx的location指令是用来匹配请求URL的一种方式,可以根据不同的URL路径来指定不同的处理方式。location指令可以用来匹配请求的URI(Uniform Resource Identifier),并根据匹配的结果来决定如何处理该请求
#location语法规则
location [ = | ~ | ~* | ^~ ] uri { ... }
字符 | 说明 |
---|---|
= | 用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 |
^~ | 用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写 |
~ | 用于标准url前,表示包含正则表达式,并且区分大小写 |
~* | 用于标准url前,表示包含正则表达式,并且不区分大写 |
不带任何符号 | 匹配起始于此uri的所有的uri |
\ | 用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号 |
2.4.2 匹配优先级
(1)局部location与全局server
局部优先级高于全局优先级;当局部没有指明路径,全局兜底
[root@localhost ~]# cd /apps/nginx/conf.d/
[root@localhost conf.d]#vim pc.conf
server {
listen 80;
server_name www.pc.com;
root /opt/; #全局配置,兜底
location / { #追踪url,根据用户访问的网址
root /mnt/; #局部配置
}
}
[root@localhost ~]# nginx -s reload
(2)location模块内优先级比较
匹配优先级从高到低:=, ^~, ~/~*,不带符号
注:alias影响优先级
#官方帮助文档内的例题
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
① 当客户端访问:www.pc.com/时,问最先匹配A、B、C、D、E内的哪个location模块
答:只有A、B可匹配,A优先级最高
② 当客户端访问:www.pc.com/index.html时,问最先匹配A、B、C、D、E内的哪个location模块
答:只有B可匹配
③当客户端访问:www.pc.com/documents/index.html时,问最先匹配A、B、C、D、E内的哪个location模块
答:只有B、C可匹配,C优先级最高
④当客户端访问:www.pc.com/images/a.gif时,问最先匹配A、B、C、D、E内的哪个location模块
答:只有B、D、E可匹配,优先级:D>E>B
⑤当客户端访问:www.pc.com/documents/b.jpg时,问最先匹配A、B、C、D、E内的哪个location模块
答:只有B、C、E可匹配,优先级:E>C>B
实战:
[root@localhost ~]#vim /apps/nginx/conf.d/pc.conf
server{
listen 80;
server_name www.pc.com;
root /opt/;
location = / {
root /mnt/static1;
index index.html;
}
location / {
root /mnt/static2;
index index.html;
}
location /documents/ {
root /mnt/static3;
index index.html;
}
location ^~/images/ {
root /mnt/static4;
index index.html;
}
location ~* \.(gif|jpg|jpeg)$ {
root /mnt/static5;
index index.html;
}
}
[root@localhost conf.d]#nginx -s reload
新建与配置文件匹配的目录和文件即可
bug:理论上 = 比 什么都不加的优先级高,实际 = 与 什么都不加的优先级混淆,不能根据理论判断
其他都能匹配成功:
~*不区分大小写也有bug:
[root@localhost conf.d]# vim pc.conf
server {
listen 80;
server_name www.pc.com;
root /mnt/;
location ~* /A?\.jpg {
root /opt/;
}
}
[root@localhost conf.d]#nginx -s reload
注:这里需要注意的,虽然程序不区分大小写,但是Linux(当前xfs)系统内核区分
2.4.3 access模块
Nginx的access模块用于控制对服务器资源的访问权限,允许或拒绝特定的请求。这个模块通常用于实现访问控制、安全策略和防盗链等功能
#配置nginx服务器白名单,只允许172.16.12.1访问,其他172.16.12.0网段的全部拒绝
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.lucky.com;
allow 172.16.12.1;
deny 172.16.12.0/24;
location / {
root /opt/;
}
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#echo "welcome to this web">/opt/index.html
#配置nginx服务器黑名单,只拒绝172.16.12.1访问,允许其他172.16.12.0网段地址访问
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.lucky.com;
deny 172.16.12.1;
allow 172.16.12.0/24;
location / {
root /opt/;
}
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#echo "welcome to this web">/opt/index.html
2.4.4 验证模块(需要输入用户名和密码)
用于对HTTP请求进行基本的用户名和密码验证。这种验证方式通常用于保护网站的某些部分,例如管理页面或者私有资源
模块名称:ngx_http_auth_basic_module
访问控制基于模块 ngx_http_auth_basic_module 实现,可以通过匹配客户端资源进行限制
工作原理:当客户端发送一个请求到nginx时,nginx会检查请求的Authorization
头部。如果这个头部不存在,或者用户名和密码不正确,nginx会返回一个401 Unauthorized
响应,要求客户端提供正确的用户名和密码
#格式
Syntax: auth_basic string | off;
Default:
auth_basic off;
Context: http, server, location, 1imit_except
Syntax: auth_basic_user_file file;
Default: _
Context: http, server, location, 1imit_except
htpasswd命令:
是一个在Linux系统中用于生成和更新Apache HTTP服务器的密码文件的命令行工具
htpasswd命令来源于httpd-tools包
[root@localhost ~]#yum install -y httpd-tools #下载htpasswd命令
选项 | 说明 |
---|---|
-c | 创建一个新的密码文件。如果密码文件已经存在,这个选项会覆盖原有的文件 |
-m | 使用MD5哈希算法生成密码。这是默认的哈希算法 |
-d | 使用DES哈希算法生成密码 |
-s | 使用SHA哈希算法生成密码 |
-b | 使用命令行提供的密码,而不是交互式地提示用户输入密码。这个选项通常用于脚本中 |
-n | 不要在密码文件中添加新的行。这个选项通常用于检查用户名和密码是否正确 |
#第一次生成文件时
htpasswd -c 文件路径 姓名 #交互式生成密码
htpasswd -bc 文件路径 姓名 密码 #直接将密码跟在后面
#非第一次生成文件时
htpasswd 文件路径 姓名 #交互式生成密码
htpasswd -b 文件路径 姓名 密码 #直接将密码跟在后面
实战:
[root@localhost ~]#yum install -y httpd-tools
[root@localhost ~]#htpasswd -c /mnt/.nginxuser dh
[root@localhost ~]#cat /mnt/.nginxuser
[root@localhost ~]#mkdir /opt/admin
[root@localhost ~]#echo "welcome to my world" >/opt/admin/index.html
#修改子配置文件
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.pc.com;
root /opt;
location /admin{
root /opt;
auth_basic "admin site"; #提示信息,不是适用于所有的浏览器
auth_basic_user_file /mnt/.nginxuser; #密码文件存放位置
}
}
[root@localhost ~]#nginx -s reload
客户端谷歌浏览器测试:
客户端火狐浏览器测试:
2.5 自定义错误页面
可以改变默认的错误页面,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location
#格式
error_page code ... [=[response]] uri;
页面错误代码
error_page 固定写法
code 响应码
= 可以将响应码转换
uri 访问连接
默认错误页面404(访问不到资源)的报错
2.5.1 访问到404直接跳转至主页面
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.pc.com;
root /opt;
error_page 404 /index.html; #如果发生404错误,直接跳转至规定目录
[root@localhost ~]#nginx -s reload
客户端测试:现在发生404错误,直接跳转至规定目录
2.5.2 精确跳转的页面
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.pc.com;
root /opt;
error_page 404 /40x.html;
location = /40x.html {
root /mnt/error/;
}
[root@localhost ~]#nginx -s reload
客户端测试:现在发生404错误,直接跳转至精确目录
2.5.3 指定状态码,防止被劫持
error_page 404 =302 /40x.html;
客户端测试:
2.6 日志位置存放
#格式
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
level: debug, info, notice, warn, error, crit, alert, emerg
error_log /apps/nginx/logs/xxx_error.log;
固定格式 文件路径 级别(info debug等 可以忽略不写)
2.6.1 分离不同网站的日志
如果不分离,都默认混杂在同一个日志文件/apps/nginx/logs/access_log
#将虚拟主机上的两个网站日志分离
[root@localhost ~]#cd /apps/nginx/conf.d
[root@localhost conf.d]#vim pc.conf
server {
listen 80;
server_name www.pc.com;
root /opt/;
error_log /opt/logs/pc.error.log;
access_log /opt/logs/pc.access.log;
}
[root@localhost conf.d]#vim m.conf
server {
listen 80;
server_name www.m.com;
root /mnt/;
error_log /mnt/logs/m.error.log;
access_log /mnt/logs/m.access.log;
}
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#echo "pc pc pc pc" > /opt/index.html
[root@localhost conf.d]#echo "m m m m" > /mnt/index.html
[root@localhost ~]#mkdir /opt/logs
[root@localhost ~]#mkdir /mnt/logs
服务端测试:
客户端查看访问日志:
2.6.2 自定义错误日志位置
①在主配置文件,自定义错误日志的位置
②客户端错误访问服务器会产生错误日志
③ 查看自定义的错误日志
2.7 检测文件是否存在
try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部 URI 的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
#格式
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.m.com;
root /opt;
location / {
root /opt;
try_files $uri $uri.html $uri/index.html /about/default.html;
}
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#cd /opt
[root@localhost opt]#mkdir about
[root@localhost opt]#echo "about/default.html" > about/default.html
[root@localhost opt]#echo "good.html" >good.html
[root@localhost opt]#ls
#删除正常访问的文件
[root@localhost opt]#rm -rf good.html
[root@localhost opt]#ls
2.8 持久连接
#指令,可以加在全局或者server
keepalive_timeout timeout [header timeout];
#设定保持连接超时时长,0表示禁止长连接,默认为65s,通常配置在http字段作为站点全局配置
keepalive_requests number;
#在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
#如:
keepalive_requests 2;
#最大下载两个资源就会断开
keepalive_timeout 60 65;
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文
#如果设置为0表示关闭会话保持功能,将如下显示:
Connection:close
实战:
服务器设置持久连接的最大接收数为2,且持久连接持续时间为300s
服务器创建三个资源供客户端下载
客户端使用telnet模拟持久连接下载资源,服务器设置了最多只能接受两个请求,所以客户端只能下载两个资源就被迫退出了
对哪种浏览器禁用长连接:
keepalive_disable none | browser ...;
#对哪种浏览器禁用长连接,默认是none
2.9 作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务
#nginx服务器配置
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.dh.com;
location /download {
autoindex on;
autoindex_exact_size off;
root /opt/;
}
}
[root@localhost conf.d]# nginx -s reload
[root@localhost ~]#mkdir /opt/download
[root@localhost ~]#cp /etc/fstab /opt/download
[root@localhost ~]#cp /etc/passwd /opt/download/
[root@localhost ~]#cp /etc/shadow /opt/download/
[root@localhost ~]#ll /opt/download/
客户端测试:
一些其他指令:
[root@localhost nginx-1.18.0]#./configure --help |grep auto
#自带
--without-http_autoindex_module disable ngx_http_autoindex_module
autoindex on | off;
#自动文件索引功能,默为off
autoindex_exact_size on | off;
#计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ;
#显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp;
#显示索引的页面文件风格,默认html
limit_rate rate;
#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate
#变量提供限制,变量优先级高
#如
autoindex_format json; #索引页面风格换成json格式
2.10 用户上传资料至服务器
允许用户通过 HTTP POST请求上传文件,并提供了对上传文件的处理和管理功能,如写博客等
client_max_body_size 1m;
#设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size;
#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面
client_body_temp_path
#指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名
2.11 其他设置
directio size | off;
#操作完全和aio相反,aio是读取文件而directio是写文件到磁盘,启用直接I/O,默认为关闭,当文件大于等于给定大小时,例如:directio 4m;同步(直接)写磁盘,而非写缓存。
open_file_cache off; #是否缓存打开过的文件信息
open_file_cache max=N [inactive=time];
#nginx可以缓存以下三种信息:
(1) 文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2) 打开的目录结构
(3) 没有找到的或者没有权限访问的文件的相关信息
max=N:#可缓存的缓存项上限数量;达到上限后会使用LRU(Least recently used,最近最少使用)算法实现管理
inactive=time:#缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于
open_file_cache_min_uses
#指令所指定的次数的缓存项即为非活动项,将被删除
open_file_cache_valid time;
#缓存项有效性的检查验证频率,默认值为60s
open_file_cache_errors on | off;
#是否缓存查找时发生错误的文件一类的信息,默认值为off
open_file_cache_min_uses number;
#open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
示例:
open_file_cache max=10000 inactive=60s;
#最大缓存10000个文件,非活动数据超时时长60s
open_file_cache_valid 60s;
#每间隔60s检查一下缓存数据有效性
open_file_cache_min_uses 5;
#60秒内至少被命中访问5次才被标记为活动数据
open_file_cache_errors on;
#缓存错误信息
limit_except method ... { ... },仅用于location
#限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.44.20;
deny all;
}
#允许 192.168.44.20主机下载,其他都拒绝