程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 高性能服务器 - Nginx

    • Nginx - 介绍
    • Nginx - 环境准备
    • Nginx - 基础指令
    • Nginx - 核心配置文件
    • Nginx - 配置文件详解
      • 1. Nginx 请求处理顺序
      • 2. location 指令的匹配规则
      • 3. proxy_pass 指令的使用与场景详解
        • 3.1. 基本用法
        • 3.2. URI 处理规则
        • 1. 带路径的 proxy_pass
        • 2. 不带路径的 proxy_pass
        • 3. 特殊情况/
        • 3.3.^~ /api/、/api 与 /api/ 的区别
        • 1. location ^~ /api/
        • 2. location /api
        • 3. location /api/
        • 3.4. 使用变量进行动态代理
        • 3.5. 支持 HTTPS 的反向代理
        • 3.6. 设置请求头
        • 3.7. WebSocket 代理
        • 3.8. 负载均衡配置
        • 3.9. 超时与重试策略
      • 4. HTTPS 重定向配置
        • 4.1. 重定向的端口配置
        • 4.2. 80 和 443 端口的特殊性
        • 4.3. 重定向的实践建议
      • 5. Nginx HTTP 配置示例
      • 6. Nginx HTTPS 配置示例
        • 可选配置与可修改配置
    • Nginx - 配置巩固实例
    • Nginx - 静态资源部署
    • Nginx - 静态资源访问
    • Nginx - 反向代理
    • Nginx - 负载均衡
    • Nginx - 缓存集成
    • Nginx - 部署与集群
    • Nginx - 站点与认证
    • Nginx - 下载站点及美化
    • Nginx - Lau学习
    • Nginx - Lua扩展模块
    • Nginx - Lua模块文档表
    • Nginx - 自定义镜像
  • 项目部署

  • 服务器
  • 高性能服务器 - Nginx
scholar
2024-08-15
目录

Nginx - 配置文件详解

# Nginx - 配置详解

前言

Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛应用于 Web 服务器、反向代理、负载均衡、内容缓存等场景。本节将详细介绍 Nginx 的配置、请求处理顺序、location 指令的匹配规则,以及 proxy_pass 指令的用法。


# 1. Nginx 请求处理顺序

Nginx 处理请求的顺序如下:

  1. 监听端口:

    • Nginx 根据配置文件中的 listen 指令监听特定的端口,如 80(HTTP)和 443(HTTPS)。这是 Nginx 处理请求的第一步。
    • 例如,如果配置文件中有多个 server 块监听同一端口,Nginx 会继续根据请求的主机名(Host header)来区分处理。
  2. 匹配主机名(域名):

    • Nginx 根据请求中的主机名(例如 Host: example.com)匹配对应的 server_name 指令。如果多个 server 块匹配相同的主机名,Nginx 会使用配置文件中第一个匹配的 server 块。
    • 这一步是为了确定具体使用哪个 server 块来处理请求。
  3. 匹配 location:

    • 在选定的 server 块中,Nginx 会根据 location 指令进一步匹配请求的 URI(即请求路径)。
    • location 指令有一套复杂的匹配规则(详见下文),用于确定如何处理请求。例如,请求 /api/v1/resource 可能匹配到 location /api/。
  4. 请求处理:

    • Nginx 根据匹配到的 location 规则处理请求。这可能涉及到静态文件的提供、反向代理到后端服务器、URL 重写等操作。

# 2. location 指令的匹配规则

location 指令用于定义如何处理特定路径的请求。Nginx 支持多种类型的 location 匹配方式,匹配的优先级如下:

  1. 精确匹配 (=):

    • 格式:location = /exact/path { ... }
    • 说明:仅当请求的 URI 与指定路径完全相同时才会匹配。适用于对特定路径的精确控制。
  2. 前缀匹配 (^~):

    • 格式:location ^~ /static/ { ... }
    • 说明:如果请求的 URI 以指定路径为前缀,并且找到了匹配项,则直接使用此规则,不再继续进行正则匹配。适用于对某个目录下所有资源的匹配。
  3. 正则表达式匹配 (~ 和 ~*):

    • 区分大小写的正则匹配:location ~ /regex/ { ... }
    • 不区分大小写的正则匹配:location ~* /regex/ { ... }
    • 说明:使用正则表达式匹配请求的 URI,并且在找到第一个匹配项后立即使用,不再继续匹配。适用于复杂的 URI 模式匹配。
  4. 前缀匹配(默认方式):

    • 格式:location /prefix/ { ... }
    • 说明:如果请求的 URI 以指定路径为前缀,且没有更优先级的规则匹配,则使用此规则。Nginx 默认按这种方式进行匹配。

