Nginx核心

一、概述

Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个电子邮件代理服务器。正向代理服务的是客户端(比如VPN),反向代理服务的是服务端。Nginx是多进程的,有一个Master进程控制多个Worker进程。速度快、并发高、热部署。

1、优点

  • 速度快,并发高,在5万左右。采用多进程,io多路复用技术。像Tomcat是一个重量级的服务器,并发在200左右
  • 配置简单,扩展性强
  • 高可靠性,有master进程和worker进程,其中master进行单独用于管理worker进程
  • 热部署
  • 成本低,BSD许可证(可以修改源码并且可以用来赚钱)

2、常用模块

  • 静态资源部署
  • Rewrite地址重写,使用正则表达式
  • 反向代理
  • 负载均衡
  • web缓存
  • 用户认证模块

3、核心组成

  • nginx:二进制可执行文件
  • nginx.conf:核心配置文件
  • error.log:错误的日志记录
  • access.log:访问日志记录
  • nginx.pid:记录nginx的Master进程id

二、配置

# nginx.config文件
# 全局配置部分
#-----------------------------# 定义工作进程数量(建议设置为CPU核心数或自动检测)
# 值:数字 或 auto
worker_processes 4;  # user指令:用于配置运行Nginx服务器的worker进程的用户和用户组。使用user指令启动的时候,可以指定Linux系统的用户和用户组,然后访问Nginx的时候,只能访问到该用户拥有权限的目录,进行权限访问控制。# daemon:是否已守护进程运行,默认为on# pid:用于指定存放master进程id的文件路径# error_log:用于配置Nginx错误日志存放的路径# include:可以引入其他的配置文件,可以放在任何位置,放在全局块中可以引入全局块指令# 事件模块配置(控制连接处理模型)
#-----------------------------
events {# 每个Worker进程允许的最大并发连接数(包含活动连接和空闲连接)。默认 512。设置值不能超过操作系统支持打开的最大句柄数量# 总最大连接数 = worker_processes * worker_connectionsworker_connections 40960;  # accept_mutex:用来设置Nginx网络连接序列化,默认为on。用来解决惊群问题,就是一个请求发送过来,所有的worker进程都会唤醒来抢夺这个请求,设置为on开启序列化,意为每次来请求,只会唤醒一个worker进程来处理请求。根据实际需求来配置,因为可能会同时发送过来多个请求# muli accept:用来设置是否允许woker进行同时接受多个网络连接。默认为off,可以打开提高速度# use:设置Nginx服务器使用哪种事件驱动来处理网络消息。默认值根据操作系统来确定。推荐使用epoll使用io多路复用。
}# HTTP核心模块配置
#-----------------------------
http {# 根据User-Agent判断设备类型(用于后续条件判断)# 定义变量 $device_type,默认值为desktop,匹配移动设备则设为mobilemap $http_user_agent $device_type {default        desktop;  # 默认值~*android|iphone|ipad|ipod mobile;  # 正则匹配(不区分大小写)}# 包含MIME类型定义文件(默认路径为nginx目录下的conf/mime.types)# 我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。default_type 来指定相应给前端的类型, application/octet-stream会下载下来响应include       mime.types;  # access_log:用来设置用户访问日志的目录、格式等相关属性# log_format:用来指定日志的输出格式# 默认响应类型(当无法识别文件类型时使用)# 注意:application/wasm 是WebAssembly的MIME类型,需确认是否需要此设置default_type  application/wasm;  # 启用高效文件传输模式(零拷贝技术)。用来设置Nginx服务器是否使用Linux操作系统的sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能。默认off# 读取文件流程是客户端请求,用户区、内核区、磁盘、网卡中进行多次拷贝,效率较低,四次拷贝,sendfile是操作系统底层函数。开启可以提升效率,不需要多次拷贝,可以指定读取到哪个socket,直接响应给客户端。服务端的数据要返回给客户端。那么有两种模式,一种是实时发送,即`tcp_nodelay`,默认on,来了一个数据就直接发送给客户端,这样实时性很高,但是消耗性能。第二种就是开辟一个缓冲区,即`tcp_nopush`,默认off,依赖sendfile,数据将缓冲区填满之后再一起发送,实时性弱一点,但是性能高。两个配置看起来是互斥的,但是Linux2.5.9之后进行了优化,所有建议三者都打开,配置在http块。sendfile      on;  # 客户端保持连接的超时时间(单位:秒)。用来设置长连接的超时时间。如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间。默75秒keepalive_timeout 65;  # keepalive_requests:用来设置一个keep-alive连接使用的次数,达到次数就关闭这个连接# 从ISO8601时间格式中提取日期(用于日志文件名)map $time_iso8601 $logdate {'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;  # 正则捕获年月日default                       'date-not-found';  # 匹配失败时的默认值}# 访问日志配置(按日期分割日志)access_log logs/access-$logdate.log;  # 客户端请求相关配置#-----------------------------client_max_body_size 50m;      # 允许客户端上传的最大文件大小(重要!涉及文件上传需设置)client_body_buffer_size 60k;   # 客户端请求体缓冲区大小client_body_timeout 60;        # 客户端请求体读取超时时间(秒)client_header_buffer_size 64k; # 客户端请求头缓冲区大小client_header_timeout 60;      # 客户端请求头读取超时时间(秒)# 错误页面配置#-----------------------------error_page 400 /error/400.html;  # 错误码映射到指定URIerror_page 403 /error/403.html;error_page 404 /error/404.html;error_page 500 /error/500.html;# ...(其他错误码配置,需确保/error目录下存在对应HTML文件)# 高级连接配置#-----------------------------keepalive_requests 1000;       # 单个Keep-Alive连接允许的最大请求数large_client_header_buffers 4 64k;  # 大型请求头的缓冲区数量和大小reset_timedout_connection on;  # 关闭超时未响应的连接以释放资源send_timeout 60;              # 响应发送超时时间(秒)# 文件传输优化sendfile_max_chunk 512k;      # 单次sendfile调用的最大传输量(避免Worker进程阻塞)# 服务器名哈希表优化server_names_hash_bucket_size 256;  # 服务器名哈希表桶大小(域名较长时需要增加)# 包含虚拟主机配置文件(通常用于分站点管理)include vhosts/*.conf;  
}# 系统资源限制(需放在全局块,不能放在http块内)
#-----------------------------
worker_rlimit_nofile 100000;  # Worker进程能打开的最大文件描述符数量(需配合系统ulimit设置)
# includ.config文件
# ======================================================
# Nginx Server 块配置详解
# 此配置用于处理域名为 dbgmarkets.co 的 HTTP/HTTPS 请求
# 实现功能:SSL 加密、动静分离、API 代理、设备类型适配、Gzip 压缩
# ======================================================# server块的匹配优先级是:准确匹配、通配符在前的匹配、通配符在后的匹配、正则表达式的匹配、默认的server匹配
server {# --------------------------# 监听端口与协议配置# --------------------------listen       80;  # 监听 IPv4 的 HTTP 80 端口listen       443 ssl http2 default_server;  # 监听 IPv4 的 HTTPS 443 端口,启用 HTTP/2,设为默认主机listen       [::]:443 ssl http2 default_server;  # 监听 IPv6 的 HTTPS 443 端口# 说明:# - default_server: 当请求未匹配其他 server_name 时,并且请求的为指定监听的端口,则由此块处理。没有指定默认server,第一个server就是默认的server# - http2: 启用 HTTP/2 协议提升性能# - ssl: 启用 SSL/TLS 加密# --------------------------# 域名与基础设置# --------------------------server_name  dbgmarkets.co;  # 匹配的域名(精确匹配,不含 www 等子域名)。用于指定访问的ip或域名。多个域名间用空格分隔。有三种模式,精确匹配,通配符*匹配(不能写在中间,只能出现在首段和尾端,否者会失效),正则表达式匹配(必须使用~作为开始标识)。其中正则表达式,可以使用括号和$N方式在return中获取对应访问的值absolute_redirect off;  # 关闭绝对路径重定向(返回相对路径,适用于反向代理后方场景)# --------------------------# Gzip 压缩配置(优化传输效率)# --------------------------# 在http块中。gzip设置为on。gzip_types 设置要压缩的类型,默认只会压缩text/html类型。# gzip_comp_level:有1到9个级别。1压缩最快,压缩程度低,建议设置为6,基本已经极限。# gzip_vary:默认off。开启之后,会在响应头上面添加Vary:Accept-Encoding# gzip_buffers number size:设置压缩时缓冲区的数量和大小。默认即可# gzip_disable "正则表达式" : 会匹配浏览器的user-agnet,匹配到的就不进行压缩# gzip_min_length:当资源小于这个指定大小后,就不进行压缩了。默认20b# gzip_proxied:默认off。指的是作为反向代理服务器,对于后端返回的数据是否进行压缩。# gzip_static:默认off这个是在还没有读取时就压缩文件,然后直接读取对应文件的.gz文件,有的话就直接使用这个文件,没有的话在读取源文件,使用头信息Content-Encoding:gzip和Vary:Accept-Encoding告诉浏览器进行了文件压缩。gzip on;  # 启用 Gzip 压缩gzip_min_length 1k;  # 只压缩大于 1KB 的文件gzip_comp_level 9;  # 压缩级别 1-9(9 最高压缩率,CPU 消耗较大)gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;  # 压缩指定 MIME 类型gzip_vary on;  # 添加 "Vary: Accept-Encoding" 头gzip_disable "MSIE [1-6]\.";  # 为旧版 IE 浏览器禁用压缩# --------------------------# SSL/TLS 安全配置# --------------------------ssl_certificate C:/crm/nginx-1.20.2/ssl/dbgmarkets_co/dbgmarkets_co.crt;  # SSL 证书路径(Windows 格式)ssl_certificate_key C:/crm/nginx-1.20.2/ssl/dbgmarkets_co/dbgmarkets_co.key;  # SSL 私钥路径ssl_session_cache shared:SSL:1m;  # SSL 会话缓存(1MB 内存,减少握手开销)ssl_session_timeout  10m;  # SSL 会话超时时间(10 分钟)ssl_ciphers HIGH:!aNULL:!MD5;  # 加密套件配置(HIGH 安全级别,禁用 aNULL/MD5)ssl_prefer_server_ciphers on;  # 优先使用服务端加密套件# 注意:建议添加 ssl_protocols TLSv1.2 TLSv1.3; 以禁用老旧协议# --------------------------# 静态资源服务配置# --------------------------# root 实际返回的资源是root路径+location路径# alias 实际返回的资源只是alias的路径root C:/crm/web/dist;  # 静态文件根目录(前端构建产物存放路径)# 示例:请求 /css/style.css 将映射到 C:/crm/web/dist/css/style.css# --------------------------# 公共代理头设置# --------------------------proxy_set_header X-Forwarded-Proto $scheme;  # 传递客户端协议(http/https)proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实 IPclient_max_body_size 15M;  # 允许客户端上传最大 15MB 文件(如文件上传功能)# --------------------------# 路由处理:根路径(/)# --------------------------location / {# 设备类型判断(根据全局 map 映射的 $device_type 变量)if ($device_type = mobile) {  # 如果是移动设备proxy_pass http://127.0.0.1:3001;  # 代理到本地的 3001 端口(移动端服务)break;  # 终止后续处理}index  index.html;  # 默认访问文件try_files $uri $uri/ /index.html;  # 前端 SPA 路由支持(找不到文件时返回 index.html)# 流程:尝试访问真实文件 → 查找目录 → 回退到 index.html}# --------------------------# 路由处理:API 接口(/api)# --------------------------# location /api 匹配所有以/api开头的请求# =/api 精确匹配,只匹配/api的请求# ~^/api\w$ 正则表达式匹配,~标识使用正则表达式,^开头,$结尾。其中使用~*标识正则表达式不区分大小写# ^~/api 匹配第一个以/api开头的请求。默认的匹配顺序是匹配所有的条件,返回最后一个匹配到的,这个^~标识表示匹配到这个表达式之后,就不再向后匹配,直接返回结果location /api {# 解决跨域问题# add_header Access-Control-Allow-Origin 访问的ip地址端口号# add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE# 代理到本地的 81 端口(后端 API 服务)proxy_pass http://127.0.0.1:81;  # 关键代理头设置# WebSocket 协议升级支持proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection "Upgrade";  proxy_set_header Host $host;  # 传递原始域名# 补充:通常还需添加 X-Forwarded-For 头记录客户端 IP 链}# --------------------------# 错误页面配置# --------------------------# 5xx 错误统一返回 50x.html。error_page 500 =200 /error.html 使用=可以将返回的状态码500改为200error_page   500 502 503 504  /50x.html;  # 注意:需确保 root 目录存在 50x.html 文件
}# rewrit 指令
# set指令。`set $key value`。设置变量键值对。$key可以直接使用。Nginx有预定的变量,如$args就是所有请求参数,$host获取到的是访问的服务器地址
# `if (){}`指令。条件如果是一个变量,不为空或0就是true。也可以使用=和!=判断,不需要引号。也可以使用正则表达式判断,变量和表达式之间用空格和~隔开,然后匹配上为true,其中~区分大小写,~*不区分大小写,!~表示取反。还可以使用内置参数和变量结合判断,如`-f $request_filename`用来判断这个文件是否存在。
# break;指令,终止当前作用域,并且会重定向到当前indx文件。
# `rewrite 正则表达式 地址 [命令]`。命令:last:匹配到后会拿这个地址去所有块中寻找,然后转发;break:匹配到后,会拿这个地址去本块中寻找;redirect:重定向到指定地址,临时重定向302;permanent:永久重定向,301
# `rewrite_log on;`开启后,会以notice级别输出到error日志中。所以需要 `error_log error.log notice;`
# `return code url`:直接返回指定的code,跳转到对应的url上。

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

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

