Nginx

Nginx 知识量:8 - 22 - 84

6.2 其他功能实现><

使用limit指令防止滥用- 6.2.1 -

Nginx提供了limit指令,可以用于限制某些操作的频率或数量,以防止滥用或攻击。

以下是一些常见的limit指令的用法:

1. limit_req: 用于限制请求的频率。它可以指定一个速率和一个时间段,以限制在给定时间段内来自特定客户端的请求数量。这对于防止DDoS攻击或限制滥用非常有用。

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  
server {  
    location / {  
        limit_req zone=one burst=5;  
        ...  
    }  
}

在上述配置中,limit_req_zone指令定义了一个名为“one”的速率限制区域,基于二进制远程地址($binary_remote_addr)进行匹配。rate=1r/s指定了每秒一个请求的速率限制。limit_req指令则将该速率限制应用于特定的服务器块,并允许最多有5个请求超过速率限制(burst=5)。
2. limit_conn: 用于限制并发连接的数量。它可以指定一个最大并发连接数,以防止单个客户端消耗过多资源。这对于限制高并发访问或防止DoS攻击非常有用。

limit_conn_zone $binary_remote_addr zone=addr:10m;  
server {  
    location / {  
        limit_conn addr 100;  
        ...  
    }  
}

在上述配置中,limit_conn_zone指令定义了一个名为“addr”的并发连接限制区域,基于二进制远程地址($binary_remote_addr)进行匹配。zone=addr:10m指定了区域的大小为10MB。limit_conn指令则将并发连接限制应用于特定的服务器块,并允许最多有100个并发连接(addr 100)。

这些是Nginx中常见的limit指令的用法示例。通过合理配置这些指令,可以有效地防止滥用和攻击,保护服务器和应用程序的安全性。请注意,这些配置只是提供了一种基本的方法来限制请求或并发连接的数量,实际应用中可能需要根据具体情况进行调整和优化。

约束访问- 6.2.2 -

要限制访问整个网站或其某些部分,Nginx可以使用不同的方法来实现。以下是一些常见的方法:

1. IP 地址限制:可以使用 Nginx 的 allow 和 deny 指令来限制访问基于 IP 地址。可以在配置文件中指定允许访问的 IP 地址范围,并使用 deny all 指令来拒绝其他所有未明确允许的访问。

server {  
    listen 80;  
    server_name example.com;  
      
    location / {  
        allow 192.168.0.0/24;  
        deny all;  
    }  
}

在上述示例中,只有 IP 地址在 192.168.0.0/24 范围内的客户端才能访问该网站。

2. 身份验证:如果希望对网站或其某些部分进行身份验证,可以使用 Nginx 的基本身份验证功能。可以将需要身份验证的目录设置为需要基本身份验证的目录,并提供一个 .htpasswd 文件来存储用户名和密码。

server {  
    listen 80;  
    server_name example.com;  
      
    location / {  
        auth_basic "Restricted Content";  
        auth_basic_user_file /path/to/.htpasswd;  
    }  
}

在上述示例中,访问需要身份验证的目录时,Nginx 会提示用户输入用户名和密码。只有提供正确的用户名和密码才能访问该目录。

3. 代理缓存:如果希望限制访问整个网站或其某些部分,可以使用 Nginx 的代理缓存功能。通过配置代理缓存,可以缓存网站的内容,并在一定时间内提供缓存的内容,以减少对后端服务器的请求。

server {  
    listen 80;  
    server_name example.com;  
      
    location / {  
        proxy_pass http://backend-server;  
        proxy_cache my_cache;  
        proxy_cache_valid 200 304 30m;  
        proxy_cache_valid any 30m;  
    }  
}

在上述示例中,Nginx 将请求转发到后端服务器,并将响应缓存到名为 "my_cache" 的代理缓存中。缓存的内容将在一定时间内提供给客户端,以减少对后端服务器的请求。

4. 基于时间的限制:如果希望基于时间来限制访问,可以使用 Nginx 的 if 指令结合日期函数来实现。可以根据当前时间、请求的时间戳等条件来限制访问。

