#nginx配置案例

news2024/9/23 17:12:10

示例配置 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.coloradmin.cn/o/2144676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将多个pdf合并成一个文件?这几种合并方法很好用!

如何将多个pdf合并成一个文件?面对日益增长的PDF文档,我们时常陷入管理困境,这不仅仅关乎于时间与精力的巨大消耗,因为这些孤立的PDF文件如同散落的拼图碎片,让关键信息的搜寻变得如同大海捞针,严重拖慢了工…

双指针算法:快速解决问题的小技巧(Java代码实现)

“人的一生是短暂的,但如果卑鄙地过这短暂的一生,那就太长了。” 文章目录 前言文章有误敬请斧正 不胜感恩!双指针简介对撞指针快慢指针例题聪明的小羊肖恩神奇的数组盛最多的水 总结 前言 写在开始: 双指针算法是一种经典且高效…

“中秋快乐”文字横幅的MATLAB代码生成

中秋快乐呀朋友们!!! 给大家带来一个好玩的代码,能够生成“中秋快乐”的横幅文字,比较简单,当然你也可以根据自己的需求去更改文字和背景,废话不多说,直接展示。 文字会一直闪烁&…

智能BI项目第三期

AIGC AI 提问技巧 为了让 Al 更好地理解我们的输入,并给出预期精确的输出,需要严格控制我们的提问词。 1.使用系统预设 控制输入格式(便于Al精确地理解我们的需求) 你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供…

《深度学习》PyTorch框架 优化器、激活函数讲解

目录 一、深度学习核心框架的选择 1、TensorFlow 1)概念 2)优缺点 2、PyTorch 1)概念 2)优缺点 3、Keras 1)概念 2)优缺点 4、Caffe 1)概念 2)优缺点 二、pytorch安装 1、安装 2、…

传输层协议 —— UDP协议

目录 0.前言 1.UDP协议格式 16位源端口和目的端口 16位UDP长度 16位校验和 2.UDP协议特点 无连接 不可靠 面向数据报 3.UDP的缓冲区 0.前言 首先,我们得明确一点,网络模型是分层的。自底向上分别是物理层、数据链路层、网络层、传输层、应用层…

Nginx反向代理出现502 Bad Gateway问题的解决方案

🎉 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客,近日在调用其他API时又遇到一些棘手的问题,于是写下这篇博客作为记录。 🎉 问题描述 在代理的遇到过很多错误码,其中出现频率最高的就是502&#x…

JavaEE:网络编程(套接字)

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

驱动开发知识点

裸机开发 ——————————————linux驱动 SOC: 定义:SOC,全称System on Chip,是一种集成了多个功能模块的芯片,包括处理器、内存、外设、接口等。它将原本分散在多个芯片上的功能集成到一个芯片上&#xff0…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展,后台管理系统的复杂度不断增加,对于开发者而言,既要系统的功能完备,又要追求开发效率的提升。然而,传统的开发方式往往会导致大量的重复劳动,尤其是在构建复杂的管理页面时。有…

不限学历!这个证书在上海太香了!利于积分、落户、抵扣个税...

一、软考是什么? “软考”全称:计算机技术与软件专业技术资格(水平)考试,关于它你需要知道: 1、软考是全国性考试:软考实行全国统一规划,实行统一大纲,统一试题&#xff…

【vulhub】Os-hackNos-1

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【vulhub】Os-hackNos-1 环境搭建漏洞复现 环境搭建 进入vulnhub官网 https://vulnhub.com 下载镜像 在虚拟机中打开镜像文件…

100行Python代码实现FastAPI Websocket 聊天室(纯协程方案)

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。 项目地址 代码已经开源, fastapi_chatroom 👏 欢迎Star 代码运行效果: 所有的项目都在github上开源:100-line-code 欢迎Star 👏 用100行…

open sora1.1容器构建教程指南

一、介绍 Open-Sora 1.1 项目是 Colossal AI 团队开发的一个完全开源的视频生成项目,该项目致力于高效制作高质量视频,并通过开源原则实现先进视频生成技术的低成本普及。 1. 项目背景与目标 Open-Sora 项目旨在通过提供开源的模型、工具和内容&#…

idea使用阿里云服务器运行jar包

说明&#xff1a;因为我用的阿里云服务器不是自己的&#xff0c;所以一些具体的操作可能不太全面。看到一个很完整的教程&#xff0c;供参考。 0. 打包项目 这里使用的是maven打包。 在pom.xml中添加以下模块。 <build><plugins><plugin><groupId>org…

JDBC导图

思维歹徒 一、使用步骤 二、SQL注入 三、数据库查询&#xff08;查询&#xff09; 四、数据库写入&#xff08;增删改&#xff09; 五、Date日期对象处理 六、连接池使用 创建连接是从连接池拿&#xff0c;释放连接是放回连接池 七、事务和批次插入 八、Apache Commons DBUtil…

进程监控与管理详解

一、进程的定义: 进程process是正在运行的程序,包括: 分配的内存地址空间 安全属性、包括所有权和特权 一个或多个线程 进程状态 进程的环境包括: 本地和全局变量 当前调度上下文…

多目标优化算法(Multi-Objective Optimization Algorithms, MOOA)介绍

在现实世界中&#xff0c;许多问题都涉及到多个目标的权衡和优化。例如&#xff0c;在工程设计中&#xff0c;可能需要同时考虑成本、效率和可靠性&#xff1b;在资源管理中&#xff0c;可能需要平衡环境保护和经济效益。多目标优化算法&#xff08;Multi-Objective Optimizati…

bmp格式图片怎么转换jpg?这几种转换方法超级好用!

bmp格式图片怎么转换jpg&#xff1f;BMP格式&#xff0c;这一历史悠久的图像编码方式&#xff0c;正逐渐在数字时代的浪潮中显得力不从心&#xff0c;其边缘化的趋势愈发明显&#xff0c;这一现象的根源&#xff0c;在于BMP格式固有的局限性难以匹配现代用户对于图像处理的多元…

【Python】探索Magenta:音乐与艺术的机器智能创作

下班了&#xff0c;今天的苦就先吃到这里。 在人工智能的浪潮中&#xff0c;机器学习技术正逐渐渗透到艺术创作的各个领域。今天&#xff0c;我们来探索一个特别的项目——Magenta&#xff0c;它是由Google Brain团队发起的&#xff0c;旨在使用机器智能生成音乐和艺术。这个项…