详解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 年发布以来,凭借其高性能、低内存消耗、高并发处理能力等特点…...
动静态链接与加载
目录 静态链接 ELF加载与进程地址空间(静态链接) 动态链接与动态库加载 GOT表 静态链接 对于多个.o文件在没有链接之前互相是不知到对方存在的,也就是说这个.o文件中调用函数的的跳转地址都会被设定为0(当然这个函数是在其他.…...
83_CentOS7通过yum无法安装软件问题解决方案
大家好,我是袁庭新。很多小伙伴在CentOS 7中使用yum命令安装软件时,出现无法安装成功的问题,今天给大家分享一套解决方案~ 在CentOS 7中,yum是一个常用的包管理工具,它基于RPM包管理系统。如果你发现yum无法使用,可能是由于多种原因造成的。以下是一些解决步骤,可以帮…...
在PyTorch中使用插值法来优化卷积神经网络(CNN)所需硬件资源
插值法其实就是在已知数据点之间估计未知点的值。通过已知的离散数据点,构造一个连续的曲线函数,预测数据点之间的空缺值是什么并且自动填补上去。 适用场景: 在卷积神经网络(CNN)中的应用场景中,经常遇到计算资源有限,比如显存不够或者处理速度慢,需要用插值来降低计…...
数据包在客户端和服务端,以及网络设备间如何传输的?
声明:文章中图片来自于网络收集,整体流程自己梳理。 目录 问题:如下socket客户端请求数据包如何传输的? 拓扑环境 数据包在分层间传输 网络分层L2/L3/L4 数据包收发-在各分层间变化 各层头部中-核心信息 数据包在不同设备…...
用Python实现Excel数据同步到飞书文档
目录 一、整体目标 二、代码结构拆解 三、核心逻辑讲解(重点) 1. 建立安全连接(获取access_token) 2. 定位文档位置 3. 数据包装与投递 四、异常处理机制 五、函数讲解 get_access_token() 关键概念解释 1. 飞书API访问…...
25林业研究生复试面试问题汇总 林业专业知识问题很全! 林业复试全流程攻略 林业考研复试真题汇总
25 林业考研复试,专业面试咋准备?学姐来支招! 宝子们,一提到林业考研复试面试,是不是就慌得不行,感觉老师会扔出一堆超难的问题?别怕别怕,其实林业考研复试就那么些套路,…...
js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性
ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言,本文讲述Javascript[ECMAScript]版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]的新特性,帮助朋友们更好的熟悉和使用Javascript ES5 1.严格模式 use strict2.Object getPrototypeOf,返回一个对象的原…...
vxe-table实现动态列
vxe-table实现动态列 1.动态列解释2.解决步骤2.1将后端返回的动态列表头,按照格式拼接在固定列表头上2.2将后端返回的列表数据按照键值对格式组装 1.动态列解释 正常列表是有固定的列;我的需求是,最初只知道表格的固定两列,查询数…...
尚硅谷爬虫note009
一、jsonpath 1.安装 pip install jsonpath 2.使用 只能解析本地文件 .json文件 {"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century&qu…...
verilog笔记
Verilog学习笔记(一)入门和基础语法BY电棍233 由于某些不可抗拒的因素和各种的特殊原因,主要是因为我是微电子专业的,我需要去学习一门名为verilog的硬件解释语言,由于我是在某西部地区的神秘大学上学,这所…...
Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当今社会,随着人们生活水平的不断提高和健康意识的日益增强,健…...
正确清理C盘空间
一.系统清理 正确清理C盘空间主要是删除不需要的文件和应用程序,以释放磁盘空间。以下是一些常用的方法: 删除临时文件:在Windows搜索框中输入“%temp%”,打开临时文件夹,将其中的文件全部删除。 清理回收站…...
网站快速收录:如何设置robots.txt文件?
为了网站快速收录而合理设置robots.txt文件,需要遵循一定的规则和最佳实践。robots.txt文件是一个纯文本文件,它告诉搜索引擎爬虫哪些页面可以访问,哪些页面不可以访问。以下是如何设置robots.txt文件以助于网站快速收录的步骤和要点…...
python绘制年平均海表温度、盐度、ph分布图
python绘制年平均海表温度、盐度、ph图 文章目录 python绘制年平均海表温度、盐度、ph分布图前言一、数据准备二、代码编写2.1. python绘制年平均海表温度(主要)2.2. python绘制年平均海表盐度(选看)2.3. python绘制年平均海表ph&…...
网络空间安全(2)应用程序安全
前言 应用程序安全(Application Security,简称AppSec)是一个综合性的概念,它涵盖了应用程序从开发到部署,再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义:应用程序安全是指识别和修复应用程序…...
HTTPS 通信流程
HTTPS 通信流程时序图: #mermaid-svg-HWoTbFvfih6aYUu6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-icon{fill:#552222;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-text{fill:#…...
全链路优化:如何让单点登录认证接口并发性能翻倍?
背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…...
http代理IP怎么实现?如何解决代理IP访问不了问题?
HTTP代理是一种网络服务,它充当客户端和目标服务器之间的中介。当客户端发送请求时,请求首先发送到代理服务器,然后由代理服务器转发到目标服务器。同样,目标服务器的响应也会先发送到代理服务器,再由代理服务器返回给…...
设计模式教程:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是设计模式中的一种行为型模式,它允许顺序访问一个集合对象中的元素,而无需暴露集合对象的内部结构。换句话说,迭代器模式提供了一个方法,能让你遍历集合中的元素,…...
AI Agent架构深度解析:从ReAct到AutoGPT,自主智能体的技术演进与工程实践
前言 觉得不错就点个赞吧!。 一、AI Agent技术架构演进图谱 (配图:AI Agent架构演进时间轴,标注关键技术节点) 1.1 三代架构对比分析 架构类型代表系统核心特征局限性反应式DeepBlue预置规则库无长期记忆认知式Wats…...
USC安防平台之地图临近资源列表
USC安防平台通过配置多层地图,并把相关的摄像机和门禁对象配置到数据上,用户可以方便的在地图上查看并操作。 但是对于大型的视频监控项目,同一个经纬度可能安装了很多台摄像机,这时候就需要显示同一个经纬度的临近资源列表&…...
Flutter 启动优化
Dart VM在Flutter中的作用是什么?它负责执行Dart代码,无论是JIT还是AOT模式都需要它。在JIT模式下,VM随应用一起运行,而在AOT模式下,代码已经被编译成机器码,VM可能不需要运行时存在?不过实际上…...
JavaScript数组方法reduce详解
JavaScript数组方法reduce详解 目录 JavaScript数组方法reduce详解一,前言二,核心语法三,案例1.求和2.找最大值3.数组转对象4.复合操作(同时实现 map filter) 四,常见错误1.空数组没有初始值2.没有返回累加…...
计算机毕业设计SpringBoot+Vue.js服装商城 服装购物系统(源码+LW文档+PPT+讲解+开题报告)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Web自动化中Selenium下Chrome与Edge的Webdriver常用Options参数
目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …...
现代未来派品牌海报徽标设计无衬线英文字体安装包 THANKS LAB
THANK LAB 是一种高级未来主义的软字体,将时尚的现代设计与光滑圆润的边缘相结合,营造出大胆而平易近人的美感。这款字体非常适合品牌、海报、标题、UI/UX 和科幻主题项目,旨在激发创造力。THANK LAB Futuristic Soft Font 完全支持拉丁字母、…...
《AI与NLP:开启元宇宙社交互动新纪元》
在科技飞速发展的当下,元宇宙正从概念逐步走向现实,成为人们关注的焦点。而在元宇宙诸多令人瞩目的特性中,社交互动体验是其核心魅力之一。人工智能(AI)与自然语言处理(NLP)技术的迅猛发展&…...
【算法通关村 Day6】二叉树层次遍历
树与层次遍历青铜挑战 理解树的结构 通过中序和后序遍历序列恢复二叉树是一个经典的二叉树构建问题。给定二叉树的中序遍历序列和后序遍历序列,我们可以利用以下步骤进行恢复。 思路: 后序遍历的特点: 后序遍历的最后一个节点是树的根节点…...
安全面试2
文章目录 简单描述一下什么是水平越权,什么是垂直越权,我要发现这两类漏洞,那我代码审计要注意什么地方水平越权:垂直越权:水平越权漏洞的审计重点垂直越权漏洞的审计重点 解释一下ssrf漏洞原理攻击场景修复方法 横向移…...
