目录
引言
nginx作为后起之秀,它的功能十分强大,在上文中进行了理论讲解和服务安装,本文将学习如何进行操作
一、Nginx配置文件详解
想要了解一个文件的具体操作,首先要了解它的配置文件及作用
nginx 官方帮助文档: nginx documentation
(一)配置文件
Nginx的配置文件的组成部分:
主配置文件:安装目录下的nginx.conf
/apps/nginx/conf/nginx.conf
过滤出非空行和未被注释的行
#events块: #事件驱动相关的配置 同步
worker_connections 1024;:定义每个工作进程可以同时处理的最大连接数为1024。这意味
着在系统资源允许的情况下,每个工作进程最多可同时处理1024个客户端连接。
#http块: #http/https 协议相关配置段
include mime.types;:包含一个名为mime.types的文件,这个文件中定义了不同文
件扩展名对应的MIME类型。
default_type application/octet-stream;:当找不到匹配MIME类型的文件时,默认
使用"application/octet-stream"作为MIME类型。
sendfile on;:启用高效文件传输模式(sendfile系统调用),用于提高静态文件
服务性能。keepalive_timeout 65;:设置保持连接(KeepAlive)超时时间为65秒。即在
一次TCP连接上,如果没有新的请求,在65秒后Nginx会关闭连接以释放资源。
#server块:
listen 80;:指定服务器监听的端口为80(HTTP默认端口)。
server_name localhost;:定义服务器名称为localhost,意味着它将响应发送到本地主机
名的请求。
#location块:
location / {:匹配所有根路径("/")的请求。
root html;:设置网站根目录为html,所以当用户访问"/"时,Nginx会在服务器的html目
录下查找相应的资源。
index index.html index.htm;:如果请求的是目录而非具体文件,则返回列表中的第一个
存在的文件作为主页,先尝试加载index.html,如果不存在则尝试加载index.htm。
error_page 500 502 503 504 /50x.html;:定义错误页面,当出现500、502、503或
504状态码时,显示位于/50x.html的错误页面。
location = /50x.html {:精确匹配 "/50x.html" 的请求。
root html;:如果请求的是50x.html错误页面,则同样从服务器的html目录下查找该文件
子配置文件: include conf.d/*.conf
这一条配置信息,可以写在配置文件中的任何位置,如果写在语句块之外,那么就是全局生效,如何写在语句块中,只有在语句块中生效,例如写在http语句块中,events,语句块中的配置就不会生效
(二)模块
nginx 有多种模块
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
二、全局配置文件
(一)关闭版本或修改版本
1.关闭版本号
server_tokens语句:来自核心模块,使用以下链接查看官方文档的详细解释
server_tokens on:#这是默认设置,表示在响应头部(Server字段)显示完整的Nginx版
#本号以及可能的操作系统和模块信息。这有助于调试,但可能会暴露服
#务器的敏感信息给潜在攻击者。
server_tokens off:#关闭版本信息显示,仅显示“Server: nginx”。这样可以提高安全性,
#因为攻击者无法通过响应头部获取精确的Nginx版本和其他详细信息。
server_tokens build:#仅显示编译时的基本版本信息,如"Server: nginx/1.23.4",不
#包含详细的模块和操作系统信息。
server_tokens string:#允许自定义响应头部的Server字段内容,例如 "server_tokens
#my_custom_string;",将会显示 "Server: my_custom_string"
可以将版本信息隐藏起来
在http语句块中添加server_tokens off;
注意要以封号结尾
添加完毕后重新加载配置文件
nginx -s reload
再访问的话就看不到版本信息了
2.修改版本信息
先将服务关闭:systemctl stop nginx
首先去修改源码,在安装包里 注意 #号不要去掉
vim /data/nginx-1.18.0/src/core/nginx.h
因为上面之前在配置文件中添加了server_tokens off;关闭了版本号,所以还需要修改ngx_http_header_filter_module.c文件中49行的内容
vim /data/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
而后重新编译
而后执行:make && make install
重启服务后使用客户端去访问看到的是ngx_http_header_filter_module.c文件中49行的内容
因为将版本号关闭了,在nginx.h文件中设置的版本信息无法显示
将配置文件中关闭版本号的语句注释掉
重新加载配置文件后再i访问就是在nginx.h文件中设置的版本名称
(二)修改启动的进程数
开启服务时只会打开一个进程
这是因为在配置文件中规定了数量
可以通过修改配置文件规定打开数量
worker_processes auto;
如果设置为auto 就是你真实的cpu数量
(三)cpu与work进程绑定
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
可以看到,同样的进程,在重新加载配置文件后,会在不同的cpu上跳转
通过修改配置文件实现cpu绑定
序号绑定cpu叫做亲缘性
(四)work进程的优先级
当你想将nginx的work进程的优先级调高 可以使用nice设置
默认的优先级为0
可以在配置文件中添加:worker_priority number;
工作进程优先级,-20~19
重新加载文件后查看一下优先级
(五)调试work进程打开的文件的个数
worker_rlimit_nofile
所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致
首先修改配置文件
而后修改系统的最大打开文件数量:ulimit -n 或者limits.conf的值
vim /etc/security/limits.conf
修改配置文件后需要重启
需要区分nginx的启动方式,如果是直接使用nginx命令启动,此时配置就已经设置完成了
如果使用system服务去管理nginx程序,需要在nginx的启动文件中添加:LimitNOFILE
vim /usr/lib/systemd/system/nginx.service
添加完文件后执行:systemctl daemon-reload命令,重新加载启动文件
而后重启服务生效
(六)关闭work进程
master_process off|on
是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on(开启)
三、event,IO模型调优
worker_connections 20000
#这个指令设置每个工作进程允许同时打开的最大连接数。在本例中,每个工作进程可以同
#时处理最多20000个客户端连接。需要与worker_rlimit_nofile搭配使用,总进程数量
#不能超过其数值,此项调优主要看硬件与软件的设置
use epoll
#epoll是Linux内核提供的一种高效I/O事件通知机制。当使用epoll时,Nginx能够更高
#效地管理大量的并发连接,尤其是在高负载的场景下。epoll对于Linux系统是一种理想
#的事件模型选择。此选项是开启epoll,Nginx支持众多的事件驱动,比如:select、poll
#、epoll,只能设置在events模块中设置。
accept_mutex on
#accept mutex(接受互斥锁)用于防止多个工作进程在同一时刻执行accept系统调用,
#从而避免“惊群”现象的发生。开启这个选项可以在多工作进程模式下更好地同步新连接
#的接收过程。
multi_accept on
#当multi_accept设置为on时,一个工作进程在接受到新的连接请求后,如果当前工作进
#程没有满载(即未达到worker_connections设定的上限),它会继续尝试接受更多的连
#接,而不是立即返回等待其他进程接受连接。这有助于提高服务器处理新连接的速度和效率。
四、http语句设置
http 是一个大的语句块,包含若干个小的语句块
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL { #指定URL的特性
...
if CONDITION {
...
}
}
}
}
在Nginx的配置文件中,http语句块是整个HTTP服务器配置的核心部分,它包含了处理所有HTTP请求相关的配置。http块通常位于全局配置文件(如nginx.conf)的顶部或中间部分,用于定义HTTP服务器的基本行为、模块设置、虚拟主机(server blocks)以及其他全局HTTP相关的参数
http {
include mime.types;
#这行指令包含了一个名为mime.types的文件,这个文件中定义了不同类型的文件与MIME类型之间
#的映射关系。例如,当用户请求一个.html文件时,Nginx会根据此文件将MIME类型设置为text/html。
default_type application/octet-stream;
#如果Nginx无法确定某个文件的具体MIME类型,它会默认使用application/octet-stream作为
#该文件的MIME类型。
include /apps/nginx/conf.d/﹡.conf; #此行需要手动添加
#此行表示Nginx会包含/apps/nginx/conf.d/目录下的所有以.conf结尾的配置文件。这使得你
#可以通过分散在多个文件中的配置来管理不同的虚拟主机或特定的配置选项。
sendfile on;
#开启零拷贝技术
keepalive_timeout 65;
#定义了HTTP连接保持激活(KeepAlive)的状态超时时间,单位是秒。此信息表示如果客户端在65
#秒内没有新的请求,Nginx将会关闭这个TCP连接。
server {
listen 80;
server_name localhost;
#定义了一个监听80端口的HTTP服务器实例(即默认的HTTP服务),其server_name设为localhost,
#这意味着该服务器将响应所有指向本地主机名的请求
location / {
#在server块内部定义了一个匹配根路径("/")主站点的location块,主站点为安装路径。也就是
#安装nginx时 --prefix="路径"
root html;
#指定了文档根目录为html。
index index.html index.htm;
}
#index index.html index.htm; 设置了默认索引文件,当访问目录而不是具体文件时,Nginx将
#尝试提供这些文件之一。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
#定义了错误页面处理规则,当出现HTTP状态码为500、502、503或504的错误时,Nginx将返回位
#于html目录下的50x.html文件作为错误页面。
}
}
}
(一)mime
此项为支持的 文件格式,如果不支持的格式 会自动帮你下载,如果支持 就会显示在网页上
(二)server语句
1.server下的 root
使用方法的官方文档
root指定了主页文件的位置
注意在编写配置文件时,每段的末尾需要以;结尾
使用客户端访问时,就会以自己设定的主站目录为根目录
2.server块构建虚拟主机
基于域名
在子配置目录中,分别建立两个不同的配置文件
分别建立number目录和name目录,并建立数据文件
建立完成后,检查配置文件,确认无误后重新加载配置文件
在客户端的/etc/hosts文件中添加服务器的域名,与服务器配置文件中的server_name名称相同,让客户端访问时能够正确解析IP地址
而后使用客户机访问不同的域名,就会得到不同的信息
基于端口
修改配置文件,使其监听不同的端口号
基于IP地址
首先添加一个IP地址,可以是临时的,实际环境中最好添加一块新的网卡,设置不同的IP地址
将配置文件中listen设置为不同的IP地址,表示监听指定地址的80端口
3.alias别名
在/data/html目录下建立word目录,并在word目录建立与访问目录同名的目录文件
而后在txt目录下建立数据文件
使用客户机测试一下
(三)localtion语句
location语句是server语句块中的组成部分
Module ngx_http_core_module :官方文档
location语句在Nginx配置文件中用于定义URL请求与服务器资源之间的映射关系,以及针对特定URL路径的处理规则。它是一个非常关键且灵活的指令,允许根据请求URI来控制Nginx如何处理客户端的HTTP请求。
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
= | 用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 |
^~ | 用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写 |
~ | 用于标准url前,表示包含正则表达式,并且区分大小写 |
~* | 用于标准url前,表示包含正则表达式,并且不区分大写 |
无任何符号 | 匹配起始于此uri的所有的uri |
1.=:精准匹配
使用客户机访问,有任何其它字符则会匹配失败
2.^~:符号用于实现前缀匹配
此配置会匹配/opt/目录name目录下的所有文件,而后
在/opt/name目录下建立两个数据文件
使用客户端验证
3.~/~*:用于匹配正则表达式
两个符号的区别是
~:区分大小写
~*:不区分大小写
此配置的意思时,在/opt/html目录下有一个a.txt文件,输入a.txt能直接访问到,输入A.txt也可以匹配到a.txt文件
在/opt/html目录下创建数据文件
在客户机使用curl访问时需要注意,nginx服务虽然不去分大小写,但是文件系统会区分大小写,所以访问大写字母时,无法匹配到小写字母的文件,如果说不区分大小写的话,访问A.txt文件时,会匹配到a.txt的文件,显示a.txt文件的内容
访问其它文件时,即使有该文件,但无法匹配,还是会报错
使用~区分大小写
只能匹配以A开头的文件,匹配小写a时会找不到匹配的文件
4.符号优先级
location优先级:(=) > ( ^~ ) > ( ~,~*优先级一样 ) > (/)
下面进行优先级测试
修改配置文件
添加数据文件
测试优先级
如果匹配到welcome to pla1,说明优先匹配到/data/html/pla1/a.txt,则=精准匹配的优先级最高
将精准匹配项注释或删除,重新加载文件。测试~*与/的优先级
证明,~*的优先级大于/
(四)access 模块
Nginx的access模块,通常指的是ngx_http_access_module模块。这个模块提供了基于客户端IP地址的简单访问控制功能,允许管理员通过配置文件定义哪些IP地址或地址范围可以或者不能访问服务器资源。
Module ngx_http_access_module :官方文档
使用grep过滤出access模块
1.设置访问权限
在Nginx配置中,access模块主要通过allow和deny指令来实现
allow表示允许;deny表示拒绝
建立好数据文件
使用不同IP的客户端进行测试
需要注意的时,匹配顺序由上往下时,匹配到符合要求的语句时会停止往下匹配,所以设置允许和拒绝时需要注意顺序
可以看到,匹配到allow允许时,就不会匹配下面的拒绝语句
如果要拒绝所有IP地址,可以输入deny all
deny all:拒绝所有未明确的IP地址,不在你允许列表里的所有IP地址
2.设置访问方式
如果想拒绝GET请求,可以使用limit_except指令:
默认是允许GET请求方式的
通过设置配置文件来拒绝
deny all;:拒绝指定之外的所有访问方式
(五)验证模块
在Nginx中,验证模块主要用于对客户端请求进行身份验证。虽然Nginx本身并未提供丰富的内置认证机制,但可以通过第三方模块或与外部程序(如HTTP基本认证、HTTP摘要认证)结合使用来实现
Module ngx_http_auth_basic_module:官方文档
这是Nginx的一个内置模块,用于实现HTTP基本认证
server {
listen 80;
server_name www.number.com;
root /data/html;
location /user {
#定义访问路径,如果没有。需要建立/data/html/user/目录
root /data/html/;
auth_basic "welcome to nignx";
#认证的提示信息,有的浏览器不会显示
auth_basic_user_file /apps/nginx/conf.d/.nginxuser;
#定了包含用户名和加密密码的文件位置,此处的文件名叫什么,使用htpasswd命令生成的文件名就叫什么
}
}
用户信息文件需要使用htpasswd命令生成,该命令来源于http-tools包,它是httpd服务的依赖包,编译安装的话是没有这个包的,需要手动下载
yum install httpd-tools -y。或者直接yum install httpd -y
而后使用htpasswd命令去生成文件及信息
准备好数据文件
所有文件准备完毕后重新加载配置文件:nginx -s reload
使用谷歌浏览器验证
使用火狐浏览器
(六)自定义错误界面
可以改变默认的错误页面,同时也可以用指定的响应状态码进行响应
使用error_page语句,它来自核心模块
自定义错误界面,官方使用文档链接为:Module ngx_http_core_module
1.自定义页面
建立自定义错误页面文件,文件名必须与配置文件跳转的名称相同
使用curl浏览器访问
也可以直接跳转到主页面
就好比你输入www.jd.com/xxxxxxx,访问一个JD不存在的文件,依然可以直接跳转到JD的主页面
可以自己手动设置
修改配置文件,让出现404报错时,跳转到主页面
2.指定状态码
正常情况下,找不到访问的文件,错误代码为404
我们可以将错误代码自定义成其它的值
这么做的目的是防止有的网站恶意截取404信息,将本网站的404报错信息,显示为其它网站的404,截取本网站的访问量
(七)验证文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
来自核心模块
自定义错误界面,官方使用文档链接为:
server {
listen 80;
server_name www.number.com;
root /data/html;
location / {
root /opt/;
try_files $uri $uri.html $uri/index.html /html/try.html;
#从左往右依次匹配,$uri=主站点后面的文件
#比如访问192.168.84.40/txt文件,首先匹配txt文件,如果没有,再匹配txt.html文件,如果也
#没有,再匹配txt/下的index.html文件,如果都没有,就去访问/html/try.html文件,这个文件
#必须存在,否则会出现报错。匹配所有信息,都是从设定的root目录开始,这是里/opt
#注意:每个参数之间只有一个空格
}
}
建立托底文件
使用客户端访问时,因为主站点目录下没有任何文件,所以只能访问最后的托底文件
再建立一个txt目录,而后建立一个index.html数据文件
在主站点目录下建立一个txt.html的文件,匹配到对应的文件后,就不会匹配后面的内容
在主站点目录下建立一个txt文件
(八)长连接
在HTTP协议中,长连接(Long-lived Connection)通常指的是持久连接(Persistent Connection),即TCP连接在完成一次请求/响应后并不立即关闭,而是保持一段时间的开放状态,以便后续请求可以复用该连接,从而减少建立和关闭连接的开销
可以使用telnet进行模拟演示,此命令需要手动下载
yum install telnet -y
当请求达到设定数量后就会断开
超时后也会自动断开连接
(九)作为下载服务器配置
作为下载服务器配置时,Nginx需要对静态文件提供服务,并且可能需要调整一些与下载相关的设置,例如大文件传输、断点续传等
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务,默认安装此模块
官方使用文档链接为:
Module 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提供
在配置文件中添加autoindex on开启文件索引
建立下载目录,并在目录下添加文件
而后使用浏览器访问测试
autoindex_exact_size off
计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
显示本机时间:autoindex_localtime on