详解Nginx 配置
一、Nginx 介绍
Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发,自 2004 年发布以来,凭借其高性能、低内存消耗、高并发处理能力等特点,迅速在 Web 服务器领域崭露头角。Nginx 可以高效地处理静态资源,如 HTML、CSS、JavaScript 文件和图片等,同时通过反向代理功能,将客户端请求转发到后端的应用服务器,实现负载均衡,提高整个系统的可用性和性能。它广泛应用于各类大型网站、高流量应用以及云服务平台等场景。
二、Nginx 配置基础
(一)配置文件结构剖析
Nginx 的配置文件通常为nginx.conf,其结构清晰,主要由以下几个部分组成:
全局块:从配置文件开始到events块之间的部分,用于设置一些影响 Nginx 全局运行的指令,如运行用户、工作进程数等。
events 块:主要用于配置 Nginx 的网络连接相关的事件处理,如选择事件驱动模型、设置每个工作进程的最大连接数等。
http 块:这是 Nginx 配置中最为核心的部分,用于配置 HTTP 服务器相关的参数,如文件类型映射、日志记录、gzip 压缩等。在http块中还可以包含多个server块。
server 块:每个server块代表一个虚拟主机,用于配置特定网站或应用的相关参数,如监听端口、服务器名称、访问日志等。在server块中又可以包含多个location块。
location 块:用于匹配特定的 URL 路径,并对其进行相应的配置,如设置根目录、代理转发等。
(二)常用配置指令详解
全局配置指令
user:指定 Nginx 工作进程运行的用户和用户组,例如user nginx nginx;,以确保服务器的安全性。
worker_processes:设置 Nginx 的工作进程数,一般建议设置为与服务器 CPU 核心数相同,以充分利用 CPU 资源,如worker_processes pid:指定 Nginx 进程 ID 文件的路径,方便管理和监控 Nginx 进程,如pid /var/run/nginx.pid;。
error_log:设置错误日志的路径和级别,有助于排查服务器运行过程中出现的问题,如error_log /var/log/nginx/error.log warn;。
事件配置指令
use:选择 Nginx 的事件驱动模型,常见的有epoll(适用于 Linux 系统)、kqueue(适用于 FreeBSD 等系统)等,如use epoll;,以提高服务器的性能。
worker_connections:设置每个工作进程能够处理的最大连接数,结合服务器性能和业务需求合理设置,如worker_connections 1024;。
accept_mutex:开启或关闭 Nginx 的 “接受锁”,防止多个工作进程同时接受新连接时可能出现的 “惊群” 现象,默认开启,如accept_mutex on;。
HTTP 配置指令
include:用于包含其他配置文件,方便管理和维护,如include /etc/nginx/mime.types;,引入文件类型映射表。
default_type:设置默认的 MIME 类型,当服务器无法识别文件类型时使用,如default_type application/octet-stream;。
sendfile:开启高效的文件传输模式,减少磁盘 I/O 开销,提高文件传输效率,如sendfile on;。
keepalive_timeout:设置客户端与服务器之间的长连接超时时间,如keepalive_timeout 65;。
gzip:开启 gzip 压缩功能,减少数据传输量,提高网站访问速度,如gzip on;,并可进一步配置压缩级别等参数。
Server 配置指令
listen:指定服务器监听的端口,如listen 80;,监听 HTTP 协议的 80 端口。
server_name:设置服务器的名称,可以是域名或 IP 地址,如server_name example.com;。
access_log:指定访问日志的路径和格式,用于记录客户端的访问信息,如access_log /var/log/nginx/access.log main;。
error_log:在server块中设置的错误日志,仅记录当前虚拟主机相关的错误信息,覆盖http块中的全局错误日志设置。
Location 配置指令
匹配规则:location通过不同的匹配符号来确定匹配规则。例如,=表示精确匹配,~表示区分大小写的正则表达式匹配,~*表示不区分大小写的正则表达式匹配,^~表示普通字符串匹配,且一旦匹配成功,不再进行其他正则表达式匹配。
常用指令:
-
root:设置请求的根目录,如root /usr/share/nginx/html;,当访问/路径时,会从该目录下查找对应的文件。
-
alias:用于替换路径,与root略有不同,如alias /data/www/;,可以将特定的 URL 路径映射到不同的文件目录。
-
proxy_pass:实现代理转发功能,将匹配的请求转发到后端服务器,如proxy_pass http://backend_server;。
三、Nginx 进阶配置实例
(一)反向代理配置
假设我们有一个后端应用服务器运行在www.rhihi.com:8080,希望通过 Nginx 将对example.com的请求转发到该后端服务器。配置如下:
server {listen 80;server_name example.com;location / {proxy_pass http://www.rhihi.com:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
在上述配置中,proxy_pass指令将请求转发到http://www.rhihi.com:8080,同时通过proxy_set_header指令设置了一些请求头信息,以便后端服务器能够正确处理请求。
(二)负载均衡配置
假设有三个后端服务器backend1、backend2、backend3,分别运行在192.168.1.10:80、192.168.1.11:80、192.168.1.12:80,我们使用 Nginx 的轮询负载均衡策略将请求分发到这三个服务器上。配置如下:
upstream backend_servers {server 192.168.1.10:80;server 192.168.1.11:80;server 192.168.1.12:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
这里通过upstream指令定义了后端服务器集群,Nginx 会按照轮询的方式依次将请求分发到各个后端服务器上。
(三)动静分离配置
为了提高网站性能,我们将静态资源(如图片、CSS、JavaScript 文件)和动态请求(如 PHP、Python 等应用程序的请求)分开处理。假设静态资源存放在/var/www/static目录下,动态请求由后端的 FastCGI 服务器处理。配置如下:
server {listen 80;server_name example.com;location /static/ {root /var/www/;expires 30d;access_log off;}location / {fastcgi_pass 127.0.0.1:9000;fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;include fastcgi_params;}}
在上述配置中,/static/路径下的请求会被 Nginx 直接从/var/www/static目录中读取静态资源,并设置了缓存过期时间为 30 天,同时关闭了该路径的访问日志。而其他请求则通过fastcgi_pass转发到后端的 FastCGI 服务器进行处理。
(四)HTTPS 配置
为了实现网站的安全访问,我们需要为 Nginx 配置 HTTPS。首先,需要获取 SSL 证书,假设证书文件为example.com.crt和example.com.key,存放在/etc/nginx/ssl目录下。配置如下:
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {# 正常的业务逻辑配置}}
上述配置中,listen 443 ssl表示监听 443 端口并启用 SSL 加密,ssl_certificate和ssl_certificate_key指定了证书文件的路径,同时通过ssl_protocols和ssl_ciphers指令设置了支持的 SSL 协议版本和加密算法。
四、Nginx 配置优化技巧
(一)性能优化
调整工作进程数:根据服务器的 CPU 核心数合理设置worker_processes,充分利用 CPU 资源,提高并发处理能力。
优化连接数:通过合理设置worker_connections,增加每个工作进程能够处理的最大连接数,同时结合keepalive_timeout等参数,优化连接的复用和管理,减少连接建立和销毁的开销。
启用高效文件传输:开启sendfile指令,采用高效的文件传输模式,减少磁盘 I/O 操作,提高文件传输效率。
启用 gzip 压缩:根据业务需求合理配置gzip指令,对传输的数据进行压缩,减少网络带宽消耗,加快页面加载速度。
(二)安全优化
关闭版本信息显示:在http块中添加server_tokens off;指令,避免在响应头中暴露 Nginx 的版本信息,降低被攻击的风险。
设置访问控制:通过location块结合allow和deny指令,限制特定 IP 或 IP 段的访问,如只允许某些内部 IP 访问管理后台页面。
防止恶意请求:利用limit_req和limit_conn指令,设置请求频率限制和连接数限制,防止恶意用户通过大量请求对服务器进行攻击。
五、Nginx 配置常见问题与解决
配置文件语法错误:在修改 Nginx 配置文件后,使用nginx -t命令检查语法是否正确。如果出现语法错误,根据错误提示信息仔细检查配置文件中的指令拼写、符号使用等问题。
服务器无法启动:可能是端口被占用、配置文件错误或权限不足等原因导致。使用netstat -tlnp命令检查端口占用情况,确保 Nginx 监听的端口未被其他程序占用。同时,检查配置文件的权限是否正确,确保 Nginx 进程有足够的权限读取配置文件和访问相关资源。
代理转发异常:如果代理转发出现问题,检查proxy_pass指令的目标地址是否正确,后端服务器是否正常运行。同时,注意检查proxy_set_header设置的请求头信息是否符合后端服务器的要求。
相关文章:
详解Nginx 配置
一、Nginx 介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发,自 2004 年发布以来,凭借其高性能、低内存消耗、高并发处理能力等特点…...
数据库系统概念
1. 绪论 数据库的基本概念: 数据(data): 数据库中存储的基本对象, 可以是文字, 声音, 图片, 视频等。 数据库(DB): 概括来说就是永久存储, 有组织, 可共享的大量数据的集合。 数据库管理系统(DBMS): 和操作系统一样是计算机基础软件, 主要有数据定义语言(DDL, 对数据对象的组…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
一台服务器将docker image打包去另一天服务器安装这个镜像
一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…...
QT串口通信之二,实现单个温湿度传感器数据的采集(采用Qt-modbus实现)
接上 QT串口通信之一,实现单个温湿度传感器数据的采集 上述文章中用QSerialPort实现了温湿度传感器的采集,实际上比较麻烦的,因为需要自定义解析帧, 接下来,用Qt-modbus-封装度更高的协议,来实现温湿度的采集; #include "MainWindow.h" #include "ui_M…...
基于SpringBoot的校园消费点评管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【小沐学Java】VSCode搭建Java开发环境
文章目录 1、简介2、安装VSCode2.1 简介2.2 安装 3、安装Java SDK3.1 简介3.2 安装3.3 配置 4、安装插件Java Extension Pack4.1 简介4.2 安装4.3 配置 结语 1、简介 2、安装VSCode 2.1 简介 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在桌面上…...
《操作系统 - 清华大学》8 -4:进程管理:进程控制结构
深度剖析进程控制块:操作系统进程管理的核心关键 在操作系统的复杂体系中,进程控制块(PCB)是实现高效进程管理的关键所在。接下来,将从多个维度深入剖析进程控制块,帮助更好地理解其在操作系统中的重要作用…...
RPC 框架项目剖析
RPC 框架项目剖析 说明 本文用于梳理一个 rpc项目的实现细节,此项目基于cpp语言 大概三千行左右,用于学习目的。 项目链接:rpc项目 项目底层类 1.抽象消息类 描述: 各种消息的基类 属性: 消息id,消息类型…...
C++ Boost面试题大全及参考答案
目录 boost::thread_group 如何实现批量线程管理? 解释 boost::asio 中 proactor 模式的设计原理 使用 boost::atomic 实现无锁环形缓冲区 boost::mutex 与 std::mutex 在异常安全上的差异 如何用 boost::condition_variable 实现生产者 - 消费者模型 当 boost::shared_p…...
关于Transparent native-to-ascii conversion
1、功能 自动转换ASCII编码,即在文件系统上,文件的编码格式为ascii编码,在编辑器(idea/pycharm)中,其展现结果为配置的编码格式,仅展现方便阅读 使用UTF-8并勾选自动转换ASCII编码结果&#x…...
js数据类型检测
JavaScript的数据类型检测 typeof操作符 适用场景 基本数据类型快速判断:适用于快速判断变量是否为number、string、boolean、undefined、function等基本数据类型。比如在函数参数检查中,若要求传入数字参数,可用typeof来初步判断。函数类型…...
go 模块管理
go version 查看版本 go version go1.21.12 windows/amd64 需要保证:go的版本升级为1.11以上,go mod依赖的最底版本 go env 查看go的环境变量 go env 开启go mod # 标识开启go的模块管理 set GO111MODULE=on GO111MODULE有三个值:off, on和auto(默认值)。 GO111M…...
记一次复杂分页查询的优化历程:从临时表到普通表的架构演进
1. 问题背景 在项目开发中,我们需要实现一个复杂的分页查询功能,涉及大量 IP 地址数据的处理和多表关联。在我接手这个项目的时候,代码是这样的 要知道代码里面的 ipsList 数据可能几万条甚至更多,这样拼接的sql,必然是要内存溢出的,一味地扩大jvm参数不…...
基于 Python 的项目管理系统开发
基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中,有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统,能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…...
java面试场景问题
还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…...
JS宏实例:数据透视工具的制作(四)
上一节中,我们完成了核心的计算代码部分,本节中将完善事件代码 一、创建所有需求的事件函数 1、窗体初始化 // 窗体初始化 function pivotForm_Initialize(){} function typeSet_Initialize(){} function valueSet_Initialize(){} function allCol…...
5. Go 方法(结构体的方法成员)
Go语言没有传统的 class ,为了让函数和结构体能够关联,Go引入了“方法”的概念。 当普通函数添加了接收者(receiver)后,就变成了方法。 一、函数和方法示例 // 普通函数 func Check(s string) string {return s }//…...
20250223学习记录
之前HDFview查看.hdf5文件的时候,看到土壤湿度数据是分为AM和PM,当时我有一个这样的疑问 但是后来用Python处理的时候,直接就是对整个的.hdf5文件处理,当时没有注意这一块,所以就没有这个疑问了。 今天突然看到一篇论…...
WPS携手DeepSeek:开启智能办公新时代
在数字化办公的浪潮中,效率与智能成为了人们追求的核心目标。近年来,人工智能技术的飞速发展为办公领域带来了前所未有的变革契机。DeepSeek作为一款备受瞩目的人工智能工具,以其强大的功能吸引了众多用户,然而在使用过程中&#…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...
【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...
