基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module实现。
1、新建一个 PC web 站点
# 定义子配置文件路径
[root@nginx01 ~]# mkdir /apps/nginx/conf/conf.d
[root@nginx01 ~]# vim /apps/nginx/conf/nginx.conf
http {
......
include /apps/nginx/conf/conf.d/*.conf;
# 在配置文件的最后面添加此行,注意不要放在最前面,会导致前面的命令无法生效
}
# 创建PC网站配置
[root@nginx01 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name 192.168.1.51;
location / {
root /data/nginx/html/pc;
}
}
[root@nginx01 ~]# mkdir -p /data/nginx/html/pc
[root@nginx01 ~]# echo "pc web" > /data/nginx/html/pc/index.html
[root@nginx01 ~]# systemctl reload nginx
# 访问测试
![图片[1]-Nginx 核心配置示例-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/11/image-239.png)
2、root 与 alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
# 范例
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location /about {
root /opt/html;
# 必须要在html目录中创建一个名为about的目录才可以访问,否则报错。
}
}
[root@nginx01 ~]# mkdir -p /opt/html/about
[root@nginx01 ~]# echo about > /opt/html/about/index.html
#重启Nginx并访问测试
![图片[2]-Nginx 核心配置示例-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/11/image-240.png)
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location /about {
#注意about后不要加/ , 使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,
否则403
alias /opt/html/about;
# 当访问about的时候,会显示alias定义的/opt/html/about里面的内容。
}
}
# 重启Nginx并访问测试
![图片[3]-Nginx 核心配置示例-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/11/image-241.png)
location中使用root指令和alias指令的意义不同
root 给定的路径对应于location中的/uri 左侧的/
alias 给定的路径对应于location中的/uri 的完整路径
3、location 的详细使用
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置
在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
# 语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= # 用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹
配并立即处理请求
^~ # 用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对uri的最左
边部分做匹配检查,不区分字符大小写
~ # 用于标准uri前,表示包含正则表达式,并且区分大小写
~* # 用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 # 匹配起始于此uri的所有的uri
\ # 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
# 匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
3.1、匹配案例-精确匹配
在server部分使用location配置一个web界面,例如:当访问nginx 服务器的/logo.jpg的时候要显示指定html文件的内容
精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高
cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name 192.168.1.51;
location / {
root /data/nginx/html/pc;
}
location = /logo.jpg {
root /data/nginx/images;
index index.html;
}
}
# 上传logo.jpg图片到/data/nginx/images,重启Nginx并访问测试
# 访问测试:http://192.168.1.51/logo.jpg
3.2、匹配案例-区分大小写
~ 实现区分大小写的模糊匹配. 以下范例中, 如果访问uri中包含大写字母的JPG,则以下location匹配Ax.jpg条件不成功,因为 ~ 区分大小写,当用户的请求被执行匹配时发现location中定义的是小写的jpg,本次访问的uri匹配失败,后续要么继续往下匹配其他的location(如果有),要么报错给客户端
location ~ /A.?\.jpg { # 匹配字母A开头的jpg图片,后面?表示A后面零次或一个字符
index index.html;
root /data/nginx/html/image;
}
# 重启Nginx并访问测试
# 将只能访问以小写字符的jpg图片,不能识别大写的JPG结尾的图片
3.3、匹配案例-不区分大小写
~* 用来对用户请求的uri做模糊匹配,uri中无论都是大写、都是小写或者大小写混合,此模式也都会匹配,通常使用此模式匹配用户request中的静态资源并继续做下一步操作,此方式使用较多
此方式中,对于Linux文件系统上的文件仍然是区分大小写的,如果磁盘文件不存在,仍会提示404
location ~* /A.?\.jpg {
index index.html;
root /opt/nginx/html/image;
}
# 重启Nginx并访问测试
对于不区分大小写的location,则可以访问任意大小写结尾的图片文件,如区分大小写则只能访问Aa.jpg此类文件,不区分大小写则可以访问除了aa.jpg以外,还有其它的资源比如Aa.JPG、aA.jPG这样的混合名称文件,但是还同时也要求nginx服务器的资源目录有相应的文件,比如:必须有Aa.JPG,aA.jPG这样文件存在。
3.4、匹配案例-URI开始
location ^~ /images {
root /data/nginx/;
index index.html;
}
location /api {
alias /data/nginx/api;
index index.html;
}
#重启Nginx并访问测试,实现效果是访问/images和/app返回不同的结果
[root@nginx01 ~]# curl http://192.168.1.51/images/
images
[root@nginx01 ~]# curl http://192.168.1.51/api/
api web
3.5、匹配案例-文件名后缀
mkdir /data/nginx/static
# 上传一个图片到/data/nginx/static
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
root /data/nginx/static;
index index.html;
}
# 重启Nginx并访问测试
3.6、匹配案例-优先级
location = /1.jpg {
root /data/nginx/static1;
index index.html;
}
location /1.jpg {
root /data/nginx/static2;
index index.html;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
mkdir -p /data/nginx/static{1,2,3}
# 上传图片到 /data/nginx/static{1,2,3} 并重启nginx访问测试
# 匹配优先级:=, ^~, ~/~*,/
location优先级:(location =) > (location ^~ 路径) > (location ~,~* 正则顺序) >
(location 完整路径) > (location 部分起始路径) > (/)
3.7、生产使用案例
# 直接匹配网站根会加速Nginx访问处理
location = /index.html {
......;
}
location / {
......;
}
# 静态资源配置方法1
location ^~ /static/ {
......;
}
# 静态资源配置方法2,应用较多
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
# 多应用配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}
4、Nginx 四层访问控制
访问控制基于模块ngx_http_access_module实现,可以通过匹配客户端源IP地址进行限制
如果能在防火墙设备控制,最好就不要在nginx上配置,可以更好的节约资源
location = /login/ {
root /data/nginx/html/pc;
allow 192.168.1.0/24;
deny all;
}
location /about {
alias /data/nginx/html/pc;
index index.html;
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all; #按先小范围到大范围排序
}
5、Nginx 账户认证功能
由 ngx_http_auth_basic_module 模块提供此功能
# CentOS安装包
[root@nginx01 ~]# yum -y install httpd-tools
# Ubuntu安装包
[root@Ubuntu ~]# apt -y install apache2-utils
# 创建用户
# -b 非交互式方式提交密码
[root@centos8 ~]# htpasswd -cb /apps/nginx/conf/.htpasswd user1 123456
Adding password for user user1
[root@centos8 ~]# htpasswd -b /apps/nginx/conf/.htpasswd user2 123456
Adding password for user user2
[root@centos8 ~]# tail /apps/nginx/conf/.htpasswd
user1:$apr1$Rjm0u2Kr$VHvkAIc5OYg.3ZoaGwaGq/
user2:$apr1$nIqnxoJB$LR9W1DTJT.viDJhXa6wHv.
# 安全加固
[root@nginx01 ~]# chown nginx.nginx /apps/nginx/conf/.htpasswd
[root@nginx01 ~]# chmod 600 /apps/nginx/conf/.htpasswd
[root@nginx01 ~]# vim /apps/nginx/conf/conf.d/pc.conf
location = /login/ {
root /data/nginx/html/pc;
index index.html;
auth_basic "login password";
auth_basic_user_file /apps/nginx/conf/.htpasswd;
}
# 重启Nginx并访问测试
[root@nginx01 ~]# curl http://user1:123456@192.168.1.51/login/
login page
[root@nginx01 ~]# curl -u user2:123456 192.168.1.51/login/
login page
6、自定义错误页面
自定义错误页,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location
error_page code ... [=[response]] uri;
# 范例
listen 80;
server_name 192.168.1.51;
error_page 500 502 503 504 /error.html;
location = /error.html {
root /data/nginx/html;
}
# 重启nginx并访问不存在的页面进行测试
# 自定义错误页面
error_page 404 /40x.html;
location = /40x.html {
root /data/html/ ;
}
# 如果404,就转到主页
# 404转为302
# error_page 404 /index.html;
error_page 404 =302 /index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
7、自定义错误日志
可以自定义错误日志
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
[root@nginx01 ~]# mkdir /data/nginx/logs
listen 80;
server_name 192.168.1.51;
error_page 500 502 503 504 404 /error.html;
access_log /apps/nginx/logs/magedu-org_access.log;
error_log /apps/nginx/logs/magedu-org_error.log; #定义错误日志
location = /error.html {
root html;
}
# 重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件
8、检测文件是否存在
try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
# 如果不存在页面, 就转到default.html页面
location / {
root /data/nginx/html/pc;
index index.html;
try_files $uri $uri.html $uri/index.html /about/default.html;
#try_files $uri $uri/index.html $uri.html =489;
}
echo "default page" >> /data/nginx/html/pc/about/default.html
# 重启nginx并测试,当访问到http://192.168.1.51/about/xx.html等不存在的uri会显示
default.html,如果是自定义的状态码则会显示在返回数据的状态码中
# 注释default.html行,启用上面489响应码的那一行,在其生效后再观察结果
location / {
root /data/nginx/html/pc;
index index.html;
# try_files $uri $uri.html $uri/index.html /about/default.html;
try_files $uri $uri/index.html $uri.html =489;
}
curl -I http://192.168.1.51/about/xx.html
HTTP/1.1 489 # 489就是自定义的状态返回码
Server: nginx
Date: Thu, 21 Feb 2019 00:11:40 GMT
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=65
9、长连接配置
keepalive_timeout timeout [header_timeout];
# 设定保持连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number;
# 在一次长连接上所允许请求的资源的最大数量,默认为1000次,建议适当调大,比如:500
keepalive_requests 3;
keepalive_timeout 65 60;
# 开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60
# 浏览器收到的服务器返回的报文
# 如果设置为0表示关闭会话保持功能,将如下显示:
Connection:close
# 浏览器收到的服务器返回的报文
# 使用命令测试:
[root@nginx01 ~]# telnet www.magedu.org 80
Trying 192.168.1.51...
Connected to 192.168.1.51.
Escape character is '^]'.
GET / HTTP/1.1
HOST: 192.168.1.51
# Response Headers(响应头信息):
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 24 Sep 2020 04:35:35 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Wed, 23 Sep 2020 14:39:21 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "5c8a6b3a-7"
Accept-Ranges: bytes
# 页面内容
pc web
10、作为下载服务器配置
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 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.Rate limit can also be set in the $limit_rate variable, however, since version 1.17.0, this method is not recommended:
#注意:download不需要index.html文件
[root@nginx01 ~]# mkdir -p /data/nginx/html/pc/download
[root@nginx01 ~]# vim /apps/nginx/conf/conf.d/pc.conf
location /download {
autoindex on; # 自动索引功能
autoindex_exact_size on; # 计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
autoindex_localtime on; # on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT时间
limit_rate 1024k; # 限速,默认不限速
root /data/nginx/html/pc;
}
[root@nginx01 ~]# cp /root/anaconda-ks.cfg /data/nginx/html/pc/download/
# 重启Nginx并访问测试下载页面
11、作为上传服务器
以下指令控制上传数据
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位作为目录名
[root@centos8 ~]# md5sum /data/nginx/html/pc/index.html
95f6f65f498c74938064851b1bb 96 3d 4 /data/nginx/html/pc/index.html
1级目录占1位16进制,即2^4=16个目录 0-f
2级目录占2位16进制,即2^8=256个目录 00-ff
3级目录占2位16进制,即2^8=256个目录 00-ff
#配置示例:
client_max_body_size 100m; #如果太大,上传时会出现下图的413错误,注意:如果php上传,还需要修改php.ini的相关配置
client_body_buffer_size 1024k;
client_body_temp_path /apps/nginx/client_body_temp/ 1 2 2; #上传时,Nginx会自动创
建相关目录
12、其他配置
keepalive_disable none | browser ...;
# 对哪种浏览器禁用长连接
limit_except method ... { ... },仅用于location
# 禁止客户端使用除了指定的请求方法之外的其它方法,如果使用会出现403错误
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
aio on | off # 是否启用asynchronous file I/O(AIO)功能,需要编译开启 --with-file-aio
# linux 2.6以上内核提供以下几个系统调用来支持aio:
1、SYS_io_setup:建立aio 的context
2、SYS_io_submit: 提交I/O操作请求
3、SYS_io_getevents:获取已完成的I/O事件
4、SYS_io_cancel:取消I/O操作请求
5、SYS_io_destroy:毁销aio的context
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; #缓存错误信息