初识Nginx默认配置文件

news2025/2/6 21:00:28

说起配置Nginx确实是一件让人头疼的事,开始时对Nginx配置不熟悉,为了满足需求在网上查找了很多相关配置的博客,也是天花乱坠不知道谁对谁错。就不停反复尝试最终在不懈的努力下中终于成功了。那时就觉得是时候好好整理一下Nginx的相关配置了。
在这里插入图片描述


Nginx配置文件目录

在这里插入图片描述

  • fastcgi开头的配置
    在这里插入图片描述

    • 什么是fastchi
      fastCGi 是由CGI(common gateway interface,通用网关接口)发展而来,是http服务器(nginx,apache)和动态语言(PHP) 之间的通信接口。记住,fastCGI只是一个接口。
      fastCGI的优点:fastCGI采用C/S结构,可以将http服务器和动态脚本解析服务器分离(二者可以部署在不同的服务器上),让http服务器专一处理静态请求和转发动态请求到脚本解析服务器;脚本解析器服务器则专一处理动态脚本的请求。

    关于fastCGI我们这里就不做过多的解释说明。可以参考FastCGI协议理论讲解,Nginx,fastCGI,http方式关系梳理,通用网关接口-FastCGI介绍等。

  • 以mime开头的配置
    在这里插入图片描述
    媒体类型文件,Nginx 会根据服务端文件后缀名在映射关系中获取所属文件类型,将文件类型添加到 HTTP 消息头字段“Content-Type”中.

  • 以nginx开头的配置
    nginx默认的主配置文件(核心配置文件,也是今天的主角)
    在这里插入图片描述

  • 以scgi开头的配置
    在这里插入图片描述
    SCGI (Simple common gateway interface)是 CGI 的替代版本,它与 FastCGI 类似,同样是将请求处理程序独立于 Web 服务器之外,但更容易实现,性能比 FastCGI 要弱一些。

  • 以uwsgi开头的配置
    在这里插入图片描述
    WSGI (Web server gateway interface)是为 Python 语言中定义的 Web 服务器与 Python 应用程序或框架间的通用通信接口,可以使 Python 应用程序或框架与支持这一协议的不同Web服务器进行通信。常见的 Python Web 框架都实现了该协议的封装。

Nginx的主配置文件

为了便于了解 Nginx 配置文件的内部结构,这里约定几个名词的定义。
1) 配置指令
在配置文件中,由 Nginx 约定的内部固定字符串,Nginx 官方文档中的英文单词为 directive,本次统一称为配置指令,简称指令。指令是 Nginx 中功能配置的最基本元素,Nginx 的每个功能配置都是通过多个不同的指令组合来实现的。
2) 配置指令值
每个配置指令都有对应的内容来表示该指令的控制参数,本次约定其对应的内容为配置指令值,简称指令值。指令值可以是字符串、数字或变量等多种类型。
3) 配置指令语句
指令与指令值组合构成指令语句。一条指令语句可以包含多个配置指令值,在 Nginx 配置文件中,每条指令语句都要用;作为语句结束的标识符。
4) 配置指令域
配置指令值有时会是由{ }括起来的指令语句集合,本次约定{ }括起来的部分为配置指令域,简称指令域。指令域既可以包含多个指令语句,也可以包含多个指令域。
5) 配置全局域
配置文件 nginx.conf 中上层没有其他指令域的区域被称为配置全局域,简称全局域。

Nginx 的常见配置指令域如下表所示。

域名称域类型域说明
main全局域Nginx 的根级别指令区域。该区域的配置指令是全局有效的,该指令名为隐性显示,nginx.conf 的整个文件内容都写在该指令域中
events指令域Nginx 事件驱动相关的配置指令域
http指令域Nginx HTTP 核心配置指令域,包含客户端完整 HTTP 请求过程中每个过程的处理方法的配置指令
upstream指令域用于定义被代理服务器组的指令区域,也称“上游服务器”
server指令域Nginx 用来定义服务 IP、绑定端口及服务相关的指令区域
location指令域对用户 URI 进行访问路由处理的指令区域
stream指令域Nginx 对 TCP 协议实现代理的配置指令域
types指令域定义被请求文件扩展名与 MIME 类型映射表的指令区域
if指令域按照选择条件判断为真时使用的配置指令域

