#nginx配置案例

news/2024/9/20 0:17:03 标签: nginx, 运维

示例配置 1:反向代理 + 负载均衡 + 缓存控制

http {
    # 定义后端服务器池,用于负载均衡
    upstream backend_servers {
        server backend1.example.com weight=3;  # 权重为3
        server backend2.example.com weight=1;  # 权重为1
        server backend3.example.com backup;    # 备份服务器
    }

    # 全局缓存配置,缓存静态文件的请求
    proxy_cache_path /data/nginx/cache keys_zone=my_cache:10m levels=1:2 max_size=1g;
    proxy_temp_path /data/nginx/temp;

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

        # 启用缓存和压缩功能
        gzip on;
        gzip_types text/css application/javascript image/png;

        # 处理静态文件
        location /static/ {
            root /var/www/static;  # 静态文件路径
            expires 30d;           # 缓存30天
        }

        # 处理动态请求,使用负载均衡和反向代理
        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_cache my_cache;        # 启用缓存
            proxy_cache_valid 200 302 10m;  # 成功和重定向的缓存时间为10分钟
            proxy_cache_valid 404 1m;    # 404页面缓存1分钟
        }

        # 自定义错误页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /var/www/errors;  # 错误页面路径
        }
    }
}

解析与说明:

关键字: http
作用: 定义HTTP服务器相关的全局配置,并且通过 upstream 来定义负载均衡的后端服务器池。proxy_cache_path 配置了缓存机制。
语法规则: http 块是Nginx的全局配置块之一,定义在该块中的配置会影响所有的 server 块。

upstream 块:
关键字: upstream
自定义名称: backend_servers(定义的服务器池的名称,供后续使用)
作用: 定义负载均衡的服务器集群。server backend1.example.com weight=3 表示 backend1 服务器的权重是3,而 backend2 的权重是1,表示更多请求会被分配给 backend1。server backend3.example.com backup 是备份服务器,仅在其他服务器不可用时启用。
语法规则: upstream 块中的服务器定义了负载均衡的后端服务器池,可以通过proxy_pass引用这些服务器。

proxy_cache_path 和 proxy_temp_path:
关键字: proxy_cache_path, proxy_temp_path
自定义名称: /data/nginx/cache 是缓存存储路径,my_cache 是缓存区域的名称。
作用: 定义缓存路径及缓存区。keys_zone=my_cache:10m 定义了一个名称为 my_cache 的缓存区域,大小为10MB,max_size=1g 限制缓存总大小为1GB。
语法规则: proxy_cache_path 定义了缓存的路径、区域名称及缓存大小限制等。

server 块:
关键字: server
自定义名称: www.example.com(域名)
作用: 定义虚拟主机,处理对 www.example.com 的请求。监听80端口。
语法规则: server 块用于定义虚拟主机,每个 server 块包含域名、端口以及与之相关的多个 location。

location /static/ 块:
关键字: location, root, expires
自定义路径: /static/(URL前缀),/var/www/static(静态文件路径)
作用: 处理 /static/ 路径下的请求。通过 root 指定静态资源的物理路径,expires 30d 指定浏览器缓存30天。
语法规则: location 块用于匹配请求的路径。root 定义该路径对应的文件系统目录。

location / 块:
关键字: location, proxy_pass, proxy_cache
自定义名称: backend_servers(引用的负载均衡服务器池)
作用: 处理动态请求,使用 proxy_pass 将请求转发给 upstream 定义的服务器池,使用 proxy_cache 对动态内容进行缓存。
语法规则: proxy_pass 用于将请求代理到后端服务器,proxy_cache 启用Nginx的缓存机制。

错误页面:
关键字: error_page, location
自定义路径: /50x.html(错误页面路径)
作用: 定义自定义的服务器错误页面。当出现 500, 502, 503, 504 错误时,返回 50x.html。
语法规则: error_page 用于自定义错误页面。location = 用于精确匹配该错误页面路径。

示例配置 2:Nginx 作为反向代理,支持 HTTPS 和 HTTP/2

