Nginx配置文件全解:从入门到设计

Nginx配置文件全解:从入门到架构设计

1. Nginx配置文件基础

Nginx的主配置文件通常位于/etc/nginx/nginx.conf​。配置文件使用简单的文本格式,由指令和指令块组成。

1.1 基本语法规则

  • 每个指令以分号(;)结束
  • 指令块用大括号({})包围
  • 配置文件支持使用#添加注释

1.2 基本结构

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

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

    log_format main '$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 main;

    sendfile on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

2. 主要配置块

2.1 全局块

位于配置文件最顶层的指令,影响Nginx的全局行为。

主要指令:

  • user​: 指定Nginx worker进程的用户
  • worker_processes​: 指定Nginx worker进程的数量
  • error_log​: 指定错误日志的位置和级别
  • pid​: 指定存储主进程ID的文件位置

2.2 events块

配置影响Nginx处理连接的指令。

主要指令:

  • worker_connections​: 指定每个worker进程的最大连接数
  • use​: 指定使用的事件模型(如epoll, kqueue等)

2.3 http块

包含HTTP服务器相关的配置。

主要指令:

  • include​: 引入其他配置文件
  • default_type​: 指定默认MIME类型
  • log_format​: 定义日志格式
  • access_log​: 指定访问日志的位置和格式

3. HTTP服务器配置

在http块内,可以定义一个或多个server块,每个代表一个虚拟主机。

http {
    server {
        listen 80;
        server_name example.com;
        root /var/www/example.com;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

主要指令:

  • listen​: 指定服务器监听的IP地址和端口
  • server_name​: 指定服务器名称(域名)
  • root​: 指定网站根目录
  • index​: 指定默认索引文件

4. Location块详解

Location块用于匹配特定的URI请求。

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~* \.(jpg|jpeg|png|gif)$ {
    expires 30d;
}

匹配规则:

  • =​: 精确匹配
  • ^~​: 优先级最高的前缀匹配
  • ~​: 区分大小写的正则匹配
  • ~*​: 不区分大小写的正则匹配
  • /​: 通用前缀匹配

主要指令:

  • try_files​: 按顺序检查文件是否存在
  • rewrite​: 重写URL
  • return​: 返回特定的HTTP状态码

5. 反向代理和负载均衡

Nginx可以作为反向代理服务器和负载均衡器。

5.1 反向代理配置

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5.2 负载均衡配置

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}

负载均衡算法:

  • 轮询(默认)
  • 权重
  • ip_hash
  • least_conn

6. HTTPS和SSL/TLS配置

配置HTTPS需要SSL/TLS证书。以下是一个基本的HTTPS服务器配置:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # ... 其他配置 ...
}

主要指令:

  • ssl_certificate​: 指定SSL证书文件路径
  • ssl_certificate_key​: 指定SSL证书私钥文件路径
  • ssl_protocols​: 指定支持的SSL/TLS协议版本
  • ssl_ciphers​: 指定支持的加密算法

7. 性能优化配置

7.1 启用Gzip压缩

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

7.2 配置缓存

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

7.3 启用FastCGI缓存

fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    # ...

    location ~ \.php$ {
        fastcgi_cache my_cache;
        fastcgi_cache_valid 200 60m;
        # ... 其他FastCGI配置 ...
    }
}

8. 安全性配置

8.1 隐藏Nginx版本信息

server_tokens off;

8.2 配置X-Frame-Options防止点击劫持

add_header X-Frame-Options "SAMEORIGIN";

8.3 配置内容安全策略(CSP)

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";

9. 高级功能和模块

9.1 HTTP/2支持

server {
    listen 443 ssl http2;
    # ... 其他配置 ...
}

9.2 WebSocket支持

location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

9.3 动态模块

Nginx支持动态加载模块,可以在运行时启用或禁用某些功能。

load_module modules/ngx_http_image_filter_module.so;

10. 最佳实践和架构设计

10.1 模块化配置