打开系统默认的 nginx.conf 文件,可以看到整个文件的结构如下。


#user  nobody;
worker_processes  1; # 只启动一个工作进程

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
   worker_connections  1024; # 每个工作进程的最大连接为1024
}


http {
   include       mime.types; # 引入MIME类型映射表文件
   default_type  application/octet-stream;  # 全局默认映射类型为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  logs/access.log  main;

   sendfile        on;  # 启用零复制机制
   #tcp_nopush     on;

   #keepalive_timeout  0;
   keepalive_timeout  65;  # 保持连接超时时间为65s

   #gzip  on;

   server {
       listen       80;     # 监听80端口的网络连接请求
       server_name  localhost;  # 虚拟主机名为localhost

       #charset koi8-r;

       #access_log  logs/host.access.log  main;

       location / {
           root   html;
           index  index.html index.htm;
       }

       #error_page  404              /404.html;

       # redirect server error pages to the static page /50x.html
       #
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   html;
       }

       # proxy the PHP scripts to Apache listening on 127.0.0.1:80
       #
       #location ~ \.php$ {
       #    proxy_pass   http://127.0.0.1;
       #}

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
       #
       #location ~ \.php$ {
       #    root           html;
       #    fastcgi_pass   127.0.0.1:9000;
       #    fastcgi_index  index.php;
       #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
       #    include        fastcgi_params;
       #}

       # deny access to .htaccess files, if Apache's document root
       # concurs with nginx's one
       #
       #location ~ /\.ht {
       #    deny  all;
       #}
   }


   # another virtual host using mix of IP-, name-, and port-based configuration
   #
   #server {
   #    listen       8000;
   #    listen       somename:8080;
   #    server_name  somename  alias  another.alias;

   #    location / {
   #        root   html;
   #        index  index.html index.htm;
   #    }
   #}


   # HTTPS server
   #
   #server {
   #    listen       443 ssl;
   #    server_name  localhost;

   #    ssl_certificate      cert.pem;
   #    ssl_certificate_key  cert.key;

   #    ssl_session_cache    shared:SSL:1m;
   #    ssl_session_timeout  5m;

   #    ssl_ciphers  HIGH:!aNULL:!MD5;
   #    ssl_prefer_server_ciphers  on;

   #    location / {
   #        root   html;
   #        index  index.html index.htm;
   #    }
   #}

}

由上述配置文件可以看出,配置文件中的指令和指令值是以类似于 key-value 的形式书写的。写在配置文件全局域的指令是 Nginx 配置文件的核心指令,主要是对 Nginx 自身软件运行进行配置的指令。其中,events 和 http 所包含的部分分别为事件指令域和 HTTP 指令域,指令域内的指令则明确约定了该区域内的指令的应用范围。

server 指令域被包含于 http 指令域中,同时又包含了 location 指令域,各指令域中的共用范围逐层被上层指令域限定,可见各指令域匹配的顺序是由外到内的。Nginx 的配置指令按照内部设定可以同时编写在不同指令域中,包含在最内层的指令将对外层同名指令进行指令值覆盖,并以最内层指令配置为最终生效配置

编写 Nginx 配置文件时,为了便于维护,也会把一些指令或指令域写在外部文件中,再通过 include 指令引入 nginx.conf 主配置文件中。例如,配置文件中把写有 types 指令域的 mime.types 文件引用到 http 指令域中。此处使用的是 nginx.conf 文件的相对路径。

提供静态内容

一个重要的 Web 服务器任务是提供文件(例如图像或静态 HTML 页面)。您将实现一个示例,根据请求,将从不同的本地目录提供文件: /data/www (可能包含 HTML 文件)和 /data/images (包含图像)。这将需要编辑配置文件,并在具有两个位置块的 http 块内设置一个服务器块。
首先,创建 /data/www 目录并将包含 index.html 任何文本内容的文件放入其中,然后创建目录 /data/images 并在其中放置一些图像。
接下来,打开配置文件。默认配置文件已经包含了该 server 块的几个示例,其中大部分被注释掉了。现在,注释掉所有此类块并启动一个新 server 块:

