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

news2024/11/27 11:39:27

二、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.coloradmin.cn/o/1805222.html

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

相关文章

MFA 轰炸:苹果用户的攻击目标

一些 Apple (苹果) 用户报告了利用密码重置功能进行的网络钓鱼攻击。 你注意到 iPhone 上的系统提示你输入密码。你点击“不允许”。然后这种情况一次又一次地发生。 在某个时候,你可能会感到恼火或开始恐慌,然后点击“允许”。 然后,你接…

[羊城杯 2023]CSGO

主函数初始化时,有反调试检测 打个断点在前面,然后nop掉 go语言的主函数是main_main 直接来到main_main,发现能可能是base64变表 在前面打个断点,F9 此处为base64变表,来到v25的地址处 得到变表LMNOPQRSTUVWXYZab…

【云原生】Kubernetes----轻量级的现代HTTP反向代理和负载均衡器之Traefik

目录 引言 一、Traefik基本概念 (一)什么是Ingress (二)什么是Traefik (三)Traefik和Nginx的区别 1.设计目标 2.配置语言 3.容器支持 4.功能特性 二、安装部署Traefik (一&#xff0…

Redis实战篇02

1.分布式锁Redisson 简单介绍: 使用setnx可能会出现的极端问题: Redisson的简介: 简单的使用: 业务代码的改造: private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

NGINX之location和rewrite

一.NGINX常用的正则表达式 二.Location location作用:对访问的路径做访问控制或者代理转发 1.location 常用的匹配规则: 进行普通字符精确匹配,也就是完全匹配^~ / 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 …

QGraphicsView实现简易地图20『鹰眼视图-全图显示』

前文链接:QGraphicsView实现简易地图19『迁徙图』 鹰眼视图-全图显示 能够显示所有已加载的瓦片地图,支持当前视口的范围显示器。鼠标在鹰眼视图上移动时,支持是否干预主视图地图加载两种模式,即移动时是否让主视图加载空白处的瓦…

无头+单向+非循环链表的实现

这里写目录标题 1. 链表1.1 链表的概念及结构1.2 链表的分类 2. 接口实现3. 链表的实现3.1 打印链表3.2 头插3.3 尾插3.4 头删3.5 尾删3.6 单链表查找3.7 在pos之前插入3.8 在pos之后插入3.9 删除pos位置的值3.10 删除pos位置之后的值3.11 链表的释放3.12 动态申请一个节点 4. …

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真,包括电机,SVPWM模块,矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…

【Java 百“练”成钢】Java 基础:带参数的方法

Java 基础:带参数的方法 01.求和02.字符串输出03.寻找最大值04.寻找最小值05.字符串拼接06.求平均值07.数组排序08.累乘09.存在的字符串10.长整型求和11.寻找字符串索引12.字符串拼接(StringBuilder) 01.求和 public class SumCalculator {s…

各类电机数学模型相关公式总结 —— 集成芯片驱动

0、背景技术概述 永磁直流电机(PMDC)、永磁同步电机(PMSM)、无刷直流电机(BLDC)以及混合式两相步进电机在小功率应用场景中多采用集成芯片驱动(如二合一、三合一驱动芯片)的原因主要…

python 多任务之多线程

多线程 线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就是说进程是线程的容器,一个进程中最少有一个线程来负责执行程序,它可以与同属一个进程的其它线程共享进程所拥有的全…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

openai 前员工释放出关于AGI的前世今生和未来发展趋势的详细报告

目录 1.引言2.AGI的临近3.投资与工业动员4.国家安全与AI竞赛5.技术挑战与机遇6.项目与政策7.结语8.原文PDF链接PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 2024年,我们站在了一个全新的科技前沿。在这篇文…

LabVIEW电机槽楔松动声测系统

LabVIEW电机槽楔松动声测系统 开发了一种利用LabVIEW软件和硬件平台,为大型电机设计的槽楔松动声测系统。该系统通过声波检测技术,实现了对电机槽楔是否松动的快速准确判断,极大地提高了检测效率和安全性。 项目背景 大型电机在运行过程中…

python-微分方程计算

首先导入数据 import numpy as np from scipy.integrate import odeint from scipy.optimize import minimize import matplotlib.pyplot as pltdata np.array([[30, 4],[47.2, 6.1],[70.2, 9.8],[77.4, 35.2],[36.3, 59.4],[20.6, 41.7],[18.1, 19],[21.4, 13],[22, 8.3],[2…

字符串形成树形

字符串形成树形 有的时候我们形成树形不是以ID的关系进行匹配的而是以字符串进行形成 数据 CREATE TABLE `contract_main_org_info` (`id` bigint(20) NOT NULL COMMENT 组织单位id,`parent_id` int(11) NULL DEFAULT NULL COMMENT 父组织单位id,`org_name` varchar(255) CHA…

什么是pump?pump跟单机器人是什么?

区块链pump(拉盘)是一种市场操纵策略,通常指在短时间内人为抬高某种加密货币的价格,从而吸引其他投资者购买,随后通过快速出售(dump)获利。这种策略通常由一群协调好的投资者或交易团体执行&…

学习使用 Frida 过程中出现的问题

一、adb shell命令报错:error: no devices found 目前该问题解决方法仅供参考,可先看看再选择试试!!!!! 查看此电脑也会发现没有出现手机型号文件夹。 第一步: 检查一下手机开了u…

适用于电脑的 5 大嗨格式数据恢复替代方案

嗨格式数据恢复是有一定知名度的 Windows 和 Mac 恢复程序,旨在恢复格式化、删除和丢失的图片、视频和音频。该应用程序支持多种文件格式以及相机 RAW 图像。最好的部分?它的预览功能可以在恢复照片和其他媒体文件之前检查和验证它​​们——这可以节省大…

Golang | Leetcode Golang题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; func wordBreak(s string, wordDict []string) bool {wordDictSet : make(map[string]bool)for _, w : range wordDict {wordDictSet[w] true}dp : make([]bool, len(s) 1)dp[0] truefor i : 1; i < len(s); i {for j : 0; j < i;…