将配置文件分割成多个小文件,便于管理和维护。

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

10.2 使用环境变量

使用环境变量可以使配置更加灵活,适应不同的部署环境。

server {
    server_name ${NGINX_SERVER_NAME};
    root ${NGINX_DOC_ROOT};
    # ... 其他配置 ...
}

10.3 多阶段架构设计

对于大型项目,可以采用多阶段的Nginx架构:

  1. 前端负载均衡层
  2. 应用层
  3. 静态资源层
  4. 后端服务层
客户端
前端负载均衡Nginx
应用Nginx 1
应用Nginx 2
静态资源Nginx
后端服务1
后端服务2

这种架构可以提供更好的扩展性和性能。

10.4 监控和日志

配置适当的监控和日志对于维护高可用性系统至关重要。

log_format detailed_log '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '$request_time $upstream_response_time $pipe';

access_log /var/log/nginx/detailed_access.log detailed_log;

结合工具如ELK栈(Elasticsearch, Logstash, Kibana)可以更好地分析和可视化日志数据。

结语

Nginx的配置文件是一个强大而灵活的工具,掌握它可以让你构建高性能、安全和可扩展的Web应用架构。本指南涵盖了从基础到高级的多个方面,但Nginx的功能远不止于此。持续学习和实践是成为Nginx配置专家的关键。

希望这个全面的指南能帮助你更好地理解和使用Nginx配置文件。如果你有任何问题或需要进一步的说明,请随时询问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/780299.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决微信读书和Apple Books导入epub电子书不显示图片的问题

title: 解决微信读书和Apple Books导入epub电子书不显示图片的问题 tags: 个人成长 categories:杂谈 最近找到一本很喜欢的书的电子版的epub版,发现无论是导入微信读书,还是Apple家的Books, 都无法正常显示图片。 于是我用calibre打开epub电子书&#x…

昇思25天学习打卡营第10天 | 自然语言处理:RNN实现情感分类

1. RNN实现情感分类 1.2 概述 情感分类是自然语言处理中的经典任务,是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型,实现如下的效果: 输入: This film is terrible 正确标签: Negative(负面) 预测标签: Negative输…

nacos-sdk-python——Python版本Nacos客户端

