二、Nginx原来是这样?(系列篇02)

二、Nginx原来是这样?(系列篇02)

大家好,我是秋意零。

今天分享Nginx系列篇的第二节。Nginx目录结构、运行原理、基本配置。

更多请关注,Nginx系列篇主页:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3OTc2OTE3NA==&action=getalbum&album_id=3438641450349625348#wechat_redirect

目录结构

1)目录带有temp的字段是临时文件,是Nginx运行之后产生的。

带有temp目录的项在Nginx的目录结构中主要用于存储临时文件,这些目录与Nginx处理不同类型的请求时产生的临时数据相关。每个temp目录对应于Nginx处理特定类型请求时的临时存储需求,具体说明如下:

  1. client_body_temp: 存储客户端请求体的临时文件。当客户端发送POST请求,且请求体较大时,Nginx会先将请求体写入到这个目录下的临时文件中,然后再由Nginx处理或转发给后端服务器。
  2. fastcgi_temp: 用于FastCGI请求的临时文件存储。当Nginx作为前端服务器,与后端FastCGI应用服务器(如PHP-FPM)交互时,可能会需要存储一些临时数据,比如上传的文件或者大请求体。
  3. proxy_temp: 服务于HTTP代理和反向代理请求的临时文件。当Nginx作为代理服务器转发请求到后端,并且需要暂存请求或响应的内容时,会用到这个目录。
  4. scgi_tempuwsgi_temp: 分别用于SCGI(Simple Common Gateway Interface)和uWSGI(Universal Web Server Gateway Interface)协议相关的临时文件存储。这两种协议类似于FastCGI,用于与不同的后端应用程序服务器通信。

这些临时文件夹的存在,使得Nginx能够高效处理各种类型的请求,尤其是在处理大数据量传输时,避免了直接在内存中存储大量数据,从而降低了系统内存的压力。需要注意的是,这些目录通常由Nginx服务运行的用户(如上面显示的nobody)拥有权限,以确保安全性和隔离性。在生产环境中,定期清理这些临时文件是非常重要的维护操作,以避免磁盘空间被无用的临时文件耗尽。

[root@localhost nginx]# ll
total 0
drwx------ 2 nobody root   6 Apr 21 18:48 client_body_temp
drwxr-xr-x 2 root   root 333 Apr 21 18:24 conf   # 配置文件目录
drwx------ 2 nobody root   6 Apr 21 18:48 fastcgi_temp
drwxr-xr-x 2 root   root  40 Apr 21 18:24 html   # 静态资源目录
drwxr-xr-x 2 root   root  58 Apr 21 20:01 logs   # 日志目录
drwx------ 2 nobody root   6 Apr 21 18:48 proxy_temp
drwxr-xr-x 2 root   root  19 Apr 21 18:24 sbin   # 主程序目录
drwx------ 2 nobody root   6 Apr 21 18:48 scgi_temp
drwx------ 2 nobody root   6 Apr 21 18:48 uwsgi_temp

2)分别查看上诉目录内容

[root@localhost nginx]# ll conf/
total 68
-rw-r--r-- 1 root root 1077 Apr 21 18:24 fastcgi.conf
-rw-r--r-- 1 root root 1077 Apr 21 18:24 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 Apr 21 18:24 fastcgi_params
-rw-r--r-- 1 root root 1007 Apr 21 18:24 fastcgi_params.default
-rw-r--r-- 1 root root 2837 Apr 21 18:24 koi-utf
-rw-r--r-- 1 root root 2223 Apr 21 18:24 koi-win
-rw-r--r-- 1 root root 5349 Apr 21 18:24 mime.types
-rw-r--r-- 1 root root 5349 Apr 21 18:24 mime.types.default
-rw-r--r-- 1 root root 2656 Apr 21 18:24 nginx.conf  # 主要配置文件,该文件可以引用其它配置文件
-rw-r--r-- 1 root root 2656 Apr 21 18:24 nginx.conf.default
-rw-r--r-- 1 root root  636 Apr 21 18:24 scgi_params
-rw-r--r-- 1 root root  636 Apr 21 18:24 scgi_params.default
-rw-r--r-- 1 root root  664 Apr 21 18:24 uwsgi_params
-rw-r--r-- 1 root root  664 Apr 21 18:24 uwsgi_params.default
-rw-r--r-- 1 root root 3610 Apr 21 18:24 win-utf


[root@localhost nginx]# ll html/
total 8
-rw-r--r-- 1 root root 497 Apr 21 18:24 50x.html     # Nginx访问出现错误时的提示页面
-rw-r--r-- 1 root root 615 Apr 21 18:24 index.html   # Nginx默认访问的文件