相关文章

综合开发-手机APP远程控制PLC1500柱灯的亮灭

要通过 ​​Unity3D​​ 开发的手机 App 控制 ​​电气柜上面的柱灯&#xff0c;需要WIFI模块作为桥梁&#xff0c;按照以下步骤实现&#xff1a; ​​1. 硬件准备&#xff08;硬件部分&#xff09;​​ ​​所需材料​​ ​​ESP32开发板​​&#xff08;如ESP32-WROOM-32&a…

五款提效工具

1. 亿可达 核心功能&#xff1a;通过“触发器动作”模式&#xff0c;实现任务自动执行&#xff08;如邮件转发、评论回复、数据同步&#xff09;。 适用场景&#xff1a;自动同步Notion项目到滴答清单生成待办事项 优势&#xff1a;节省重复操作时间&#xff0c;减少人为错误&a…

Docker化HBase排错实录:从Master hflush启动失败到Snappy算法未支持解决

前言 在容器化时代&#xff0c;使用 Docker 部署像 HBase 这样复杂的分布式系统也比较方便。社区也提供了许多方便的 HBase Docker 镜像&#xff0c;没有找到官方的 apache的&#xff0c;但有包含许多大数据工具的 harisekhon/hbase 或用于学习目的的 bigdatauniversity/hbase…

windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)

服务器数据库的搭建和远程访问 mysql数据库安装&#xff08;详细&#xff09; window安装mysql详细流程 路程&#xff1a;重设MySQL5密码&#xff0c;发现远程服务器原本有一个MySQL5&#xff0c;尝试在服务器本地建立连接被拒绝&#xff0c;因为不知道密码。 &#xff08;1…

每日c/c++题 备战蓝桥杯(P1093 [NOIP 2007 普及组] 奖学金)

洛谷P1093 [NOIP 2007 普及组] 奖学金 详解题解 题目背景与要求 题目链接&#xff1a;P1093 奖学金 核心任务&#xff1a;根据学生三科总分评选前5名奖学金获得者&#xff0c;需按特定规则排序输出。 排序规则&#xff08;按优先级从高到低&#xff09;&#xff1a; 总分降…

openEuler 22.03 安装 Nginx,支持离线安装

目录 一、环境检查1.1 必要环境检查1.2 在线安装&#xff08;有网络&#xff09;1.3 离线安装&#xff08;无网络&#xff09; 二、下载Nginx2.1 在线下载2.2 离线下载 三、安装Nginx四、开机自启服务五、开放防火墙端口六、常用命令 一、环境检查 1.1 必要环境检查 # 查看 g…

基于深度学习的图像压缩技术(二)