http {
    # 定义后端服务器
    upstream backend {
        server 127.0.0.1:8080;
    }

    server {
        listen 443 ssl http2;  # 启用HTTPS和HTTP/2
        server_name www.example.com;

        # SSL 证书和密钥
        ssl_certificate     /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com.key;

        # SSL安全配置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        # 开启Gzip压缩
        gzip on;
        gzip_types text/plain text/css application/javascript;

        # 代理请求到后端
        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;
        }

        # 静态文件缓存
        location /static/ {
            root /var/www/html/static;
            expires 30d;
        }
    }

    # HTTP到HTTPS的重定向
    server {
        listen 80;
        server_name www.example.com;

        location / {
            rewrite ^ https://$server_name$request_uri? permanent;  # 301重定向到HTTPS
        }
    }
}

解析与说明:

upstream 块:
关键字: upstream
自定义名称: backend(后端服务器池名称)
作用: 定义反向代理的后端服务器池。此处仅有一台服务器,位于 127.0.0.1:8080。
SSL 和 HTTP/2 配置:

关键字: listen, ssl_certificate, ssl_certificate_key, ssl_protocols
自定义路径: /etc/nginx/ssl/example.com.crt 和 /etc/nginx/ssl/example.com.key(SSL证书和密钥路径)
作用: 在443端口启用HTTPS和HTTP/2协议,配置SSL证书及安全协议。
语法规则: listen 443 ssl http2 启用HTTPS和HTTP/2协议,ssl_protocols 指定支持的TLS版本。

HTTP到HTTPS重定向:
关键字: rewrite
内置变量: $server_name, $request_uri
作用: 将所有HTTP请求重定向到HTTPS版本。
语法规则:

rewrite ^ https://$server_name$request_uri? permanent; 使用 rewrite 指令进行正则匹配,并将请求重定向到HTTPS。

proxy_pass 指令:
关键字: proxy_pass, proxy_set_header
自定义名称: backend(定义的服务器池)
作用: 将客户端请求转发给定义的后端服务器池 backend,并保持客户端请求头信息(如IP、Host等)。

静态文件缓存:
关键字: expires
作用: 缓存 /static/ 路径下的文件,浏览器缓存时间设置为30天。
语法规则: expires 30d 指定缓存时长。

总结
关键字: server, upstream, location, proxy_pass, ssl_certificate, rewrite 等是Nginx中的关键字,具有特定的语法和作用。

自定义名称: 如 backend_servers、my_cache、example.com 等名称和路径根据需求自定义,便于引用。

语法规则: Nginx的语法基于块和指令的组合。块如 http、server、location 用于定义作用范围,指令如 proxy_pass、ssl_certificate、expires 用于定义具体行为。

解释重定向:

下面是对

rewrite ^ https://$server_name$request_uri? permanent;

