nginx 资料整理(四)- web

壹只菜鸟 2024-10-17 16:03:01 阅读 63

nginx 资料整理(四)

1. web服务器1. 日志功能1. 访问日志2. 错误日志3. 实例演示

2. 网站功能列表1. autoindex2. autoindex_localtime

3. 认证功能1. auth_basic2. 实例演示

4. 访问控制功能1. allow & deny2. 局限性3. 实例演示

5. 状态模块1. stub_status2. 实例演示

在这里插入图片描述

本章我们继续整理nginx web服务器相关内容

1. web服务器

在后面的示例中,我们将主要以编写<code>子配置文件的形式进行搭建示例网站

cainiao网站为起点,开始我们本次的旅程吧

服务器信息

主机名 IP 系统 软件
web-svr-01 192.168.202.131 CentOS 7.9 nginx/1.20.1

目前我们只配置一台机器进行演示即可,当后面更多机器的时候,我们再进行扩充

编写站点文件

[root@web-svr-01 conf.d]# mkdir -p /app/code/www

[root@web-svr-01 conf.d]# echo "cainiao index" > /app/code/www/index.html

[root@web-svr-01 conf.d]# vim www.cainiao.cn.conf

[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

location / {

index index.html;

}

}

验证

[root@web-svr-01 conf.d]# curl -H Host:www.cainiao.cn 127.0.0.1

cainiao index

读者也可以在同网段的windows服务器,修改hosts域名解析文件,通过浏览器访问此网站。这个hosts文件一般在C:\Windows\System32\drivers\etc目录中,可以在该文件中追加192.168.31.48 www.cainiao.cn

1. 日志功能

Nginx的日志功能主要体现在两个方面:访问日志错误日志

访问日志(access.log):记录每次HTTP请求的信息,如请求的时间、客户端IP、请求的URL、响应状态码等。在Nginx配置文件中设置访问日志的格式和日志文件的位置。例如:

http {

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;

...

}

错误日志(error.log):记录Nginx运行中遇到的错误信息,如启动、运行中的错误、客户端请求的错误等。错误日志的配置通常在全局块中进行,例如:

error_log /var/log/nginx/error.log warn;

以上是Nginx日志配置的基本方法,可以根据实际需求进行定制化配置。

1. 访问日志

学习nginx,首先要学会查看官网 ngx_http_log_module

在这里插入图片描述

log_format 定义访问日志的格式,只能出现在http全局块中,支持默认格式或者<code>json格式,名字可以自定义

说明 配置
Syntax(语法) <code>log_format name [escape=default|json|none] string ...;
Default(默认) log_format combined “…”;
Context(语境,可以出现的位置) http

格式中包含的变量较多

变量名 变量说明
$time_iso8601 ISO 8601 时间格式
$time_local 用户请求的时间和时区
$msec 毫秒级别的日志记录时间
$remote_addr 发起与 Nginx 建立连接的网络客户端的 IP,有时会是上层代理服务器的 IP
$http_x_forwarded_for 可以记录客户端 IP,通过代理服务器来记录客户端的 IP
$remote_user 用于记录远程客户端的用户名称
$http_user_agent 用户客户端浏览器标识
$connection 网络连接编号
$connection_requests 当前连接的请求数
$request 用户请求的 URI 及请求方法
$request_method 用户请求方法
$request_uri 用户请求的 URI 及请求方法
$server_protocol 请求协议
$request_time 请求时间
$request_length 请求数据大小
$status 用户请求响应状态码
$bytes_sent 发送到客户端响应数据的大小
$body_bytes_sent 用户请求返回的响应体字节数
$http_referer HTTP 请求头中属性字段 referer

示例:

<code>#日志格式

http {

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;

...

}

#对应的日志内容

[root@web-svr-01 conf.d]# cat /var/log/nginx/access.log

127.0.0.1 - - [11/Oct/2024:10:41:40 +0800] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-"