请注意,使用 if 指令时要小心,因为它可能会引入潜在的稳定性问题。在实际应用中,最好仔细评估使用条件并谨慎配置。

5. 使用第三方模块:Nginx 有许多第三方模块可用于更复杂的访问控制和限制功能。例如,ngx_http_auth_request_module 可以用于基于 HTTP 基本身份验证或其他身份验证机制进行访问控制。可以根据具体需求选择适合的模块来扩展 Nginx 的功能。

这些方法可以根据具体需求进行组合和调整,以实现想要的访问限制策略。请注意,在实施任何访问限制策略时,请确保仔细评估其对用户体验和合法访问的影响,并确保遵守相关法律法规和最佳实践。

流媒体文件- 6.2.3 -

Nginx可以通过配置相应的模块来提供对视频媒体的支持。对于FLV和MP4等格式的视频文件,Nginx提供了相应的模块来处理这些文件。

伪流媒体(pseudo-streaming)是一种在服务器端实现视频流化的方式。通过伪流媒体,用户可以在下载整个视频文件之前开始播放视频。Nginx通过在特定的location中搜索视频文件,并通过start请求参数来指明开始播放的位置,从而实现伪流媒体的功能。

要使用伪流媒体功能,需要在Nginx的配置文件中添加相应的location块,并指定处理视频文件的模块。例如,对于FLV格式的视频文件,可以使用ngx_http_flv_module模块来处理FLV文件。以下是一个示例配置:

http {  
    server {  
        listen 80;  
          
        location /video/ {  
            flv_live on;  
            alias /path/to/video/files/;  
        }  
    }  
}

在上述示例中,创建了一个HTTP服务器,监听端口80。然后,定义了一个名为/video/的位置(location),并启用了flv_live指令来启用伪流媒体功能。通过alias指令,将实际的视频文件路径设置为/path/to/video/files/。

注意:为了使用伪流媒体功能,需要确保服务器上已经安装了相应的模块,并且这些模块与Nginx版本兼容。此外,还需要将实际的视频文件放置在正确的路径下。

预定义变量- 6.2.4 -

Nginx预定义变量是Nginx服务器在处理请求时自动生成的变量,用于存储与请求相关的信息。这些预定义变量可以实现在配置文件中访问请求的特定部分,以便根据不同的请求条件进行相应的处理。

以下是一些常见的Nginx预定义变量:

  • $http_user_agent:存储客户端的User-Agent字符串,通常用于检测请求的来源设备和浏览器类型。

  • $remote_addr:存储客户端的IP地址。

  • $remote_port:存储客户端的端口号。

  • $remote_user:存储经过身份验证的用户名(如果启用了身份验证)。

  • $request:存储完整的请求行,包括请求方法、URL和协议版本。

  • $status:存储响应的状态码。

  • $body_bytes_sent:存储已发送给客户端的字节数。

  • $http_referer:存储请求的来源页面的URL(如果存在)。

  • $http_host:存储请求的主机名和端口号(如果指定了端口)。

  • $http_accept:存储客户端接受的媒体类型。

这些预定义变量可以在Nginx配置文件中的不同上下文中使用,例如在server块、location块或if指令中。可以使用这些变量来执行条件逻辑、重定向请求或设置响应头等操作。

SPDY和HTTP/2- 6.2.5 -

Nginx支持SPDY和HTTP/2协议,用于改进网页加载速度。

SPDY是一种由Google开发的协议,旨在通过压缩、优先级和多路复用等技术来提高网页加载速度。Nginx通过使用SPDY模块,可以在服务器上实现SPDY协议,从而提供更快的网页加载速度。

HTTP/2是继HTTP/1.1之后的最新版HTTP协议。它引入了许多改进,包括多路复用、头部压缩、服务器推送等,以提高网页加载速度和性能。Nginx通过使用HTTP/2模块,可以在服务器上实现HTTP/2协议,从而提供更快的网页加载速度和更好的性能。

