编程技术分享平台

网站首页 > 技术教程 正文

Nginx 的多功能性:适用于多种场景的 Web 服务器

xnh888 2024-09-10 22:51:06 技术教程 17 ℃ 0 评论

Nginx 是一款高度通用的 Web 服务器,可用于多种场景,包括作为静态内容服务、反向代理服务器、负载均衡器、API 网关、防火墙、媒体流服务器、VPN 网关和高可用性集群。它的灵活性和效率使其成为许多不同类型的 Web 应用程序和服务的流行选择。此外,Nginx 可以使用各种第三方模块轻松扩展和定制,使其更能适应特定的用例。

  1. 提供静态内容— 直接向客户端提供静态 HTML、CSS、JavaScript、图像、视频和其他文件,而不对其进行处理。
  2. 反向代理服务器— 将传入流量分发到多个后端服务器、缓存响应并处理 SSL/TLS 加密。
  3. 负载均衡器— 在多个服务器之间分配传入流量以提高性能和可用性。
  4. API 网关— 路由和管理 API 请求、处理身份验证和授权以及速率限制请求。
  5. Web 应用程序防火墙— 保护 Web 应用程序免受常见攻击,例如 SQL 注入、跨站点脚本攻击和 DDoS 攻击。
  6. 媒体流服务器— 流媒体文件,例如视频和音频文件。
  7. 虚拟专用网络 (VPN) 网关— 设置 VPN 网关以将远程客户端安全地连接到专用网络。
  8. 高可用性集群— 用作高可用性集群的前端,以提高可靠性和正常运行时间。

提供静态内容的配置

server {
    listen 80; 
    server_name example.com;

    # 定义静态文件存放的根目录
    root /var/www/example.com; 

    # 定义缓存选项以提高性能
    expires 1d; 
    add_header Cache-Control "public";

    # 直接将静态文件提供给客户端
    location / { 
        try_files $uri  $uri / =404; 
    } 
}
  • 在此配置中,Nginx 在端口 80 上侦听对域 example.com 的传入请求。root指令指定静态文件在服务器上存储的目录。
  • expires指令告诉 Nginx 将文件缓存一天以提高性能。该add_header指令向响应添加一个Cache-Control标头,告诉客户端也缓存文件。
  • location /块告诉 Nginx 将静态文件直接提供给客户端而不对其进行处理。该try_files指令检查所请求的文件是否存在,如果存在则提供该文件。如果文件不存在,则返回 404 错误。

2.将传入流量分发到多个后端服务器并处理 SSL/TLS 加密的反向代理服务器的配置

upstream backend {
    server backend1.example.com:8080;
    server backend2.example.com:8080;
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • 在此示例中,upstream块定义了一组将接收传入流量的后端服务器。这些server块定义如何处理传入的 HTTP 和 HTTPS 请求。
  • 第一个服务器块将所有传入的 HTTP 请求重定向到 HTTPS。第二个服务器块处理传入的 HTTPS 请求,并使用 proxy_pass 指令将它们传递到上游块中定义的后端服务器。
  • proxy_set_header 指令向传出请求添加附加标头,包括原始主机标头、客户端的真实 IP 地址和任何转发的 IP 地址。
  • 可以自定义此配置以适应不同的用例,包括负载平衡、缓存等。

3. 两台后端服务器负载均衡流量配置

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}
  • 在此配置中,http 块包含一个upstream块,它将后端服务器定义为 backend1.example.com 和 backend2.example.com。
  • 然后,server块定义负载均衡器本身的配置,在端口 80 上监听 example.com 的流量
  • location 块指定传入请求应代理到后端上游,并设置一些标头以向后端服务器提供有关客户端请求的信息。
  • 最后,error_page 和 location 块处理负载平衡过程中可能发生的错误。

4. API网关配置