http {
    server {
    }
}

通常,配置文件可以包含几个 server 块,这些块由它们侦听的端口和服务器名称来区分。一旦 nginx 决定了哪个 server 处理请求,它就会根据 server 块中定义的 location 指令参数测试请求标头中指定的 URI。
将以下 location 块添加到块中 server :

location / {
    root /data/www;
}

此 location 块指定 “ / ” 前缀,与请求中的 URI 相比。对于匹配的请求,URI 将被添加到 root 指令中指定的路径中,即 to /data/www ,以形成本地文件系统上所请求文件的路径。如果有多个匹配 location 的块,nginx 会选择前缀最长的块。上面的 location 块提供最短的前缀,长度为 1,因此只有当所有其他 location 块都无法提供匹配时,才会使用此块

接下来,添加第二个 location 块:

location /images/ {
    root /data;
}

它将匹配以 开头的 /images/ 请求( location / 也匹配此类请求,但前缀较短)。
server 该块的结果配置应如下所示:

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

这已经是侦听标准端口 80 的服务器的工作配置,并且可以在本地计算机上访问 http://localhost/ 。为了响应 URI 以 /images/ 开头的请求,服务器将从该 /data/images 目录发送文件。例如,为了响应请求, http://localhost/images/example.png nginx 将发送 /data/images/example.png 文件。如果这样的文件不存在,nginx 将发送一个指示 404 错误的响应。URI 不以 开头的 /images/ 请求将映射到目录 /data/www 。例如,为了响应请求, http://localhost/some/example.html nginx 将发送 /data/www/some/example.html 文件。

要应用新配置,请启动 nginx(如果尚未启动)或将 reload 信号发送到 nginx 的主进程,方法是执行:

nginx -s reload

设置简单代理服务器

nginx 的常见用途之一是将其设置为代理服务器,这意味着接收请求、将它们传递给代理服务器、从它们检索响应并将它们发送到客户端的服务器。
我们将配置一个基本的代理服务器,该服务器使用本地目录中的文件处理图像请求,并将所有其他请求发送到代理服务器。在此示例中,两个服务器都将在单个 nginx 实例上定义。
首先,通过在 nginx 的配置文件中再 server 添加一个块来定义代理服务器,其中包含以下内容:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这将是一个简单的服务器,它侦听端口 8080(以前,由于使用标准端口 80 以来,尚未指定该 listen 指令)并将所有请求映射到本地文件系统上的 /data/up1 目录。创建此目录并将 index.html 文件放入其中。请注意,该 root 指令放置在上下文中 server 。当选择用于处理请求的 location 块不包含其自己的 root 指令时,将使用此类 root 指令。