Nacos(Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它主要用于解决微服务架构中服务发现和配置管理的问题,提供了一站式解决方案。以下是 Nacos 的几个关键功能: 服务发现和健康…

C++模板元编程(一)——可变参数模板

这个系列主要记录C模板元编程的常用语法 文章目录 引言语法应用函数模板可变参数的打印可变参数的最小/最大函数 类模板 参考文献 引言 在C11之前,函数模板和类模板只支持含有固定数量的模板参数。C11增强了模板功能,允许模板定义中包含任意个(包括0个)…

保研复习 | 数据结构

目录 CH1 绪论☆ 数据项、数据元素、数据结构☆ 逻辑结构和存储结构的区别☆ 顺序存储结构和链式存储结构的比较☆ 算法的重要特性☆ 算法的复杂度 CH2 线性表☆ 单链表 CH3 栈、队列和数组☆ 栈和堆是什么?☆ 栈在括号匹配中的应用☆ 栈在表达式求值中的应用☆ …

Linux中的管道符‘|‘以及SQL(DQL,DCL)

ls 指令 语法: ls [选项][目录或文件] 功能: 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -…

【初阶数据结构】深入解析循环队列:探索底层逻辑

🔥引言 本篇将介绍如何实现循环队列并实现过程需要注意的事项,虽然篇幅较小,但是其中逻辑还是值得引人思考的,循环队列可以采用数组或链表实现,这篇将采用数组实现循环队列 🌈个人主页:是店小二…

Webpack: Loader开发 (1)

概述 如何扩展 Webpack?有两种主流方式,一是 Loader —— 主要负责将资源内容翻译成 Webpack 能够理解、处理的 JavaScript 代码;二是 Plugin —— 深度介入 Webpack 构建过程,重塑 构建逻辑。 相对而言,Loader 的职责…

阶段三:项目开发---搭建项目前后端系统基础架构:任务11:搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例,具体介绍各个目录情况并参照创建相关文件夹 任务指导 1、讲框架的选择和原理 …

java信号量(Semaphore)

Java中的信号量(Semaphore)是一种用于控制多个线程对共享资源的访问的同步工具。它可以用来限制可以同时访问某些资源的线程数量。Semaphore 提供了一个计数器来管理许可证的获取和释放,每个许可证代表对资源的一次访问权限。 import java…

DB-GPT-PaperReading

DB-GPT: Empowering Database Interactions with Private Large Language Models 1. 基本介绍 DB-GPT 旨在理解自然语言查询,提供上下文感知响应,并生成高精度的复杂 SQL 查询,使其成为从新手到专家的用户不可或缺的工具。DB-GPT 的核心创新在于其私有 LLM 技术,该技术在…

CIRKD

环境不好满足,不建议复现

CSS【详解】长度单位 ( px,%,em,rem,vw,vh,vmin,vmax,ex,ch )

px 像素 pixel 的缩写,即电子屏幕上的1个点,以分辨率为 1024 * 768 的屏幕为例,即水平方向上有 1024 个点,垂直方向上有 768 个点,则 width:1024px 即表示元素的宽度撑满整个屏幕。 随屏幕分辨率不同,1px …

计网_计算机网络概述

2024.07.03:计算机网络概述 第1节 计算机网络概述 1.1 互连网与互联网1.1.1总结1.1.2 因特网(互联网)发展[自行了解] 1.2 计算机网络组成1.2.1 计算机网络组成方式11.2.2 计算机网络组成方式21.2.3 计算机网络组成方式3 1.3 三种交换方式1.3.1 电路交换(1) 电路交换…

Spring源码十五:Bean的加载

上一篇我们通过Spring源码十四:Spring生命周期介绍了refresh的最后两个方法,至此通过前面大概十篇左右的篇幅介绍完了Spring容器初始化,接下来,将进入Spring另外一个模块Bean相关的知识点。 在Spring框架中,Bean加载过…

人工智能时代打工人摸鱼秘籍(1)- 为啥说大模型像人?

人工智能以势不可挡的方式席卷全球。 所有公司,都在削尖脑袋想,如何在在产品、营销、运营、服务和管理上加持大人工智能的能力。 公司在卷生卷死的时候,有一批人已经偷偷在用大模型提(摸)效(鱼)…

从打印到监测:纳米生物墨水助力3D生物打印与组织监测平台?

从打印到监测:纳米生物墨水助力3D生物打印与组织监测平台? 在 3D 组织工程中,纳米生物墨水是将纳米材料与 ECM 水凝胶结合,以提高其打印性和功能性的重要策略。纳米生物墨水可以增强水凝胶的机械性能、导电性、生物活性&#xff…

2024高考作文题“人工智能”

今年开年到现在,明显的感受就是,咨询人工智能机器人的客户比往年更多了。什么原因,是因为人工成本太高了,今年整体经济环境变差,招不起人,所以想用AI机器人来降低用工成本吗? 还是说因为语音线路…

JVM专题之G1垃圾收集器下

索引(记录)的源码的工作流程图如下: CSet(Collection Set 回收集合) 收集集合(CSet)代表每次GC暂停时回收的一系列目标分区。在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中。因此无论是年轻代收集,还是混合收集,工作的机…

PsQuerySystemDllInfo逆向

typedef struct _SYSTEM_DLL_ENTRY {ULONG64 type;UNICODE_STRING FullName;PVOID ImageBase;PWCHAR BaseName;PWCHAR StaticUnicodeBuffer; }SYSTEM_DLL_ENTRY, * PSYSTEM_DLL_ENTRY; 返回值为上面的结构体指针 验证 type: fullname inagebase: pwchar basename PWCHAR …