接上篇&#xff1a;基于深度学习的图像压缩技术&#xff08;一&#xff09;-CSDN博客 3 基于生成对抗神经网络的图像压缩技术 生成对抗网络是一种先进的无监督学习算法&#xff0c;由Goodfellow等人在2014 年首次提出&#xff0c;其核心思想源于博弈论。 生成对抗网络在图像压…

TCP和UDP的数据传输+区别

目录 一、数据传输过程 1.1 TCP字节流服务图 1.2 UDP数据报服务图 二、tcp与udp的区别 1.连接方式 2.可靠性 3.传输效率 4.有序性 5.流量控制和拥塞控制 6.应用场景 7.首部长度 三、tcp与udp能不能使用同一个端口号&#xff1f; 四、同一个协议&#xf…

基于ssm的校园旧书交易交换平台(源码+文档)

项目简介 校园旧书交易交换平台的主要使用者分为&#xff1a; 前台功能&#xff1a;用户进入系统可以对首页、书籍信息、校园公告、个人中心、后台管理等功能进行操作&#xff1b; 后台主要是管理员&#xff0c;管理员功能包括主页、个人中心、学生管理、发布人管理、书籍分类…

虚假安全补丁攻击WooCommerce管理员以劫持网站

一场大规模钓鱼攻击正针对WooCommerce用户&#xff0c;通过伪造安全警报诱使他们下载所谓的"关键补丁"&#xff0c;实则为植入WordPress后门的恶意程序。 恶意插件植入 根据Patchstack研究人员发现&#xff0c;上当受骗的用户在下载更新时&#xff0c;实际上安装的…

