40.Nginx应用------多个虚拟主机的实现方式 | autoindex模块 | 访问限制模块 | stub_stauts状态模块 | Location模块 | 日志

1. 多个虚拟主机的实现方式

1.1 基于多个IP实现方式

(很少,就是在server里面配置listen IP地址)

主机返回结果
10.0.0.7返回 hello 10.7
172.16.1.7返回 hello 172.7

[root@web01 ~]# cat /etc/nginx/conf.d/ip.conf

server {
  listen 10.0.0.7:80;
  location / {
   root /ip1;
   index index.html;
        }
}

server {
   listen 172.16.1.7:80;
   location / {
    root /ip2;
    index index.html;
        }
}
[root@web01 ~]# mkdir /ip1
[root@web01 ~]# mkdir /ip2
[root@web01 ~]# echo "hello,10.7" > /ip1/index.html
[root@web01 ~]# echo "hello,172.7" > /ip2/index.html
[root@web01 ~]# systemctl restart nginx

新增配置文件用restart
修改配置文件用reload (平滑启动)

测试

[root@web01 ~]# curl 10.0.0.7:80
hello,10.7
[root@web01 ~]# curl 172.16.1.7:80
hello,172.7

1.2 基于不同的端口方式

(测试listen里配置监听端口)

主机返回结果
10.0.0.78080
10.0.0.78081

[root@web01 ~]# cat /etc/nginx/conf.d/port.conf

server {
  listen 8081;
	location / {
		root /port1;
		index index.html;
	}
}

server {
	listen 8082;
	location / {
		root /port2;
		index index.html;
	}
}
[root@web01 ~]# mkdir /port1
[root@web01 ~]# mkdir /port2
[root@web01 ~]# echo "8081" > /port1/index.html
[root@web01 ~]# echo "8082" > /port2/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx 

1.3 基于不同的域名方式

(生产) 记得配置域名解析
(我们由于是假的域名,所以配置DNS劫持即可)

域名返回结果
docs.oldux.comdocs
test.oldxu.comtest

[root@web01 ~]# cat /etc/nginx/conf.d/all.oldxu.com.conf

server {
	listen 80;
	server_name docs.oldxu.com;
	location / {
		root /docs;
		index index.html;
	}
}

server {
	listen 80;
	server_name test.oldxu.com;
	location / {
		root /test;
		index index.html;
	}
}
[root@web01 ~]# mkdir /docs
[root@web01 ~]# mkdir /test
[root@web01 ~]# echo "docs" > /docs/index.html
[root@web01 ~]# echo "test" > /test/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl restart nginx

2. autoindex目录索引

实战1模仿阿里云镜像提供站点, 实战模拟搭建企业内网YUM仓库( 生产 )
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldxu.com.conf

