Nginx最常用的七种模块配置 | 您所在的位置:网站首页 › nginx模块开发中文字符比较 › Nginx最常用的七种模块配置 |
Nginx基础模块 官方帮助文档 Nginx默认是不允许列出整个目录浏览下载 配置目录索引的命令 语法格式:autoindex on | off ; on开启 off关闭 默认配置:autoindex off; 如果默认开启的话所有的文件都会以列表形式累出来,这些文件是不能给用户看到的 配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用) autoindex常用参数 autoindex_exact_size off; 修改为on表示显示出文件的确切大小,单位是bytes,修改为off表示显示出文件的大概大小,单位是kb或者mb或者gb autoindex_localtime on; 修改为on表示显示的时间为服务器中文件的时间,修改为off表示显示文件时间为GMT时间 charset utf-8,gbk; 默认中文目录乱码,添加上解决乱码,一般只配置一个utf-8即可,如果配置了utf8不行,那么久加上gbk 案例:实现目录索引 需求:1.当访问know.com时打开首页,2.访问know.com/download则打开目录索引列表 注意:对单个页面实现目录索引,则在location /xxx{}中进行配置,想要实现首页目录索引,则在location /中配置 [root@localhost conf.d]# vim know.conf server { listen 80; server_name know.com; location / { root /web/know; index index.html; } location /download { root /web/know; autoindex on; autoindex_exact_size on; autoindex_localtime on; charset utf-8,gbk; } } [root@localhost know]# mkdir download [root@localhost know]# cd download/ 上传文件 [root@localhost download]# rz -E [root@localhost download]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost download]# systemctl reload nginx配置文件解读 ngx_http_stub_status_module用于展示nginx连接状态信息,需要–with-http_stub_module模块支持 配置状态监控命令 语法格式:stub_status; 老版本的nginx需要在后面加个on 默认配置:- 配置文件:server(对单个站点生效)、location(对单个页面生效,最常用) 配置nginx status [root@localhost conf.d]# vim know.conf server { listen 80; server_name know.com; location / { root /web/know; index index.html; } location /nginx_status { //这里必须是nginx_status stub_status; access_log off; //这一项必须加上,表示不把此页面的访问写入到日志中 } } 网站访问输出信息 http://know.com/nginx_status Active connections: 2 server accepts handled requests 338 338 395 Reading: 0 Writing: 1 Waiting: 1 Active connections //当前活动的连接数 accepts //当前的总连接数TCP handled //成功的连接数TCP requests //总的http请求数注意: 如果使用restart重置服务,会清空所有的连接数 reload重载不会清空之前的连接数 通过状态监控,可以验证长连接和短连接的区别 设置短连接只需要修改/etc/nginx/nginx.conf文件中keepalive_timeout 0;即可 3.Nginx访问控制3.1.Nginx基于ip的访问控制基于ip的访问控制 http_access_module 配置命令 允许配置语法 语法格式:allow address|CIDR|unix:|all; 默认配置:- 配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用)、limit_except(特殊位置) 拒绝配置语法 语法格式:deny address|CIDR|unix:|all; 默认配置:- 配置区域:http、server、location、limit_except 访问控制规则查看流程:从上往下、依次匹配,满足就不再继续,和网络中的acl规则一致 企业中访问控制思路 先写允许的就默认拒绝所有 先写拒绝的就默认允许所有 常见配置 允许一个:allow 192.168.81.210 允许一个网段:allow 192.168.81.0/24 允许多个网段就多写几个allow 允许所有deny all 拒绝一个:deny 192.168.81.210 拒绝一个网段:deny 192.168.81.0/24 拒绝多个网段就多写几个deny 拒绝所有deny all 案例1:只允许192.168.81.1访问nginx_status,其他都拒绝 [root@localhost conf.d]# vim know.conf location /nginx_status { stub_status; access_log off; allow 192.168.81.1; deny all; } nginx -t systemctl reload nginx案例2,拒绝192.168.81.1访问nginx_status,其他都允许 [root@localhost conf.d]# vim know.conf location /nginx_status { stub_status; access_log off; deny 192.168.81.1; allow all; } [root@localhost ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]# systemctl reload nginx3.2.Nginx基于用户认证访问控制基于用户登录认证:http_auth_basic_module 认证配置命令 语法格式:auth_basic string |off; string表示描述信息,off表示关闭 默认配置:auth_basic off; 配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用)、limit_except(特殊位置) 用户密码配置文件 语法格式:auth_basic_user_file filepath; 默认配置:- 配置区域:配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用)、limit_except(特殊位置) 实例 生成用户密码文件 [root@localhost ~]# htpasswd -b -c /etc/nginx/.auth_passwd.conf admin 123456 Adding password for user admin //首次创建使用-c创建出文件,第二次添加用户时不能使用-c,会把原来内容覆盖,-b表示命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互,-D 删除指定的用户,建议多创建一些账号密码给不同人使用,某人离职后使用-D给他删掉 [root@localhost ~]# htpasswd -b /etc/nginx/.auth_passwd.conf jiangxl 123456 Adding password for user jiangxl 删除用户 [root@localhost ~]# htpasswd -D /etc/nginx/.auth_passwd.conf wuzh Deleting password for user wuzh [root@localhost ~]# cat /etc/nginx/.auth_passwd.conf admin:$apr1$ZanWwGuM$HSZAnt6DfJ0QQ3QK8xFp3. jiangxl:$apr1$57gO0dsC$oNVF71wAfQN2qgTck8iI// [root@localhost conf.d]# vim know.conf server { listen 80; server_name know.com; location / { root /web/know; index index.html; } location /download { root /web/know; autoindex on; charset utf-8,gbk; autoindex_exact_size on; autoindex_localtime on; auth_basic "Please enter the user name password!!!"; auth_basic_user_file /etc/nginx/.auth_passwd.conf; } } [root@localhost ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]# systemctl reload nginx 谷歌看不到我么配置的提示内容,可以使用火狐经常会遇到这种情况,服务器流量异常,负载过大等等,对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往开考虑对同一个IP的连接数,并发数进行限制 ngx_http_limit_conn_module模块可以根据定义key来限制每个键值的连接数,如同一个IP来源的连接数 4.1.连接数限制HTTP请求建立在一次TCP连接基础上,一次TCP连接至少产生一次HTTP请求 用到的变量 $binary_remote_addr 变量的长度是固定的4字节,表示客户端的地址存储字节,一个IP就是4字节,完全没有必要用7-15字节的,除非IPv6 $remote_addr 变量的长度是7-15字节 一个IP地址=32bit=4字节,假如我们配置的策略大小是10M那么可以容纳的IP数为10M=10X024X024 limit_conn_module连接频率限制 NGINX连接限制预语法 定义连接数限制zone 语法格式:limit_conn_zone key zone=name:size; 默认配置:- 配置区域:http(对所有站点生效) 调用连接数限制zone 语法格式:limit_conn name number; 默认配置:- 配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用) 实例 首先定义一个zone限制,可以定义多个,对不同站点做不同的限制,配置在http模块中,按着正规配置就配置在nginx.conf中的http中,也可以配置到单个server配置中的最上方 [root@localhost conf.d]# vim /etc/nginx/nginx.conf http { ..... ..... limit_conn_zone $binary_remote_addr zone=know_conn:10m; include /etc/nginx/conf.d/*.conf; } 限制同一个IP来源的数量 [root@localhost conf.d]# vim know.conf limit_conn_zone $binary_remote_addr zone=know_conn:10m; server { listen 80; server_name know.com; location / { root /web/know; index index.html; limit_conn know_conn 1; } } [root@localhost ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]# systemctl reload nginx 解释: limit_conn_zone $binary_remote_addr zone=know_conn:10m; //定义一个限制,将用户的IP保存到变量$binary_remote_addr中,定义限制的名称是know_conn大小为10m limit_conn know_conn 1; //调用刚刚定义的限制zone,1表示同一时刻只允许一个客户端ip连接压力测试 [root@localhost ~]# ab -n 30000 -c 200 http://know.com/index.html博客详细介绍https://www.cnblogs.com/jingmin/p/9100747.html重要参数解释limit_req_module请求频率限制 请求数限制语法 定义请求数限制语法 语法格式:limit_req_zone key zone=name:size rate=rate; 默认配置:- 配置区域:http(对所有站点生效) 调用请求数限制语法 语法格式:limit_req zone number [burst=number] [nodelay]; 默认配置:- 配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用) 请求数配置实例 [root@localhost conf.d]# vim know.conf limit_req_zone $binary_remote_addr zone=know_req:10m rate=1r/s; server { listen 80; server_name know.com; location / { root /web/know; index index.html; limit_req zone=know_req burst=3 nodelay; } } 解释: limit_req_zone $binary_remote_addr zone=know_req:10m rate=1r/s; //定义一个req请求限制,把ip保存在变量中,zone名称是know_req大小10m,频率为1r/s表示1秒只能请求1个,多了就会报错,实际工作中肯定不会是1,可以根据自身应用的情况来进行调优,800-900适中 limit_req zone=know_req burst=3 nodelay; //调用know_req,设置最大吞吐量为3,也就是最小是1,最多请求在给3个,当超过了3个就会报错 [root@localhost ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]# systemctl reload nginx 使用压力测试来验证即可 [root@localhost ~]# ab -n 20 -c 10 http://know.com/index.htmlNginx有非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志,也就是说每个站点都可以有自己独立的访问日志,日志格式可以通过log_format命令定义格式 5.1.log_format配置log_format指令 配置语法对error.log、access.log都生效 语法格式:log_format name [escape=default|json string…; 默认配置:log_format combined “…”; 配置区域:http(对所有站点生效) 默认的Nginx定义日志语法 默认配置 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 192.168.81.1 - - [07/Apr/2020:18:26:12 +0800] "GET /linux-data/linux-txt.html HTTP/1.1" 200 2875 "http://know.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "-" 如果做了代理或者负载可以用如下配置 log_format main '$remote_addr $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status'; log_format用来定义,main是定义的日志名称 可以定义多个log_format,用不同的名字区分最后调用即可Nginx日志格式允许保安的变量 注意:如果nginx位于负载均衡器,nginx反向代理后,web服务器无法直接获取客户端的真实ip地址 $remote_addr获取的是反向代理的ip地址,反向代理服务器在转发请求的http头信息中 增加x-forwarded-for信息,用来记录客户端ip地址和客户端请求的服务器地址,即使客户端设置了代理服务器,同样能看到客户端的源地址,代理服务器和web服务器都需要配置for_forwarded_for access_log指令 语法格式:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition] ]; access_log off; 默认配置:access_log logs/access.log combined; 配置区域:配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用)、limit_except(特殊位置) 5.3.日志配置实例需求:对所有站点设置单独的访问日志和错误日志,并定义不同的日志格式 5.3.1.定义不同的日志格式环境:在一台服务器上实现多个站点 实现虚拟主机的方式 基于ip 不同IP实现 基于端口 相同IP不同端口 基于域名 相同ip相同端口不同域名 需求:公司有三个站点需要发布分别采用是那种不同虚拟主机来实现,并且每个站点使用不同的日志存放,know.com、shangmei.com用各自定义的log_format,lrx.com用默认的main。 6.1.基于IP配置基于IP的基本不会用 首先增加新的ip地址 [root@localhost conf.d]# ifconfig ens33:1 192.168.81.100 [root@localhost conf.d]# ifconfig ens33:2 192.168.81.100 上传网页文件 [root@localhost ~]# mkdir /web && cd /web [root@localhost web]# rz -E [root@localhost web]# ls know liurenxing shangmei 编辑know.com的配置文件,增加如下配置 [root@localhost conf.d]# vim know.conf server { listen 192.168.81.210:80; //设置不同IP server_name know.com; access_log /nginx_log/know_access.log know_log; //设置不同的日志存放路径 error_log /nginx_log/know_error.log warn; location / { root /web/know; index index.html; } 编辑shangmei.com的配置文件,增加如下配置 [root@localhost conf.d]# vim shangmei.conf server { listen 192.168.81.100:80; //设置不同IP server_name shangmei.com; access_log /nginx_log/shangmei_access.log shangmei_log; //设置不同的日志存放路径 error_log /nginx_log/shangmei_error.log warn; location / { root /web/shangmei; index index.html; } 编辑lrx.com的配置文件,增加如下配置 [root@localhost conf.d]# vim liurenxing.conf server { listen 192.168.81.110:80; //设置不同IP server_name lrx.com; location / { root /web/liurenxing; index index.htm; access_log /nginx_log/lrx_access.log main; //设置不同的日志存放路径 error_log /nginx_log/lrx_error.log warn; } } 重载nginx [root@localhost conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost conf.d]# systemctl reload nginx 第一次访问可能会有缓存,多刷新几次就会出来,如果reload没有生效那么就是用restat重启一下![]() ![]() ![]() |
CopyRight 2018-2019 实验室设备网 版权所有 |