[root@localhost nginx]# ll logs/
total 12
-rw-r--r-- 1 root root 1402 Apr 22 14:48 access.log  # Nginx用户访问日志文件,所以访问都将记录在该文件中
-rw-r--r-- 1 root root  648 Apr 22 14:48 error.log   # Nginx访问报错时记录日志文件
-rw-r--r-- 1 root root    6 Apr 21 20:01 nginx.pid   # 记录Nginx的主进程的Pid的文件

[root@localhost nginx]# ll sbin/
total 3804
-rwxr-xr-x 1 root root 3892104 Apr 21 18:24 nginx    # Nginx程序启动文件

3)验证nginx.pid文件是否保存的主进程Pid

可以看到nginx.pid文件内容,和nginx: master主进程ID一致。该文件为更具nginx: master主进程PID变化

[root@localhost nginx]# cat logs/nginx.pid
15032
[root@localhost nginx]# ps -aux | grep nginx
root      15032  0.0  0.0  20576   628 ?        Ss   12:51   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

Nginx运行原理

1)主进程(Master Process)与工作进程(Worker Processes):

  • Master Process:Nginx 启动时,首先会生成一个主进程。主进程主要负责管理子进程、加载和验证配置文件、维护工作进程池,以及响应信号(如重新加载配置、优雅关闭等)。主进程不直接参与处理客户端请求。
  • Worker Processes:主进程会根据配置文件中指定的数量创建多个工作进程。每个工作进程都能够独立处理客户端的请求,包括接收请求、处理请求、返回响应等。工作进程数量通常与服务器的CPU核心数相匹配,以充分利用硬件资源。

重新加载配置(reload操作):nginx.conf配置文件更改了,Master会将Worker进程Kill掉,Kill之前会留有一段时间让当前的Worker进程处理完手上的请求,不再接收新的请求了。Kill掉之后创建一个新的Worker进程,配置文件读取的也是最新的。

[root@localhost nginx]# ps -aux | grep nginx
root      15228  0.0  0.0  20576   620 ?        Ss   14:56   0:00 nginx: master process ./sbin/nginx
nobody    15229  0.0  0.0  21020  1316 ?        S    14:56   0:00 nginx: worker process

image-20240422145948095

基础配置

1)初始配置文件(示例)

[root@localhost conf]# cat 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;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  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;
    #    }
    #}

}

2)Nginx配置各个区域块解析

  1. 全局块(Outside of any http{} block)

    • user: 指定运行 Nginx 工作进程的用户和组,默认为 nobodywww-data
    • worker_processes: 设置 Nginx 使用的工作进程数,通常与服务器的 CPU 核心数相匹配。
    • error_log: 定义全局错误日志的文件路径及日志级别。
    • pid: 设置 Nginx 主进程的 PID 文件路径。
  2. Events Block

    • events { … }: 控制 Nginx 如何处理连接。重要配置包括:
      • worker_connections: 每个工作进程能同时打开的最大连接数。
      • use epoll (Linux): 指定使用的事件处理机制,如epoll提高性能。
  3. HTTP Block

    • http { … }: 包含了所有与 HTTP 协议相关的配置。
      • include mime.types: 引入 MIME 类型映射文件。
      • default_type application/octet-stream: 设定默认的 MIME 类型,用于未明确定义类型的文件。
      • log_format: 自定义日志格式。
      • access_log: 定义访问日志的文件路径及格式。
      • sendfile on;: 开启高效文件传输模式,减少 CPU 使用。
      • keepalive_timeout: 设置 Keep-Alive 连接超时时间。
      • server_tokens off;: 关闭服务器版本号在错误页面的显示,增强安全性。
  4. Server Blocks

    • server { … }: 定义一个虚拟主机或监听的端口配置。
      • listen 80;: 监听的端口号。
      • server_name example.com www.example.com;: 服务器名称,用于域名解析。
      • root /var/www/html;: 指定网站根目录。
      • location / { … }: 定义不同URL路径的处理方式,如静态文件服务、反向代理等。
        • root html;: root 指令指定了服务器根路径请求所对应的本地文件系统的根目录。在这个例子中,“html” 是一个目录名,它相对于 Nginx 安装目录(或在配置文件中通过 alias 指令指定的其他基路径)的相对路径。
        • index index.html index.htm;: index 指令指定了当请求的URL是一个目录时,Nginx 应该优先尝试返回的默认文档列表。
        • try_files $uri $uri/ =404;: 尝试访问请求的文件或目录,如果找不到则返回404错误。
        • proxy_pass http://localhost:8000;: 如果是反向代理配置,则将请求转发给后端服务器。

    这只是 nginx.conf 文件中可能包含的部分配置示例。实际配置根据具体需求会更加复杂和多样化,可能还包括SSL证书配置、速率限制、缓存策略、Gzip压缩、rewrite规则等高级配置。每个配置指令的具体意义和可选参数,都可以在 Nginx 官方文档中找到详细的说明。

    Nginx 官方文档:https://nginx.org/en/docs/