server {
  listen 80;
  server_name mirror.oldxu.com;
  charset utf-8;       #设置中文字符集
  root /mirror;        #全局设置路径
	
	location / {         #这里的 / 其实就是一个相对(/mirror)路径
	   index index.html; #提供yum源的仓库
	   location /repo {
	   autoindex on;             #打开目录浏览功能!!!!
	   autoindex_exact_size off;  #关闭字节显示(会以MB的方式显示)
	   autoindex_localtime on;
	   #打开会显示文件上传的本地的时间(默认格林威治时间-8h)
	}
}

拉取资源同步至本地
[root@web01 mirror]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /mirror/repo/


实战2访问控制
2.1 基于来源的IP实现访问控制
  仅允许哪些IP可以访问
  拒绝某个IP访问,其他IP都可以 正常访问

注意:deny和allow的顺序是有 影响的。
  默认情况下从第一条规则开始匹配
  如果匹配成功,检查规则是允许还是拒绝。但不在继续匹配下面的内容
  如果匹配不成功,则继续往下匹配。

server {
	listen 80;
	server_name mirror.oldxu.com;
	charset utf-8;
	

	location / {
        root /mirror;
		index index.html;
	}

	location /repo {
         root /mirror/yum;
         autoindex  on;
         allow 10.0.0.1/32;   #10.0.0.100 规则匹配不成功,继续往下匹配
         allow 10.0.0.100/32;  #10.0.0.100 规则匹配成功,动作,放行,结束匹配。
         deny  all;           #
         }
}

2.2 基于用户名和密码的访问控制

① 准备一个密码文件
[root@web01 mirror]# yum install httpd-tools -y (安装阿帕奇工具包以便生成密码)
[root@web01 mirror]# htpasswd -cb /etc/nginx/auth_pass 【用户xxx】 【密码xxx】

-c创建
-b命令行穿件密码

② 给mirror.oldxu.com 的 /repo 添加用户密码认证
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldxu.com.conf

server {
	listen 80;
	server_name mirror.oldxu.com;
	charset utf-8;
	root /mirror;

	location / {
		index index.html;
	}

	location /repo {
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;

	auth_basic "hello";  #密码框上边提示站点信息
	auth_basic_user_file  "/etc/nginx/auth_pass"  #密码文件位置
	}

}

3. 访问限制

3.1 请求限制 limit_req(作用于Http层)
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldxu.com.con

limit_req_zone   $binary_remote_addr   zone=req_one:10m rate=1r/s;
#开辟一个区域     针对的来源的IP地址     zone区域名称,大小10M,处理速度1个请求/s

server {
	listen 80;
	server_name  limit.oldxu.com;
   	limit_req    zone=req_one    burst=3 nodelay;
   	# 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
   location / {
   root /limit;
   index index.html;
	}

}

3.2 连接限制 limit_conn 限制下载速度 访问速度

[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldxu.com.conf

limit_conn_zone   $binary_remote_addr      zone=conn_od:10m;
#连接限制,       针对的是来源的IP      名称叫conn_od定义了一个10m内存空间
server {
	listen 80;
	server_name  limit.oldxu.com;
	limit_conn  conn_od 2;
	limit_rate_after 100m;   #100M后开始限速 (迅雷)
	limit_rate 200k;         #限速

	location / {
		root /limit;
	}

}

4. 综合案例

限制web服务
请求评率被限制原理:
在这里插入图片描述

请求频率限速原理:倒入水的会被漏掉(请求被处理)多余的水
会在水桶等待漏掉(等待数据处理)多余的水会满出来(请求会被丢掉)

器请求数处理为1秒一个,触发值为5、 #请求限制
限制用户仅可同时下载一个文件。 #连接限制
当下载超过100M则限制下载速度为500k。如果同时下载超过2个视频,则返回提示 “请联系oldxu进行会员充值”。

[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldxu.com.conf

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_od:10m;

server {
	listen 80;
	server_name  limit.oldxu.com;
	charset utf-8;
	
	limit_req zone=req_one burst=5 nodelay;	        #请求限制
	limit_conn  conn_od 1;			                #连接限制
	
	limit_rate_after 100m; 			                #100m不限速
	limit_rate 500k;   			                    #限速500k

	location / {
		root /limit;
		index index.html;
	}

	
	error_page 503  @err;   #错误接收 @err是一个特殊的重定向
	location @err {
		default_type text/html;
		return 200                 '请联系oldxu充值,联系qq:xxxxx';
	}
}

5. 状态模块stub_stauts

监控Nginx连接   
监控Nginx请求   
模拟长连接和短连接效果

location /status {     #开启Nginx的状态监控
	    stub_status;
}

开启Nginx的状态监控

提供以下状态信息 7种状态 指标

状态含义
Active connections当前活跃连接数,包括Waiting等待连接数。
accepts已接收的总TCP连接数量。
handled已处理的TCP连接数量。
requests当前总http请求数量。
Reading当前读取的请求头数量。
Writing当前响应的请求头数量。
Waiting当前等待请求的空闲客户端连接数

6. Location匹配

6.1 location匹配规则

# 匹配符 匹配规则没有匹配上则继续匹配
= 精确匹配1 必须是百分百匹配
^~ 以某个字符串开头2
~ 区分大小写的正则匹配3
~* 不区分大小写的正则匹配4
/ 通用匹配,任何请求都会匹配到5

官方文档:

The “/” request will match configuration A, the “/index.html” request
will match configuration B the “/documents/document.html” request will
match configuration C, the “/images/1.gif” request will match
configuration D, the “/documents/1.jpg” request will match
configuration E.

[root@web01 conf.d]# cat /etc/nginx/conf.d/location2.oldxu.com.conf

server {
    listen 80;
    server_name location2.oldxu.com;

    # 通用匹配,任何请求都会匹配到
    location / {
        root html;
        index index.html;
    }

    # 精准匹配,必须请求的uri是/nginx_status
    location = /nginx_status {
        stub_status;
    }

    # 严格区分大小写,匹配以.php结尾的都走这个location xx.com/1.php
    location ~ \.php$ {
        default_type text/html;
        return 200 'php访问成功';
    }

    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {  
    # \ 转义符 点是特殊字符
   
        default_type text/html;
        return 200 'jsp访问成功';
    }

    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
    location ~* \.(jpg|gif|png|js|css)$ {
        return 403;
    }

    # 不区分大小写匹配
    location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
        deny all;
    }
}

6.2 location优先级

参考6.1表格

6.3 location @ 内部重定向

 error_page 404 403 401 @err;
 location @err {
     default_type text/html;
     return 200 '你可能是不小心走丢了。';
 }     #将错误404,403,401统一跳转一个页面

6.4 location uri 添加 / 和不添加 / 的区别?

#不添加/,默认上/code/test目录下找index.html文件,如果没有 index.html则会查找/code/test文件

location /test {
    root /code;
    index index.html;
}
    

#添加/,默认上/test目录下寻找index.html文件,如果没有index.html 则会直接返回403

location /test/ {
    root /code;
}

7. nginx日志

  • 日志格式 log_format
  • 访问日志 access_log
  • 错误日志 error_log

log_format: 定义日志格式:
关键字 变量

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 /var/log/nginx/access.log main;

$remote_addr        # 记录客户端IP地址
$remote_user        # 记录客户端用户名
$time_local            # 记录通用的本地时间
$time_iso8601       # 记录ISO8601标准格式下的本地时间
$request                # 记录请求的方法以及请求的http协议
$status                   # 记录请求状态码(用于定位错误信息)
$body_bytes_sent    # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent          # 发送给客户端的总字节数
$msec                  # 日志写入时间。单位为秒,精度是毫秒。
$http_referer       # 记录从哪个页面链接访问过来的
$http_user_agent       # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length        # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time           # 请求花费的时间,单位为秒,精度毫秒

access_log 可以定义在 http、server、location?

每一个server都会定义一个access_log。为了区分网站的访问记录
	http {
		access_log   /var/log/nginx/access.log main;
		server {
			# access_log /var/log/nginx/log.oldxu.com.log main;
		}

		#如果某个网站不想记录日志,则可以通过如下两种方式去实现?
		server {
			access_log off;
			#access_log /dev/null;
		}
	}

error_log:错误日志

error_log  /var/log/nginx/error.log warn;	
#几乎是所有Nginx统一的一个位置。(全局,作用于所有的网站)

如果Nginx在访问的时候没有达到你的预期,请检查错误日志,

常用模块:

autoindex
allow、deny
auth_basic
limit_req
limit_conn
stub_status
location
log

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值