自学内容网 自学内容网

一. nginx学习笔记 又长又臭篇幅

目录

引言

Nginx 简介

Nginx 的特点和优势

适用场景

安装 Nginx

在 Windows 上安装 Nginx

在 Linux (CentOS)上安装 Nginx

基本配置

Nginx 配置文件结构

启动、停止和重载 Nginx

基本的服务器块配置

处理静态文件

设置文档根目录

配置 MIME 类型

优化静态文件服务

反向代理

反向代理概述

反向代理的优点:

配置反向代理服务器

负载均衡基本配置

负载均衡算法

SSL/TLS 配置

获取 SSL 证书

配置 HTTPS

强制 HTTPS 重定向

完整配置示例

访问控制

IP 地址白名单和黑名单

IP 地址白名单

IP 地址黑名单

基于请求的访问控制

基于请求的 URI 访问控制

基于请求方法的访问控制

日志管理

配置访问日志和错误日志

访问日志

错误日志

日志格式定制

日志分析工具

性能优化

缓存配置

Gzip 压缩

Keep-Alive 设置

安全性

基本安全配置

防止 DDoS 攻击

安全性最佳实践

使用 HTTPS

定期更新 Nginx

限制访问控制

使用安全的文件权限

定期检查日志

常见问题与故障排除

常见错误代码及其含义

解决常见配置问题

调试技巧