《冰雪传奇点卡版》:第二大陆介绍!

一、第二大陆&#xff1a;高阶资源与实力验证的核心战场 1. 准入条件与地图分布 进入门槛&#xff1a; 基础要求&#xff1a;角色需达到四转&#xff08;需消耗50万元宝完成转生任务&#xff09;&#xff0c;部分地图需额外满足神魔点数&#xff08;如黑暗之森需神魔全2&#…

信创系统图形界面开发指南:技术选择与实践详解

信创系统图形界面开发指南&#xff1a;技术选择与实践详解 &#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&…

【人脸去遮挡前沿】三阶段级联引导学习如何突破真实场景遮挡难题?

一、现实痛点:当人脸被遮挡,AI “认脸” 有多难? 你是否遇到过这样的场景? 中考体育测试:2025 年天津泰达街中考考场要求考生 “脸部无遮挡” 才能通过人脸识别入场,戴口罩、帽子的学生需现场调整发型。智能门锁:奇景光电在 CES 2025 推出的 WiseEye 掌静脉模块,通过掌…

c++线程的创建

c 11 线程编程实战 目录 c 11 线程编程实战1&#xff0c;线程的创建1.1 传入无参函数1.2 传入有参函数1.3 传入类内部函数1.4 lambda表达式 1&#xff0c;线程的创建 1.1 传入无参函数 //传入函数&#xff0c;创建线程 void ThreadMain() {//获取线程IDstd::thread::id thi…

人工智能数学基础(六):数理统计

数理统计是人工智能中数据处理和分析的核心工具&#xff0c;它通过收集、分析数据来推断总体特征和规律。本文将系统介绍数理统计的基本概念和方法&#xff0c;并结合 Python 实例&#xff0c;帮助读者更好地理解和应用这些知识。资源绑定附上完整资源供读者参考学习&#xff0…

解决STM32待机模式无法下载程序问题的深度探讨

在现代嵌入式系统开发中&#xff0c;STM32系列微控制器因其高性能、低功耗和丰富的外设资源而广受欢迎。然而&#xff0c;开发者在使用STM32时可能会遇到一个问题&#xff1a;当微控制器进入待机模式后&#xff0c;无法通过调试接口&#xff08;如SWD或JTAG&#xff09;下载程序…

C#扩展方法与Lambda表达式基本用法

C# 扩展方法与 Lambda 表达式详解 一、扩展方法详解 1. 基本概念 ​​扩展方法​​允许为现有类型"添加"方法&#xff0c;而无需修改原始类型或创建派生类型。 ​​定义条件​​&#xff1a; 必须在静态类中定义方法本身必须是静态的第一个参数使用this修饰符指…

C#规避内存泄漏的编码方法

C#规避内存泄漏的编码方法 内存泄漏是C#开发中常见的问题&#xff0c;尽管.NET有垃圾回收机制(GC)&#xff0c;但不当的编码实践仍可能导致内存无法被及时回收。以下是系统性的规避内存泄漏的方法&#xff1a; 一、理解内存泄漏的常见原因 ​​未释放的事件订阅​​​​静态…

React 后台管理系统

这是一个基于 React TypeScript Ant Design 开发的向明天系统前端项目。 git仓库地址 技术栈 React 19TypeScriptAnt Design 5.xRedux ToolkitReact RouterAxiosLess 环境要求 Node.js (推荐使用最新LTS版本)npm 或 yarn 安装步骤 克隆项目到本地 git clone [https://…

第九节:文件操作

理论知识 文件的基本概念&#xff1a;文件是存储数据的基本单位&#xff0c;在 Linux 系统中&#xff0c;一切皆文件。文件可以是文本文件、二进制文件、设备文件等。文件的创建&#xff1a;使用 touch 命令可以创建一个新的空文件。如果文件已经存在&#xff0c;则更新文件的…