要启用SPDY或HTTP/2协议,需要在Nginx配置文件中进行相应的设置。例如,要启用HTTP/2协议,可以在配置文件中添加以下行:

ssl_protocols TLSv1.2 TLSv1.3;    
ssl_prefer_server_ciphers on;

这些设置将启用HTTP/2协议,并确保服务器使用安全的加密套件。

注意:要使用SPDY或HTTP/2协议,需要确保服务器和客户端都支持这些协议。此外,还需要确保证书是有效的,并且支持相应的协议。

PHP-FPM- 6.2.6 -

Nginx与PHP-FPM(FastCGI Process Manager)的结合是一种常见的服务器配置,用于提供动态网页内容。

Nginx是一个高性能的HTTP和反向代理服务器,它能够处理静态文件和动态内容。而PHP-FPM是PHP FastCGI进程管理器,它负责处理PHP脚本的执行和与Nginx的通信。

通过将Nginx和PHP-FPM结合使用,可以实现以下功能:

  • 负载均衡:PHP-FPM可以作为反向代理服务器,将来自Nginx的请求分发到多个PHP进程上,实现负载均衡,提高服务器的处理能力。

  • 缓存:PHP-FPM可以通过缓存来减少对数据库和其他外部资源的访问,从而提高性能。

  • 动态内容处理:PHP-FPM负责处理PHP脚本的执行,生成动态内容,并将结果返回给Nginx。Nginx将结果返回给客户端。

  • 请求分发:Nginx可以根据不同的规则将请求分发到不同的PHP-FPM进程上,实现请求的路由和分发。

在配置Nginx与PHP-FPM时,需要在Nginx配置文件中添加与PHP-FPM的连接指令。例如,以下是一个示例配置:

server {  
    listen 80;  
    server_name example.com;  
      
    location / {  
        fastcgi_pass 127.0.0.1:9000; # PHP-FPM 进程地址和端口  
        fastcgi_index index.php; # 默认文件名  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 传递给 PHP 的文件路径  
        include fastcgi_params; # 其他参数  
    }  
}

在上述示例中,fastcgi_pass指令指定了PHP-FPM的地址和端口。fastcgi_index指令指定了默认的文件名。fastcgi_param指令用于传递其他参数给PHP-FPM。include fastcgi_params;指令包含了其他预定义的参数。

将Nginx和uWSGI结合- 6.2.7 -

将Nginx和uWSGI结合是一种常见的部署Python web应用程序的方法。下面是一般的步骤来将它们结合起来:

1. 安装Nginx和uWSGI:首先,确保服务器上已经安装了Nginx和uWSGI。可以使用适合操作系统的包管理器来安装它们。

2. 配置uWSGI:创建一个uWSGI配置文件,通常命名为uwsgi.ini。该文件包含有关如何运行uWSGI的信息,例如应用程序的路径、端口号等。

[uwsgi]  
module = your_app:app  # 指定应用程序的入口点  
master = true  
processes = 5  # 指定进程数量  
socket = /tmp/uwsgi.sock  # 指定socket文件路径  
chmod-socket = 660  # 设置socket文件的权限  
vacuum = true  # 清理空闲的socket文件  
die-on-term = true  # 在退出时清理资源

3. 启动uWSGI:使用以下命令启动uWSGI,并指向配置文件:

uwsgi --ini uwsgi.ini

4. 配置Nginx:在Nginx的配置文件中添加一个server块,以将请求代理到uWSGI。

server {  
    listen 80;  
    server_name example.com;  # 替换为实际的域名或IP地址  
      
    location / {  
        include uwsgi_params;  # 包含uWSGI的参数配置  
        uwsgi_pass unix:/tmp/uwsgi.sock;  # 指定uWSGI的socket文件路径  
    }  
}

5. 启动Nginx:使用以下命令启动Nginx:

nginx -t  # 测试配置文件是否正确      
nginx -s reload  # 重新加载配置文件以使更改生效

现在,Python web应用程序应该已经通过Nginx和uWSGI在运行了。