一, nginx 配置文件架构
上一篇 已对 main 全局配置做了详细介绍 本章对剩下的配置文件部分做介绍
二,event 设置
(一)event 相关的配置文件为
配置工作模式以及连接数
(二)具体表现
1,单个worker最大并发连接数
worker_connections 65536; #设置单个工作进程的最大并发连接数
注意:要和配置文件中全局配置的 worker_rlimit_nofile 数量; (所有worker最大并发连接数) 配合
2, 使用epoll事件驱动
use epoll;
默认使用epoll事件驱动 Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置
3, 惊群
accept_mutex on;
#on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
4,一个worker 可以同时接待多个请求
multi_accept on;
#ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
三, http设置
(一)http
http 是一个大的语句块,包含若干个小的语句块(比如server语句块)
(二) http 协议配置说明
http {
include mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录
default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#自定义优化参数
sendfile on; 零拷贝技术
#tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端。
#tcp_nodelay off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。
#keepalive_timeout 0;
keepalive_timeout 65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同
#gzip on; #开启文件压缩
server {
listen 80; #设置监听地址和端口
server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,如:*.kgc.com www.kgc.* ~^www\d+\.kgc\.com$ default_server
#charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8
#access_log logs/host.access.log main;
location /fxj { www.ky31.com/fsj /apps/nginx/html
root /data;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #定义错误页面
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #以http的方式转发php请求到指定web服务器
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ { #以fastcgi的方式转发php请求到php处理
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件
来改变自己的重定向等功能。
# deny all;
#}
location ~ /passwd.html {
deny all;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server { #自定义虚拟server
3.3.1 MIME
范例: 识别php文件为text/html
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm; #指定默认网页文件,此指令由
ngx_http_index_module模块提供
# }
#}
# HTTPS server
#
#server { #https服务器配置
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
1, mime
此项为支持的 文件格式,如果不支持的格式 会自动帮你下载,如果支持 就会显示在网页上
2, server块构建虚拟主机
2.1 子配置文件规则
子配置文件委身在http 模块 写其他的模块内容是没用的
子配置文件里的内容 和http 模块下面的内容冲突时 以子配置文件为 读配置文件由上而下 所以建议子配置文件放这个模块的最后
2.2 如何写子配置文件
检查一下
2.3 做虚拟主机
两个容易犯错的地方!
注意 子配置文件的位置!在 /apps/nginx/conf.d/
注意关闭防火墙 否则报错 curl: (7) Failed connect to www.m.com:80; 没有到主机的路由
1,在/apps/nginx/conf.d/ 各自新建shouji.conf diannao.conf
2, 分别 给两个访问目录加内容
index.html 是站点文件 因为配置文件写了客户机访问时 默认去这里看
3, 服务机 检查
4, 客户机配置 域名 vim /etc/hosts
5, 客户机分别访问 看到不同的东西
3,root location
3.1 root location 意义
root 指明根目录的位置
location 追踪url 根据用户访问的地址不同,去往不同的页面
3.2 location 下面再写root
把 局部的根 站点文件写入 111
原理:
直接curl 访问原来的根 (没匹配到location 下面的根)
curl /shouji/ 匹配到location 取下面的根
curl ip 地址时 子配置文件有两个diannao.conf 和 shouji.conf 按字母排序 先匹配到diannao.conf 所以显示 diannao
4, alias 别名
server {
listen 80;
server_name www.kgc.com;
location /nwes {
root /data/nginx/html/pc/;
#相当于追加 将 文件夹news追加到/data/nginx/html/pc/news
}
location /study{
alias /mnt/nginx/sports/;
#相当于替换 你访问 study 就是访问/mnt/nginx/sports
}
}
(三) location 去匹配
1, 介绍
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
2,语法规则
location [ = | ~ | ~* | ^~ ] uri { ... }
= | #用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 |
^~ | #用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写 |
~ | #用于标准url前,表示包含正则表达式,并且区分大小写 |
~* | #用于标准url前,表示包含正则表达式,并且不区分大写 |
不带符号 | #匹配起始于此uri的所有的uri |
匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
3, 例题
4 ,location 一个bug
4.1 区分大小写问题
~* 是不区分大小写的
#匹配 已A后面一个或没有字符,已.jpg结尾的图片 ?表示1个或0个
然后在 新根 下面放一张图片 改名 a.jpg
重新加载配置文件
浏览器输入 192.168.217.66/a.jpg 看不到
因为 软件不区分大小写 但是linux的文件系统xfs还是会区分大小写
输入 A.jpg 才能看到图片
5, location 匹配顺序
5.1 实验1
location 不是由上而下的 是看优先级读
根据 location 匹配规则 应该按照优先级 匹配/data/index.html 的内容
5.2 实验2
根据优先级 先看到static1 再看到3 再看到2
6,location 作用
因为nginx 不擅长处理动态资源
需要动静分离
静态资源去找nginx
动态资源 去另外一个服务器
四 , access 模块 四层控制
access 模块 控制ip
(一)如何查看模块是否默认安装
去到源码包
安装nginx时 有些模块默认安装 有些模块是手动安装
without 是默认安装 with 是手动安装
(二) 控制ip
配置文件修改
server {
listen 80;
server_name www.kgc.com;
allow 192.168.91.0/24;
deny 192.168.91.101;
location / {
root /data/nginx/html/pc;
}
}匹配了之后就不往下匹配了
所以范围小的往上
写一个子配置文件
可以发现 黑名单客户机访问不了
其他 客户机正常匹配到 opt
五, 验证模块 需要输入用户名和密码
(一)语法
在配置文件加
auth_basic "admin site";
#提示信息,不是所有浏览器都有用
注意这一行一定要有 开启这个模块 并显示提示信息
auth_basic_user_file/apps/nginx/conf.d/.httpuser;
#密码文件存放位置 且这个文件 需要用特定的命令生成(htpasswd )
(二)htpasswd
此命令来自于 httpd-tools 包,如果没有安装 一下即可
1, htpasswd 选项
-c 代表新建用户名和密码对应的文件
htpasswd -c 文件路径 姓名 交互式生成密码
-b 将密码跟在用户名后
htpasswd -c 文件路径 姓名 密码 直接将密码跟在后面
2, htpasswd 示例
再新增一个 小红用户 直接跟密码
注意: 这两个账户是nginx的虚拟账号
(三)验证模块 示例
注意! 提示信息不是所有浏览器都能看到
且 此处匹配的是 /mnt/html/admin
六 ,网页的状态页
(一)语法
(二)stub_status 示例
用客户端访问 可以看到网页的状态
(三) 网页状态页具体解释
Active connections | #当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting |
accepts | #统计总值,Nginx自启动后已经接受的客户端请求的总数 |
handled | #统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接 |
requests | #统计总值,Nginx自启动后客户端发来的总的请求数。 |
Reading | #当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足 |
Writing | #当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大 |
Waiting | #当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing) |
(四)提取网页状态页的 Reading Writing Waiting
目的:提取这三个数字
当直接提取 会有很多垃圾信息
把多余的信息 导给垃圾箱
(五) 加密 网页状态页
1,为什么要加密 网页状态页
网页状态页比较机密 所以需要加密。
两个方法可以配合使用
1,用验证模块 要求输入账号密码才能访问 这个网页
2,设置白名单 默认都不能进 只允许自己进
2,加密 网页状态页 并提取Reading Writing Waiting
此时直接用 curl 文字版浏览器会出现401 报错
401报错; 请求 要求用户的身份验证
需要按照url 格式补完用户和密码 再去提取
七,自定义错误页面
我们 可以改变 默认的错误页面,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location
(一)格式
(二)示例
#当出现404 错误 就去 /data/error/ 这个文件夹找40x.html 这个文件
给这个 40.xhtml 加内容(你可以把html 理解为一种文件格式 类似txt index只是名字)
客户机 输入没有的地址 不会出现404
八 , 自定义状态码
(一)改404 的意义
但是有些流氓浏览器 会劫持你的网站,当出现404时,没等到你把客户机引导到 自定义的页面,就被劫持了。
所以需要改状态码
(二)步骤
很简单 加上404=302 即可
客户机: 状态码变为302 这样不用担心被劫持了
九, 检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
(一)语法
注意 :比如客户机访问/abc 依次去试
主页面的abc文件夹 主页面的 abc.html 文件 主页面下 abc/index.html 文件
最后有个 主页面下 about/default.html 拖底
(二) 示例
注意!!! 不要手贱!
try_files $uri $uri.html $uri/index.html /about/default.html 中间不要多打空格!
在拖底文件夹 里写入tuodi
客户机验证:
我们再来检验 try_files会按顺序检查
在 /data 下建abc.html
客户机再次验证: 匹配的是这里的内容
十 , 长连接
http 基于 tcp 协议 先要 三次握手然后 再传输数据
一次三次握手 下载多个资源
一次三次握手下载一个资源
(一)语法
默认开启 在主配置文件
(二)示例
keepalive_requests 3; | #最大下载三个资源就会断开 |
keepalive_timeout 60 65; (只能有一个空格 ) | #开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。 |
Keep-Alive:timeout=60 | #浏览器收到的服务器返回的报文 #如果设置为0表示关闭会话保持功能 |
keepalive_disable none | browser ...; | 对哪种浏览器禁用长连接 |
十一 , 作为下载服务器配置
(一)介绍
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务
(二)语法
(三) 示例
配置文件添加 locatoin /download
往 /download/ 文件夹加入内容
客户机访问
(四)用户上传资料
上传需要借助开发小的程序, 并且程序 5M 和 nginx 10M 都会限制。 两者取最小
十二 , 其他设置
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.91.101;
deny all;
}
#除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用
十三,写配置文件时一直有交换提示
有交换提示 把隐藏文件删了