127.0.0.1 - - [11/Oct/2024:10:42:41 +0800] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-"

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定义访问日志的位置和使用的格式(log_format),可以出现的位置较多,不过多数情况放在http全局块或server全局块中

说明 配置
Syntax <code>access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log off;

Default access_log logs/access.log combined;
Context http, server, location, if in location, limit_except

示例:

<code>log_format compression '$remote_addr - $remote_user [$time_local] '

'"$request" $status $bytes_sent '

'"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /spool/logs/nginx-access.log compression buffer=32k;

2. 错误日志

错误日志收集在ngx的核心模块[ngx_core_module]中,帮助用户及时判断 Nginx 配置及运行时出错的原因,错误日志也可以通过 Nginx 内置指令进行配置,但不支持格式定义

说明 配置
Syntax <code>error_log file [level];
Default error_log logs/error.log error;
Context main, http, mail, stream, server, location

关于 error_log 指令需要说明:

在同一级别的指令域中,也可指定多个日志;指令值中的第一个参数是输出日志的方式,默认是输出到本地的文件中。该指令也支持输出到 syslog 或内存缓冲区中;

<code>error_log syslog:server=192.168.2.109 error;

error_log memory:32m debug;

error_log /dev/null;

# 访问文件不存在时,记入错误日志

log_not_found on;

指令值中第二个参数是输出日志的级别,指定的级别将包含自身及级别值比其小的所有级别日志,日志内容会保存到第一个参数设定的输出位置。

错误日志级别及相关说明如下表所示:

级别 级别值 级别说明
debug 8 代码中标记为 NGX_LOG_DEBUG 的输出,输出最为详细,配合调试使用
info 7 代码中标记为 NGX_LOG_INFO 的输出,因包括除 debug 级别的所有输出,故同样会消耗大量磁盘 IO 资源
notice 6 代码中标记为 NGX_LOG_NOTICE 的输出
warn 5 代码中标记为 NGX_LOG_WARN 的输出
error 4 代码中标记为 NGX_LOG_ERROR 的输出,实际生产环境中常用的输出级别
crit 3 代码中标记为 NGX_LOG_CRIT 的输出
alert 2 代码中标记为 NGX_LOG_ALERT 的输出
emerg 1 代码中标记为 NGX_LOG_EMERG 的输出

一般我们使用的日志级别是<code>notice,视具体情况而定

3. 实例演示

现在为我们的cainiao网站,添加日志功能。

[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

access_log /var/log/nginx/www.cainiao.cn.access.log main;

error_log /var/log/nginx/www.cainiao.cn.error.log notice;

location / {

index index.html;

}

}

