一, 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 协议配置说明
1. http { 2. include mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录 3. default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件 4. #日志配置部分 5. #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 6. # '$status $body_bytes_sent "$http_referer" ' 7. # '"$http_user_agent" "$http_x_forwarded_for"'; 8. #access_log logs/access.log main; 9. #自定义优化参数 10. sendfile on; 零拷贝技术 11. #tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端。 12. #tcp_nodelay off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。 13. #keepalive_timeout 0; 14. keepalive_timeout 65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同 15. #gzip on; #开启文件压缩 16. 17. server { 18. listen 80; #设置监听地址和端口 19. server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,如:*.kgc.com www.kgc.* ~^www\d+\.kgc\.com$ default_server 20. #charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8 21. #access_log logs/host.access.log main; 22. location /fxj { www.ky31.com/fsj /apps/nginx/html 23. root /data; 24. index index.html index.htm; 25. } 26. #error_page 404 /404.html; 27. # redirect server error pages to the static page /50x.html 28. # 29. error_page 500 502 503 504 /50x.html; #定义错误页面 30. location = /50x.html { 31. root html; 32. } 33. # proxy the PHP scripts to Apache listening on 127.0.0.1:80 34. # 35. #location ~ \.php$ { #以http的方式转发php请求到指定web服务器 36. # proxy_pass http://127.0.0.1; 37. #} 38. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 39. # 40. #location ~ \.php$ { #以fastcgi的方式转发php请求到php处理 41. # root html; 42. # fastcgi_pass 127.0.0.1:9000; 43. # fastcgi_index index.php; 44. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 45. # include fastcgi_params; 46. #} 47. # deny access to .htaccess files, if Apache's document root 48. # concurs with nginx's one 49. # 50. #location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件 51. 来改变自己的重定向等功能。 52. # deny all; 53. #} 54. location ~ /passwd.html { 55. deny all; 56. } 57. } 58. # another virtual host using mix of IP-, name-, and port-based configuration 59. # 60. #server { #自定义虚拟server 61. 3.3.1 MIME 62. 范例: 识别php文件为text/html 63. # listen 8000; 64. # listen somename:8080; 65. # server_name somename alias another.alias; 66. # location / { 67. # root html; 68. # index index.html index.htm; #指定默认网页文件,此指令由 69. ngx_http_index_module模块提供 70. # } 71. #} 72. # HTTPS server 73. # 74. #server { #https服务器配置 75. # listen 443 ssl; 76. # server_name localhost; 77. # ssl_certificate cert.pem; 78. # ssl_certificate_key cert.key; 79. # ssl_session_cache shared:SSL:1m; 80. # ssl_session_timeout 5m; 81. # ssl_ciphers HIGH:!aNULL:!MD5; 82. # ssl_prefer_server_ciphers on; 83. # location / { 84. # root html; 85. # index index.html index.htm; 86. # } 87. #}
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网段主机使用
十三,写配置文件时一直有交换提示
有交换提示 把隐藏文件删了