root和alias指令区别(面试题)

假设 root 设置为 /var/www/html,且 location /images/ 处理图像请求,那么请求 http://example.com/images/picture.jpg 会映射到文件系统路径 /var/www/html/images/picture.jpg

用户请求:http://example.com/images/picture.jpg
宿主机映射路径:/var/www/html/images/picture.jpg

location /images {
  root /var/www/html;
  index index.html index.htm;
}

若使用 alias /var/www/html/ 在相同的 location /images/ 中,同样的请求 http://example.com/images/picture.jpg 将直接映射到 /var/www/html/picture.jpg不会保留 location 中的 /images/ 部分

用户请求:http://example.com/images/picture.jpg
宿主机映射路径:/var/www/html/picture.jpg

location /images {
  alias /var/www/html/;
  index index.html index.htm;
}

详情参考:https://zhuanlan.zhihu.com/p/25093537

3)最小化Nginx配置文件,这里只是将注释去掉了。

[root@localhost conf]# cat nginx.conf

worker_processes  1;  # worker进程启动数量

events {
    worker_connections  1024;  # 单个worker进程的连接数
}

http {
    include       mime.types;   # include可以将其它配置文件引入到当前配置文件当中。mime.types文件是记录的请求头类型,比如:text/html、text/css、application/json请求头,打开文件查看详情。
    default_type  application/octet-stream; # 如果请求头类型,没在mime.types文件记录,那么就走default_type定义的application/octet-stream类型(格式流)

    sendfile        on;  # 使用linux的sendfi1e(socket,file,1en)高效网络传输,也就是数据0拷贝。
    keepalive_timeout  65; # 持久连接(Keep-Alive)的超时时间。当客户端与Nginx服务器之间启用HTTP Keep-Alive连接时,允许在一个TCP连接上连续发送多个HTTP请求,而不是为每个请求都新建一个TCP连接。这样可以减少建立新连接的开销,提高HTTP请求的效率。

# 一个server指一个虚拟主机 vhost
    server {
        listen       80;
        server_name  localhost;  # 指定主机的地址,可以是域名或IP
        
		# location 用于根据客户端请求的URI(统一资源标识符)来匹配请求并执行相应的操作,如提供静态文件服务、代理请求到后端服务器、重定向等
        location / {
            root   html;  # root代表根目录,这里指的是/usr/local/nginx/html目录下
            index  index.html index.htm;  # 默认访问的文件
        }

        error_page   500 502 503 504  /50x.html;  # error_page指服务器端发生错误,比如返回500 502 503 504时,跳转到/50x.html文件。http://qiuyl.com/50x.html,但是上面的location /默认没有指定该文件,所以下面的location = /50x.html 判断后会在html目录找该文件。
        location = /50x.html {
            root   html;
        }

    }

}

End

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

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