Nginx 会按照上述优先级顺序依次匹配 location,找到最合适的规则后停止匹配并处理请求。


# 3. proxy_pass 指令的使用与场景详解

proxy_pass 是 Nginx 实现反向代理功能的核心指令。它将客户端的请求转发给另一个服务器,并将后端服务器的响应返回给客户端。以下是 proxy_pass 的使用方法及各种应用场景。

# 3.1. 基本用法

location /api/ {
    proxy_pass http://backend.example.com;
}
1
2
3

在这个配置中,所有 /api/ 下的请求都会被代理到 http://backend.example.com。Nginx 会转发请求,并将后端服务器的响应返回给客户端。

# 3.2. URI 处理规则

# 1. 带路径的 proxy_pass

  • 规则:如果 proxy_pass 后面指定了一个路径(例如 http://backend.example.com/app/),Nginx 会将匹配的 location 部分从客户端请求的 URI 中移除,并将剩余部分附加到 proxy_pass 后面的路径上。

  • 举例:

    location /api/ {
        proxy_pass http://backend.example.com/app/;
    }
    
    1
    2
    3
    • 客户端请求:http://nginx-server/api/get-data
    • Nginx 处理:
      • 匹配到 location /api/
      • 移除 /api/,剩下 /get-data
      • 将 /get-data 附加到 proxy_pass 指定的路径 /app/
    • 最终请求:http://backend.example.com/app/get-data

# 2. 不带路径的 proxy_pass

  • 规则:如果 proxy_pass 后面没有指定路径(例如 http://backend.example.com),Nginx 会将匹配的 location 部分保留,并直接将整个请求 URI 转发给后端服务器。

  • 举例:

    location /api/ {
        proxy_pass http://backend.example.com;
    }
    
    1
    2
    3
    • 客户端请求:http://nginx-server/api/get-data
    • Nginx 处理:
      • 匹配到 location /api/
      • 不移除 /api/,保留完整的请求 URI
    • 最终请求:http://backend.example.com/api/get-data

# 3. 特殊情况/

  • 域名或 IP 后面有 /:
    • 如果 proxy_pass 指令后面包含一个 /,即使没有指定路径,也会被视为带路径的情况。例如:

      proxy_pass http://backend.example.com/;
      
      1
    • 在这种情况下,即使没有额外的路径部分(如 app/),Nginx 仍会将匹配的 location 部分从 URI 中移除,然后将剩余部分附加到后面的 /。

    • 举例:

      location /api/ {
          proxy_pass http://backend.example.com/;
      }
      
      1
      2
      3
      • 客户端请求:http://nginx-server/api/get-data
      • Nginx 处理:
        • 匹配到 location /api/
        • 移除 /api/,剩下 /get-data
      • 最终请求:http://backend.example.com/get-data

总结来说,proxy_pass 后面如果带有路径(包括一个单独的 /),Nginx 会替换 location 部分并附加剩余 URI。如果没有路径,Nginx 则保留 location 匹配的 URI 部分并直接转发给后端。

# 3.3.^~ /api/、/api 与 /api/ 的区别

# 1. location ^~ /api/

  • 匹配方式:前缀匹配,但优先级高于正则表达式匹配。

  • 匹配规则:location ^~ /api/ 表示当请求 URI 以 /api/ 开头时,Nginx 会立即使用这个配置块,而不会再继续尝试其他更低优先级的匹配(包括正则表达式匹配)。

  • 使用场景:适用于希望匹配某个路径前缀,并且避免其他复杂匹配规则(如正则)的情况。通常用于排除一些细粒度的匹配规则。

  • 匹配示例:

    • http://example.com/api/
    • http://example.com/api/v1/get-data
  • 不会匹配:

    • http://example.com/api(因为少了斜杠 /)
    • http://example.com/apitest

# 2. location /api

  • 匹配方式:普通的前缀匹配。

  • 匹配规则:location /api 表示匹配所有以 /api 开头的 URI。它的优先级低于 ^~ 和精确匹配(=),但高于正则表达式匹配。

  • 使用场景:适用于匹配所有 /api 开头的请求路径,灵活且广泛。

  • 匹配示例:

    • http://example.com/api
    • http://example.com/api/get-data
    • http://example.com/api/v1/
  • 不会匹配:

    • http://example.com/apitest

# 3. location /api/

  • 匹配方式:普通的前缀匹配。

  • 匹配规则:location /api/ 仅匹配以 /api/ 开头的 URI。比 location /api 更严格,因为它不匹配 /api 本身,只匹配带斜杠 / 的路径。

  • 使用场景:适用于需要明确区分 /api 和 /api/ 的情况,确保匹配到的是一个路径而非类似 /api 这样的资源。

  • 匹配示例:

    • http://example.com/api/
    • http://example.com/api/v1/get-data
  • 不会匹配:

    • http://example.com/api
    • http://example.com/apitest

实际开发建议

  • 开始时使用宽泛匹配:在开发的早期阶段,使用 location /api 这样的宽泛匹配规则可以更快地进行测试和开发。
  • 根据需求调整:随着项目的发展,了解了具体的路径需求后,可以逐步引入更严格的匹配规则(如 ^~ 或 /api/),以提高精确性和性能。

# 3.4. 使用变量进行动态代理

proxy_pass 可以结合 Nginx 的变量使用,动态决定代理目标:

location /api/ {
    set $backend "http://backend1.example.com";  # 设置默认的后端服务器地址。
    if ($request_uri ~* "/api/v2/") {            # 如果请求的 URI 匹配 "/api/v2/"(不区分大小写)。
        set $backend "http://backend2.example.com"; # 将后端服务器地址更改为 backend2。
    }
    proxy_pass $backend;  # 将请求代理到动态设置的后端服务器。
}
1
2
3
4
5
6
7

在这个例子中,Nginx 会根据请求的 URI 动态选择后端服务器。这种方式适用于多后端服务的场景。

# 3.5. 支持 HTTPS 的反向代理

Nginx 支持代理 HTTPS 请求:

location /api/ {
    proxy_pass https://backend.example.com;  # 将请求代理到支持 HTTPS 的后端服务器。
}
1
2
3

在这个配置中,Nginx 会与后端服务器建立安全的 TLS 连接,从而安全地转发请求和响应。

# 3.6. 设置请求头

在代理请求时,Nginx 通常会设置一些 HTTP 请求头,以传递客户端的相关信息给后端服务器:

location /api/ {
    proxy_pass http://backend.example.com;   # 将请求代理到后端服务器。
    proxy_set_header Host $host;             # 设置 Host 请求头,传递客户端请求的主机信息。
    proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 请求头,传递客户端的真实 IP 地址。
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Forwarded-For 请求头,传递客户端和代理链的 IP 地址。
}
1
2
3
4
5
6
  • Host:传递客户端请求的主机信息。
  • X-Real-IP:传递客户端的真实 IP 地址。
  • X-Forwarded-For:传递客户端和代理链的 IP 地址。

这些设置对于后端服务器了解请求来源非常重要,尤其是在负载均衡和日志记录中。

# 3.7. WebSocket 代理

代理 WebSocket 时,需要配置连接升级(Upgrade)和保持连接(Connection):

location /ws/ {
    proxy_pass http://backend.example.com;      # 将 WebSocket 请求代理到后端服务器。
    proxy_http_version 1.1;                     # 设置 HTTP 协议版本为 1.1,这是 WebSocket 必需的。
    proxy_set_header Upgrade $http_upgrade;     # 设置 Upgrade 请求头,支持 WebSocket 的协议升级。
    proxy_set_header Connection "upgrade";      # 设置 Connection 请求头,保持连接,WebSocket 必需。
    proxy_set_header Host $host;                # 设置 Host 请求头,传递客户端的主机信息。
}
1
2
3
4
5
6
7

WebSocket 连接需要 HTTP/1.1 协议支持,并且必须配置 Upgrade 和 Connection 请求头,Nginx 才能正确代理 WebSocket 流量。

# 3.8. 负载均衡配置

proxy_pass 可以与 upstream 指令结合,实现负载均衡:

upstream backend {
    server backend1.example.com;  # 定义第一个后端服务器。
    server backend2.example.com;  # 定义第二个后端服务器。
}

location /api/ {
    proxy_pass http://backend;    # 将请求代理到 `upstream` 定义的服务器组,进行负载均衡。
}
1
2
3
4
5
6
7
8

在这个配置中,Nginx 会根据负载均衡算法,将请求分配到不同的后端服务器,常用的算法包括轮询(默认)、最少连接数等。

# 3.9. 超时与重试策略

为代理请求设置超时和重试策略,有助于提升服务的稳定性:

location /api/ {
    proxy_pass http://backend.example.com;      # 将请求代理到后端服务器。
    proxy_connect_timeout 5s;                   # 设置与后端服务器建立连接的超时时间为 5 秒。
    proxy_send_timeout 10s;                     # 设置发送请求到后端服务器的超时时间为 10 秒。
    proxy_read_timeout 10s;                     # 设置从后端服务器读取响应的超时时间为 10 秒。
}
1
2
3
4
5
6
  • proxy_connect_timeout:与后端服务器建立连接的超时时间。如果在指定时间内无法建立连接,Nginx 会终止请求。
  • proxy_send_timeout:发送请求到后端服务器的超时时间。如果在指定时间内无法发送完请求数据,Nginx 会终止请求。
  • proxy_read_timeout:从后端服务器读取响应的超时时间。如果在指定时间内无法接收响应数据,Nginx 会终止请求。

这些超时设置可以有效避免后端服务不可用时,Nginx 长时间等待导致的资源浪费。


# 4. HTTPS 重定向配置

为了确保所有 HTTP 请求都通过 HTTPS 安全传输,可以配置 Nginx 自动重定向 HTTP 请求到 HTTPS。以下是常见的 HTTPS 重定向配置示例:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
1
2
3
4
5

在这个配置中,Nginx 监听 80 端口(HTTP),并将所有请求重定向到 HTTPS(443 端口)。这种配置非常常见,用于确保所有流量都通过 HTTPS 加密传输。

# 4.1. 重定向的端口配置

  • 自定义端口重定向:你可以指定任意端口来监听 HTTP 请求并进行重定向。例如:

    server {
        listen 8080;
        server_name example.com;
        return 301 https://$host$request_uri;
    }
    
    1
    2
    3
    4
    5

    在这个例子中,Nginx 监听 8080 端口,并将请求重定向到 HTTPS。这种配置适用于需要在特定端口处理 HTTP 请求的场景。

  • 统一管理端口:通常情况下,所有 HTTP 请求都在 80 端口监听,通过简单配置即可重定向到 HTTPS。例如:

    server {
        listen 80;
        server_name example.com;
        return 301 https://$host$request_uri;
    }
    
    1
    2
    3
    4
    5

    这种配置可以简化管理,用户在浏览器中输入域名时,默认通过 80 端口访问,然后自动重定向到 HTTPS。

# 4.2. 80 和 443 端口的特殊性

  • 80 端口:是 HTTP 的默认端口。如果在浏览器中输入 http://example.com,浏览器会默认使用 80 端口。因此,通常不需要显式写出 :80。

  • 443 端口:是 HTTPS 的默认端口。如果在浏览器中输入 https://example.com,浏览器会默认使用 443 端口,因此通常也不需要显式写出 :443。

# 4.3. 重定向的实践建议

对于大多数网站,建议所有重定向监听块都使用 80 端口,这样可以确保所有 HTTP 请求都被正确重定向到 HTTPS,并简化配置管理。


# 5. Nginx HTTP 配置示例

  • 监听 80 端口:默认情况下,HTTP 协议使用端口 80。因此,配置 listen 80; 表示 Nginx 会监听所有发往端口 80 的请求。
  • 监听其他非默认端口:除了 80 端口外,Nginx 也可以配置监听其他端口,比如 8080。在这种情况下,客户端需要显式地在 URL 中指定端口号(例如 http://example.com:8080)。
  • WebSocket 配置:Nginx 支持 WebSocket,配置时需要注意设置 proxy_http_version 1.1,以及 Upgrade 和 Connection 头部,以支持协议升级。
  • 如果是基于docker部署的,内部监听的什么端口号是无所谓的,最终我们都需要把这些端口号对外部进行一个映射,真正访问的是容器外部映射的端口。

image-20241230002509486
























 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 


events {
    worker_connections  1024;  # 设置最大连接数,即Nginx可以同时处理的最大连接数(可修改)。
}

http {
    include       mime.types;                 # 引入 MIME 类型定义文件,确定不同文件的 Content-Type。
    default_type  application/octet-stream;   # 设置默认的 MIME 类型(可修改,如果文件类型未知则使用此类型)。

    sendfile        on;                       # 开启高效文件传输模式(可选,建议开启以提高文件传输效率)。
    keepalive_timeout  65;                    # 设置客户端连接保持时间(单位:秒,可修改,通常设置为60秒或更长)。

    client_max_body_size     50m;             # 设置客户端上传文件的最大允许大小(可修改,默认单位为M字节)。
    client_body_buffer_size  10m;             # 设置客户端请求体缓存区的大小(可修改,缓存区大小决定了请求体可暂存的大小)。
    client_header_timeout    1m;              # 设置客户端请求头超时时间(可修改,超过此时间则断开连接)。
    client_body_timeout      1m;              # 设置客户端请求体超时时间(可修改,超过此时间则断开连接)。

    gzip on;                                  # 开启 Gzip 压缩(可选,建议开启以减少传输数据量)。
    gzip_min_length  1k;                      # 设置进行 Gzip 压缩的最小文件长度(可修改,小于该大小的文件不会被压缩)。
    gzip_buffers     4 16k;                   # 设置 Gzip 压缩使用的缓冲区大小(可修改,决定了每次压缩时使用的内存)。
    gzip_comp_level  4;                       # 设置 Gzip 压缩等级(可修改,1-9 级别,数值越大压缩效果越好,但消耗CPU资源越多)。
    gzip_types text/plain application/javascript text/css; # 设置 Gzip 压缩的文件类型(可修改,指定哪些文件类型应该被压缩)。
    gzip_vary on;                             # 开启 Gzip Vary 头部支持(可选,建议开启以支持基于不同请求头的缓存策略)。

    # 监听 80 端口的服务器配置
    server {
        listen 80;                            # 监听默认的 HTTP 端口 80。
        server_name example.com www.example.com; # 定义主机名(可修改为你的域名,多个主机名用空格分隔)。

        # 网站的根目录配置
        location / {
            root /var/www/html;               # 设置网站的根目录(可修改为你的目录,指向网站文件存放的位置)。
            index index.html index.htm;       # 设置默认的首页文件(可修改,Nginx会首先查找这些文件)。
        }
        
        # 代理 /api/ 路径的请求到后端服务器
        location ^~ /api/ {		
            proxy_pass http://服务器ip:8080/;  # 将所有 /api/ 开头的请求代理到指定的后端服务器(可修改)。
            proxy_set_header   Host             $host;              # 设置 Host 请求头,传递客户端请求的主机信息(可选)。
            proxy_set_header   X-Real-IP        $remote_addr;        # 设置 X-Real-IP 请求头,传递客户端的真实 IP 地址(可选)。
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; # 设置 X-Forwarded-For 请求头,传递客户端和代理链的 IP 地址(可选)。
        }

        # WebSocket 配置示例
        location /websocket/ {
            proxy_pass http://127.0.0.1:8080;  # 将 WebSocket 请求代理到后端服务器(可修改)。
            proxy_http_version 1.1;            # 设置 HTTP 协议版本为 1.1(WebSocket 必须)。
            proxy_set_header Upgrade $http_upgrade;  # 支持 WebSocket 的协议升级(必需)。
            proxy_set_header Connection "upgrade";   # 保持连接(必需,WebSocket 必须)。
            proxy_set_header Host $host;             # 设置 Host 请求头,传递客户端的主机信息(可选)。
        }
    }

    # 其他非默认端口的服务器配置
    server {
        listen 8080;                          # 监听非默认的 HTTP 端口 8080(可修改)。
        server_name api.example.com;          # 定义另一个主机名(可修改为你的域名)。

        # 接口服务的根目录配置
        location / {
            root /var/www/api;                # 设置接口服务的根目录(可修改为你的目录)。
            index index.html index.htm;       # 设置默认的首页文件(可修改,通常用来返回API文档或者静态页面)。
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 6. Nginx HTTPS 配置示例

  • 监听 443 端口:默认情况下,HTTPS 协议使用端口 443。因此,配置 listen 443 ssl; 表示 Nginx 会监听所有发往端口 443 的 HTTPS 请求。
  • HTTPS 重定向:为了强制用户使用 HTTPS,可以在 80 端口上配置重定向,将所有 HTTP 请求重定向到 HTTPS。例如,将 http://example.com 重定向到 https://example.com。
  • WebSocket 配置:HTTPS 下的 WebSocket 配置与 HTTP 基本相同,只是需要确保在 proxy_pass 中使用 HTTPS URL。
























 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


events {
    worker_connections  1024;  # 设置最大连接数,即Nginx可以同时处理的最大连接数(可修改)。
}

# HTTPS 配置部分
http {
    include       mime.types;                 # 引入 MIME 类型定义文件,确定不同文件的 Content-Type。
    default_type  application/octet-stream;   # 设置默认的 MIME 类型(可修改)。

    sendfile        on;                       # 开启高效文件传输模式(可选,建议开启)。
    keepalive_timeout  65;                    # 设置客户端连接保持时间(单位:秒,可修改)。

    client_max_body_size     50m;             # 设置客户端上传文件的最大允许大小(可修改)。
    client_body_buffer_size  10m;             # 设置客户端请求体缓存区的大小(可修改)。
    client_header_timeout    1m;              # 设置客户端请求头超时时间(可修改)。
    client_body_timeout      1m;              # 设置客户端请求体超时时间(可修改)。

    gzip on;                                  # 开启 Gzip 压缩(可选,建议开启)。
    gzip_min_length  1k;                      # 设置进行 Gzip 压缩的最小文件长度(可修改)。
    gzip_buffers     4 16k;                   # 设置 Gzip 压缩使用的缓冲区大小(可修改)。
    gzip_comp_level  4;                       # 设置 Gzip 压缩等级(可修改,1-9 级别)。
    gzip_types text/plain application/javascript text/css; # 设置 Gzip 压缩的文件类型(可修改)。
    gzip_vary on;                             # 开启 Gzip Vary 头部支持(可选,建议开启)。

    # 监听 443 端口的 HTTPS 服务器配置
    server {
        listen 443 ssl;                        # 监听 HTTPS 默认端口 443。
        server_name example.com www.example.com; # 定义主机名(可修改为你的域名)。

        # SSL 证书配置
        ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL 证书路径(可修改为你的路径)。
        ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 证书密钥路径(可修改为你的路径)。
        ssl_session_timeout 5m;                # 设置 SSL 会话超时时间(可修改)。
        ssl_ciphers HIGH:!aNULL:!MD5;          # 设置 SSL 加密算法(可修改)。
        ssl_protocols TLSv1.2 TLSv1.3;         # 设置支持的 SSL/TLS 协议版本(可修改)。
        ssl_prefer_server_ciphers on;          # 优先使用服务器的加密算法(可选,建议开启)。

        # 网站的根目录配置
        location / {
            root /var/www/html;               # 设置网站的根目录(可修改为你的目录)。
            index index.html index.htm;       # 设置默认的首页文件(可修改)。
        }

        # WebSocket 配置示例
        location /websocket/ {
            proxy_pass http://127.0.0.1:8080; # 将 WebSocket 请求代理到后端服务器(可修改)。
            proxy_http_version 1.1;           # 设置 HTTP 协议版本为 1.1(可选,WebSocket 必须)。
            proxy_set_header Upgrade $http_upgrade; # 支持 WebSocket 的协议升级。
            proxy_set_header Connection "upgrade";  # 保持连接(WebSocket 必须)。
            proxy_set_header Host $host;            # 传递主机头信息(可选)。
        }
    }

    # HTTPS 重定向配置
    server {
        listen 80;                             # 监听 HTTP 默认端口 80。
        server_name example.com www.example.com; # 定义主机名(可修改为你的域名)。

        # 重定向到 HTTPS
        location / {
            return 301 https://$host$request_uri; # 强制将所有请求重定向到 HTTPS。
        }
    }

    # 其他非默认端口的 HTTPS 服务器配置
    server {
        listen 8443 ssl;                        # 监听非默认的 HTTPS 端口 8443(可修改)。
        server_name api.example.com;           # 定义另一个主机名(可修改为你的域名)。

        # SSL 证书配置
        ssl_certificate /etc/nginx/ssl/api.example.com.crt; # SSL 证书路径(可修改为你的路径)。
        ssl_certificate_key /etc/nginx/ssl/api.example.com.key; # SSL 证书密钥路径(可修改为你的路径)。
        ssl_session_timeout 5m;                # 设置 SSL 会话超时时间(可修改)。
        ssl_ciphers HIGH:!aNULL:!MD5;          # 设置 SSL 加密算法(可修改)。
        ssl_protocols TLSv1.2 TLSv1.3;         # 设置支持的 SSL/TLS 协议版本(可修改)。
        ssl_prefer_server_ciphers on;          # 优先使用服务器的加密算法(可选,建议开启)。

        # 接口服务的根目录配置
        location / {
            root /var/www/api;                # 设置接口服务的根目录(可修改为你的目录)。
            index index.html index.htm;       # 设置默认的首页文件(可修改)。
        }
        
        # 代理 /api/ 路径的请求到后端服务器
        location ^~ /api/ {		
            proxy_pass https://服务器ip:8080/;  # 将所有 /api/ 开头的请求代理到指定的后端服务器(可修改)。
            proxy_set_header   Host             $host;              # 设置 Host 请求头,传递客户端请求的主机信息(可选)。
            proxy_set_header   X-Real-IP        $remote_addr;        # 设置 X-Real-IP 请求头,传递客户端的真实 IP 地址(可选)。
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; # 设置 X-Forwarded-For 请求头,传递客户端和代理链的 IP 地址(可选)。
        }

        # WebSocket 配置示例
        location /ws/ {
            proxy_pass http://127.0.0.1:9090; # 将 WebSocket 请求代理到后端服务器(可修改)。
            proxy_http_version 1.1;           # 设置 HTTP 协议版本为 1.1(WebSocket 必须)。
            proxy_set_header Upgrade $http_upgrade; # 支持 WebSocket 的协议升级。
            proxy_set_header Connection "upgrade";  # 保持连接(WebSocket 必须)。
            proxy_set_header Host $host;            # 传递主机头信息(可选)。
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

# 可选配置与可修改配置

  • 可选配置:

    • sendfile on;:用于开启高效文件传输,建议开启。
    • gzip 相关配置:用于开启并配置 Gzip 压缩,提高传输效率,建议开启。
    • ssl_prefer_server_ciphers on;:用于优先使用服务器的加密算法,建议开启。
  • 可修改配置:

    • client_max_body_size:可以根据具体需求调整客户端上传文件的最大大小。
    • client_body_buffer_size:可以根据具体需求调整客户端请求体的缓存区大小。
    • keepalive_timeout:可以根据具体需求调整客户端连接保持时间。
    • ssl_certificate 和 ssl_certificate_key:需要根据实际的证书路径进行修改。
    • server_name:需要根据实际的域名进行修改。
    • root 和 index:根据实际的项目根目录和默认文件进行修改。
    • listen 端口号:非默认端口可以根据实际需求进行调整。

总结

  • 除了 server 块(特别是 listen 和 SSL 相关的配置)不同之外,HTTP 和 HTTPS 配置文件中的其他部分通常是相同的。这包括全局配置项(如 sendfile、gzip 配置等)以及 location 块中的大部分内容,如反向代理设置、WebSocket 支持等。
  • 在实际配置中,你可以在同一个 Nginx 配置文件中配置 HTTP 和 HTTPS 服务,只需要在各自的 server 块中进行特定的配置即可。这样可以避免重复配置相同的全局设置。
编辑此页 (opens new window)
上次更新: 2025/01/01, 12:41:26
Nginx - 核心配置文件
Nginx - 配置巩固实例

← Nginx - 核心配置文件 Nginx - 配置巩固实例→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式