http {
    upstream backend {
        server api1.example.com;
        server api2.example.com;
        server api3.example.com;
    }

    server {
        listen 80;
        server_name api.example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          # 可选:设置超时时间
            proxy_connect_timeout 10s;
            proxy_send_timeout 120s;
            proxy_read_timeout 120s;
        }
    }
}
  • 在此配置中,Nginx 充当由三台服务器组成的后端的 API 网关。
  • 对 api.example.com 的请求将使用 proxy_pass 指令代理到后端服务器。
  • proxy_set_header 指令用于设置传出请求的 Host、X-Real-IP 和 X-Forwarded-For 标头,后端服务器可能需要这些标头才能正确处理请求。
  • 其中包含可选的 proxy_connect_timeout、proxy_send_timeout 和 proxy_read_timeout 指令,用于设置代理连接的超时,以防止客户端将连接保持打开状态时间过长。

5. 防范 SQL 注入攻击

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      # 阻止SQL注入攻击
        if ($args ~* "(select|union|insert|update|delete|drop|create)") {
            return 403;
        }
    }
}
  • 在此示例中,if 语句检查请求参数中是否有常见的 SQL 注入关键字,如果找到匹配项,服务器将返回 403 Forbidden 响应以阻止攻击。
  • 这只是如何配置 Nginx 来保护 Web 应用程序免受攻击的示例之一。其他方法包括速率限制、IP 阻止和 SSL/TLS 加密。

6. 配置Nginx作为流媒体服务器

http {
    server {
        listen 80;
        server_name example.com;

# 媒体文件的位置
        location /media/ {
            alias /path/to/media/files/;
            autoindex on;
        }

# HLS(HTTP Live Streaming)文件的位置
        location /hls/ {
            alias /path/to/hls/files/;
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
# 启用CORS(跨源资源共享)
            add_header 'Access-Control-Allow-Origin' '*' always;
        }
    }
}

  • 此配置将 Nginx 设置为从 /path/to/media/files/ 目录提供媒体文件,并从 /path/to/hls/files/ 目录提供 HLS 文件。
  • HLS 是一种流行的流媒体协议,用于通过 HTTP 传输直播和点播视频内容。
  • autoindex on 指令启用媒体文件位置的目录列表,允许客户端浏览和下载单个文件。
  • types 指令指定 HLS 文件的 MIME 类型,清单文件为 m3u8,媒体段为 ts。
  • add_header 指令将 Access-Control-Allow-Origin 标头添加到 HLS 响应中,允许客户端访问来自不同域的资源。
  • 这对于可能托管在不同域上的网站和应用程序上的流式传输视频内容非常重要。

7. OpenVPN 服务器反向代理的配置

server {
    listen 443;
    server_name vpn.example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    location / {
        proxy_pass http://127.0.0.1:1194;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • 此配置侦听端口 443 并使用证书和密钥设置 SSL/TLS 加密。
  • 然后,它将流量代理到在本地主机端口 1194 上运行的 OpenVPN 服务器。 proxy_set_header 指令设置标头以将客户端信息传递到后端 OpenVPN 服务器。
  • 请注意,此配置假设 OpenVPN 服务器已设置并正在运行。
  • 此外,仔细配置和保护 OpenVPN 服务器以确保 VPN 网关的安全也很重要。

8. 配置 Nginx 作为反向代理以跨多个后端服务器分发传入流量

upstream backend {
    server 192.168.1.2;
    server 192.168.1.3;
    server 192.168.1.4;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • 在此配置文件中,upstream 块定义了 Nginx 将向其分发传入流量的一组后端服务器。
  • 本例中存在三台后端服务器,IP地址分别为192.168.1.2、192.168.1.3、192.168.1.4。
  • 服务器块侦听端口 80 并定义 example.com 服务器名称。 location 块定义了 Nginx 将请求代理到后端服务器的根位置。 proxy_pass 指令指定upstream块中定义的upstream组, proxy_set_header 指令将各种请求标头传递到后端服务器。
  • 通过此配置,example.com 域的传入流量将分布在后端上游组中的三个后端服务器上,从而为 Web 应用程序提供高可用性和更高的可靠性。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表