接下来,使用上一节中的服务器配置,并对其进行修改,使其成为代理服务器配置。在第一个 location 块中,将 proxy_pass 指令与参数中指定的代理服务器的协议、名称和端口放在一起(在我们的例子中,它是 http://localhost:8080 ):

server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

我们将修改第二个 location 块,该块当前将带有前缀的 /images/ 请求映射到 /data/images 目录下的文件,以使其与具有典型文件扩展名的图像的请求相匹配。修改后的 location 块如下所示:


location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

该参数是一个正则表达式,匹配所有以 .gif 、 .jpg 或 .png 结尾的 URI。正则表达式的前面应加上 ~ 。相应的请求将映射到目录 /data/images 。

当 nginx 选择一个 location 块来处理请求时,它首先检查指定前缀的位置指令,记住 location 最长的前缀,然后检查正则表达式。如果存在与正则表达式的匹配项,nginx 会选择这个 location ,否则,它会选择之前记住的那个。
代理服务器的最终配置将如下所示:

server {
    location / {
        proxy_pass http://localhost:8080/;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

配置文件中的计量单位

在 Nginx 配置文件中有很多与容量、时间相关的指令值,Nginx 配置文件有如下规范。

  1. 容量单位可以使用字节、千字节、兆字节或千兆字节,示例如下。
512
1k或1K
10m或10M
1g或10G

2.时间的最小单位是毫秒,示例如下。

10ms  # 10毫秒
30s     # 30秒
2m      # 2分钟
5h      # 5小时
1h 30m  # 1小时30分
6d      # 6天
3w      # 3周
5M      # 5个月
2y      # 2年

配置文件中的哈希表

Nginx 使用哈希表加速对 Nginx 配置中常量的处理,如 server 中的主机名、types 中的 MIME 类型映射表、请求头属性字段等数据集合。哈希表是通过关键码来快速访问常量对应值的数据存储结构,在通过哈希表获取数据的过程中,其内部实现通过相关函数将常量名转换为一个关键码来实现对应值的快速定位和读取。

由于数据的复杂性,会出现不同常量名转换的关键码是一样的情况,这就会导致读取对应值时发生冲突。为了解决这个问题,Nginx 同时引入了哈希桶机制,就是把相同关键码的哈希键存在一个哈希桶定义的存储空间中,然后再进行二次计算来获取对应的值。

单个哈希桶的大小等于 CPU 缓存行大小的倍数。这样就可以通过减少内存访问的数量来加速在 CPU 中搜索哈希关键码的速度。如果哈希桶的大小等于 CPU 的缓存行的大小,在 Nginx 进行哈希关键码搜索期间,内存的访问次数最多是两次,一次是计算哈希桶的地址,另一次是在哈希桶内进行哈希关键码的搜索。

Nginx 在每次启动或重新加载配置时会选择合适大小的最小初始化哈希表。哈希表的大小会随哈希桶数量的增加而不断调整,直到哈希桶总的大小达到哈希表设置的最大值。因此,在 Nginx 提示需要增加哈希表或哈希桶的大小时,要先调整哈希表的大小。

参考

nginx新手指南

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

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

相关文章

【MIMO 从入门到精通】[P6]【What is Beamforming?】

前言: Beamforming 是MIMO 技术里面的核心技术之一,所以讲MIMO 必须对Beamforming 有所了解,本篇主要了解一下beamforming Explains how a beam is formed by adding delays to antenna elements. 波束赋形(Beamforming&#xff…

【我与java的成长记】之面向对象的初步认识

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言一、什么是面向对象面向过程…

力扣刷题记录(18)LeetCode:474、518、377、322

目录 474. 一和零 518. 零钱兑换 II 377. 组合总和 Ⅳ 322. 零钱兑换 总结&#xff1a; 474. 一和零 这道题和前面的思路一样&#xff0c;就是需要将背包扩展到二维。 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector&l…

tvbox最新接口配置

TVBox是在Github的开源项目&#xff0c;本身是一个空壳软件&#xff0c;可免费使用及再开发。安装后需要配置接口才能正常使用。 TVBox&#xff0c;也被称为网络电视盒子&#xff0c;是一种可以连接到电视的设备&#xff0c;使电视具有智能电视的功能。TVBox的主要功能是通过网…

mysql 26day 数据库双主双从 搭建mycat 数据库负载均衡 读写分离

目录 搭建一个(双主双从) &#xff08;然后搭建mycat&#xff09;四台主机配置master1 (主库1)master2 (主库2)slave 1(从库1)master1 (主库1)slave 1(从库1)如果配置出错 需要从这里从新配置 写入数据(测试)mycat安装java安装mycat编辑文件server.xml编辑文件schema.xml配置 m…

网站被恶意扫描怎么办(上WAF)

在网络安全领域&#xff0c;有一大类工具被广泛使用&#xff0c;且作用不可忽视&#xff0c;它就是网络安全扫描器。扫描器是一种专门设计用来评估计算机、网络或者应用中已知的弱点的计算机程序&#xff0c;但是很多人恶意使用&#xff0c;找到网站弱点进行攻击。 扫描器的种…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 &#xff0c;感觉大佬在矩阵转置那块介绍的还是有些简略&#xff0c;我自己又做了点动图加以补充理解。膜拜大佬&#xff01; Part A 先解决解析命令行参数的…

fpga verilog rs232 发送模块实现

RS-232是一种串行通信协议&#xff0c;用于在计算机和其他外部设备之间进行数据传输。RS-232定义了电气特性、信号级别、机械特性和传输速率等规范&#xff0c;为串行通信提供了一种标准化的接口。 RS-232通常使用DB9连接器&#xff0c;用于传输和接收数据、控制信号以及地线连…

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…

小学班委有哪些职位

在成长的道路上&#xff0c;班委是一个不可或缺的角色。它不仅是一个职位&#xff0c;更是一份责任和担当。对于孩子们来说&#xff0c;成为班委不仅意味着荣誉&#xff0c;更意味着在集体中发挥自己的力量&#xff0c;为班级做贡献。 那么&#xff0c;小学班委有哪些职位呢&am…

小学班级管理方法和措施

开学了&#xff0c;宝贝们步入小学的大门&#xff0c;新环境、新同学、新起点。如何为孩子们营造一个和谐、有序的学习环境&#xff1f;这离不开我们班主任的精心管理。 制定明确的班规 教室里&#xff0c;同学们有秩序地坐着&#xff0c;这得益于我们班的班规。但班规不是摆设…

Java SPI 机制介绍和实战

目录 什么是 Java SPI Java SPI 原理 Java SPI 使用场景 1. 框架扩展与插件化 2. 服务加载与扩展 3. 组件化和模块化设计 4. 数据转换和格式化 5. 插件化应用程序 Java SPI 实战 步骤 1&#xff1a;定义服务接口 步骤 2&#xff1a;实现服务提供者 步骤 3&#xf…

UE5 C++(九)— 静态、动态加载类和资源

文章目录 前提静态加载类和资源静态加载资源静态加载类 动态加载类和资源动态资源动态加载类 前提 有必要说一下&#xff0c;静态这块内容加载时我用UE5.2版本出现调用静态资源不是显示问题&#xff0c;修改后容易崩。所以&#xff0c;这里不建议5.2版本&#xff0c;直接用5.3…

VS2005环境下编译C++报错

WinGenerateKey.obj : error LNK2011: 未链接预编译对象&#xff1b;映像可能不能运行 解决&#xff1a;连接器->输入&#xff0c;添加&#xff1a;..\WinGenerateKey\Debug\stdafx.obj 或者 ..\WinGenerateKey\Release\stdafx.obj 报错&#xff1a;fatal error C1083: Can…

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

【WSL2】安装和配置ubuntu

文章目录 1. 安装WSL22. 安装ubuntu2.1. 通过Microsoft Store2.1. 通过命令行 3. ubuntu的使用3.1. 创建管理员root账户3.2. 换源3.3. 安装图形化界面GNOME 1. 安装WSL2 在控制面板 - 程序 - 程序与功能中点击启用或关闭Windows功能&#xff0c;选择 虚拟机平台适用于Linux的W…

阅读2023:让每一天都徜徉于书海之中

阅读&#xff0c;是中华民族的优良传统&#xff0c;也是创新发展的永续动力。2023年初&#xff0c;教育部、中央宣传部等八部门印发《全国青少年学生读书行动实施方案》&#xff0c;推动青少年学生阅读深入开展&#xff0c;促进全面提升育人水平。 阅读不仅是文化传承的重要手…

AI智能五子棋这个逆袭.高.智.商.人群的神器竟然是它果断入手

「当当狸智能五子棋」新品现已震撼上市发售啦&#xff0c;将迎来一个全新的对弈时代 市面上首款将智能语音交互&#xff0c;AI陪玩功能融合在棋盘里&#xff0c;且不用摆子收纳的新式棋盘五子棋。 一款打破传统&#xff0c;全面革新&#xff0c;融合AI智能陪玩模式的五子棋诞…

JavaScript基础知识点总结:从零开始学习JavaScript(二)

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

Vue使用Element table表格格式化GMT时间为Shanghai时间

Vue使用Element表格格式化GMT时间为Shanghai时间 说明 阿里巴巴java开发规范规定&#xff0c;数据库必备gmt_create、gmt_modified字段&#xff0c;使用的是GMT时间&#xff0c;在中国使用必然要转换我中国时间。 在阿里巴巴的Java开发规范中&#xff0c;要求每个表都必备三…