案例: 


  • 引言

    • Nginx 简介

      • Nginx最初由 Igor Sysoev 开发,旨在解决 C10K 问题,即如何在单台服务器上同时处理一万多个并发连接。Nginx 采用事件驱动架构,相比传统的线程或进程模型,能够更有效地利用系统资源,实现高并发处理。
    • Nginx 的特点和优势

      • 高并发处理:使用事件驱动模型,能够处理大量并发连接,适合高流量网站。
      • 低内存消耗:相比其他服务器,Nginx 的内存占用较低,适合资源有限的环境。
      • 反向代理和负载均衡:支持多种负载均衡算法,能够将请求分发到多个后端服务器,提升网站的可用性和响应速度。
      • 灵活的配置:通过配置文件,用户可以轻松地定制 Nginx 的行为,满足不同需求。
      • 静态文件处理:对于静态文件,Nginx 的处理速度非常快,适合用作静态资源的服务器。
      • 安全性:支持 SSL/TLS 加密和防止 DDoS 攻击,增强网站的安全性。
    • 适用场景

      • 反向代理服务器:将请求转发到后端服务器(如应用服务器),以实现负载均衡和提高安全性。

      • 负载均衡:支持多种负载均衡算法(如轮询、IP 哈希等),可以将流量分配到多台后端服务器,提高系统的可用性和性能。

      • 静态文件服务:能够高效地提供静态资源(如图片、CSS、JavaScript 等),通常性能优于传统的应用服务器。

      • SSL/TLS 终端:处理 HTTPS 请求,卸载加密和解密的负担,减轻后端服务器的压力。

      • 内容缓存:可以缓存静态和动态内容,提高访问速度,减少后端负载。

      • API 网关:适用于微服务架构,作为 API 请求的入口,进行流量管理、认证和监控。

      • WebSocket 代理:支持 WebSocket 协议,适合需要实时通信的应用。

      • HTTP/2 支持:支持 HTTP/2 协议,提升网站的加载速度和用户体验。

  • 安装 Nginx

    • 在 Windows 上安装 Nginx

      • 下载 Nginx

        • 访问 nginx: download
        • 下载适合 Windows 的最新版本(通常是 .zip 文件)。
      • 解压缩

        • 将下载的 .zip 文件解压到您希望安装 Nginx 的目录(例如 D:\nginx)。
      • 运行 Nginx

        • 打开命令提示符(cmd)。
        • 进入 Nginx 的安装目录:
        • start nginx
      • 验证安装

      • 停止 Nginx

        • 在命令提示符中输入:(然后刷新浏览器就访问不到了)
        • nginx -s stop
    • 在 Linux (CentOS)上安装 Nginx

      • 安装 EPEL 仓库(Nginx 在 EPEL 中可用):
        • sudo yum install epel-release -y
          
      • 安装 Nginx
        • sudo yum install nginx -y
          
      • 启动 Nginx 服务
        • sudo systemctl start nginx
          
      • 设置 Nginx 开机自启动
        • sudo systemctl enable nginx
          
      • 检查 Nginx 是否运行
        • sudo systemctl status nginx
          

      • 打开浏览器,访问127.0.0.1
      • 要关闭 Nginx 服务
        • sudo systemctl stop nginx
          
      • 用 Nginx 的开机自启动
        • sudo systemctl disable nginx
          
  • 基本配置

    • Nginx 配置文件结构

      • user  nginx;  # 指定 Nginx 运行的用户
        worker_processes  auto;  # 自动设置工作进程数
        
        events {
            worker_connections  1024;  # 每个工作进程的最大连接数
        }
        
        http {
            include       mime.types;  # 包含 MIME 类型文件
            default_type  application/octet-stream;
        
            sendfile        on;  # 启用高效文件传输
            keepalive_timeout  65;  # 设置保持连接的超时时间
        
            # 定义服务器块
            server {
                listen       80;  # 监听的端口
                server_name  localhost;  # 服务器名
        
                location / {
                    root   /usr/share/nginx/html;  # 网站根目录
                    index  index.html index.htm;  # 默认首页文件
                }
            }
        }
        
    • 启动、停止和重载 Nginx

      • sudo systemctl start nginx  //启动
        sudo systemctl stop nginx   //停止
        sudo systemctl reload nginx  //重新加载
        sudo systemctl status nginx  //连接状态
        
        #windows 重新加载
        nginx -s reload
        
    • 基本的服务器块配置

      • server {
            listen 80;  # 监听 HTTP 请求
            server_name example.com www.example.com;  # 服务器名
        
            location / {
                root /var/www/html;  # 网站根目录
                index index.html index.htm;  # 默认首页
            }
        
            location /images/ {
                root /var/www;  # 指定子目录
            }
        
            # 错误页面配置
            error_page 404 /404.html;
            location = /404.html {
                internal;
            }
        
            # 反向代理示例
            location /api/ {
                proxy_pass http://backend_server;  # 代理到后端服务器
            }
        }
        
  • 处理静态文件

    • 设置文档根目录

      • 在 Nginx 中,可以通过 rootalias 指令设置文档根目录。假设你希望将文档根目录设置为 D:/tu,你可以这样配置:
      • server {
            listen       8072;
            server_name  localhost;
        
            location / {
                root   D:/tu;  # 设置文档根目录
                index  index.html;  # 默认首页文件
            }
        }
        
    • 配置 MIME 类型

      • Nginx 默认会加载 mime.types 文件来设置 MIME 类型。如果你需要为特定文件类型设置 MIME 类型,可以在 http 块中进行配置。例如:
      • http {
            include       mime.types;  # 加载 MIME 类型配置
            default_type  application/octet-stream;
        
            # 其他配置...
        }
        
      • 你可以在 mime.types 文件中找到常见文件扩展名的 MIME 类型,如下所示:

        text/html         html htm;
        text/css          css;
        text/javascript   js;
        image/jpeg        jpg jpeg;
        image/png         png;
        
    • 优化静态文件服务

      • 启用 sendfile:可以提高文件传输性能。
        • sendfile on;  # 启用高效文件传输
          
      • 使用 gzip 压缩:可以减少传输数据的大小。

        • gzip on;  # 启用 gzip 压缩
          gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
          
      • 设置缓存:为静态文件设置合理的缓存策略。

        • location / {
              expires 30d;  # 设置文件过期时间为30天
          }
  • 反向代理

    • 反向代理概述

      • 反向代理 是一种服务器,客户端请求不直接发送到目标服务器,而是发送到反向代理服务器。反向代理服务器接收请求,然后将其转发到适当的后端服务器。后端服务器的响应会通过反向代理返回给客户端。
      • 反向代理的优点:
        • 安全性:隐藏后端服务器的真实地址,增强安全性。
        • 负载均衡:可以将请求分配到多台后端服务器,以实现负载均衡,提高性能。
        • 缓存:反向代理可以缓存后端服务器的响应,减少对后端的请求压力。
        • SSL 终止:可以在反向代理服务器上处理 SSL 加密,简化后端服务器的配置。
    • 配置反向代理服务器

      • server {
            listen       80;  # 监听 80 端口
            server_name  zbr.com;  # 你的服务器域名或 IP 地址
        
            location /ceshi {
                proxy_pass http://192.68.1.11:7862;  # 将请求转发到目标服务
                proxy_set_header Host $host;  # 设置请求头
                proxy_set_header X-Real-IP $remote_addr;  # 转发客户端 IP
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 添加 X-Forwarded-For 头
                proxy_set_header X-Forwarded-Proto $scheme;  # 添加协议头
            }
        }
    • 负载均衡基本配置

      • http {
            upstream backend_servers {
                server backend1.example.com;  # 第一台后端服务器
                server backend2.example.com;  # 第二台后端服务器
                server backend3.example.com;  # 第三台后端服务器
            }
        
            server {
                listen       80;
                server_name  example.com;
        
                location / {
                    proxy_pass http://backend_servers;  # 将请求转发到负载均衡集群
                    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_set_header X-Forwarded-Proto $scheme;
                }
            }
        }
        
        负载均衡算法
        • 轮询(默认):按顺序将请求分配到每台后端服务器。

        • 权重:根据权重将请求分配到后端服务器。配置示例:

          • upstream backend_servers {
                server backend1.example.com weight=3;  # 权重为 3
                server backend2.example.com weight=1;  # 权重为 1
            }
            
        • IP 哈希:根据客户端 IP 地址将请求分配到特定后端服务器。配置示例:

          • upstream backend_servers {
                ip_hash;  # 启用 IP 哈希
                server backend1.example.com;
                server backend2.example.com;
            }
            
  • SSL/TLS 配置

    • 获取 SSL 证书

      • 网上买一个
    • 配置 HTTPS

      • server {
            listen 443 ssl;  # 启用 SSL
            server_name example.com www.example.com;  # 你的域名
        
            ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  # SSL 证书路径
            ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  # 私钥路径
        
            # 强化 SSL 配置(可选)
            ssl_protocols TLSv1.2 TLSv1.3;  # 启用 TLS 版本
            ssl_ciphers 'HIGH:!aNULL:!MD5';  # 设置密码套件
        
            location / {
                # 你的其他配置...
            }
        }
    • 强制 HTTPS 重定向

      • 如果你希望将所有 HTTP 请求重定向到 HTTPS,可以添加一个新的 server 块来处理 80 端口的请求:
      • server {
            listen 80;
            server_name example.com www.example.com;
        
            return 301 https://$host$request_uri;  # 强制重定向到 HTTPS
        }
        
    • 完整配置示例

      • # 强制 HTTP 到 HTTPS 重定向
        server {
            listen 80;
            server_name example.com www.example.com;
        
            return 301 https://$host$request_uri;  # 强制重定向到 HTTPS
        }
        
        # HTTPS 配置
        server {
            listen 443 ssl;
            server_name example.com www.example.com;
        
            ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  # SSL 证书路径
            ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  # 私钥路径
        
            # 强化 SSL 配置
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers 'HIGH:!aNULL:!MD5';
        
            location / {
                # 你的其他配置...
            }
        }
        
  • 访问控制

    • IP 地址白名单和黑名单

      • IP 地址白名单
        server {
            listen       80;
            server_name  example.com;
        
            location / {
                allow 192.168.1.100;  # 允许的 IP 地址
                allow 192.168.1.101;  # 另一个允许的 IP 地址
                deny all;  # 拒绝其他所有访问
            }
        }
        
        IP 地址黑名单
        • server {
              listen       80;
              server_name  example.com;
          
              location / {
                  deny 192.168.1.200;  # 拒绝的 IP 地址
                  deny 192.168.1.201;  # 另一个拒绝的 IP 地址
                  allow all;  # 允许其他所有访问
              }
          }
          
    • 基于请求的访问控制

      • 基于请求的 URI 访问控制
        • server {
              listen       80;
              server_name  example.com;
          
              location /admin {
                  allow 192.168.1.100;  # 仅允许特定 IP 地址访问
                  deny all;  # 拒绝其他访问
              }
          }
          
      • 基于请求方法的访问控制
        • server {
              listen       80;
              server_name  example.com;
          
              location /api {
                  limit_except GET {
                      deny all;  # 只允许 GET 请求,拒绝其他方法
                  }
              }
          }
          
  • 日志管理

    • 配置访问日志和错误日志

      • 访问日志
        • Nginx 默认会记录访问日志,可以在 http 或 server 块中进行配置。例如:
          
          http {
              access_log /var/log/nginx/access.log;  # 访问日志文件路径
              # 其他配置...
          }
          
      • 错误日志
        • 错误日志的配置类似,可以在 http 或 server 块中进行配置:
          
          http {
              error_log /var/log/nginx/error.log;  # 错误日志文件路径
              error_log /var/log/nginx/error.log warn;  # 设置日志级别为 warn
              # 其他配置...
          }
          
    • 日志格式定制

      • http {
            log_format custom_format '$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 custom_format;  # 使用自定义格式
        }
        
      • $remote_addr:客户端 IP 地址
      • $remote_user:用户认证信息
      • $time_local:访问时间
      • $request:请求行
      • $status:HTTP 状态码
      • $body_bytes_sent:发送的字节数
      • $http_referer:来源地址
      • $http_user_agent:客户端用户代理
      • $http_x_forwarded_for:转发的客户端 IP(如果存在)
    • 日志分析工具

      • GoAccess
      • AWStats
  • 性能优化

    • 缓存配置

      • 静态文件缓存
        • 可以通过 expires 指令配置静态文件的缓存时间。例如,设置缓存图片、CSS 和 JS 文件:

          location / {
              expires 30d;  # 缓存 30 天
              add_header Cache-Control "public, max-age=2592000";  # 设置 Cache-Control 头
          }
          
      • 代理缓存
        • 如果 Nginx 作为反向代理,你可以配置代理缓存来提高性能:

          http {
              proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
          
              server {
                  listen 80;
                  server_name example.com;
          
                  location /api {
                      proxy_pass http://backend_server;
                      proxy_cache my_cache;  # 启用代理缓存
                      proxy_cache_valid 200 60m;  # 缓存 200 响应 60 分钟
                  }
              }
          }
          
    • Gzip 压缩

      • 启用 Gzip 压缩可以减少传输数据的大小,提高网站加载速度。可以在 http 块中配置:

        http {
            gzip on;  # 启用 Gzip 压缩
            gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;  # 压缩的 MIME 类型
            gzip_min_length 1000;  # 最小压缩长度
            gzip_vary on;  # 支持代理缓存
        }
        
    • Keep-Alive 设置

      • Keep-Alive 允许客户端与服务器之间保持持久连接,减少重复连接的开销。可以在 http 块中配置:
      • http {
            keepalive_timeout 65;  # 设置 Keep-Alive 超时时间
            keepalive_requests 100;  # 最大请求数
        }
        
  • 安全性

    • 基本安全配置

      • 关闭不必要的 HTTP 方法
        • server {
              listen 80;
              server_name example.com;
          
              location / {
                  limit_except GET POST {
                      deny all;  # 只允许 GET 和 POST 方法
                  }
              }
          }
          
      • 隐藏 Nginx 版本信息
        • http {
              server_tokens off;  # 隐藏版本信息
          }
          
      • 限制请求速率
        • http {
              limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  # 每个 IP 每秒最多 1 个请求
          
              server {
                  listen 80;
                  server_name example.com;
          
                  location / {
                      limit_req zone=one burst=5;  # 突发请求数为 5
                      # 其他配置...
                  }
              }
          }
          
    • 防止 DDoS 攻击

      • 使用防火墙
      • 使用 Nginx 的限制模块
        • http {
              limit_conn_zone $binary_remote_addr zone=addr:10m;  # 每个 IP 地址的连接数限制
          
              server {
                  listen 80;
                  server_name example.com;
          
                  location / {
                      limit_conn addr 10;  # 每个 IP 地址最多 10 个连接
                      # 其他配置...
                  }
              }
          }
          

    • 安全性最佳实践

      • 使用 HTTPS

        强烈建议使用 SSL/TLS 来加密数据传输,保护用户信息。参考之前的 SSL/TLS 配置。

        定期更新 Nginx

        确保 Nginx 和操作系统保持最新,及时修补已知的安全漏洞。

        限制访问控制

        使用 IP 白名单和黑名单来限制访问敏感区域,例如管理面板。

        使用安全的文件权限

        确保 Nginx 配置文件和相关目录的权限设置正确,避免未授权访问。

        定期检查日志

        定期检查 Nginx 访问日志和错误日志,发现异常活动并采取相应措施。

  • 常见问题与故障排除

    • 常见错误代码及其含义

      • 400 Bad Request: 客户端请求无效,可能是请求语法错误或请求数据缺失。
      • 401 Unauthorized: 请求需要身份验证,客户端未提供有效的凭证。
      • 403 Forbidden: 服务器拒绝请求,可能是由于权限设置或文件/目录的访问控制。
      • 404 Not Found: 请求的资源未找到,可能是 URL 错误或文件不存在。
      • 405 Method Not Allowed: 请求方法不被允许,可能是服务器配置错误。
      • 500 Internal Server Error: 服务器内部错误,通常是代码或配置问题。
      • 502 Bad Gateway: Nginx 作为反向代理时,后端服务器不可用或返回错误。
      • 504 Gateway Timeout: Nginx 作为反向代理时,后端服务器超时未响应。
    • 解决常见配置问题

      • 检查 Nginx 配置文件
        • nginx -t
      • 查看错误日志
      • 配置文件的正确缩进
        • 确保配置文件的格式和缩进正确,尤其是在 serverlocation 块中。

      • 资源路径问题
        • 确保静态文件和资源的路径正确配置,使用绝对路径时要注意格式和拼写。

    • 调试技巧

      • 使用 Nginx 的调试日志
        • error_log /var/log/nginx/error.log debug;
          
      • 清理缓存
      • 测试不同配置
        • 在调试时,可以逐步注释掉部分配置,查看问题是否得到解决。

                ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

案例: 

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/', methods=['GET'])
def success():
    return jsonify({"port+": "9082"}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9082)  # 监听所有可用的接口,端口
worker_processes 1;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;

    sendfile on;
    keepalive_timeout 65;

    upstream flask_app {
        server 127.0.0.1:9081;  # 第一个后端服务
        server 127.0.0.1:9082;  # 第二个后端服务
    }

    server {
        listen 8072;
        server_name localhost;

        location / {
            proxy_pass http://flask_app;  # 使用 upstream 组
            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_set_header X-Forwarded-Proto $scheme;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root D:/tu/nginx-1.26.2/nginx-1.26.2/html;  # 确保路径正确
        }
    }
}

这样 你每次 刷新浏览器 就会在不同程序上返回了


原文地址:https://blog.csdn.net/pasaxiaorui/article/details/143366819

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!