验证网络协议是否支持测试TCP/HTTP/HTTPS
可以在Nginx配置文件中添加对应的server监听端口和ssl证书配置,例如:
# TCP
server {
listen 80;
}
# HTTP
server {
listen 80;
location / {
root /var/www/html;
}
}
# HTTPS
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.pem;
ssl_certificate_key /etc/nginx/ssl/mykey.pem;
location / {
root /var/www/html;
}
}
验证服务器支持可以根据请求方法类型进行限制,限制多种请求
可以使用Nginx的if语句和$http_x_requested_with变量来限制请求方法类型,例如:
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
if ($http_x_requested_with !~* ^(XMLHttpRequest|Fetch)$) {
return 403;
}
最大连接数配置测试/并发连接数配置测试
可以在Nginx配置文件中设置worker_processes和worker_connections参数来控制最大连接数和并发连接数,例如:
worker_processes 4;
events {
worker_connections 1024;
}
验证服务器支持自定义黑白名单列表,包括目录以及ip的黑白名单;也可以定义黑白名单的请求方法,包括文件名后缀等
可以使用Nginx的access模块和geo模块来实现黑白名单的配置,例如:
# IP黑名单
geo $blacklist {
default 0;
10.0.0.0/8 1;
172.16.0.0/12 1;
192.168.0.0/16 1;
}
server {
location / {
# IP黑名单
if ($blacklist) {
return 403;
}
# 目录白名单
if ($uri !~* ^/(public|static)/) {
return 403;
}
# 请求方法黑名单
if ($request_method ~* ^(PUT|DELETE)$) {
return 405;
}
# 文件名后缀黑名单
if ($uri ~* \.(php|asp|jsp)$) {
return 403;
}
# 其他配置
...
}
}
验证服务器支持配置ssl的证书和秘钥的能力
可以在Nginx配置文件中添加ssl_certificate和ssl_certificate_key参数来配置ssl证书和秘钥,例如:
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.pem;
ssl_certificate_key /etc/nginx/ssl/mykey.pem;
...
}
验证服务器支持跨域请求解决方案
可以在Nginx配置文件中添加add_header参数和proxy_pass参数来实现跨域请求解决方案,例如:
server {
location /api {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';
proxy_pass http://backend_server;
...
}
}
验证服务器支持提供读取以及采集客户端发起的请求的报文头;提供获取特定路径下的报文头;提供修改报文头格式
可以使用Nginx的http模块和变量来读取和修改报文头,例如:
server {
location / {
# 读取报文头
add_header '
Custom-Header' $http_custom_header;
# 修改报文头格式
if ($http_user_agent ~* chrome) {
add_header 'Custom-User-Agent' 'Chrome';
}
# 获取特定路径下的报文头
location /api {
add_header 'Custom-Header' $http_custom_header;
...
}
...
}
需要注意的是,修改报文头可能会导致安全问题,需要谨慎使用。
在nginx中实现防盗链需要使用ngx_http_referer_module模块,具体配置如下:
# 设置来源域名列表
valid_referers none blocked example.com;
# 设置防盗链的文件类型
if ($invalid_referer) {
return 403;
}
location ~* \.(jpg|png|gif)$ {
...
}
# 拦截IP及非法域名跳转请求
if ($http_referer ~* (baidu\.com|bing\.com)) {
return 403;
}
其中,valid_referer指令定义了合法的来源域名列表
在nginx中作为静态资源服务器需要使用root指令指定根目录,具体配置如下:
server {
location / {
root /var/www/html;
}
}
其中,root指令定义了静态资源文件的根目录。
在nginx中实现对静态资源进行压缩需要使用ngx_http_gzip_module模块,具体配置如下:
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript;
...
}
server {
location / {
root /var/www/html;
}
}
其中,gzip指令开启了压缩功能,gzip_types指令定义了需要压缩的文件类型。
# 针对不同路径和不同文件类型配置缓存时间
location ~* \.(jpg|jpeg|png|gif|css|js|woff|woff2|eot|ttf|svg)$ {
expires 1d;
add_header Cache-Control "public";
...
}
# 针对不同路径和不同文件进行访问权限的限制
location /private/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
...
}
# 针对文件的高速读取,高效传输,长链接等
location /static/ {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
...
}
# 根据URI的不同需求来进行配置,提供使用字符串与正则表达式匹配
location ~* ^/user/\d+ {
...
}
# 合并多个请求一次响应
location /combine {
gzip on;
gzip_types text/css text/javascript;
gzip_min_length 1;
gzip_comp_level 9;
gzip_vary on;
gzip_proxied any;
gzip_http_version 1.1;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.";
subrequest_output_buffer_size 256k;
subrequest_in_memory on;
set $args '';
set $sub_req '';
if ($request_method = 'GET') {
set $args $args&$arg_param1=$arg_value1&$arg_param2=$arg_value2;
set $sub_req /api/get_data?$args;
}
add_header 'Content-Type' 'application/json';
echo_flush '{"data": [';
echo_subrequest $sub_req;
echo_flush ']}';
echo_after_flush '\n';
}
# 当出现状态码404或者其他错误码时,跳转至错误页面
error_page 404 /404.html;
location = /404.html {
internal;
root /usr/share/nginx/html;
}
# 错误页面提供自定义修改
error_page 500 502 503 504 /50x.html;
location = /50x.html {
internal;
root /usr/share/nginx/html;
}
在nginx中实现负载均衡算法需要使用upstream模块,具体配置如下:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server backend3.example.com;
ip_hash;
}
server {
location / {
proxy_pass http://backend;
}
}
其中,upstream指令定义了后端服务器列表和负载均衡算法,weight指令定义了服务器的权重,ip_hash指令将请求根据客户端IP哈希到特定的服务器上。
在nginx中实现健康检查需要使用ngx_http_upstream_module模块,具体配置如下:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
keepalive 32;
check interval=3000 rise=2 fall=5 timeout=1000;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
location / {
proxy_pass http://backend;
}
}
其中,check指令定义了健康检查的参数,包括检查间隔、成功次数、失败次数、超时时间等,check_http_send指令定义了健康检查请求的内容,check_http_expect_alive指令定义了响应状态码范围。
在nginx中实现熔断限流需要使用ngx_http_limit_req_module模块,具体配置如下:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
}
server {
location / {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend;
}
}
其中,limit_req_zone指令定义了限流的区域、大小和速率,limit_req指令定义了限流的区域和阈值,burst指令定义了突发请求的最大数量,nodelay指令表示不延迟请求。
在nginx中实现流量控制需要使用ngx_http_limit_conn_module模块,具体配置如下:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
}
server {
location / {
limit_conn addr 10;
proxy_pass http://backend;
}
}
其中,limit_conn_zone指令定义了连接数限制的区域和大小,limit_conn指令定义了连接数限制的区域和阈值。
在nginx中实现对IP限制访问连接数需要使用ngx_http_limit_conn_module模块,具体配置如下:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
}
server {
location / {
limit_conn addr 10;
proxy_pass http://backend;
}
}
其中,limit_conn_zone指令定义了连接数限制的区域和大小,limit_conn指令定义了连接数限制的区域和阈值。可以通过修改阈值来控制连接数的限制。
针对突发流量的处理:
在nginx中针对突发流量的处理需要使用ngx_http_limit_req_module模块,具体配置如下:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...
}
server {
location / {
limit_req zone=one burst=20 nodelay;
proxy_pass http://backend;
}
}
其中,limit_req_zone指令定义了请求限制的区域和大小,rate指定了限制的速率,limit_req指令定义了请求限制的区域和突发流量的处理方式。可以通过修改rate和burst的值来控制限制的速率和突发流量的处理方式。
在nginx中实现限制下载速度需要使用ngx_http_limit_rate_module模块,具体配置如下
server {
location / {
limit_rate 100k;
proxy_pass http://backend;
}
}
其中,limit_rate指令定义了下载速率的限制值。
在nginx中实现访问日志需要使用access_log指令,具体配置如下:
http {
...
access_log /var/log/nginx/access.log;
...
}
其中,access_log指令定义了访问日志文件的路径和格式。
在nginx中实现错误日志需要使用error_log指令,具体配置如下:
http {
...
error_log /var/log/nginx/error.log error;
...
}
其中,error_log指令定义了错误日志文件的路径和级别。
在nginx中实现自定义日志格式需要使用log_format指令,具体配置如下:
http {
...
log_format mylog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log mylog;
...
}
其中,log_format指令定义了自定义的日志格式,access_log指令使用自定义的日志格式记录访问日志。
在nginx中实现BWS多节点需要使用ngx_http_upstream_module模块,具体配置如下:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
least_conn;
}
server {
location / {
proxy_pass http://backend;
}
}
其中,upstream指令定义了后端服务器列表和负载均衡算法,least_conn指令将请求发送到连接数最少的服务器上。
在nginx中实现后端多节点需要使用ngx_http_upstream_module模块,具体配置如下:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com backup;
}
server {
location / {
proxy_pass http://backend;
}
}
其中,upstream指令定义了后端服务器列表和备用服务器,backup指令将该服务器标记为备用服务器。
在nginx中支持Lua脚本需要使用ngx_http_lua_module模块,具体配置如下:
http {
...
lua_package_path "/path/to/lua/?.lua;;";
...
server {
location / {
content_by_lua_file /path/to/lua/script.lua;
}
}
}
其中,lua_package_path指令定义了Lua脚本文件的路径,content_by_lua_file指令指定了使用Lua脚本处理请求。
在nginx中支持Prometheus监控需要使用ngx_http_stub_status_module模块和ngx_http_prometheus_module模块,具体配置如下:
http {
...
stub_status on;
...
server {
listen 8080;
location /metrics {
prometheus;
}
}
}
其中,stub_status指令开启了状态信息的收集,prometheus指令将状态信息输出为Prometheus格式。
nginx自带的stub_status模块可以用于监测当前处理的活跃连接数、正在读取的客户端连接数、响应数据到客户端的数量、BWS等待下次请求的驻留连接数等信息,具体配置如下:
http {
...
stub_status on;
...
}