文章目录
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.7 | 8080 |
10.0.0.7 | 8081 |
[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.com | docs |
test.oldxu.com | test |
[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