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

目录

引言

[Nginx 简介](#Nginx 简介)

[Nginx 的特点和优势](#Nginx 的特点和优势)

适用场景

[安装 Nginx](#安装 Nginx)

[在 Windows 上安装 Nginx](#在 Windows 上安装 Nginx)

[在 Linux (CentOS)上安装 Nginx](#在 Linux (CentOS)上安装 Nginx)

基本配置

[Nginx 配置文件结构](#Nginx 配置文件结构)

[启动、停止和重载 Nginx](#启动、停止和重载 Nginx)

基本的服务器块配置

处理静态文件

设置文档根目录

[配置 MIME 类型](#配置 MIME 类型)

优化静态文件服务

反向代理

反向代理概述

反向代理的优点:

配置反向代理服务器

负载均衡基本配置

负载均衡算法

[SSL/TLS 配置](#SSL/TLS 配置)

[获取 SSL 证书](#获取 SSL 证书)

[配置 HTTPS](#配置 HTTPS)

[强制 HTTPS 重定向](#强制 HTTPS 重定向)

完整配置示例

访问控制

[IP 地址白名单和黑名单](#IP 地址白名单和黑名单)

[IP 地址白名单](#IP 地址白名单)

[IP 地址黑名单](#IP 地址黑名单)

基于请求的访问控制

[基于请求的 URI 访问控制](#基于请求的 URI 访问控制)

基于请求方法的访问控制

日志管理

配置访问日志和错误日志

访问日志

错误日志

日志格式定制

日志分析工具

性能优化

缓存配置

[Gzip 压缩](#Gzip 压缩)

[Keep-Alive 设置](#Keep-Alive 设置)

安全性

基本安全配置

[防止 DDoS 攻击](#防止 DDoS 攻击)

安全性最佳实践

[使用 HTTPS](#使用 HTTPS)

[定期更新 Nginx](#定期更新 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](https://nginx.org/en/download.html "nginx: download")
  * 下载适合 Windows 的最新版本(通常是 `.zip` 文件)。
  * ![](https://i-blog.csdnimg.cn/direct/f7017d73086345b5b7177d5b0b024a0e.png)
* **解压缩**:

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

  * 打开命令提示符(cmd)。
  * 进入 Nginx 的安装目录:
  *

        start nginx

* **验证安装**:

  * 在浏览器中访问 [http://127.0.0.1:80/](http://127.0.0.1/ "http://127.0.0.1:80/"),如果看到 Nginx 欢迎页面,则安装成功。
  * ![](https://i-blog.csdnimg.cn/direct/1b88379f2fb3444e930e060c4437d289.png)
* **停止 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

    ![](https://i-blog.csdnimg.cn/direct/e3ebc4f6418c45749db112f6e40246e1.png)
* **打开浏览器,访问127.0.0.1**
  * ![](https://i-blog.csdnimg.cn/direct/2474208abb244a3a8656815dca7418eb.png)
* **要关闭 Nginx 服务**
  *

        sudo systemctl stop nginx

* **用 Nginx 的开机自启动**
  *

        sudo systemctl disable nginx

基本配置

### Nginx 配置文件结构

* ![](https://i-blog.csdnimg.cn/direct/4ee0cf2a39be4bf8aa1fe70b12d1ec51.png)
* ![](https://i-blog.csdnimg.cn/direct/4188394282ab461e9fcd352510033b61.png)
*

      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 中,可以通过 `root` 或 `alias` 指令设置文档根目录。假设你希望将文档根目录设置为 `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

* 查看错误日志
* 配置文件的正确缩进
  * 确保配置文件的格式和缩进正确,尤其是在 `server`、`location` 块中。

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

* 使用 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;  # 确保路径正确
        }
    }
}

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

相关推荐
运维&陈同学1 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!1 小时前
【Linux】进程状态
linux·运维
明明跟你说过2 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Mr_Xuhhh3 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
朝九晚五ฺ10 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe11 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒12 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
虚拟网络工程师13 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
墨鸦_Cormorant13 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker
BLEACH-heiqiyihu13 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器