Nginx常用模块
目录
Nginx虚拟主机
1.虚拟主机方式
- 基于多IP的方式
- 基于多端口的方式
- 基于多域名的方式
2.基于多IP的方式
[root@web02 conf.d]# cat game.conf
server {
listen 80;
server_name 192.168.15.8;
location / {
root /opt/Super_Mary;
index index.html;
}
}
server {
listen 80;
server_name 172.16.1.8;
location / {
root /opt/xaingqi;
index index.html;
}
} # 在网页端输入192.168.15.8进入的是超级玛丽,输入172.16.1.8进入的是象棋
3.基于多端口的方式
[root@web02 conf.d]# cat game1.conf
server {
listen 80;
server_name game001.com;
location / {
root /opt/Super_Mary;
index index.html;
}
}
server {
listen 81;
server_name game001.com;
location / {
root /opt/xiangqi;
index index.html;
}
} # 在网页端输入game001.com:80进入的是超级玛丽,输入game001.com:81进入的是象棋(要在hosts修改域名)
4.基于多域名的方式
[root@web02 conf.d]# cat game2.conf
server {
listen 80;
server_name game001.com;
location / {
root /opt/Super_Mary;
index index.html;
}
}
server {
listen 80;
server_name game002.com;
location / {
root /opt/xiangqi;
index index html;
}
} # 在网页端输入game001.com进入的是超级玛丽,输入game002.com进入的是象棋(要在hosts修改域名)
Nginx日志
1.排查报错原因
systemctl status nginx.service -l
cat /var/log/nginx/error.log # 两个都是查看错误日志 能解决百分之90的问题
2.日志参数
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for # 真实的客户端IP(在反向代理中生效)
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
3.网站的访问来源
eg:
- 修改配置文件(本机ip为172.16.1.8,由vpn启动,vpn的ip是172.16.1.81)
[root@web02 conf.d]# cat game2.conf
server {
listen 80;
server_name game001.com;
location / {
root /opt/Super_Mary;
index index.html;
}
}
server {
listen 80;
server_name game002.com;
location / {
root /opt/xiangqi;
index index.html;
}
}
- 域名解析
192.168.15.8 game001.com
172.16.1.8 game002.com
- 依次访问后查看日志
192.168.15.1 - - [04/Jan/2022:15:36:07 +0800] "GET /sounds/stomp.mp3 HTTP/1.1" 404 555 "http://game001.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" "-" # 本机的windowip访问
172.16.1.81 - - [04/Jan/2022:15:34:51 +0800] "GET /img/stype_1/b_m.png HTTP/1.1" 200 2271 "http://game002.com/" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-" # vpn的ip访问
- 总结
从公网访问的话ip是本机window系统的ip
而从内网访问的话因为是经由vpn访问,所以访问ip是vpn的ip
Nginx常用模块
1.Nginx访问控制模块
- ngx_http_access_module
语法
#允许访问的语法
Syntax: allow address | all;
Default: —
Context: http, server, location, limit_except
#拒绝访问的语法
Syntax: deny address | all;
Default: —
Context: http, server, location, limit_except
#如果配置允许,则也要配置拒绝;配置拒绝可以单独配置
# 特别注意!!! 匹配规则是从上往下的,上面的符合就不匹配下面的,不符合就依次往下匹配。
案例
1.允许192.168.15.1访问,不允许其他IP访问
[root@web02 conf.d]# vim xiangqi.conf
server {
listen 80;
server_name game002.com;
allow 192.168.15.1; # 允许192.168.15.1访问
deny all; # 不允许其他IP访问
location / {
root /opt/xiangqi;
index index.html;
}
}
2.允许192.168.15.0这个网段访问,不允许其他网段访问
[root@web02 conf.d]# vim xiangqi.conf
server {
listen 80;
server_name game002.com;
allow 192.168.15.0/24; # 允许192.168.15.0这个网段访问
deny all; # 不允许其他网段访问
location / {
root /opt/xiangqi;
index index.html;
}
}
# 知识补充 curl -H'Host:game.com' -I 192.168.15.8 从linux访问网站。
3.只允许通过VPN来访问
[root@web02 conf.d]# vim xiangqi.conf
server {
listen 80;
server_name game002.com;
allow 117.16.1.81; # 允许通过VPN来访问
deny all; # 其他拒绝
location / {
root /opt/xiangqi;
index index.html;
}
}
2.Nginx访问认证模块
- ngx_http_auth_basic_module
语法
#开启的登录认证
Syntax: auth_basic string | off;
Default: auth_basic off; # 默认
Context: http, server, location, limit_except # 可使用的地方
#指定登录用的用户名密码文件
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
案例
1、安装httpd-tools
[root@web01 ~]# yum install httpd-tools -y
2、生成用户名密码文件
[root@web01 ~]# htpasswd -c /etc/nginx/auth zonghan
New password:
Re-type new password:
Adding password for user zonghan
3、将文件路径加入Nginx配置
[root@web01 ~]# vim /etc/nginx/conf.d/game2.conf
auth_basic "Welcome To Login";
auth_basic_user_file /etc/nginx/auth;
4、重启Nginx
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl restart nginx
3.目录索引模块
- ngx_http_autoindex_module
语法
Syntax: autoindex on | off;
Default: autoindex off; # 默认关闭
Context: http, server, location # 适用地方
# ngx_http_autoindex_module模块处理以斜杠字符('/')结尾的请求,并生成目录列表。
# 当ngx_http_index_module模块找不到索引文件时,通常会将请求传递给ngx_http_autoindex_module模块。
展示目录索引
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
autoindex_format html | xml | json | jsonp;
案例
显示目录
[root@web02 conf.d]# vim index.conf
server {
listen 80;
server_name 192.168.15.8;
autoindex on; # 展示目录索引
location / {
root /opt;
}
}
文件大小四舍五入
[root@web02 conf.d]# vim index.conf
server {
listen 80;
server_name 192.168.15.8;
autoindex on;
autoindex_exact_size off;
location / {
root /opt;
}
}
显示本地时间
[root@web02 conf.d]# vim index.conf
server {
listen 80;
server_name 192.168.15.8;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
location / {
root /opt;
}
}
显示目录的格式
[root@web02 conf.d]# vim index.conf
server {
listen 80;
server_name 192.168.15.8;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
autoindex_format json;
location / {
root /opt;
}
} # 有html、xml、json、jsonp格式,默认是html
4.控制速率的模块模块
- ngx_http_limit_req_module
语法
#设置空间的语法
Syntax: limit_req_zone key zone=name:size rate=rate [sync];
eg:limit_req_zone $remote_addr zone=one:10m rate=1r/s;
声明连接池 变量 名称 连接池的大小 速率
Default: —
Context: http
limit_req_zone #设置空间的模块
key #空间存储的内容
zone #指定空间
=name #空间的名字
:size #空间的大小
rate=rate [sync]; #读写速率
#调用的语法
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
eg:limit_req zone=one burst=5;
Default: —
Context: http, server, location
limit_req #调用控件模块
zone=name #指定空间=空间的名字
[burst=number] #允许多请求几次
[nodelay | delay=number]; #延时
# 特别注意!!! 定义空间语法的时候 如果要作用于location要写在server内,调用时写在location,要作用于server要写在http内,调用时写在server,要作用于http要写在全局呢内,调用时写在http内
案例
要求每秒只能有一个访问
[root@web02 conf.d]# cat supermary.conf
limit_req_zone $remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name 192.168.15.8;
limit_req zone=one burst=5; # 连续刷新5次就503
location / {
root /opt/Super_Marie;
index index.html;
}
}
5.控制访问连接数模块
- ngx_http_limit_conn_module
语法
#设置限制的空间
Syntax: limit_conn_zone key zone=name:size;
eg:limit_conn_zone $remote_addr zone=addr:10m;
Default: —
Context: http
limit_conn_zone #设置空间的模块
key #指定空间存储的内容
zone #指定空间
=name #空间名字
:size; #空间的大小
#调用限制的空间
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
limit_conn #调用空间的模块
zone #空间的名字
number; #指定可以同时连接的次数
案例
要求1个ip只有1个连接
[root@web02 conf.d]# cat supermary.conf
limit_conn_zone $remote_addr zone=addr:10m;
server {
listen 80;
server_name 192.168.15.7;
limit_conn addr 1; # 调用
location / {
root /opt/Super_Mary;
index index.html;
}
}
压力测试
1、安装ab测试命令
yum install httpd-tools -y
2、ab 参数
-n : 总共需要访问多少次
-c : 每次访问多少个
eg: ab -n 100000 -c 200 http://192.168.15.8/
6.Nginx状态监控模块
- ngx_http_stub_status_module
语法
Syntax: stub_status;
Default: —
Context: server, location
案例
监控Nginx运行状态
[root@web02 conf.d]# cat game5.conf
server {
listen 80;
server_name 192.168.15.7;
location / {
stub_status;
}
}