相关文章

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标: 学习嵌入式实时操作系统(RTOS&#xf…

找素数第二、三种方法

文章目录 第一种 :使用标签第二种:本质是方法的分装 第一种 :使用标签 没有使用信号量。break和continue作用范围只是最近的循环,无法控制外部循环。 此时使用标签 对外部循环进行操作。 package com.zhang; /* 找素数 第二种方…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好,牢饭少不了!!! 原理: 模拟WiFi的已连接设备,强制让其下线重连,获取其握手包,使用密码字典(宝丽)婆洁。 环境(准备工作)&a…

计网仿真综合实验 实验十二

实验十二 综合网络实验 实验过程 IP配置说明参考连线配置OSPF使公司内部联通 路由器R1的OSPF配置路由器R2的OSPF配置路由器R3的OSPF配置R1、R2、R3的相关解释路由器R4的OSPF配置路由器R5的OSPF配置路由器R6的OSPF配置R4、R5、R6解释: 路由器R2的RIP配置路由器R7的RIP配置 总结 …

Unity DOTS技术(十五) 物理系统

要解决性能的瓶颈问题,在DOTS中我们将不再使用Unity自带的物理组件. 下面来分享一下在DOTS中当如何使用物理插件. 一.导入插件 在使用DOTS系创建的实体我们会发现,游戏物体无法受物理系统影响进行运动.于是我们需要添加物理系统插件. 1.打开Package Manager > 搜索插件Uni…

IT人的拖延——都是“分心”惹的祸?

典型表现 我们说到拖延的原因有很多,还有一个原因是因为“分心太多“造成的,分心太多的拖延大致上有以下表现: 无法集中注意力: 分心太多会导致我们无法集中注意力在当前的工作任务上,我们可能会经常性地走神或者在工…

你好GPT-4o——对GPT-4o发布的思考与看法

你好GPT-4o 前言 2024年5月13日,OpenAI官网发布了他们的新一代自然语言处理交互系统——GPT-4o。这是OpenAI继GPT4之后又一个新的旗舰模型。 GPT-4o(“o”代表“omni”)是迈向更自然的人机交互的一步——它接受文本、音频、图像和视频的任意…

Linux环境---在线安装MYSQL数据库

Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本:1.8 参考文档 MYSQL版本:8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统:CentOS 1.1 建立存…

Golang | Leetcode Golang题解之第133题克隆图

题目: 题解: func cloneGraph(node *Node) *Node {if node nil {return node}visited : map[*Node]*Node{}// 将题目给定的节点添加到队列queue : []*Node{node}// 克隆第一个节点并存储到哈希表中visited[node] &Node{node.Val, []*Node{}}// 广…

数据结构严蔚敏版精简版-栈和队列以及c语言代码实现

1栈的定义和特权 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。 注:虽然说栈的实现就是一端插入和删除,但不一定是在“表尾”,这个“表尾”是广义的。 头插法实现链栈 尾插法实现链栈 因此,对栈来说,表尾…

从GAN到WGAN(01/2)

从GAN到WGAN 文章目录 一、说明二、Kullback-Leibler 和 Jensen-Shannon 背离三、生成对抗网络 (GAN)四、D 的最优值是多少?五、什么是全局最优?六、损失函数代表什么?七、GAN中的问题 一、说明 生成对抗网络 &#…

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 前后端分离(前端代码工程化独立出来形成一个单独的app) 1.开发分离 2.部署分离 3.服务器分离…

012-Linux逻辑卷管理(LVM)

前言 安装 Linux 操作系统时遇到的⼀个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间; 基本的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小。随着 Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户…

如何计算 GPT 的 Tokens 数量?

基本介绍 随着人工智能大模型技术的迅速发展,一种创新的计费模式正在逐渐普及,即以“令牌”(Token)作为衡量使用成本的单位。那么,究竟什么是Token呢? Token 是一种将自然语言文本转化为计算机可以理解的…

论文阅读:All-In-One Image Restoration for Unknown Corruption

发表时间:2022 cvpr 论文地址:https://openaccess.thecvf.com/content/CVPR2022/papers/Li_All-in-One_Image_Restoration_for_Unknown_Corruption_CVPR_2022_paper.pdf 项目地址:https://github.com/XLearning-SCU/2022-CVPR-AirNet 在本文…

Word Split Line

Word Split Line 分割线 https://download.csdn.net/download/spencer_tseng/89413772

将字符串str1复制为字符串str2

定义两个字符数组str1和str2,再设两个指针变量p1和p2,分别指向两个字符数组中的有关字符,通过改变指针变量的值使它们指向字符串中的不同的字符,以实现字符的复制。编写程序: 运行程序: 程序分析&#xff1…

MySQL 与 PostgreSQL 关键对比二(SQL语法)

目录 1 详细示例 1.1自动增量列 1.2 字符串连接 1.3 JSON 支持 2 总结 MySQL 和 PostgreSQL 是两种流行的开源关系数据库管理系统(RDBMS)。尽管它们在许多方面相似,但在 SQL 语法和功能上存在一些显著差异。 以下SQL语句的执行如果需要开…

向量数据库是什么?

向量数据库是什么? 随着人工智能和机器学习技术的迅猛发展,向量数据库作为一种新型数据库引起了广泛关注。向量数据库专门用于存储和查询高维向量数据,是在大规模数据检索和相似性搜索领域的重要工具。 向量数据库的定义 向量数据库是一种…

SLAM小题目

1、最小二乘题目&#xff1a; 假设有三个WIFI热点&#xff0c;位置分别在(x1,y1), (x2,y2), (x3,y3), 移动端测量到每一个热点的距离L1,L2和L3&#xff0c;要求解移动端的位置. #include <iostream> #include <vector> #include <cmath> class Point { pub…