这一 Nginx 指令中每个部分的详细解释。该指令用于将所有HTTP请求永久重定向(301重定向)到对应的HTTPS版本。

  1. rewrite:
    解释: Nginx的 rewrite 指令用于修改请求的URI或URL。它可以通过正则表达式来匹配请求的URL,并根据需要重定向到新的URL。
    作用: 告诉Nginx如何处理和重定向请求的URI。

  2. ^:
    解释: 这是一个正则表达式符号,表示字符串的开始。
    作用: 它告诉Nginx匹配请求的URL从头开始,即匹配所有请求的URI。这里 ^ 独立使用,表示匹配任意URI。

  3. https://:
    解释: 这是要重定向到的新URL的协议部分。https:// 指定重定向到HTTPS协议,强制将请求从HTTP切换到HTTPS。
    作用: 将原始的HTTP请求转换为HTTPS请求。

  4. $server_name:
    解释: 这是Nginx中的一个内置变量,表示当前请求的服务器名称(即域名)。该变量在每个请求中自动填充,例如 www.example.com。
    作用: 使用当前请求的服务器名来构建新的重定向URL,确保请求保持在同一个域名下。

  5. $request_uri:
    解释: 这是Nginx的另一个内置变量,表示请求的完整URI(包括请求路径和查询字符串)。
    例如,客户端请求

    /path/to/page?query=value,
    $request_uri 将被替换为 /path/to/page?query=value。

    作用: 保持请求的URI不变,确保重定向后的路径和查询参数与原请求一致。

  6. ?:
    解释: ? 是一个符号,表示查询参数的分隔符。在URL中,? 用于将查询字符串与主路径分开。例如:/path?param=value。
    作用: 保证在重定向过程中,查询参数(如果有)也被正确传递。这里的 ? 仅用于保留查询字符串,即使原请求中没有查询参数。

  7. permanent:
    解释: 这是一个标志,告诉Nginx返回HTTP状态码 301,表示永久重定向。浏览器或搜索引擎会将该重定向信息缓存,并认为资源的地址已经永久改变。
    作用: 表示这是一个永久重定向(301状态码),会通知浏览器更新缓存中的URL以指向新地址。与 permanent 相对的是 redirect(或 302),表示临时重定向。
    整体效果:
    rewrite ^ https://$server_name$request_uri? permanent; 这一指令执行时,Nginx会将所有传入的HTTP请求重定向到对应的HTTPS版本,并保持路径和查询字符串不变。

请求流程举例: 假设用户访问了以下URL:

http://www.example.com/page?id=123

正则表达式 ^ 会匹配整个URI。
$server_name 将被替换为 www.example.com。
$request_uri 将被替换为 /page?id=123。
? 保留查询参数,即 id=123。
permanent 会将响应的状态码设为 301(永久重定向)。

最终重定向URL: https://www.example.com/page?id=123

关键点总结:
rewrite 是Nginx指令,用于重定向请求。
^ 匹配从头到尾的所有请求URI。
https:// 强制将请求协议更改为HTTPS。
$server_name 替换为当前请求的服务器名。
$request_uri 保留原请求的路径和查询参数。
? 保留查询字符串。
permanent 告诉浏览器这是一个永久重定向,并返回 301 状态码。


http://www.niftyadmin.cn/n/5666367.html

相关文章

vue2+js项目升级vue3项目流程

Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有了显著的提升。升级到 Vue 3 可以让你的项目受益于这些改进。但是,升级过程也需要谨慎,因为涉及到代码的重构和潜在的兼容性问题。 1. 升级前的准备 备份项目: 在开始升级之前,…

【Python报错已解决】ModuleNotFoundError: No module named ‘sklearn‘

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

L67 【哈工大_操作系统】操作系统历史 学习任务

L6 操作系统历史 线条一 1、上古神机 IBM7094 专注于计算批处理操作系统(Batch system) 2、OS/360 一台计算机干多种事,多道程序作业之间的 切换和调度 成为核心 (多进程结构和进程管理概念萌芽!) 3…

【新手上路】衡石分析平台使用手册-认证方式

认证方式​ 用户登录衡石系统时,系统需要对输入的用户名和密码进行验证,保证系统的安全。衡石提供 CAS、SAML2、OAUTH2等多种单点登录认证方式。在 SSO 单点登录中,衡石是服务提供者 SP(Service Provider)为用户提供所…

JAVA虚拟机----JVM

(一)认识JVM JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机:JVM、VMwave、Virtual Box。 (二)JVM运…

GUI编程16:图片按钮、单选框、多选框

视频链接:18、图片按钮、单选框、多选框_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p18&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.图片按钮代码示例 package com.yundait.lesson05;import javax.swing.*; import java.awt.*; impo…

运维最难的是哪些部分呢

在讨论运维工作中,监控通常被视为一个核心且至关重要的环节,但它是否可以被简单地定义为“最难”的工作,则取决于多种因素,包括但不限于技术复杂度、资源投入、团队结构、业务特性以及故障应对的及时性等。以下是对运维中监控工作…

Vue.js与Flask/Django后端配合详细讲解

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…