[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

[root@web-svr-01 conf.d]# curl -H Host:www.cainiao.cn 192.168.202.131

cainiao index

[root@web-svr-01 conf.d]# cat /var/log/nginx/www.cainiao.cn.access.log

192.168.202.131 - - [11/Oct/2024:11:22:27 +0800] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-"

[root@web-svr-01 conf.d]# cat /var/log/nginx/www.cainiao.cn.error.log

[root@web-svr-01 conf.d]#

在同一个服务器上,可能存在多个虚拟主机的情况下,建议把日志写在每个虚拟主机的server块中,并且直接用网站命名日志名称。

2. 网站功能列表

所属模块 Module ngx_http_autoindex_module

1. autoindex

Nginx的autoindex功能是用于在Nginx配置中启用或禁用自动索引的。当启用此功能时,如果Nginx在目录中找不到默认的首页(如index.html),它将生成一个包含该目录中所有文件和子目录的HTML页面,用于在请求目录而非文件时浏览文件、查看文件信息。它可通过配置选项定制,如显示确切文件大小、本地时间和自定义页面格式。优点包括方便浏览、易于配置和提供文件信息。

缺点包括安全风险、性能影响和无法自定义页面外观。

格式:

说明 配置
Syntax autoindex on
Default autoindex off;
Context http, server, location

示例:

<code>[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

access_log /var/log/nginx/www.cainiao.cn.access.log main;

error_log /var/log/nginx/www.cainiao.cn.error.log notice;

location / {

index index.html;

autoindex on;

}

}

[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

[root@web-svr-01 conf.d]# cd /app/code/www/

[root@web-svr-01 www]# touch {1..5}

[root@web-svr-01 www]# mv index.html index.html.bak

在这里插入图片描述

2. autoindex_localtime

nginx网站功能列表中的autoindex_localtime是一个指令,用于在nginx的自动索引功能中启用本地时间格式。

格式:

说明 配置
Syntax autoindex_localtime on
Default autoindex_localtime off;
Context http, server, location

示例:

<code>[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

access_log /var/log/nginx/www.cainiao.cn.access.log main;

error_log /var/log/nginx/www.cainiao.cn.error.log notice;

location / {

index index.html;

autoindex on;

autoindex_localtime on;

}

}

[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

[root@web-svr-01 www]# touch {1..5}

[root@web-svr-01 www]# ll

total 4

-rw-r--r-- 1 root root 0 Oct 11 13:54 1

-rw-r--r-- 1 root root 0 Oct 11 13:54 2

-rw-r--r-- 1 root root 0 Oct 11 13:54 3

-rw-r--r-- 1 root root 0 Oct 11 13:54 4

-rw-r--r-- 1 root root 0 Oct 11 13:54 5

-rw-r--r-- 1 root root 14 Oct 11 09:53 index.html.bak

在这里插入图片描述

3. 认证功能

1. auth_basic

指令为<code>auth_basic,所属模块 Module ngx_http_auth_basic_module

Nginx的auth_basic指令用于启用HTTP基本认证,它需要一个认证页面提示用户输入用户名和密码。

auth_basic格式:

说明 配置
Syntax auth_basic string
Default auth_basic off;
Context http, server, location, limit_except

在这个配置中,auth_basic指令后跟一个提示信息,当用户访问受保护的区域时,会看到这个信息。<code>auth_basic_user_file指令指定一个密码文件,Nginx将使用这个文件来验证用户名和密码

auth_basic_user_file 格式:

说明 配置
Syntax auth_basic_user_file file;
Default
Context http, server, location, limit_except

账户密码文件

<code>#Specifies a file that keeps user names and passwords, in the following format:

# comment

name1:password1

name2:password2:comment

name3:password3

创建密码文件需要使用htpasswd工具,这个工具通常与Apache的httpd-tools包一起安装。以下是创建密码文件的命令:

sudo htpasswd -c /etc/nginx/.htpasswd username

上面的命令会提示输入密码,并创建一个包含认证信息的文件。使用-c选项会创建一个新文件,如果文件已存在,则不应使用此选项以避免覆盖现有用户。

请确保Nginx用户有权限读取.htpasswd文件,通常这意味着设置合适的文件权限和所有权。

注意:auth_basic模块的优点包括实现简单、配置方便,适用于不需要高强度安全保护的场景。‌ 然而,它的缺点是用户名和密码以Base64编码的形式出现在Authorization头部,容易被截取和解析,因此不适合用于保护高安全性的数据‌

2. 实例演示

下面我们为cainiao网站增加用户基本认证功能

安装htpasswd工具,并增加账户cainiao

[root@web-svr-01 www]# yum install httpd-tools

[root@web-svr-01 www]# htpasswd -c /etc/nginx/.cainiao.pw cainiao

New password:

Re-type new password:

Adding password for user cainiao

[root@web-svr-01 www]# cat /etc/nginx/.cainiao.pw

cainiao:$apr1$QpVaBatU$qkPNkGeHGY1.MQqDgjTZe/

修改网站配置文件

[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

access_log /var/log/nginx/www.cainiao.cn.access.log main;

error_log /var/log/nginx/www.cainiao.cn.error.log notice;

location / {

index index.html;

autoindex on;

autoindex_localtime on;

auth_basic "cainiao website";

auth_basic_user_file /etc/nginx/.cainiao.pw;

}

}

[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

强制刷新网页,可以看到要求输入账户及密码了

在这里插入图片描述

输入完账户及密码,可以正常访问

4. 访问控制功能

主要的指令包括:<code>allow和deny,所属模块 Module ngx_http_access_module

1. allow & deny

Nginx 提供了基于 IP 地址的访问控制功能,可以通过 allowdeny 指令来实现。

说明 配置
Syntax <code>allow address | CIDR | unix: | all;
Default
Context http, server, location, limit_except
说明 配置
Syntax <code>deny address | CIDR | unix: | all;
Default
Context http, server, location, limit_except

可以基于IP地址,网段或者所有。allow与deny是按照顺序执行的,即先执行的先生效

示例:

<code>location / {

deny 192.168.1.1;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

allow 2001:0db8::/32;

deny all;

}

被拒绝访问的页面会提示403

2. 局限性

http_access_module 的局限性:

由于此实现的原理是基于客户端的ip来控制,但是nginx并不知道哪一个ip是真正的客户的,如果客户端与服务端的nginx之间还有一层代理(如其他的中间件),如对下图的中对IP1访问IP3做控制,此时IP1经过中间件后,放IP3发送的请求为IP2,即控制失败,所以只能通过$remote_addr控制允许访问,不能控制拒绝访问

在这里插入图片描述

解决办法:

1)HTTP头信息控制:http_x_forwarded_for

在这里插入图片描述

<code>http_x_forwarded_for=Client IP,Proxy(1)IP,Proxy(2)IP,……

2)结合geo模块配置解决

3)HTTP头自定义变量传递

3. 实例演示

[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

access_log /var/log/nginx/www.cainiao.cn.access.log main;

error_log /var/log/nginx/www.cainiao.cn.error.log notice;

location / {

index index.html;

allow 10.0.84.22;

deny all;

autoindex on;

autoindex_localtime on;

auth_basic "cainiao website";

auth_basic_user_file /etc/nginx/.cainiao.pw;

}

}

[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

在一直使用的机器进行访问:

在这里插入图片描述

在<code>10.0.84.22访问

在这里插入图片描述

5. 状态模块

Nginx 状态模块是用于收集 Nginx 的运行状态数据的模块。它可以提供关于 Nginx 的当前连接、处理的请求、状态码等信息。

1. stub_status

指令<code>stub_status 所属模块 Module ngx_http_stub_status_module

说明 配置
Syntax stub_status;
Default
Context server, location

In versions prior to 1.7.5, the directive syntax required an arbitrary argument, for example, “<code>stub_status on”.

示例:

location = /basic_status {

stub_status;

}

可以通过访问 http://localhost/nginx_status 来查看 Nginx 的状态信息。

常见的状态信息:

状态 说明
Active connections 当前活跃的连接数。
server accepts handled requests 服务器接受、处理和完成的请求数。
Reading 读取客户端请求的连接数。
Writing 响应客户端请求的连接数。
Waiting 等待客户端请求的连接数。
2. 实例演示

<code>[root@web-svr-01 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@web-svr-01 conf.d]# systemctl reload nginx

[root@web-svr-01 conf.d]# cat www.cainiao.cn.conf

server {

listen 80;

server_name www.cainiao.cn;

root /app/code/www;

access_log /var/log/nginx/www.cainiao.cn.access.log main;

error_log /var/log/nginx/www.cainiao.cn.error.log notice;

location / {

index index.html;

stub_status;

#allow 10.0.84.22;

#deny all;

autoindex on;

autoindex_localtime on;

auth_basic "cainiao website";

auth_basic_user_file /etc/nginx/.cainiao.pw;

}

}

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。